diff --git a/.github/workflows/dapr-pubsub.yaml b/.github/workflows/dapr-pubsub.yaml new file mode 100644 index 00000000000..5b92ecf7549 --- /dev/null +++ b/.github/workflows/dapr-pubsub.yaml @@ -0,0 +1,69 @@ +name: dapr-pubsub +on: + push: + paths: + - "pkg/pubsub/dapr" + - "test/pubsub/**" + pull_request: + paths: + - "pkg/pubsub/dapr" + - "test/pubsub/**" +permissions: read-all + +jobs: + dapr_test: + name: "Dapr pubsub test" + runs-on: ubuntu-22.04 + timeout-minutes: 15 + strategy: + matrix: + DAPR_VERSION: ["1.10"] + steps: + - name: Check out code into the Go module directory + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c + + - name: Set up Go 1.20 + uses: actions/setup-go@v3 + with: + go-version: 1.20 + + - name: Bootstrap e2e + run: | + mkdir -p $GITHUB_WORKSPACE/bin + mkdir .tmp + echo "$GITHUB_WORKSPACE/bin" >> $GITHUB_PATH + make e2e-bootstrap + make e2e-helm-install + helm repo add dapr https://dapr.github.io/helm-charts/ + helm repo add bitnami https://charts.bitnami.com/bitnami + helm repo update + helm upgrade --install dapr dapr/dapr --version=${{ matrix.DAPR_VERSION }} --namespace dapr-system --create-namespace --wait --debug + helm upgrade --install redis bitnami/redis --namespace default --set image.tag=7.0-debian-11 --wait --debug + make e2e-subscriber-build-load-image + make e2e-subscriber-deploy + + - name: Run e2e + run: | + make docker-buildx IMG=gatekeeper-e2e:latest + make e2e-build-load-externaldata-image + make docker-buildx-crds CRD_IMG=gatekeeper-crds:latest + kind load docker-image --name kind gatekeeper-e2e:latest gatekeeper-crds:latest + kubectl create ns gatekeeper-system + make e2e-publisher-deploy + make e2e-helm-deploy HELM_REPO=gatekeeper-e2e HELM_CRD_REPO=gatekeeper-crds HELM_RELEASE=latest ENABLE_PUBSUB=true + make test-e2e ENABLE_PUBSUB_TESTS=1 + + - name: Save logs + if: ${{ always() }} + run: | + kubectl logs -n fake-subscriber -l app=sub --tail=-1 > logs-audit-subscribe.json + kubectl logs -n gatekeeper-system -l control-plane=audit-controller --tail=-1 > logs-audit-publish.json + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + if: ${{ always() }} + with: + name: pubsub-logs + path: | + logs-*.json + diff --git a/.gitignore b/.gitignore index 128e3756cde..329c0880ded 100644 --- a/.gitignore +++ b/.gitignore @@ -362,3 +362,6 @@ tilt-settings.json # dummy provider's certificate directory test/externaldata/dummy-provider/certs/ + +# annotations for dapr +annotations.yaml diff --git a/Makefile b/Makefile index 094a3e0f6fb..c667cda2a0e 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,9 @@ GATOR_IMG := $(GATOR_REPOSITORY):latest DEV_TAG ?= dev USE_LOCAL_IMG ?= false ENABLE_GENERATOR_EXPANSION ?= false +ENABLE_PUBSUB ?= false +AUDIT_CONNECTION ?= "audit" +AUDIT_CHANNEL ?= "audit" VERSION := v3.13.0-beta.0 @@ -37,6 +40,7 @@ GOLANGCI_LINT_VERSION := v1.51.2 GOLANGCI_LINT_CACHE := $(shell pwd)/.tmp/golangci-lint BENCHMARK_FILE_NAME ?= benchmarks.txt +FAKE_SUBSCRIBER_IMAGE ?= fake-subscriber:latest ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) BIN_DIR := $(abspath $(ROOT_DIR)/bin) @@ -186,6 +190,30 @@ e2e-helm-install: ./.staging/helm/linux-amd64/helm version --client e2e-helm-deploy: e2e-helm-install +ifeq ($(ENABLE_PUBSUB),true) + @echo 'auditPodAnnotations: {dapr.io/enabled: "true", dapr.io/app-id: "audit", dapr.io/metrics-port: "9999"}' > .tmp/annotations.yaml + ./.staging/helm/linux-amd64/helm install manifest_staging/charts/gatekeeper --name-template=gatekeeper \ + --namespace ${GATEKEEPER_NAMESPACE} \ + --debug --wait \ + --set image.repository=${HELM_REPO} \ + --set image.crdRepository=${HELM_CRD_REPO} \ + --set image.release=${HELM_RELEASE} \ + --set postInstall.labelNamespace.image.repository=${HELM_CRD_REPO} \ + --set postInstall.labelNamespace.image.tag=${HELM_RELEASE} \ + --set postInstall.labelNamespace.enabled=true \ + --set postInstall.probeWebhook.enabled=true \ + --set emitAdmissionEvents=true \ + --set emitAuditEvents=true \ + --set admissionEventsInvolvedNamespace=true \ + --set auditEventsInvolvedNamespace=true \ + --set disabledBuiltins={http.send} \ + --set logMutations=true \ + --set audit.enablePubsub=${ENABLE_PUBSUB} \ + --set audit.connection=${AUDIT_CONNECTION} \ + --set audit.channel=${AUDIT_CHANNEL} \ + --values .tmp/annotations.yaml \ + --set mutationAnnotations=true; +else ./.staging/helm/linux-amd64/helm install manifest_staging/charts/gatekeeper --name-template=gatekeeper \ --namespace ${GATEKEEPER_NAMESPACE} --create-namespace \ --debug --wait \ @@ -202,7 +230,8 @@ e2e-helm-deploy: e2e-helm-install --set auditEventsInvolvedNamespace=true \ --set disabledBuiltins={http.send} \ --set logMutations=true \ - --set mutationAnnotations=true;\ + --set mutationAnnotations=true +endif e2e-helm-upgrade-init: e2e-helm-install ./.staging/helm/linux-amd64/helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts;\ @@ -240,6 +269,19 @@ e2e-helm-upgrade: --set logMutations=true \ --set mutationAnnotations=true;\ +e2e-subscriber-build-load-image: + docker buildx build --platform="linux/amd64" -t ${FAKE_SUBSCRIBER_IMAGE} --load -f test/pubsub/fake-subscriber/Dockerfile test/pubsub/fake-subscriber + kind load docker-image --name kind ${FAKE_SUBSCRIBER_IMAGE} + +e2e-subscriber-deploy: + kubectl create ns fake-subscriber + kubectl get secret redis --namespace=default -o yaml | sed 's/namespace: .*/namespace: fake-subscriber/' | kubectl apply -f - + kubectl apply -f test/pubsub/fake-subscriber/manifest/subscriber.yaml + +e2e-publisher-deploy: + kubectl get secret redis --namespace=default -o yaml | sed 's/namespace: .*/namespace: gatekeeper-system/' | kubectl apply -f - + kubectl apply -f test/pubsub/publish-components.yaml + # Build manager binary manager: generate GO111MODULE=on go build -mod vendor -o bin/manager -ldflags $(LDFLAGS) main.go diff --git a/cmd/build/helmify/kustomize-for-helm.yaml b/cmd/build/helmify/kustomize-for-helm.yaml index 9be01d323df..707912ce1dc 100644 --- a/cmd/build/helmify/kustomize-for-helm.yaml +++ b/cmd/build/helmify/kustomize-for-helm.yaml @@ -147,6 +147,7 @@ spec: metadata: annotations: HELMSUBST_ANNOTATIONS: "" + HELMSUBST_AUDIT_POD_ANNOTATIONS: "" spec: containers: - name: manager @@ -163,6 +164,7 @@ spec: - --audit-events-involved-namespace={{ .Values.auditEventsInvolvedNamespace }} - --operation=audit - --operation=status + - HELMSUBST_PUBSUB_ARGS - HELMSUBST_MUTATION_STATUS_ENABLED_ARG - --logtostderr - --health-addr=:HELMSUBST_DEPLOYMENT_AUDIT_HEALTH_PORT diff --git a/cmd/build/helmify/replacements.go b/cmd/build/helmify/replacements.go index a8e2f44ccff..66a3f03e334 100644 --- a/cmd/build/helmify/replacements.go +++ b/cmd/build/helmify/replacements.go @@ -75,6 +75,10 @@ var replacements = map[string]string{ {{- toYaml .Values.podAnnotations | trim | nindent 8 }} {{- end }}`, + `HELMSUBST_AUDIT_POD_ANNOTATIONS: ""`: `{{- if .Values.auditPodAnnotations }} + {{- toYaml .Values.auditPodAnnotations | trim | nindent 8 }} + {{- end }}`, + "HELMSUBST_SECRET_ANNOTATIONS": `{{- toYaml .Values.secretAnnotations | trim | nindent 4 }}`, "- HELMSUBST_TLS_HEALTHCHECK_ENABLED_ARG": `{{ if .Values.enableTLSHealthcheck}}- --enable-tls-healthcheck{{- end }}`, @@ -85,6 +89,12 @@ var replacements = map[string]string{ "- HELMSUBST_MUTATION_STATUS_ENABLED_ARG": `{{ if not .Values.disableMutation}}- --operation=mutation-status{{- end }}`, + "- HELMSUBST_PUBSUB_ARGS": `{{ if .Values.audit.enablePubsub}} + - --enable-pub-sub={{ .Values.audit.enablePubsub }} + - --audit-connection={{ .Values.audit.connection }} + - --audit-channel={{ .Values.audit.channel }} + {{- end }}`, + "HELMSUBST_MUTATING_WEBHOOK_FAILURE_POLICY": `{{ .Values.mutatingWebhookFailurePolicy }}`, "HELMSUBST_MUTATING_WEBHOOK_REINVOCATION_POLICY": `{{ .Values.mutatingWebhookReinvocationPolicy }}`, diff --git a/cmd/build/helmify/static/values.yaml b/cmd/build/helmify/static/values.yaml index 0d3b97f10f4..eda0288ef3c 100644 --- a/cmd/build/helmify/static/values.yaml +++ b/cmd/build/helmify/static/values.yaml @@ -141,6 +141,7 @@ preUninstall: runAsNonRoot: true runAsUser: 1000 podAnnotations: {} +auditPodAnnotations: {} podLabels: {} podCountLimit: "100" secretAnnotations: {} @@ -201,6 +202,7 @@ controllerManager: # - ipBlock: # cidr: 0.0.0.0/0 audit: + enablePubsub: false hostNetwork: false dnsPolicy: ClusterFirst metricsPort: 8888 diff --git a/go.mod b/go.mod index 9ca881848be..d4e88a4f624 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,13 @@ module github.com/open-policy-agent/gatekeeper/v3 -go 1.18 +go 1.20 require ( - cloud.google.com/go/trace v1.4.0 + cloud.google.com/go/trace v1.8.0 contrib.go.opencensus.io/exporter/ocagent v0.7.0 contrib.go.opencensus.io/exporter/prometheus v0.4.2 contrib.go.opencensus.io/exporter/stackdriver v0.13.14 + github.com/dapr/go-sdk v1.6.0 github.com/davecgh/go-spew v1.1.1 github.com/dominikbraun/graph v0.16.2 github.com/go-logr/logr v1.2.4 @@ -67,6 +68,7 @@ require ( github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.4.0 // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -87,7 +89,7 @@ require ( github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20220318212150-b2ab0324ddda // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect @@ -140,9 +142,9 @@ require ( golang.org/x/text v0.9.0 // indirect golang.org/x/tools v0.9.1 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.103.0 // indirect + google.golang.org/api v0.108.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect + google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa // indirect google.golang.org/grpc v1.54.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 0fbaf288713..c1eebe9e180 100644 --- a/go.sum +++ b/go.sum @@ -58,8 +58,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/trace v1.4.0 h1:qO9eLn2esajC9sxpqp1YKX37nXC3L4BfGnPS0Cx9dYo= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0 h1:GFPLxbp5/FzdgTzor3nlNYNxMd6hLmzkE7sA9F0qQcA= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= contrib.go.opencensus.io/exporter/ocagent v0.7.0 h1:BEfdCTXfMV30tLZD8c9n64V/tIZX5+9sXiuFLnrr1k8= contrib.go.opencensus.io/exporter/ocagent v0.7.0/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= @@ -362,6 +362,8 @@ github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1S github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/dapr/go-sdk v1.6.0 h1:jg5A2khSCHF8bGZsig5RWN/gD0jjitszc2V6Uq2pPdY= +github.com/dapr/go-sdk v1.6.0/go.mod h1:KLQBltoD9K0w5hKTihdcyg9Epob9gypwL5dYcQzPro4= 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -598,6 +600,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -680,8 +683,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -1753,8 +1756,8 @@ google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.103.0 h1:9yuVqlu2JCvcLg9p8S3fcFLZij8EPSyvODIY1rkMizQ= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.108.0 h1:WVBc/faN0DkKtR43Q/7+tPny9ZoLZdIiAyG5Q9vFClg= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1837,8 +1840,8 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa h1:qQPhfbPO23fwm/9lQr91L1u62Zo6cm+zI+slZT+uf+o= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= diff --git a/main.go b/main.go index 3861e1cb443..afe56c7f4a2 100644 --- a/main.go +++ b/main.go @@ -46,6 +46,7 @@ import ( "github.com/open-policy-agent/gatekeeper/v3/pkg/metrics" "github.com/open-policy-agent/gatekeeper/v3/pkg/mutation" "github.com/open-policy-agent/gatekeeper/v3/pkg/operations" + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub" "github.com/open-policy-agent/gatekeeper/v3/pkg/readiness" "github.com/open-policy-agent/gatekeeper/v3/pkg/target" "github.com/open-policy-agent/gatekeeper/v3/pkg/upgrade" @@ -381,6 +382,7 @@ func setupControllers(mgr ctrl.Manager, sw *watch.ControllerSwitch, tracker *rea mutationSystem := mutation.NewSystem(mutationOpts) expansionSystem := expansion.NewSystem(mutationSystem) + pubsubSystem := pubsub.NewSystem() c := mgr.GetCache() dc, ok := c.(watch.RemovableCache) @@ -416,6 +418,7 @@ func setupControllers(mgr ctrl.Manager, sw *watch.ControllerSwitch, tracker *rea ExpansionSystem: expansionSystem, ProviderCache: providerCache, WatchSet: watchSet, + PubsubSystem: pubsubSystem, } if err := controller.AddToManager(mgr, &opts); err != nil { @@ -445,6 +448,7 @@ func setupControllers(mgr ctrl.Manager, sw *watch.ControllerSwitch, tracker *rea ProcessExcluder: processExcluder, CacheLister: auditCache, ExpansionSystem: expansionSystem, + PubSubSystem: pubsubSystem, } if err := audit.AddToManager(mgr, &auditDeps); err != nil { setupLog.Error(err, "unable to register audit with the manager") @@ -463,6 +467,7 @@ func setupControllers(mgr ctrl.Manager, sw *watch.ControllerSwitch, tracker *rea setupLog.Error(err, "unable to register metrics with the manager") return err } + return nil } diff --git a/manifest_staging/charts/gatekeeper/templates/gatekeeper-audit-deployment.yaml b/manifest_staging/charts/gatekeeper/templates/gatekeeper-audit-deployment.yaml index a2437efc37c..9b66fae2492 100644 --- a/manifest_staging/charts/gatekeeper/templates/gatekeeper-audit-deployment.yaml +++ b/manifest_staging/charts/gatekeeper/templates/gatekeeper-audit-deployment.yaml @@ -28,6 +28,9 @@ spec: {{- if .Values.podAnnotations }} {{- toYaml .Values.podAnnotations | trim | nindent 8 }} {{- end }} + {{- if .Values.auditPodAnnotations }} + {{- toYaml .Values.auditPodAnnotations | trim | nindent 8 }} + {{- end }} labels: {{- include "gatekeeper.podLabels" . }} app: '{{ template "gatekeeper.name" . }}' @@ -60,6 +63,11 @@ spec: - --audit-events-involved-namespace={{ .Values.auditEventsInvolvedNamespace }} - --operation=audit - --operation=status + {{ if .Values.audit.enablePubsub}} + - --enable-pub-sub={{ .Values.audit.enablePubsub }} + - --audit-connection={{ .Values.audit.connection }} + - --audit-channel={{ .Values.audit.channel }} + {{- end }} {{ if not .Values.disableMutation}}- --operation=mutation-status{{- end }} - --logtostderr - --health-addr=:{{ .Values.audit.healthPort }} diff --git a/manifest_staging/charts/gatekeeper/values.yaml b/manifest_staging/charts/gatekeeper/values.yaml index 0d3b97f10f4..eda0288ef3c 100644 --- a/manifest_staging/charts/gatekeeper/values.yaml +++ b/manifest_staging/charts/gatekeeper/values.yaml @@ -141,6 +141,7 @@ preUninstall: runAsNonRoot: true runAsUser: 1000 podAnnotations: {} +auditPodAnnotations: {} podLabels: {} podCountLimit: "100" secretAnnotations: {} @@ -201,6 +202,7 @@ controllerManager: # - ipBlock: # cidr: 0.0.0.0/0 audit: + enablePubsub: false hostNetwork: false dnsPolicy: ClusterFirst metricsPort: 8888 diff --git a/pkg/audit/controller.go b/pkg/audit/controller.go index 42d94a65503..97f1bba7692 100644 --- a/pkg/audit/controller.go +++ b/pkg/audit/controller.go @@ -16,6 +16,7 @@ import ( constraintclient "github.com/open-policy-agent/frameworks/constraint/pkg/client" "github.com/open-policy-agent/gatekeeper/v3/pkg/controller/config/process" "github.com/open-policy-agent/gatekeeper/v3/pkg/expansion" + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub" "sigs.k8s.io/controller-runtime/pkg/manager" ) @@ -24,6 +25,7 @@ type Dependencies struct { ProcessExcluder *process.Excluder CacheLister *CacheLister ExpansionSystem *expansion.System + PubSubSystem *pubsub.System } // AddToManager adds audit manager to the Manager. diff --git a/pkg/audit/manager.go b/pkg/audit/manager.go index 9b96656b539..d4e88628289 100644 --- a/pkg/audit/manager.go +++ b/pkg/audit/manager.go @@ -3,6 +3,7 @@ package audit import ( "context" "encoding/json" + "errors" "flag" "fmt" "io" @@ -16,12 +17,13 @@ import ( constraintclient "github.com/open-policy-agent/frameworks/constraint/pkg/client" "github.com/open-policy-agent/frameworks/constraint/pkg/client/drivers" "github.com/open-policy-agent/gatekeeper/v3/pkg/controller/config/process" + pubsubController "github.com/open-policy-agent/gatekeeper/v3/pkg/controller/pubsub" "github.com/open-policy-agent/gatekeeper/v3/pkg/expansion" "github.com/open-policy-agent/gatekeeper/v3/pkg/logging" mutationtypes "github.com/open-policy-agent/gatekeeper/v3/pkg/mutation/types" + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub" "github.com/open-policy-agent/gatekeeper/v3/pkg/target" "github.com/open-policy-agent/gatekeeper/v3/pkg/util" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -51,6 +53,8 @@ const ( defaultConstraintViolationsLimit = 20 defaultListLimit = 500 defaultAPICacheDir = "/tmp/audit" + defaultConnection = "audit-connection" + defaultChannel = "audit-channel" ) var ( @@ -62,6 +66,8 @@ var ( auditEventsInvolvedNamespace = flag.Bool("audit-events-involved-namespace", false, "emit audit events for each violation in the involved objects namespace, the default (false) generates events in the namespace Gatekeeper is installed in. Audit events from cluster-scoped resources will still follow the default behavior") auditMatchKindOnly = flag.Bool("audit-match-kind-only", false, "only use kinds specified in all constraints for auditing cluster resources. if kind is not specified in any of the constraints, it will audit all resources (same as setting this flag to false)") apiCacheDir = flag.String("api-cache-dir", defaultAPICacheDir, "The directory where audit from api server cache are stored, defaults to /tmp/audit") + auditConnection = flag.String("audit-connection", defaultConnection, "Connection name for publishing audit violation messages") + auditChannel = flag.String("audit-channel", defaultChannel, "Channel name for publishing audit violation messages") emptyAuditResults []updateListEntry logStatsAudit = flag.Bool("log-stats-audit", false, "(alpha) log stats metrics for the audit run") ) @@ -84,6 +90,7 @@ type Manager struct { auditCache *CacheLister expansionSystem *expansion.System + pubsubSystem *pubsub.System } // StatusViolation represents each violation under status. @@ -97,6 +104,27 @@ type StatusViolation struct { EnforcementAction string `json:"enforcementAction"` } +// ConstraintMsg represents publish message for each constraint. +type PubsubMsg struct { + ID string `json:"id,omitempty"` + Details interface{} `json:"details,omitempty"` + EventType string `json:"eventType,omitempty"` + Group string `json:"group,omitempty"` + Version string `json:"version,omitempty"` + Kind string `json:"kind,omitempty"` + Name string `json:"name,omitempty"` + Namespace string `json:"namespace,omitempty"` + Message string `json:"message,omitempty"` + EnforcementAction string `json:"enforcementAction,omitempty"` + ConstraintAnnotations map[string]string `json:"constraintAnnotations,omitempty"` + ResourceGroup string `json:"resourceGroup,omitempty"` + ResourceAPIVersion string `json:"resourceAPIVersion,omitempty"` + ResourceKind string `json:"resourceKind,omitempty"` + ResourceNamespace string `json:"resourceNamespace,omitempty"` + ResourceName string `json:"resourceName,omitempty"` + ResourceLabels map[string]string `json:"resourceLabels,omitempty"` +} + // updateListEntry holds the information necessary to update the // audit results in the `status` field of the constraint template. // Adding data to this struct has a large impact on memory usage. @@ -157,6 +185,7 @@ func New(mgr manager.Manager, deps *Dependencies) (*Manager, error) { gkNamespace: util.GetNamespace(), auditCache: deps.CacheLister, expansionSystem: deps.ExpansionSystem, + pubsubSystem: deps.PubSubSystem, } return am, nil } @@ -752,6 +781,7 @@ func (am *Manager) addAuditResponsesToUpdateLists( totalViolationsPerEnforcementAction map[util.EnforcementAction]int64, timestamp string, ) error { + var errs error for _, r := range res { key := util.GetUniqueKey(*r.Constraint) totalViolationsPerConstraint[key]++ @@ -784,10 +814,19 @@ func (am *Manager) addAuditResponsesToUpdateLists( totalViolationsPerEnforcementAction[ea]++ logViolation(am.log, r.Constraint, ea, gvk, namespace, name, r.Msg, details, r.obj.GetLabels()) + if *pubsubController.PubsubEnabled { + err := am.pubsubSystem.Publish(context.Background(), *auditConnection, *auditChannel, violationMsg(r.Constraint, ea, gvk, namespace, name, r.Msg, details, r.obj.GetLabels(), timestamp)) + if err != nil { + errs = errors.Join(errs, err) + } + } if *emitAuditEvents { emitEvent(r.Constraint, timestamp, ea, gvk, namespace, name, rv, r.Msg, am.gkNamespace, uid, am.eventRecorder) } } + if errs != nil { + return fmt.Errorf("encountered errors in publishing messages, errors: %w", errs) + } return nil } @@ -1039,6 +1078,31 @@ func logConstraint(l logr.Logger, gvknn *util.KindVersionName, enforcementAction ) } +func violationMsg(constraint *unstructured.Unstructured, enforcementAction util.EnforcementAction, resourceGroupVersionKind schema.GroupVersionKind, rnamespace, rname, message string, details interface{}, rlabels map[string]string, timestamp string) interface{} { + userConstraintAnnotations := constraint.GetAnnotations() + delete(userConstraintAnnotations, "kubectl.kubernetes.io/last-applied-configuration") + + return PubsubMsg{ + Message: message, + Details: details, + ID: timestamp, + EventType: "violation_audited", + Group: constraint.GroupVersionKind().Group, + Version: constraint.GroupVersionKind().Version, + Kind: constraint.GetKind(), + Name: constraint.GetName(), + Namespace: constraint.GetNamespace(), + EnforcementAction: string(enforcementAction), + ConstraintAnnotations: userConstraintAnnotations, + ResourceGroup: resourceGroupVersionKind.Group, + ResourceAPIVersion: resourceGroupVersionKind.Version, + ResourceKind: resourceGroupVersionKind.Kind, + ResourceNamespace: rnamespace, + ResourceName: rname, + ResourceLabels: rlabels, + } +} + func logViolation(l logr.Logger, constraint *unstructured.Unstructured, enforcementAction util.EnforcementAction, resourceGroupVersionKind schema.GroupVersionKind, rnamespace, rname, message string, details interface{}, rlabels map[string]string, diff --git a/pkg/controller/add_pubsub.go b/pkg/controller/add_pubsub.go new file mode 100644 index 00000000000..52904f36d50 --- /dev/null +++ b/pkg/controller/add_pubsub.go @@ -0,0 +1,24 @@ +/* + +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 controller + +import ( + "github.com/open-policy-agent/gatekeeper/v3/pkg/controller/pubsub" +) + +func init() { + Injectors = append(Injectors, &pubsub.Adder{}) +} diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 9fb430fd7f5..2fec2fcda8e 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -27,6 +27,7 @@ import ( "github.com/open-policy-agent/gatekeeper/v3/pkg/expansion" "github.com/open-policy-agent/gatekeeper/v3/pkg/fakes" "github.com/open-policy-agent/gatekeeper/v3/pkg/mutation" + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub" "github.com/open-policy-agent/gatekeeper/v3/pkg/readiness" "github.com/open-policy-agent/gatekeeper/v3/pkg/util" "github.com/open-policy-agent/gatekeeper/v3/pkg/watch" @@ -64,6 +65,10 @@ type WatchSetInjector interface { InjectWatchSet(watchSet *watch.Set) } +type PubsubInjector interface { + InjectPubsubSystem(pubsubSystem *pubsub.System) +} + // Injectors is a list of adder structs that need injection. We can convert this // to an interface once we create controllers for things like data sync. var Injectors []Injector @@ -83,6 +88,7 @@ type Dependencies struct { ExpansionSystem *expansion.System ProviderCache *externaldata.ProviderCache WatchSet *watch.Set + PubsubSystem *pubsub.System } type defaultPodGetter struct { @@ -171,6 +177,9 @@ func AddToManager(m manager.Manager, deps *Dependencies) error { if a2, ok := a.(WatchSetInjector); ok { a2.InjectWatchSet(deps.WatchSet) } + if a2, ok := a.(PubsubInjector); ok { + a2.InjectPubsubSystem(deps.PubsubSystem) + } if err := a.Add(m); err != nil { return err } diff --git a/pkg/controller/pubsub/pubsub_config_controller.go b/pkg/controller/pubsub/pubsub_config_controller.go new file mode 100644 index 00000000000..c1d7ddb3576 --- /dev/null +++ b/pkg/controller/pubsub/pubsub_config_controller.go @@ -0,0 +1,146 @@ +package pubsub + +import ( + "context" + "encoding/json" + "flag" + "fmt" + + constraintclient "github.com/open-policy-agent/frameworks/constraint/pkg/client" + "github.com/open-policy-agent/frameworks/constraint/pkg/externaldata" + "github.com/open-policy-agent/gatekeeper/v3/pkg/expansion" + "github.com/open-policy-agent/gatekeeper/v3/pkg/logging" + "github.com/open-policy-agent/gatekeeper/v3/pkg/mutation" + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub" + "github.com/open-policy-agent/gatekeeper/v3/pkg/readiness" + "github.com/open-policy-agent/gatekeeper/v3/pkg/util" + "github.com/open-policy-agent/gatekeeper/v3/pkg/watch" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/handler" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/controller-runtime/pkg/source" +) + +var ( + PubsubEnabled = flag.Bool("enable-pub-sub", false, "Enabled pubsub to publish messages") + log = logf.Log.WithName("controller").WithValues(logging.Process, "pubsub_controller") +) + +type Adder struct { + PubsubSystem *pubsub.System +} + +func (a *Adder) Add(mgr manager.Manager) error { + if !*PubsubEnabled { + return nil + } + r := newReconciler(mgr, a.PubsubSystem) + return add(mgr, r) +} + +func (a *Adder) InjectOpa(_ *constraintclient.Client) {} + +func (a *Adder) InjectWatchManager(_ *watch.Manager) {} + +func (a *Adder) InjectControllerSwitch(_ *watch.ControllerSwitch) {} + +func (a *Adder) InjectTracker(_ *readiness.Tracker) {} + +func (a *Adder) InjectMutationSystem(_ *mutation.System) {} + +func (a *Adder) InjectExpansionSystem(_ *expansion.System) {} + +func (a *Adder) InjectProviderCache(_ *externaldata.ProviderCache) {} + +func (a *Adder) InjectPubsubSystem(pubsubSystem *pubsub.System) { + a.PubsubSystem = pubsubSystem +} + +type Reconciler struct { + client.Client + scheme *runtime.Scheme + system *pubsub.System +} + +func newReconciler(mgr manager.Manager, system *pubsub.System) *Reconciler { + return &Reconciler{ + Client: mgr.GetClient(), + scheme: mgr.GetScheme(), + system: system, + } +} + +func add(mgr manager.Manager, r reconcile.Reconciler) error { + c, err := controller.New("pubsub-config-controller", mgr, controller.Options{Reconciler: r}) + if err != nil { + return err + } + + return c.Watch( + &source.Kind{Type: &corev1.ConfigMap{}}, + &handler.EnqueueRequestForObject{}, + predicate.Funcs{ + CreateFunc: func(e event.CreateEvent) bool { + return e.Object.GetNamespace() == util.GetNamespace() + }, + UpdateFunc: func(e event.UpdateEvent) bool { + return e.ObjectNew.GetNamespace() == util.GetNamespace() + }, + DeleteFunc: func(e event.DeleteEvent) bool { + return e.Object.GetNamespace() == util.GetNamespace() + }, + GenericFunc: func(e event.GenericEvent) bool { + return e.Object.GetNamespace() == util.GetNamespace() + }, + }, + ) +} + +func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) { + log.Info("Reconcile", "request", request, "namespace", request.Namespace, "name", request.Name) + + deleted := false + cfg := &corev1.ConfigMap{} + err := r.Get(ctx, request.NamespacedName, cfg) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{}, err + } + deleted = true + } + + if deleted { + err := r.system.CloseConnection(request.Name) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + log.Info("removed connection", "name", request.Name) + return reconcile.Result{}, nil + } + + if len(cfg.Data) == 0 { + return reconcile.Result{}, fmt.Errorf(fmt.Sprintf("data missing in configmap %s, unable to configure respective pubsub", request.NamespacedName)) + } + if _, ok := cfg.Data["provider"]; !ok { + return reconcile.Result{}, fmt.Errorf(fmt.Sprintf("missing provider field in configmap %s, unable to configure respective pubsub", request.NamespacedName)) + } + var config interface{} + err = json.Unmarshal([]byte(cfg.Data["config"]), &config) + if err != nil { + return reconcile.Result{}, err + } + err = r.system.UpsertConnection(ctx, config, request.Name, cfg.Data["provider"]) + if err != nil { + return reconcile.Result{}, err + } + log.Info("Connection upsert successful", "name", request.Name, "provider", cfg.Data["provider"]) + return reconcile.Result{}, nil +} diff --git a/pkg/controller/pubsub/pubsub_config_controller_test.go b/pkg/controller/pubsub/pubsub_config_controller_test.go new file mode 100644 index 00000000000..258b092c309 --- /dev/null +++ b/pkg/controller/pubsub/pubsub_config_controller_test.go @@ -0,0 +1,68 @@ +package pubsub + +import ( + "context" + "flag" + "fmt" + "testing" + + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub/dapr" + "github.com/open-policy-agent/gatekeeper/v3/pkg/util" + "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +func TestReconcile(t *testing.T) { + // Create a fake client with some data + scheme := runtime.NewScheme() + err := corev1.AddToScheme(scheme) + if err != nil { + t.Fatalf("Unexpected error parsing flag: %v", err) + } + + err = flag.CommandLine.Parse([]string{"--enable-pub-sub", "true"}) + if err != nil { + t.Fatalf("Unexpected error parsing flag: %v", err) + } + + request := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: util.GetNamespace(), Name: dapr.Name}} + + ctx := context.Background() + testCases := []struct { + name string + config *corev1.ConfigMap + wantErr bool + errorMsg string + }{ + { + name: "invalid configmap", + config: &corev1.ConfigMap{ + ObjectMeta: v1.ObjectMeta{ + Name: dapr.Name, + Namespace: util.GetNamespace(), + }, + }, + wantErr: true, + errorMsg: fmt.Sprintf("data missing in configmap %s, unable to configure respective pubsub", request.NamespacedName), + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(tc.config).Build() + r := &Reconciler{ + Client: client, + scheme: scheme, + } + + _, err := r.Reconcile(ctx, request) + if tc.wantErr { + assert.Equal(t, err.Error(), tc.errorMsg) + } + }) + } +} diff --git a/pkg/pubsub/connection/connection.go b/pkg/pubsub/connection/connection.go new file mode 100644 index 00000000000..0edb6a74daf --- /dev/null +++ b/pkg/pubsub/connection/connection.go @@ -0,0 +1,17 @@ +package connection + +import ( + "context" +) + +// PubSub is the interface that wraps pubsub methods. +type Connection interface { + // Publish single message over a specific topic/channel + Publish(ctx context.Context, data interface{}, topic string) error + + // Close connections + CloseConnection() error + + // Update connection + UpdateConnection(ctx context.Context, data interface{}) error +} diff --git a/pkg/pubsub/dapr/dapr.go b/pkg/pubsub/dapr/dapr.go new file mode 100644 index 00000000000..94f630d0a9d --- /dev/null +++ b/pkg/pubsub/dapr/dapr.go @@ -0,0 +1,83 @@ +package dapr + +import ( + "context" + "encoding/json" + "fmt" + + daprClient "github.com/dapr/go-sdk/client" + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub/connection" +) + +type ClientConfig struct { + // Name of the component to be used for pub sub messaging + Component string `json:"component"` +} + +// Dapr represents driver for interacting with pub sub using dapr. +type Dapr struct { + // Array of clients to talk to different endpoints + client daprClient.Client + + // Name of the pubsub component + pubSubComponent string +} + +const ( + Name = "dapr" +) + +func (r *Dapr) Publish(ctx context.Context, data interface{}, topic string) error { + jsonData, err := json.Marshal(data) + if err != nil { + return fmt.Errorf("error marshaling data: %w", err) + } + + err = r.client.PublishEvent(context.Background(), r.pubSubComponent, topic, jsonData) + if err != nil { + return fmt.Errorf("error publishing message to dapr: %w", err) + } + + return nil +} + +func (r *Dapr) CloseConnection() error { + return nil +} + +func (r *Dapr) UpdateConnection(ctx context.Context, config interface{}) error { + var cfg ClientConfig + m, ok := config.(map[string]interface{}) + if !ok { + return fmt.Errorf("invalid type assertion, config is not in expected format") + } + cfg.Component, ok = m["component"].(string) + if !ok { + return fmt.Errorf("failed to get value of component") + } + r.pubSubComponent = cfg.Component + return nil +} + +// Returns a new client for dapr. +func NewConnection(_ context.Context, config interface{}) (connection.Connection, error) { + var cfg ClientConfig + m, ok := config.(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("invalid type assertion, config is not in expected format") + } + cfg.Component, ok = m["component"].(string) + if !ok { + return nil, fmt.Errorf("failed to get value of component") + } + + tmp, err := daprClient.NewClient() + if err != nil { + return nil, err + } + + return &Dapr{ + client: tmp, + pubSubComponent: cfg.Component, + }, nil +} diff --git a/pkg/pubsub/dapr/dapr_test.go b/pkg/pubsub/dapr/dapr_test.go new file mode 100644 index 00000000000..89b63af5c48 --- /dev/null +++ b/pkg/pubsub/dapr/dapr_test.go @@ -0,0 +1,38 @@ +package dapr + +import ( + "context" + "testing" + + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub/connection" + "github.com/stretchr/testify/assert" +) + +func TestNewConnection(t *testing.T) { + tests := []struct { + name string + config interface{} + expected connection.Connection + errorMsg string + }{ + { + name: "invalid config", + config: "test", + expected: nil, + errorMsg: "invalid type assertion, config is not in expected format", + }, + { + name: "config with missing component", + config: map[string]interface{}{"enableBatching": true}, + expected: nil, + errorMsg: "failed to get value of component", + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ret, err := NewConnection(context.TODO(), tc.config) + assert.Equal(t, ret, tc.expected) + assert.EqualError(t, err, tc.errorMsg) + }) + } +} diff --git a/pkg/pubsub/provider/provider.go b/pkg/pubsub/provider/provider.go new file mode 100644 index 00000000000..5e1d0601014 --- /dev/null +++ b/pkg/pubsub/provider/provider.go @@ -0,0 +1,39 @@ +package provider + +import ( + "context" + + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub/connection" + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub/dapr" +) + +var pubSubs = newPubSubSet(map[string]InitiateConnection{ + dapr.Name: dapr.NewConnection, +}, +) + +type pubSubSet struct { + supportedPubSub map[string]InitiateConnection +} + +// returns new client for pub sub tool. +type InitiateConnection func(ctx context.Context, config interface{}) (connection.Connection, error) + +func newPubSubSet(pubSubs map[string]InitiateConnection) *pubSubSet { + supported := make(map[string]InitiateConnection) + set := &pubSubSet{ + supportedPubSub: supported, + } + for name := range pubSubs { + set.supportedPubSub[name] = pubSubs[name] + } + return set +} + +func List() map[string]InitiateConnection { + ret := make(map[string]InitiateConnection) + for name, new := range pubSubs.supportedPubSub { + ret[name] = new + } + return ret +} diff --git a/pkg/pubsub/provider/provider_test.go b/pkg/pubsub/provider/provider_test.go new file mode 100644 index 00000000000..c81602525ac --- /dev/null +++ b/pkg/pubsub/provider/provider_test.go @@ -0,0 +1,51 @@ +package provider + +import ( + "testing" + + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub/dapr" +) + +func Test_newPubSubSet(t *testing.T) { + tests := []struct { + name string + pubSubs map[string]InitiateConnection + wantKey string + }{ + { + name: "only one provider is available", + pubSubs: map[string]InitiateConnection{ + dapr.Name: dapr.NewConnection, + }, + wantKey: dapr.Name, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := newPubSubSet(tt.pubSubs) + if _, ok := got.supportedPubSub[tt.wantKey]; !ok { + t.Errorf("newPubSubSet() = %#v, want key %#v", got.supportedPubSub, tt.wantKey) + } + }) + } +} + +func TestList(t *testing.T) { + tests := []struct { + name string + wantKey string + }{ + { + name: "only one provider is available", + wantKey: dapr.Name, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := List() + if _, ok := got[tt.wantKey]; !ok { + t.Errorf("List() = %#v, want key %#v", got, tt.wantKey) + } + }) + } +} diff --git a/pkg/pubsub/system.go b/pkg/pubsub/system.go new file mode 100644 index 00000000000..9b74b09bd26 --- /dev/null +++ b/pkg/pubsub/system.go @@ -0,0 +1,86 @@ +package pubsub + +import ( + "context" + "fmt" + "sync" + + "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub/connection" + prvd "github.com/open-policy-agent/gatekeeper/v3/pkg/pubsub/provider" + logf "sigs.k8s.io/controller-runtime/pkg/log" +) + +var log = logf.Log.WithName("pubsub-system") + +type System struct { + mux sync.RWMutex + connections map[string]connection.Connection + providers map[string]string +} + +func NewSystem() *System { + return &System{} +} + +func (s *System) Publish(ctx context.Context, connection string, topic string, msg interface{}) error { + s.mux.RLock() + defer s.mux.RUnlock() + if len(s.connections) > 0 { + if c, ok := s.connections[connection]; ok { + return c.Publish(context.Background(), msg, topic) + } + return fmt.Errorf("connection is not initialized, name: %s ", connection) + } + return fmt.Errorf("No connections are established") +} + +func (s *System) UpsertConnection(ctx context.Context, config interface{}, name string, provider string) error { + s.mux.Lock() + defer s.mux.Unlock() + // Check if the connection already exists. + if conn, ok := s.connections[name]; ok { + // If the provider is the same, update the existing connection. + if s.providers[name] == provider { + return conn.UpdateConnection(ctx, config) + } + // Otherwise, close the existing connection and create a new one. + if err := s.CloseConnection(name); err != nil { + return err + } + } + // Check if the provider is supported. + if newConnFunc, ok := prvd.List()[provider]; ok { + newConn, err := newConnFunc(ctx, config) + if err != nil { + return err + } + // Add the new connection and provider to the maps. + if s.connections == nil { + s.connections = map[string]connection.Connection{} + } + if s.providers == nil { + s.providers = map[string]string{} + } + s.connections[name] = newConn + s.providers[name] = provider + return nil + } + log.Info(fmt.Sprintf("Pub-sub provider %s is not supported", provider)) + return nil +} + +func (s *System) CloseConnection(connection string) error { + s.mux.Lock() + defer s.mux.Unlock() + if len(s.connections) > 0 { + if c, ok := s.connections[connection]; ok { + err := c.CloseConnection() + if err != nil { + return err + } + delete(s.connections, connection) + delete(s.providers, connection) + } + } + return nil +} diff --git a/pkg/pubsub/system_test.go b/pkg/pubsub/system_test.go new file mode 100644 index 00000000000..532364954b3 --- /dev/null +++ b/pkg/pubsub/system_test.go @@ -0,0 +1,27 @@ +package pubsub + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSystem(t *testing.T) { + tests := []struct { + name string + input string + want *System + }{ + { + name: "requesting system", + want: &System{}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ret := NewSystem() + assert.Equal(t, ret, tc.want) + }) + } +} diff --git a/test/bats/helpers.bash b/test/bats/helpers.bash index 75535abca06..e2acb9e1205 100644 --- a/test/bats/helpers.bash +++ b/test/bats/helpers.bash @@ -137,4 +137,11 @@ mutator_enforced() { local ready_count=$(echo "${cstr}" | jq '.metadata.generation as $generation | [.status.byPod[] | select( .operations[] == "mutation-webhook" and .observedGeneration == $generation)] | length') echo "ready: ${ready_count}, expected: ${pod_count}" [[ "${ready_count}" -eq "${pod_count}" ]] -} \ No newline at end of file +} + +total_violations() { + ct_total_violations="$(kubectl get k8srequiredlabels pod-must-have-test -n gatekeeper-system -ojson | jq '.status.totalViolations')" + audit_id="$(kubectl get k8srequiredlabels pod-must-have-test -n gatekeeper-system -ojson | jq '.status.auditTimestamp')" + violations="$(kubectl logs -n fake-subscriber -l app=sub -c go-sub --tail=-1 | grep $audit_id | grep violation_audited | wc -l)" + [[ "${ct_total_violations}" -eq "${violations}" ]] +} diff --git a/test/bats/test.bats b/test/bats/test.bats index e158a97169d..dc7ef017afa 100644 --- a/test/bats/test.bats +++ b/test/bats/test.bats @@ -497,3 +497,24 @@ __expansion_audit_test() { run kubectl delete --ignore-not-found -f test/expansion/expand_cronjob_job_pod.yaml run kubectl delete --ignore-not-found -f test/expansion/expand_pod_cronjob.yaml } + +@test "gatekeeper pubsub test" { + if [ -z $ENABLE_PUBSUB_TESTS ]; then + skip "skipping pubsub tests" + fi + + run kubectl create ns nginx + run kubectl create -f test/pubsub/nginx_deployment.yaml + + run kubectl apply -f test/pubsub/k8srequiredlabels_ct.yaml + run kubectl apply -f test/pubsub/pod_must_have_test.yaml + + wait_for_process ${WAIT_TIME} ${SLEEP_TIME} "constraint_enforced k8srequiredlabels pod-must-have-test" + + wait_for_process ${WAIT_TIME} ${SLEEP_TIME} "total_violations" + + run kubectl delete -f test/pubsub/k8srequiredlabels_ct.yaml --ignore-not-found + run kubectl delete -f test/pubsub/pod_must_have_test.yaml --ignore-not-found + run kubectl delete -f test/pubsub/nginx_deployment.yaml --ignore-not-found + run kubectl delete ns nginx --ignore-not-found +} diff --git a/test/pubsub/fake-subscriber/Dockerfile b/test/pubsub/fake-subscriber/Dockerfile new file mode 100644 index 00000000000..30f7c1f7a65 --- /dev/null +++ b/test/pubsub/fake-subscriber/Dockerfile @@ -0,0 +1,35 @@ +ARG BUILDPLATFORM="linux/amd64" +ARG BUILDERIMAGE="golang:1.20-bullseye" +ARG BASEIMAGE="gcr.io/distroless/static:nonroot" + +FROM --platform=$BUILDPLATFORM $BUILDERIMAGE as builder + +ARG TARGETPLATFORM +ARG TARGETOS +ARG TARGETARCH +ARG TARGETVARIANT="" +ARG LDFLAGS + +ENV GO111MODULE=on \ + CGO_ENABLED=0 \ + GOOS=${TARGETOS} \ + GOARCH=${TARGETARCH} \ + GOARM=${TARGETVARIANT} + +WORKDIR /go/src/github.com/open-policy-agent/gatekeeper/test/pubsub/fake-subscriber + +COPY . . + +RUN go mod init && go mod tidy && go mod vendor + +RUN go build -o main + +FROM $BASEIMAGE + +WORKDIR / + +COPY --from=builder /go/src/github.com/open-policy-agent/gatekeeper/test/pubsub/fake-subscriber/main . + +USER 65532:65532 + +ENTRYPOINT ["/main"] diff --git a/test/pubsub/fake-subscriber/main.go b/test/pubsub/fake-subscriber/main.go new file mode 100644 index 00000000000..9831cbe2b2b --- /dev/null +++ b/test/pubsub/fake-subscriber/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "context" + "encoding/json" + "log" + "strconv" + + "github.com/dapr/go-sdk/service/common" + daprd "github.com/dapr/go-sdk/service/http" +) + +type PubsubMsg struct { + ID string `json:"id,omitempty"` + Details interface{} `json:"details,omitempty"` + EventType string `json:"eventType,omitempty"` + Group string `json:"group,omitempty"` + Version string `json:"version,omitempty"` + Kind string `json:"kind,omitempty"` + Name string `json:"name,omitempty"` + Namespace string `json:"namespace,omitempty"` + Message string `json:"message,omitempty"` + EnforcementAction string `json:"enforcementAction,omitempty"` + ConstraintAnnotations map[string]string `json:"constraintAnnotations,omitempty"` + ResourceGroup string `json:"resourceGroup,omitempty"` + ResourceAPIVersion string `json:"resourceAPIVersion,omitempty"` + ResourceKind string `json:"resourceKind,omitempty"` + ResourceNamespace string `json:"resourceNamespace,omitempty"` + ResourceName string `json:"resourceName,omitempty"` + ResourceLabels map[string]string `json:"resourceLabels,omitempty"` +} + +var sub = &common.Subscription{ + PubsubName: "pubsub", + Topic: "audit", + Route: "/checkout", +} + +func main() { + s := daprd.NewService(":6002") + log.Printf("Listening...") + if err := s.AddTopicEventHandler(sub, eventHandler); err != nil { + log.Fatalf("error adding topic subscription: %v", err) + } + if err := s.Start(); err != nil { + log.Fatalf("error listening: %v", err) + } +} + +func eventHandler(_ context.Context, e *common.TopicEvent) (retry bool, err error) { + var msg PubsubMsg + jsonInput, err := strconv.Unquote(string(e.RawData)) + if err != nil { + log.Fatalf("error unquoting %v", err) + } + if err := json.Unmarshal([]byte(jsonInput), &msg); err != nil { + log.Fatalf("error %v", err) + } + + log.Printf("%#v", msg) + return false, nil +} diff --git a/test/pubsub/fake-subscriber/manifest/subscriber.yaml b/test/pubsub/fake-subscriber/manifest/subscriber.yaml new file mode 100644 index 00000000000..d0372ed6350 --- /dev/null +++ b/test/pubsub/fake-subscriber/manifest/subscriber.yaml @@ -0,0 +1,43 @@ +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: pubsub + namespace: fake-subscriber +spec: + type: pubsub.redis + version: v1 + metadata: + - name: redisHost + value: redis-master.default.svc.cluster.local:6379 + - name: redisPassword + secretKeyRef: + name: redis + key: redis-password +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: sub + namespace: fake-subscriber + labels: + app: sub +spec: + replicas: 1 + selector: + matchLabels: + app: sub + template: + metadata: + labels: + app: sub + annotations: + dapr.io/enabled: "true" + dapr.io/app-id: "subscriber" + dapr.io/enable-api-logging: "true" + dapr.io/app-port: "6002" + spec: + containers: + - name: go-sub + image: fake-subscriber:latest + imagePullPolicy: Never diff --git a/test/pubsub/k8srequiredlabels_ct.yaml b/test/pubsub/k8srequiredlabels_ct.yaml new file mode 100644 index 00000000000..4437a1a19cb --- /dev/null +++ b/test/pubsub/k8srequiredlabels_ct.yaml @@ -0,0 +1,29 @@ +apiVersion: templates.gatekeeper.sh/v1 +kind: ConstraintTemplate +metadata: + name: k8srequiredlabels +spec: + crd: + spec: + names: + kind: K8sRequiredLabels + validation: + # Schema for the `parameters` field + openAPIV3Schema: + type: object + properties: + labels: + type: array + items: + type: string + targets: + - target: admission.k8s.gatekeeper.sh + rego: | + package k8srequiredlabels + violation[{"msg": msg, "details": {"missing_labels": missing}}] { + provided := {label | input.review.object.metadata.labels[label]} + required := {label | label := input.parameters.labels[_]} + missing := required - provided + count(missing) > 0 + msg := sprintf("you must provide labels: %v", [missing]) + } diff --git a/test/pubsub/nginx_deployment.yaml b/test/pubsub/nginx_deployment.yaml new file mode 100644 index 00000000000..f3bdc4befc4 --- /dev/null +++ b/test/pubsub/nginx_deployment.yaml @@ -0,0 +1,22 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + namespace: nginx + labels: + app: nginx +spec: + replicas: 4 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 diff --git a/test/pubsub/pod_must_have_test.yaml b/test/pubsub/pod_must_have_test.yaml new file mode 100644 index 00000000000..3143283304a --- /dev/null +++ b/test/pubsub/pod_must_have_test.yaml @@ -0,0 +1,13 @@ +apiVersion: constraints.gatekeeper.sh/v1beta1 +kind: K8sRequiredLabels +metadata: + name: pod-must-have-test +spec: + match: + scope: "Namespaced" + namespaces: [ "nginx" ] + kinds: + - apiGroups: [ "" ] + kinds: [ "Pod" ] + parameters: + labels: [ "test" ] diff --git a/test/pubsub/publish-components.yaml b/test/pubsub/publish-components.yaml new file mode 100644 index 00000000000..9686935dd01 --- /dev/null +++ b/test/pubsub/publish-components.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: pubsub + namespace: gatekeeper-system +spec: + type: pubsub.redis + version: v1 + metadata: + - name: redisHost + value: redis-master.default.svc.cluster.local:6379 + - name: redisPassword + secretKeyRef: + name: redis + key: redis-password +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: audit + namespace: gatekeeper-system +data: + provider: "dapr" + config: | + { + "component": "pubsub" + } diff --git a/vendor/cloud.google.com/go/trace/apiv2/doc.go b/vendor/cloud.google.com/go/trace/apiv2/doc.go index b36528c9be0..9641f7396f5 100644 --- a/vendor/cloud.google.com/go/trace/apiv2/doc.go +++ b/vendor/cloud.google.com/go/trace/apiv2/doc.go @@ -1,4 +1,4 @@ -// Copyright 2022 Google LLC +// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -23,6 +23,11 @@ // interact with the Trace API directly. If you are looking to instrument // your application for Stackdriver Trace, we recommend using OpenCensus. // +// # General documentation +// +// For information about setting deadlines, reusing contexts, and more +// please visit https://pkg.go.dev/cloud.google.com/go. +// // # Example usage // // To get started with this package, create a client. @@ -75,13 +80,12 @@ // Individual methods on the client use the ctx given to them. // // To close the open connection, use the Close() method. -// -// For information about setting deadlines, reusing contexts, and more -// please visit https://pkg.go.dev/cloud.google.com/go. package trace // import "cloud.google.com/go/trace/apiv2" import ( "context" + "fmt" + "net/http" "os" "runtime" "strconv" @@ -171,3 +175,22 @@ func versionGo() string { } return "UNKNOWN" } + +// maybeUnknownEnum wraps the given proto-JSON parsing error if it is the result +// of receiving an unknown enum value. +func maybeUnknownEnum(err error) error { + if strings.Contains(err.Error(), "invalid value for enum type") { + err = fmt.Errorf("received an unknown enum value; a later version of the library may support it: %w", err) + } + return err +} + +// buildHeaders extracts metadata from the outgoing context, joins it with any other +// given metadata, and converts them into a http.Header. +func buildHeaders(ctx context.Context, mds ...metadata.MD) http.Header { + if cmd, ok := metadata.FromOutgoingContext(ctx); ok { + mds = append(mds, cmd) + } + md := metadata.Join(mds...) + return http.Header(md) +} diff --git a/vendor/cloud.google.com/go/trace/apiv2/gapic_metadata.json b/vendor/cloud.google.com/go/trace/apiv2/gapic_metadata.json index ef3c8d6d045..566e48c5cb8 100644 --- a/vendor/cloud.google.com/go/trace/apiv2/gapic_metadata.json +++ b/vendor/cloud.google.com/go/trace/apiv2/gapic_metadata.json @@ -21,6 +21,21 @@ ] } } + }, + "rest": { + "libraryClient": "Client", + "rpcs": { + "BatchWriteSpans": { + "methods": [ + "BatchWriteSpans" + ] + }, + "CreateSpan": { + "methods": [ + "CreateSpan" + ] + } + } } } } diff --git a/vendor/cloud.google.com/go/trace/apiv2/trace_client.go b/vendor/cloud.google.com/go/trace/apiv2/trace_client.go index 6b803f9d0c4..0548b799293 100644 --- a/vendor/cloud.google.com/go/trace/apiv2/trace_client.go +++ b/vendor/cloud.google.com/go/trace/apiv2/trace_client.go @@ -1,4 +1,4 @@ -// Copyright 2022 Google LLC +// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,20 +17,26 @@ package trace import ( + "bytes" "context" "fmt" + "io/ioutil" "math" + "net/http" "net/url" "time" tracepb "cloud.google.com/go/trace/apiv2/tracepb" gax "github.com/googleapis/gax-go/v2" + "google.golang.org/api/googleapi" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" + httptransport "google.golang.org/api/transport/http" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" + "google.golang.org/protobuf/encoding/protojson" ) var newClientHook clientHook @@ -55,7 +61,18 @@ func defaultGRPCClientOptions() []option.ClientOption { func defaultCallOptions() *CallOptions { return &CallOptions{ - BatchWriteSpans: []gax.CallOption{}, + BatchWriteSpans: []gax.CallOption{ + gax.WithRetry(func() gax.Retryer { + return gax.OnCodes([]codes.Code{ + codes.Unavailable, + codes.DeadlineExceeded, + }, gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 30000 * time.Millisecond, + Multiplier: 2.00, + }) + }), + }, CreateSpan: []gax.CallOption{ gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ @@ -71,6 +88,33 @@ func defaultCallOptions() *CallOptions { } } +func defaultRESTCallOptions() *CallOptions { + return &CallOptions{ + BatchWriteSpans: []gax.CallOption{ + gax.WithRetry(func() gax.Retryer { + return gax.OnHTTPCodes(gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 30000 * time.Millisecond, + Multiplier: 2.00, + }, + http.StatusServiceUnavailable, + http.StatusGatewayTimeout) + }), + }, + CreateSpan: []gax.CallOption{ + gax.WithRetry(func() gax.Retryer { + return gax.OnHTTPCodes(gax.Backoff{ + Initial: 100 * time.Millisecond, + Max: 1000 * time.Millisecond, + Multiplier: 1.20, + }, + http.StatusServiceUnavailable, + http.StatusGatewayTimeout) + }), + }, + } +} + // internalClient is an interface that defines the methods available from Stackdriver Trace API. type internalClient interface { Close() error @@ -83,11 +127,13 @@ type internalClient interface { // Client is a client for interacting with Stackdriver Trace API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // -// This file describes an API for collecting and viewing traces and spans -// within a trace. A Trace is a collection of spans corresponding to a single -// operation or set of operations for an application. A span is an individual -// timed event which forms a node of the trace tree. A single trace may -// contain span(s) from multiple services. +// Service for collecting and viewing traces and spans within a trace. +// +// A trace is a collection of spans corresponding to a single +// operation or a set of operations in an application. +// +// A span is an individual timed event which forms a node of the trace tree. +// A single trace can contain spans from multiple services. type Client struct { // The internal transport-dependent client. internalClient internalClient @@ -119,7 +165,7 @@ func (c *Client) Connection() *grpc.ClientConn { return c.internalClient.Connection() } -// BatchWriteSpans sends new spans to new or existing traces. You cannot update +// BatchWriteSpans batch writes new spans to new or existing traces. You cannot update // existing spans. func (c *Client) BatchWriteSpans(ctx context.Context, req *tracepb.BatchWriteSpansRequest, opts ...gax.CallOption) error { return c.internalClient.BatchWriteSpans(ctx, req, opts...) @@ -153,11 +199,13 @@ type gRPCClient struct { // NewClient creates a new trace service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // -// This file describes an API for collecting and viewing traces and spans -// within a trace. A Trace is a collection of spans corresponding to a single -// operation or set of operations for an application. A span is an individual -// timed event which forms a node of the trace tree. A single trace may -// contain span(s) from multiple services. +// Service for collecting and viewing traces and spans within a trace. +// +// A trace is a collection of spans corresponding to a single +// operation or a set of operations in an application. +// +// A span is an individual timed event which forms a node of the trace tree. +// A single trace can contain spans from multiple services. func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { clientOpts := defaultGRPCClientOptions() if newClientHook != nil { @@ -215,6 +263,80 @@ func (c *gRPCClient) Close() error { return c.connPool.Close() } +// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. +type restClient struct { + // The http endpoint to connect to. + endpoint string + + // The http client. + httpClient *http.Client + + // The x-goog-* metadata to be sent with each request. + xGoogMetadata metadata.MD + + // Points back to the CallOptions field of the containing Client + CallOptions **CallOptions +} + +// NewRESTClient creates a new trace service rest client. +// +// Service for collecting and viewing traces and spans within a trace. +// +// A trace is a collection of spans corresponding to a single +// operation or a set of operations in an application. +// +// A span is an individual timed event which forms a node of the trace tree. +// A single trace can contain spans from multiple services. +func NewRESTClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { + clientOpts := append(defaultRESTClientOptions(), opts...) + httpClient, endpoint, err := httptransport.NewClient(ctx, clientOpts...) + if err != nil { + return nil, err + } + + callOpts := defaultRESTCallOptions() + c := &restClient{ + endpoint: endpoint, + httpClient: httpClient, + CallOptions: &callOpts, + } + c.setGoogleClientInfo() + + return &Client{internalClient: c, CallOptions: callOpts}, nil +} + +func defaultRESTClientOptions() []option.ClientOption { + return []option.ClientOption{ + internaloption.WithDefaultEndpoint("https://cloudtrace.googleapis.com"), + internaloption.WithDefaultMTLSEndpoint("https://cloudtrace.mtls.googleapis.com"), + internaloption.WithDefaultAudience("https://cloudtrace.googleapis.com/"), + internaloption.WithDefaultScopes(DefaultAuthScopes()...), + } +} + +// setGoogleClientInfo sets the name and version of the application in +// the `x-goog-api-client` header passed on each request. Intended for +// use by Google-written clients. +func (c *restClient) setGoogleClientInfo(keyval ...string) { + kv := append([]string{"gl-go", versionGo()}, keyval...) + kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "rest", "UNKNOWN") + c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) +} + +// Close closes the connection to the API service. The user should invoke this when +// the client is no longer required. +func (c *restClient) Close() error { + // Replace httpClient with nil to force cleanup. + c.httpClient = nil + return nil +} + +// Connection returns a connection to the API service. +// +// Deprecated: This method always returns nil. +func (c *restClient) Connection() *grpc.ClientConn { + return nil +} func (c *gRPCClient) BatchWriteSpans(ctx context.Context, req *tracepb.BatchWriteSpansRequest, opts ...gax.CallOption) error { if _, ok := ctx.Deadline(); !ok && !c.disableDeadlines { cctx, cancel := context.WithTimeout(ctx, 120000*time.Millisecond) @@ -254,3 +376,114 @@ func (c *gRPCClient) CreateSpan(ctx context.Context, req *tracepb.Span, opts ... } return resp, nil } + +// BatchWriteSpans batch writes new spans to new or existing traces. You cannot update +// existing spans. +func (c *restClient) BatchWriteSpans(ctx context.Context, req *tracepb.BatchWriteSpansRequest, opts ...gax.CallOption) error { + m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} + jsonReq, err := m.Marshal(req) + if err != nil { + return err + } + + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return err + } + baseUrl.Path += fmt.Sprintf("/v2/%v/traces:batchWrite", req.GetName()) + + params := url.Values{} + params.Add("$alt", "json;enum-encoding=int") + + baseUrl.RawQuery = params.Encode() + + // Build HTTP headers from client and context metadata. + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) + + headers := buildHeaders(ctx, c.xGoogMetadata, md, metadata.Pairs("Content-Type", "application/json")) + return gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) + if err != nil { + return err + } + httpReq = httpReq.WithContext(ctx) + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil { + return err + } + defer httpRsp.Body.Close() + + // Returns nil if there is no error, otherwise wraps + // the response code and body into a non-nil error + return googleapi.CheckResponse(httpRsp) + }, opts...) +} + +// CreateSpan creates a new span. +func (c *restClient) CreateSpan(ctx context.Context, req *tracepb.Span, opts ...gax.CallOption) (*tracepb.Span, error) { + m := protojson.MarshalOptions{AllowPartial: true, UseEnumNumbers: true} + jsonReq, err := m.Marshal(req) + if err != nil { + return nil, err + } + + baseUrl, err := url.Parse(c.endpoint) + if err != nil { + return nil, err + } + baseUrl.Path += fmt.Sprintf("/v2/%v", req.GetName()) + + params := url.Values{} + params.Add("$alt", "json;enum-encoding=int") + + baseUrl.RawQuery = params.Encode() + + // Build HTTP headers from client and context metadata. + md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) + + headers := buildHeaders(ctx, c.xGoogMetadata, md, metadata.Pairs("Content-Type", "application/json")) + opts = append((*c.CallOptions).CreateSpan[0:len((*c.CallOptions).CreateSpan):len((*c.CallOptions).CreateSpan)], opts...) + unm := protojson.UnmarshalOptions{AllowPartial: true, DiscardUnknown: true} + resp := &tracepb.Span{} + e := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { + if settings.Path != "" { + baseUrl.Path = settings.Path + } + httpReq, err := http.NewRequest("POST", baseUrl.String(), bytes.NewReader(jsonReq)) + if err != nil { + return err + } + httpReq = httpReq.WithContext(ctx) + httpReq.Header = headers + + httpRsp, err := c.httpClient.Do(httpReq) + if err != nil { + return err + } + defer httpRsp.Body.Close() + + if err = googleapi.CheckResponse(httpRsp); err != nil { + return err + } + + buf, err := ioutil.ReadAll(httpRsp.Body) + if err != nil { + return err + } + + if err := unm.Unmarshal(buf, resp); err != nil { + return maybeUnknownEnum(err) + } + + return nil + }, opts...) + if e != nil { + return nil, e + } + return resp, nil +} diff --git a/vendor/cloud.google.com/go/trace/apiv2/tracepb/trace.pb.go b/vendor/cloud.google.com/go/trace/apiv2/tracepb/trace.pb.go index d0b06738232..95001d459e2 100644 --- a/vendor/cloud.google.com/go/trace/apiv2/tracepb/trace.pb.go +++ b/vendor/cloud.google.com/go/trace/apiv2/tracepb/trace.pb.go @@ -1,4 +1,4 @@ -// Copyright 2020 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.21.5 +// protoc v3.21.9 // source: google/devtools/cloudtrace/v2/trace.proto package tracepb @@ -224,8 +224,10 @@ func (Span_Link_Type) EnumDescriptor() ([]byte, []int) { // A span represents a single operation within a trace. Spans can be // nested to form a trace tree. Often, a trace contains a root span // that describes the end-to-end latency, and one or more subspans for -// its sub-operations. A trace can also contain multiple root spans, -// or none at all. Spans do not need to be contiguous—there may be +// its sub-operations. +// +// A trace can also contain multiple root spans, or none at all. +// Spans do not need to be contiguous. There might be // gaps or overlaps between spans in a trace. type Span struct { state protoimpl.MessageState @@ -234,34 +236,38 @@ type Span struct { // Required. The resource name of the span in the following format: // - // projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/[SPAN_ID] + // - `projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/[SPAN_ID]` // - // [TRACE_ID] is a unique identifier for a trace within a project; - // it is a 32-character hexadecimal encoding of a 16-byte array. + // `[TRACE_ID]` is a unique identifier for a trace within a project; + // it is a 32-character hexadecimal encoding of a 16-byte array. It should + // not be zero. // - // [SPAN_ID] is a unique identifier for a span within a trace; it - // is a 16-character hexadecimal encoding of an 8-byte array. + // `[SPAN_ID]` is a unique identifier for a span within a trace; it + // is a 16-character hexadecimal encoding of an 8-byte array. It should not + // be zero. + // . Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Required. The [SPAN_ID] portion of the span's resource name. + // Required. The `[SPAN_ID]` portion of the span's resource name. SpanId string `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` - // The [SPAN_ID] of this span's parent span. If this is a root span, + // The `[SPAN_ID]` of this span's parent span. If this is a root span, // then this field must be empty. ParentSpanId string `protobuf:"bytes,3,opt,name=parent_span_id,json=parentSpanId,proto3" json:"parent_span_id,omitempty"` // Required. A description of the span's operation (up to 128 bytes). - // Stackdriver Trace displays the description in the - // Google Cloud Platform Console. + // Cloud Trace displays the description in the + // Cloud console. // For example, the display name can be a qualified method name or a file name // and a line number where the operation is called. A best practice is to use // the same display name within an application and at the same call point. // This makes it easier to correlate spans in different traces. DisplayName *TruncatableString `protobuf:"bytes,4,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // Required. The start time of the span. On the client side, this is the time kept by - // the local machine where the span execution starts. On the server side, this - // is the time when the server's application handler starts running. + // Required. The start time of the span. On the client side, this is the time + // kept by the local machine where the span execution starts. On the server + // side, this is the time when the server's application handler starts + // running. StartTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - // Required. The end time of the span. On the client side, this is the time kept by - // the local machine where the span execution ends. On the server side, this - // is the time when the server application handler stops running. + // Required. The end time of the span. On the client side, this is the time + // kept by the local machine where the span execution ends. On the server + // side, this is the time when the server application handler stops running. EndTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` // A set of attributes on the span. You can have up to 32 attributes per // span. @@ -277,15 +283,14 @@ type Span struct { Status *status.Status `protobuf:"bytes,11,opt,name=status,proto3" json:"status,omitempty"` // Optional. Set this parameter to indicate whether this span is in // the same process as its parent. If you do not set this parameter, - // Stackdriver Trace is unable to take advantage of this helpful - // information. + // Trace is unable to take advantage of this helpful information. SameProcessAsParentSpan *wrapperspb.BoolValue `protobuf:"bytes,12,opt,name=same_process_as_parent_span,json=sameProcessAsParentSpan,proto3" json:"same_process_as_parent_span,omitempty"` // Optional. The number of child spans that were generated while this span // was active. If set, allows implementation to detect missing child spans. ChildSpanCount *wrapperspb.Int32Value `protobuf:"bytes,13,opt,name=child_span_count,json=childSpanCount,proto3" json:"child_span_count,omitempty"` - // Optional. Distinguishes between spans generated in a particular context. For example, - // two spans with the same name may be distinguished using `CLIENT` (caller) - // and `SERVER` (callee) to identify an RPC call. + // Optional. Distinguishes between spans generated in a particular context. + // For example, two spans with the same name may be distinguished using + // `CLIENT` (caller) and `SERVER` (callee) to identify an RPC call. SpanKind Span_SpanKind `protobuf:"varint,14,opt,name=span_kind,json=spanKind,proto3,enum=google.devtools.cloudtrace.v2.Span_SpanKind" json:"span_kind,omitempty"` } @@ -419,7 +424,7 @@ func (x *Span) GetSpanKind() Span_SpanKind { return Span_SPAN_KIND_UNSPECIFIED } -// The allowed types for [VALUE] in a `[KEY]:[VALUE]` attribute. +// The allowed types for `[VALUE]` in a `[KEY]:[VALUE]` attribute. type AttributeValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -711,15 +716,15 @@ func (x *TruncatableString) GetTruncatedByteCount() int32 { return 0 } -// A set of attributes, each in the format `[KEY]:[VALUE]`. +// A set of attributes as key-value pairs. type Span_Attributes struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The set of attributes. Each attribute's key can be up to 128 bytes + // A set of attributes. Each attribute's key can be up to 128 bytes // long. The value can be a string up to 256 bytes, a signed 64-bit integer, - // or the Boolean values `true` and `false`. For example: + // or the boolean values `true` or `false`. For example: // // "/instance_id": { "string_value": { "value": "my-instance" } } // "/http/request_bytes": { "int_value": 300 } @@ -953,14 +958,14 @@ type Span_Link struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The [TRACE_ID] for a trace within a project. + // The `[TRACE_ID]` for a trace within a project. TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` - // The [SPAN_ID] for a span within a trace. + // The `[SPAN_ID]` for a span within a trace. SpanId string `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` // The relationship of the current span relative to the linked span. Type Span_Link_Type `protobuf:"varint,3,opt,name=type,proto3,enum=google.devtools.cloudtrace.v2.Span_Link_Type" json:"type,omitempty"` - // A set of attributes on the link. You have have up to 32 attributes per - // link. + // A set of attributes on the link. Up to 32 attributes can be + // specified per link. Attributes *Span_Attributes `protobuf:"bytes,4,opt,name=attributes,proto3" json:"attributes,omitempty"` } @@ -1154,13 +1159,13 @@ type Span_TimeEvent_MessageEvent struct { // received. Type Span_TimeEvent_MessageEvent_Type `protobuf:"varint,1,opt,name=type,proto3,enum=google.devtools.cloudtrace.v2.Span_TimeEvent_MessageEvent_Type" json:"type,omitempty"` // An identifier for the MessageEvent's message that can be used to match - // SENT and RECEIVED MessageEvents. It is recommended to be unique within - // a Span. + // `SENT` and `RECEIVED` MessageEvents. Id int64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` // The number of uncompressed bytes sent or received. UncompressedSizeBytes int64 `protobuf:"varint,3,opt,name=uncompressed_size_bytes,json=uncompressedSizeBytes,proto3" json:"uncompressed_size_bytes,omitempty"` - // The number of compressed bytes sent or received. If missing assumed to - // be the same size as uncompressed. + // The number of compressed bytes sent or received. If missing, the + // compressed size is assumed to be the same size as the uncompressed + // size. CompressedSizeBytes int64 `protobuf:"varint,4,opt,name=compressed_size_bytes,json=compressedSizeBytes,proto3" json:"compressed_size_bytes,omitempty"` } @@ -1233,9 +1238,10 @@ type StackTrace_StackFrame struct { // The fully-qualified name that uniquely identifies the function or // method that is active in this frame (up to 1024 bytes). FunctionName *TruncatableString `protobuf:"bytes,1,opt,name=function_name,json=functionName,proto3" json:"function_name,omitempty"` - // An un-mangled function name, if `function_name` is - // [mangled](http://www.avabodh.com/cxxin/namemangling.html). The name can - // be fully-qualified (up to 1024 bytes). + // An un-mangled function name, if `function_name` is mangled. + // To get information about name mangling, run + // [this search](https://www.google.com/search?q=cxx+name+mangling). + // The name can be fully-qualified (up to 1024 bytes). OriginalFunctionName *TruncatableString `protobuf:"bytes,2,opt,name=original_function_name,json=originalFunctionName,proto3" json:"original_function_name,omitempty"` // The name of the source file where the function call appears (up to 256 // bytes). diff --git a/vendor/cloud.google.com/go/trace/apiv2/tracepb/tracing.pb.go b/vendor/cloud.google.com/go/trace/apiv2/tracepb/tracing.pb.go index 604153c5792..6584c63b6b3 100644 --- a/vendor/cloud.google.com/go/trace/apiv2/tracepb/tracing.pb.go +++ b/vendor/cloud.google.com/go/trace/apiv2/tracepb/tracing.pb.go @@ -1,4 +1,4 @@ -// Copyright 2020 Google LLC +// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.21.5 +// protoc v3.21.9 // source: google/devtools/cloudtrace/v2/tracing.proto package tracepb @@ -51,7 +51,7 @@ type BatchWriteSpansRequest struct { // `projects/[PROJECT_ID]`. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Required. A list of new spans. The span names must not match existing - // spans, or the results are undefined. + // spans, otherwise the results are undefined. Spans []*Span `protobuf:"bytes,2,rep,name=spans,proto3" json:"spans,omitempty"` } @@ -257,7 +257,7 @@ const _ = grpc.SupportPackageIsVersion6 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type TraceServiceClient interface { - // Sends new spans to new or existing traces. You cannot update + // Batch writes new spans to new or existing traces. You cannot update // existing spans. BatchWriteSpans(ctx context.Context, in *BatchWriteSpansRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Creates a new span. @@ -292,7 +292,7 @@ func (c *traceServiceClient) CreateSpan(ctx context.Context, in *Span, opts ...g // TraceServiceServer is the server API for TraceService service. type TraceServiceServer interface { - // Sends new spans to new or existing traces. You cannot update + // Batch writes new spans to new or existing traces. You cannot update // existing spans. BatchWriteSpans(context.Context, *BatchWriteSpansRequest) (*emptypb.Empty, error) // Creates a new span. diff --git a/vendor/cloud.google.com/go/trace/apiv2/version.go b/vendor/cloud.google.com/go/trace/apiv2/version.go index b52392b7872..ac7a1bda595 100644 --- a/vendor/cloud.google.com/go/trace/apiv2/version.go +++ b/vendor/cloud.google.com/go/trace/apiv2/version.go @@ -1,4 +1,4 @@ -// Copyright 2022 Google LLC +// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/vendor/cloud.google.com/go/trace/internal/version.go b/vendor/cloud.google.com/go/trace/internal/version.go index 9fa087b74c6..0ad9373b3b5 100644 --- a/vendor/cloud.google.com/go/trace/internal/version.go +++ b/vendor/cloud.google.com/go/trace/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.4.0" +const Version = "1.8.0" diff --git a/vendor/github.com/dapr/go-sdk/LICENSE b/vendor/github.com/dapr/go-sdk/LICENSE new file mode 100644 index 00000000000..c2c85ba5774 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/LICENSE @@ -0,0 +1,204 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021 The Dapr Authors. + + and others that have contributed code to the public domain. + + 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. diff --git a/vendor/github.com/dapr/go-sdk/actor/actor.go b/vendor/github.com/dapr/go-sdk/actor/actor.go new file mode 100644 index 00000000000..4dfaa79c6ba --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/actor.go @@ -0,0 +1,102 @@ +/* +Copyright 2021 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 actor + +import ( + "sync" +) + +// Client is the interface that should be impl by user's actor client. +type Client interface { + // Type defines the type of the actor server to be invoke + Type() string + // ID should be unique, the actor server with target ID would be created before server processing the invocation. + ID() string +} + +// Server is the interface that would be impl by user's actor server with ServerImplBase +/* +Actor user should only impls func Type() string, and his user-defined-method, Other function could be impl by +combining ServerImplBase. +*/ +type Server interface { + // ID is impl by ServerImplBase. It can be called by user defined actor function to get the actor ID of it's instance. + ID() string + // SetID is impl by ServerImplBase. It is called by actor container to inject actor ID of the instance, and should + // not called by user + SetID(string) + // Type is defined by user + Type() string + // SetStateManager is impl by ServerImplBase to inject StateManager to this actor instance + SetStateManager(StateManager) + // SaveState is impl by ServerImplBase, It saves the state cache of this actor instance to state store component by calling api of daprd. + // Save state is called at two places: 1. On invocation of this actor instance. 2. When new actor starts. + SaveState() error +} + +type ReminderCallee interface { + ReminderCall(string, []byte, string, string) +} + +type Factory func() Server + +type ServerImplBase struct { + stateManager StateManager + once sync.Once + id string +} + +func (b *ServerImplBase) SetStateManager(stateManager StateManager) { + b.stateManager = stateManager +} + +// GetStateManager can be called by user-defined-method, to get state manager of this actor instance. +func (b *ServerImplBase) GetStateManager() StateManager { + return b.stateManager +} + +func (b *ServerImplBase) ID() string { + return b.id +} + +func (b *ServerImplBase) SetID(id string) { + b.once.Do(func() { + b.id = id + }) +} + +// SaveState is to saves the state cache of this actor instance to state store component by calling api of daprd. +func (b *ServerImplBase) SaveState() error { + if b.stateManager != nil { + return b.stateManager.Save() + } + return nil +} + +type StateManager interface { + // Add is to add new state store with @stateName and @value + Add(stateName string, value interface{}) error + // Get is to get state store of @stateName with type @reply + Get(stateName string, reply interface{}) error + // Set is to set new state store with @stateName and @value + Set(stateName string, value interface{}) error + // Remove is to remove state store with @stateName + Remove(stateName string) error + // Contains is to check if state store contains @stateName + Contains(stateName string) (bool, error) + // Save is to saves the state cache of this actor instance to state store component by calling api of daprd. + Save() error + // Flush is called by stateManager after Save + Flush() +} diff --git a/vendor/github.com/dapr/go-sdk/actor/api/reminder.go b/vendor/github.com/dapr/go-sdk/actor/api/reminder.go new file mode 100644 index 00000000000..5fc2f78ee76 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/api/reminder.go @@ -0,0 +1,21 @@ +/* +Copyright 2021 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 api + +type ActorReminderParams struct { + Data []byte `json:"data"` + DueTime string `json:"dueTime"` + Period string `json:"period"` + TTL string `json:"ttl"` +} diff --git a/vendor/github.com/dapr/go-sdk/actor/api/runtime.go b/vendor/github.com/dapr/go-sdk/actor/api/runtime.go new file mode 100644 index 00000000000..58c0eb6446d --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/api/runtime.go @@ -0,0 +1,22 @@ +/* +Copyright 2021 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 api + +type ActorRuntimeConfig struct { + RegisteredActorTypes []string `json:"entities"` + ActorIdleTimeout string `json:"actorIdleTimeout"` + ActorScanInterval string `json:"actorScanInterval"` + DrainOngingCallTimeout string `json:"drainOngoingCallTimeout"` + DrainBalancedActors bool `json:"drainRebalancedActors"` +} diff --git a/vendor/github.com/dapr/go-sdk/actor/api/timer.go b/vendor/github.com/dapr/go-sdk/actor/api/timer.go new file mode 100644 index 00000000000..ad118283ac5 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/api/timer.go @@ -0,0 +1,22 @@ +/* +Copyright 2021 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 api + +type ActorTimerParam struct { + CallBack string `json:"callback"` + Data []byte `json:"data"` + DueTime string `json:"dueTime"` + Period string `json:"period"` + TTL string `json:"ttl"` +} diff --git a/vendor/github.com/dapr/go-sdk/actor/codec/codec.go b/vendor/github.com/dapr/go-sdk/actor/codec/codec.go new file mode 100644 index 00000000000..6e84e160dc4 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/codec/codec.go @@ -0,0 +1,42 @@ +/* +Copyright 2021 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 codec + +import perrors "github.com/pkg/errors" + +// Codec is serializer interface. +type Codec interface { + Marshal(interface{}) ([]byte, error) + Unmarshal([]byte, interface{}) error +} + +// Factory is factory of codec. +type Factory func() Codec + +// codecFactoryMap stores. +var codecFactoryMap = make(map[string]Factory) + +// SetActorCodec set Actor's Codec. +func SetActorCodec(name string, f Factory) { + codecFactoryMap[name] = f +} + +// GetActorCodec gets the target codec instance. +func GetActorCodec(name string) (Codec, error) { + f, ok := codecFactoryMap[name] + if !ok { + return nil, perrors.Errorf("no actor codec implement named %s", name) + } + return f(), nil +} diff --git a/vendor/github.com/dapr/go-sdk/actor/codec/constant/constant.go b/vendor/github.com/dapr/go-sdk/actor/codec/constant/constant.go new file mode 100644 index 00000000000..556d0589c5e --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/codec/constant/constant.go @@ -0,0 +1,20 @@ +/* +Copyright 2021 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 constant + +// DefaultSerializerType is default actor invocation serialization type json. +const DefaultSerializerType = "json" + +// YamlSerializerType is yaml actor invocation serialization type. +const YamlSerializerType = "yaml" diff --git a/vendor/github.com/dapr/go-sdk/actor/codec/impl/json.go b/vendor/github.com/dapr/go-sdk/actor/codec/impl/json.go new file mode 100644 index 00000000000..adde1266662 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/codec/impl/json.go @@ -0,0 +1,38 @@ +/* +Copyright 2021 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 impl + +import ( + "encoding/json" + + "github.com/dapr/go-sdk/actor/codec" + "github.com/dapr/go-sdk/actor/codec/constant" +) + +func init() { + codec.SetActorCodec(constant.DefaultSerializerType, func() codec.Codec { + return &JSONCodec{} + }) +} + +// JSONCodec is json impl of codec.Codec. +type JSONCodec struct{} + +func (j *JSONCodec) Marshal(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +func (j *JSONCodec) Unmarshal(data []byte, v interface{}) error { + return json.Unmarshal(data, v) +} diff --git a/vendor/github.com/dapr/go-sdk/actor/codec/impl/yaml.go b/vendor/github.com/dapr/go-sdk/actor/codec/impl/yaml.go new file mode 100644 index 00000000000..bd8a385c0aa --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/codec/impl/yaml.go @@ -0,0 +1,38 @@ +/* +Copyright 2021 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 impl + +import ( + "github.com/dapr/go-sdk/actor/codec" + "github.com/dapr/go-sdk/actor/codec/constant" + + "gopkg.in/yaml.v3" +) + +func init() { + codec.SetActorCodec(constant.YamlSerializerType, func() codec.Codec { + return &YamlCodec{} + }) +} + +// YamlCodec is json yaml of codec.Codec. +type YamlCodec struct{} + +func (y *YamlCodec) Marshal(v interface{}) ([]byte, error) { + return yaml.Marshal(v) +} + +func (y *YamlCodec) Unmarshal(data []byte, v interface{}) error { + return yaml.Unmarshal(data, v) +} diff --git a/vendor/github.com/dapr/go-sdk/actor/config/config.go b/vendor/github.com/dapr/go-sdk/actor/config/config.go new file mode 100644 index 00000000000..656cc81ac3e --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/config/config.go @@ -0,0 +1,42 @@ +/* +Copyright 2021 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 config + +import "github.com/dapr/go-sdk/actor/codec/constant" + +// ActorConfig is Actor's configuration struct. +type ActorConfig struct { + SerializerType string +} + +// Option is option function of ActorConfig. +type Option func(config *ActorConfig) + +// WithSerializerName set serializer type of the actor as @serializerType. +func WithSerializerName(serializerType string) Option { + return func(config *ActorConfig) { + config.SerializerType = serializerType + } +} + +// GetConfigFromOptions get final ActorConfig set by @opts. +func GetConfigFromOptions(opts ...Option) *ActorConfig { + conf := &ActorConfig{ + SerializerType: constant.DefaultSerializerType, + } + for _, o := range opts { + o(conf) + } + return conf +} diff --git a/vendor/github.com/dapr/go-sdk/actor/error/error.go b/vendor/github.com/dapr/go-sdk/actor/error/error.go new file mode 100644 index 00000000000..74702d6dac2 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/error/error.go @@ -0,0 +1,33 @@ +/* +Copyright 2021 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 error + +type ActorErr uint8 + +// TODO(@laurence) the classification, handle and print log of error should be optimized. +const ( + Success = ActorErr(0) + ErrActorTypeNotFound = ActorErr(1) + ErrRemindersParamsInvalid = ActorErr(2) + ErrActorMethodNoFound = ActorErr(3) + ErrActorInvokeFailed = ActorErr(4) + ErrReminderFuncUndefined = ActorErr(5) + ErrActorMethodSerializeFailed = ActorErr(6) + ErrActorSerializeNoFound = ActorErr(7) + ErrActorIDNotFound = ActorErr(8) + ErrActorFactoryNotSet = ActorErr(9) + ErrTimerParamsInvalid = ActorErr(10) + ErrSaveStateFailed = ActorErr(11) + ErrActorServerInvalid = ActorErr(12) +) diff --git a/vendor/github.com/dapr/go-sdk/actor/manager/container.go b/vendor/github.com/dapr/go-sdk/actor/manager/container.go new file mode 100644 index 00000000000..35f9db507f2 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/manager/container.go @@ -0,0 +1,86 @@ +/* +Copyright 2021 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 manager + +import ( + "context" + "log" + "reflect" + + "github.com/dapr/go-sdk/actor" + "github.com/dapr/go-sdk/actor/codec" + actorErr "github.com/dapr/go-sdk/actor/error" + "github.com/dapr/go-sdk/actor/state" + dapr "github.com/dapr/go-sdk/client" +) + +type ActorContainer interface { + Invoke(methodName string, param []byte) ([]reflect.Value, actorErr.ActorErr) + GetActor() actor.Server +} + +// DefaultActorContainer contains actor instance and methods type info generated from actor. +type DefaultActorContainer struct { + methodType map[string]*MethodType + actor actor.Server + serializer codec.Codec +} + +// NewDefaultActorContainer creates a new ActorContainer with provider impl actor and serializer. +func NewDefaultActorContainer(actorID string, impl actor.Server, serializer codec.Codec) (ActorContainer, actorErr.ActorErr) { + impl.SetID(actorID) + daprClient, _ := dapr.NewClient() + // create state manager for this new actor + impl.SetStateManager(state.NewActorStateManager(impl.Type(), actorID, state.NewDaprStateAsyncProvider(daprClient))) + // save state of this actor + err := impl.SaveState() + if err != nil { + return nil, actorErr.ErrSaveStateFailed + } + methodType, err := getAbsctractMethodMap(impl) + if err != nil { + log.Printf("failed to get absctract method map from registered provider, err = %s", err) + return nil, actorErr.ErrActorServerInvalid + } + return &DefaultActorContainer{ + methodType: methodType, + actor: impl, + serializer: serializer, + }, actorErr.Success +} + +func (d *DefaultActorContainer) GetActor() actor.Server { + return d.actor +} + +// Invoke call actor method with given methodName and param. +func (d *DefaultActorContainer) Invoke(methodName string, param []byte) ([]reflect.Value, actorErr.ActorErr) { + methodType, ok := d.methodType[methodName] + if !ok { + return nil, actorErr.ErrActorMethodNoFound + } + argsValues := make([]reflect.Value, 0) + argsValues = append(argsValues, reflect.ValueOf(d.actor), reflect.ValueOf(context.Background())) + if len(methodType.argsType) > 0 { + typ := methodType.argsType[0] + paramValue := reflect.New(typ) + paramInterface := paramValue.Interface() + if err := d.serializer.Unmarshal(param, paramInterface); err != nil { + return nil, actorErr.ErrActorMethodSerializeFailed + } + argsValues = append(argsValues, reflect.ValueOf(paramInterface).Elem()) + } + returnValue := methodType.method.Func.Call(argsValues) + return returnValue, actorErr.Success +} diff --git a/vendor/github.com/dapr/go-sdk/actor/manager/manager.go b/vendor/github.com/dapr/go-sdk/actor/manager/manager.go new file mode 100644 index 00000000000..ae476126778 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/manager/manager.go @@ -0,0 +1,280 @@ +/* +Copyright 2021 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 manager + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sync" + "unicode" + "unicode/utf8" + + perrors "github.com/pkg/errors" + + "github.com/dapr/go-sdk/actor" + "github.com/dapr/go-sdk/actor/api" + "github.com/dapr/go-sdk/actor/codec" + actorErr "github.com/dapr/go-sdk/actor/error" +) + +type ActorManager interface { + RegisterActorImplFactory(f actor.Factory) + InvokeMethod(actorID, methodName string, request []byte) ([]byte, actorErr.ActorErr) + DeactivateActor(actorID string) actorErr.ActorErr + InvokeReminder(actorID, reminderName string, params []byte) actorErr.ActorErr + InvokeTimer(actorID, timerName string, params []byte) actorErr.ActorErr +} + +// DefaultActorManager is to manage one type of actor. +type DefaultActorManager struct { + // factory is the actor factory of specific type of actor + factory actor.Factory + + // activeActors stores the map actorID -> ActorContainer + activeActors sync.Map + + // serializer is the param and response serializer of the actor + serializer codec.Codec +} + +func NewDefaultActorManager(serializerType string) (ActorManager, actorErr.ActorErr) { + serializer, err := codec.GetActorCodec(serializerType) + if err != nil { + return nil, actorErr.ErrActorSerializeNoFound + } + return &DefaultActorManager{ + serializer: serializer, + }, actorErr.Success +} + +// RegisterActorImplFactory registers the action factory f. +func (m *DefaultActorManager) RegisterActorImplFactory(f actor.Factory) { + m.factory = f +} + +// getAndCreateActorContainerIfNotExist will. +func (m *DefaultActorManager) getAndCreateActorContainerIfNotExist(actorID string) (ActorContainer, actorErr.ActorErr) { + val, ok := m.activeActors.Load(actorID) + if !ok { + newContainer, aerr := NewDefaultActorContainer(actorID, m.factory(), m.serializer) + if aerr != actorErr.Success { + return nil, aerr + } + m.activeActors.Store(actorID, newContainer) + val, _ = m.activeActors.Load(actorID) + } + return val.(ActorContainer), actorErr.Success +} + +// InvokeMethod to invoke local function by @actorID, @methodName and @request request param. +func (m *DefaultActorManager) InvokeMethod(actorID, methodName string, request []byte) ([]byte, actorErr.ActorErr) { + if m.factory == nil { + return nil, actorErr.ErrActorFactoryNotSet + } + + actorContainer, aerr := m.getAndCreateActorContainerIfNotExist(actorID) + if aerr != actorErr.Success { + return nil, aerr + } + returnValue, aerr := actorContainer.Invoke(methodName, request) + if aerr != actorErr.Success { + return nil, aerr + } + if len(returnValue) == 1 { + return nil, actorErr.Success + } + + var ( + retErr interface{} + replyv reflect.Value + ) + + if len(returnValue) == 2 { + replyv = returnValue[0] + retErr = returnValue[1].Interface() + } + + if retErr != nil { + return nil, actorErr.ErrActorInvokeFailed + } + rspData, err := m.serializer.Marshal(replyv.Interface()) + if err != nil { + return nil, actorErr.ErrActorMethodSerializeFailed + } + if err := actorContainer.GetActor().SaveState(); err != nil { + return nil, actorErr.ErrSaveStateFailed + } + return rspData, actorErr.Success +} + +// DeactivateActor removes actor from actor manager. +func (m *DefaultActorManager) DeactivateActor(actorID string) actorErr.ActorErr { + _, ok := m.activeActors.Load(actorID) + if !ok { + return actorErr.ErrActorIDNotFound + } + m.activeActors.Delete(actorID) + return actorErr.Success +} + +// InvokeReminder invoke reminder function with given params. +func (m *DefaultActorManager) InvokeReminder(actorID, reminderName string, params []byte) actorErr.ActorErr { + if m.factory == nil { + return actorErr.ErrActorFactoryNotSet + } + reminderParams := &api.ActorReminderParams{} + if err := json.Unmarshal(params, reminderParams); err != nil { + log.Printf("failed to unmarshal reminder param, err: %v ", err) + return actorErr.ErrRemindersParamsInvalid + } + actorContainer, aerr := m.getAndCreateActorContainerIfNotExist(actorID) + if aerr != actorErr.Success { + return aerr + } + + targetActor, ok := actorContainer.GetActor().(actor.ReminderCallee) + if !ok { + return actorErr.ErrReminderFuncUndefined + } + targetActor.ReminderCall(reminderName, reminderParams.Data, reminderParams.DueTime, reminderParams.Period) + return actorErr.Success +} + +// InvokeTimer invoke timer callback function with given params. +func (m *DefaultActorManager) InvokeTimer(actorID, timerName string, params []byte) actorErr.ActorErr { + if m.factory == nil { + return actorErr.ErrActorFactoryNotSet + } + timerParams := &api.ActorTimerParam{} + if err := json.Unmarshal(params, timerParams); err != nil { + log.Printf("failed to unmarshal reminder param, err: %v ", err) + return actorErr.ErrTimerParamsInvalid + } + actorContainer, aerr := m.getAndCreateActorContainerIfNotExist(actorID) + if aerr != actorErr.Success { + return aerr + } + _, aerr = actorContainer.Invoke(timerParams.CallBack, timerParams.Data) + return aerr +} + +func getAbsctractMethodMap(rcvr interface{}) (map[string]*MethodType, error) { + s := &Service{} + s.reflectType = reflect.TypeOf(rcvr) + s.reflctValue = reflect.ValueOf(rcvr) + sname := reflect.Indirect(s.reflctValue).Type().Name() + if !isExported(sname) { + return nil, fmt.Errorf("type %s is not exported", sname) + } + return suitableMethods(s.reflectType), nil +} + +func isExported(name string) bool { + s, _ := utf8.DecodeRuneInString(name) + return unicode.IsUpper(s) +} + +// Service is description of service. +type Service struct { + reflctValue reflect.Value + reflectType reflect.Type +} + +// MethodType is description of service method. +type MethodType struct { + method reflect.Method + ctxType reflect.Type // request context + argsType []reflect.Type // args except ctx, include replyType if existing + replyType reflect.Type // return value, otherwise it is nil +} + +// suitableMethods returns suitable Rpc methods of typ. +func suitableMethods(typ reflect.Type) map[string]*MethodType { + methods := make(map[string]*MethodType) + for m := 0; m < typ.NumMethod(); m++ { + method := typ.Method(m) + if mt, err := suiteMethod(method); err != nil { + log.Printf("method %s is illegal, err = %s, just skip it", method.Name, err) + } else { + methods[method.Name] = mt + } + } + return methods +} + +// suiteMethod returns a suitable Rpc methodType. +func suiteMethod(method reflect.Method) (*MethodType, error) { + mtype := method.Type + mname := method.Name + inNum := mtype.NumIn() + outNum := mtype.NumOut() + + // Method must be exported. + if method.PkgPath != "" { + return nil, perrors.New("method is not exported") + } + + var ( + replyType, ctxType reflect.Type + argsType []reflect.Type + ) + + if outNum > 2 || outNum == 0 { + return nil, perrors.New("num out invalid") + } + + // The latest return type of the method must be error. + if returnType := mtype.Out(outNum - 1); returnType != typeOfError { + return nil, perrors.New(fmt.Sprintf("the latest return type %s of method %q is not error", returnType, mname)) + } + + // replyType + if outNum == 2 { + replyType = mtype.Out(0) + if !isExportedOrBuiltinType(replyType) { + return nil, perrors.New(fmt.Sprintf("reply type of method %s not exported{%v}", mname, replyType)) + } + } + + index := 1 + + // ctxType + if inNum > 1 && mtype.In(1).String() == "context.Context" { + ctxType = mtype.In(1) + index = 2 + } + + for ; index < inNum; index++ { + argsType = append(argsType, mtype.In(index)) + // need not be a pointer. + if !isExportedOrBuiltinType(mtype.In(index)) { + return nil, perrors.New(fmt.Sprintf("argument type of method %q is not exported %v", mname, mtype.In(index))) + } + } + + return &MethodType{method: method, argsType: argsType, replyType: replyType, ctxType: ctxType}, nil +} + +var typeOfError = reflect.TypeOf((*error)(nil)).Elem() + +func isExportedOrBuiltinType(t reflect.Type) bool { + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + // PkgPath will be non-empty even for an exported type, + // so we need to check the type name as well. + return isExported(t.Name()) || t.PkgPath() == "" +} diff --git a/vendor/github.com/dapr/go-sdk/actor/runtime/actor_runtime.go b/vendor/github.com/dapr/go-sdk/actor/runtime/actor_runtime.go new file mode 100644 index 00000000000..410e76798bb --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/runtime/actor_runtime.go @@ -0,0 +1,102 @@ +/* +Copyright 2021 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 runtime + +import ( + "encoding/json" + "sync" + + "github.com/dapr/go-sdk/actor" + "github.com/dapr/go-sdk/actor/api" + "github.com/dapr/go-sdk/actor/config" + actorErr "github.com/dapr/go-sdk/actor/error" + "github.com/dapr/go-sdk/actor/manager" +) + +type ActorRunTime struct { + config api.ActorRuntimeConfig + actorManagers sync.Map +} + +var actorRuntimeInstance *ActorRunTime + +// NewActorRuntime creates an empty ActorRuntime. +func NewActorRuntime() *ActorRunTime { + return &ActorRunTime{} +} + +// GetActorRuntimeInstance gets or create runtime instance. +func GetActorRuntimeInstance() *ActorRunTime { + if actorRuntimeInstance == nil { + actorRuntimeInstance = NewActorRuntime() + } + return actorRuntimeInstance +} + +// RegisterActorFactory registers the given actor factory from user, and create new actor manager if not exists. +func (r *ActorRunTime) RegisterActorFactory(f actor.Factory, opt ...config.Option) { + conf := config.GetConfigFromOptions(opt...) + actType := f().Type() + r.config.RegisteredActorTypes = append(r.config.RegisteredActorTypes, actType) + mng, ok := r.actorManagers.Load(actType) + if !ok { + newMng, err := manager.NewDefaultActorManager(conf.SerializerType) + if err != actorErr.Success { + return + } + newMng.RegisterActorImplFactory(f) + r.actorManagers.Store(actType, newMng) + return + } + mng.(manager.ActorManager).RegisterActorImplFactory(f) +} + +func (r *ActorRunTime) GetJSONSerializedConfig() ([]byte, error) { + data, err := json.Marshal(&r.config) + return data, err +} + +func (r *ActorRunTime) InvokeActorMethod(actorTypeName, actorID, actorMethod string, payload []byte) ([]byte, actorErr.ActorErr) { + mng, ok := r.actorManagers.Load(actorTypeName) + if !ok { + return nil, actorErr.ErrActorTypeNotFound + } + return mng.(manager.ActorManager).InvokeMethod(actorID, actorMethod, payload) +} + +func (r *ActorRunTime) Deactivate(actorTypeName, actorID string) actorErr.ActorErr { + targetManager, ok := r.actorManagers.Load(actorTypeName) + if !ok { + return actorErr.ErrActorTypeNotFound + } + return targetManager.(manager.ActorManager).DeactivateActor(actorID) +} + +func (r *ActorRunTime) InvokeReminder(actorTypeName, actorID, reminderName string, params []byte) actorErr.ActorErr { + targetManager, ok := r.actorManagers.Load(actorTypeName) + if !ok { + return actorErr.ErrActorTypeNotFound + } + mng := targetManager.(manager.ActorManager) + return mng.InvokeReminder(actorID, reminderName, params) +} + +func (r *ActorRunTime) InvokeTimer(actorTypeName, actorID, timerName string, params []byte) actorErr.ActorErr { + targetManager, ok := r.actorManagers.Load(actorTypeName) + if !ok { + return actorErr.ErrActorTypeNotFound + } + mng := targetManager.(manager.ActorManager) + return mng.InvokeTimer(actorID, timerName, params) +} diff --git a/vendor/github.com/dapr/go-sdk/actor/state/actor_state_change.go b/vendor/github.com/dapr/go-sdk/actor/state/actor_state_change.go new file mode 100644 index 00000000000..d7916258343 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/state/actor_state_change.go @@ -0,0 +1,24 @@ +/* +Copyright 2021 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 + +type ActorStateChange struct { + stateName string + value interface{} + changeKind ChangeKind +} + +func NewActorStateChange(stateName string, value interface{}, changeKind ChangeKind) *ActorStateChange { + return &ActorStateChange{stateName: stateName, value: value, changeKind: changeKind} +} diff --git a/vendor/github.com/dapr/go-sdk/actor/state/state_async_provider.go b/vendor/github.com/dapr/go-sdk/actor/state/state_async_provider.go new file mode 100644 index 00000000000..09414697305 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/state/state_async_provider.go @@ -0,0 +1,106 @@ +/* +Copyright 2021 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" + + "github.com/pkg/errors" + + "github.com/dapr/go-sdk/actor/codec" + "github.com/dapr/go-sdk/actor/codec/constant" + client "github.com/dapr/go-sdk/client" +) + +type DaprStateAsyncProvider struct { + daprClient client.Client + stateSerializer codec.Codec +} + +func (d *DaprStateAsyncProvider) Contains(actorType string, actorID string, stateName string) (bool, error) { + result, err := d.daprClient.GetActorState(context.Background(), &client.GetActorStateRequest{ + ActorType: actorType, + ActorID: actorID, + KeyName: stateName, + }) + if err != nil || result == nil { + return false, err + } + return len(result.Data) > 0, err +} + +func (d *DaprStateAsyncProvider) Load(actorType, actorID, stateName string, reply interface{}) error { + result, err := d.daprClient.GetActorState(context.Background(), &client.GetActorStateRequest{ + ActorType: actorType, + ActorID: actorID, + KeyName: stateName, + }) + if err != nil { + return errors.Errorf("get actor state error = %s", err.Error()) + } + if len(result.Data) == 0 { + return errors.Errorf("get actor state result empty, with actorType: %s, actorID: %s, stateName %s", actorType, actorID, stateName) + } + if err := d.stateSerializer.Unmarshal(result.Data, reply); err != nil { + return errors.Errorf("unmarshal state data error = %s", err.Error()) + } + return nil +} + +func (d *DaprStateAsyncProvider) Apply(actorType, actorID string, changes []*ActorStateChange) error { + if len(changes) == 0 { + return nil + } + + operations := make([]*client.ActorStateOperation, 0) + var value []byte + for _, stateChange := range changes { + if stateChange == nil { + continue + } + + daprOperationName := string(stateChange.changeKind) + if len(daprOperationName) == 0 { + continue + } + + if stateChange.changeKind == Add { + data, err := d.stateSerializer.Marshal(stateChange.value) + if err != nil { + return err + } + value = data + } + operations = append(operations, &client.ActorStateOperation{ + OperationType: daprOperationName, + Key: stateChange.stateName, + Value: value, + }) + } + + if len(operations) == 0 { + return nil + } + + return d.daprClient.SaveStateTransactionally(context.Background(), actorType, actorID, operations) +} + +// TODO(@laurence) the daprClient may be nil. +func NewDaprStateAsyncProvider(daprClient client.Client) *DaprStateAsyncProvider { + stateSerializer, _ := codec.GetActorCodec(constant.DefaultSerializerType) + return &DaprStateAsyncProvider{ + stateSerializer: stateSerializer, + daprClient: daprClient, + } +} diff --git a/vendor/github.com/dapr/go-sdk/actor/state/state_change_metadata.go b/vendor/github.com/dapr/go-sdk/actor/state/state_change_metadata.go new file mode 100644 index 00000000000..5d09e7c32d0 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/state/state_change_metadata.go @@ -0,0 +1,35 @@ +/* +Copyright 2021 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 + +type ChangeKind string + +const ( + None = ChangeKind("") + Add = ChangeKind("upsert") + Update = ChangeKind("upsert") + Remove = ChangeKind("delete") +) + +type ChangeMetadata struct { + Kind ChangeKind + Value interface{} +} + +func NewChangeMetadata(kind ChangeKind, value interface{}) *ChangeMetadata { + return &ChangeMetadata{ + Kind: kind, + Value: value, + } +} diff --git a/vendor/github.com/dapr/go-sdk/actor/state/state_manager.go b/vendor/github.com/dapr/go-sdk/actor/state/state_manager.go new file mode 100644 index 00000000000..9b62f922bbe --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/actor/state/state_manager.go @@ -0,0 +1,188 @@ +/* +Copyright 2021 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 ( + "reflect" + "sync" + + "github.com/pkg/errors" + + "github.com/dapr/go-sdk/actor" +) + +type ActorStateManager struct { + ActorTypeName string + ActorID string + stateChangeTracker sync.Map // map[string]*ChangeMetadata + stateAsyncProvider *DaprStateAsyncProvider +} + +func (a *ActorStateManager) Add(stateName string, value interface{}) error { + if stateName == "" { + return errors.Errorf("state's name can't be empty") + } + exists, err := a.stateAsyncProvider.Contains(a.ActorTypeName, a.ActorID, stateName) + if err != nil { + return err + } + + if val, ok := a.stateChangeTracker.Load(stateName); ok { + metadata := val.(*ChangeMetadata) + if metadata.Kind == Remove { + a.stateChangeTracker.Store(stateName, &ChangeMetadata{ + Kind: Update, + Value: value, + }) + return nil + } + return errors.Errorf("Duplicate cached state: %s", stateName) + } + if exists { + return errors.Errorf("Duplicate state: %s", stateName) + } + a.stateChangeTracker.Store(stateName, &ChangeMetadata{ + Kind: Add, + Value: value, + }) + return nil +} + +func (a *ActorStateManager) Get(stateName string, reply interface{}) error { + if stateName == "" { + return errors.Errorf("state's name can't be empty") + } + + if val, ok := a.stateChangeTracker.Load(stateName); ok { + metadata := val.(*ChangeMetadata) + if metadata.Kind == Remove { + return errors.Errorf("state is marked for remove: %s", stateName) + } + replyVal := reflect.ValueOf(reply).Elem() + metadataValue := reflect.ValueOf(metadata.Value) + if metadataValue.Kind() == reflect.Ptr { + replyVal.Set(metadataValue.Elem()) + } else { + replyVal.Set(metadataValue) + } + + return nil + } + + err := a.stateAsyncProvider.Load(a.ActorTypeName, a.ActorID, stateName, reply) + a.stateChangeTracker.Store(stateName, &ChangeMetadata{ + Kind: None, + Value: reply, + }) + return err +} + +func (a *ActorStateManager) Set(stateName string, value interface{}) error { + if stateName == "" { + return errors.Errorf("state's name can't be empty") + } + if val, ok := a.stateChangeTracker.Load(stateName); ok { + metadata := val.(*ChangeMetadata) + if metadata.Kind == None || metadata.Kind == Remove { + metadata.Kind = Update + } + a.stateChangeTracker.Store(stateName, NewChangeMetadata(metadata.Kind, value)) + return nil + } + a.stateChangeTracker.Store(stateName, &ChangeMetadata{ + Kind: Add, + Value: value, + }) + return nil +} + +func (a *ActorStateManager) Remove(stateName string) error { + if stateName == "" { + return errors.Errorf("state's name can't be empty") + } + if val, ok := a.stateChangeTracker.Load(stateName); ok { + metadata := val.(*ChangeMetadata) + if metadata.Kind == Remove { + return nil + } + if metadata.Kind == Add { + a.stateChangeTracker.Delete(stateName) + return nil + } + + a.stateChangeTracker.Store(stateName, &ChangeMetadata{ + Kind: Remove, + Value: nil, + }) + return nil + } + if exist, err := a.stateAsyncProvider.Contains(a.ActorTypeName, a.ActorID, stateName); err != nil && exist { + a.stateChangeTracker.Store(stateName, &ChangeMetadata{ + Kind: Remove, + Value: nil, + }) + } + return nil +} + +func (a *ActorStateManager) Contains(stateName string) (bool, error) { + if stateName == "" { + return false, errors.Errorf("state's name can't be empty") + } + if val, ok := a.stateChangeTracker.Load(stateName); ok { + metadata := val.(*ChangeMetadata) + if metadata.Kind == Remove { + return false, nil + } + return true, nil + } + return a.stateAsyncProvider.Contains(a.ActorTypeName, a.ActorID, stateName) +} + +func (a *ActorStateManager) Save() error { + changes := make([]*ActorStateChange, 0) + a.stateChangeTracker.Range(func(key, value interface{}) bool { + stateName := key.(string) + metadata := value.(*ChangeMetadata) + changes = append(changes, NewActorStateChange(stateName, metadata.Value, metadata.Kind)) + return true + }) + if err := a.stateAsyncProvider.Apply(a.ActorTypeName, a.ActorID, changes); err != nil { + return err + } + a.Flush() + return nil +} + +func (a *ActorStateManager) Flush() { + a.stateChangeTracker.Range(func(key, value interface{}) bool { + stateName := key.(string) + metadata := value.(*ChangeMetadata) + if metadata.Kind == Remove { + a.stateChangeTracker.Delete(stateName) + return true + } + metadata = NewChangeMetadata(None, metadata.Value) + a.stateChangeTracker.Store(stateName, metadata) + return true + }) +} + +func NewActorStateManager(actorTypeName string, actorID string, provider *DaprStateAsyncProvider) actor.StateManager { + return &ActorStateManager{ + stateAsyncProvider: provider, + ActorTypeName: actorTypeName, + ActorID: actorID, + } +} diff --git a/vendor/github.com/dapr/go-sdk/client/actor.go b/vendor/github.com/dapr/go-sdk/client/actor.go new file mode 100644 index 00000000000..a4f8b598b2a --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/actor.go @@ -0,0 +1,494 @@ +/* +Copyright 2021 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 client + +import ( + "context" + "encoding/json" + "fmt" + "reflect" + + anypb "github.com/golang/protobuf/ptypes/any" + "github.com/pkg/errors" + + "github.com/dapr/go-sdk/actor" + "github.com/dapr/go-sdk/actor/codec" + "github.com/dapr/go-sdk/actor/config" + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" +) + +type InvokeActorRequest struct { + ActorType string + ActorID string + Method string + Data []byte +} + +type InvokeActorResponse struct { + Data []byte +} + +// InvokeActor invokes specific operation on the configured Dapr binding. +// This method covers input, output, and bi-directional bindings. +func (c *GRPCClient) InvokeActor(ctx context.Context, in *InvokeActorRequest) (out *InvokeActorResponse, err error) { + if in == nil { + return nil, errors.New("actor invocation required") + } + if in.Method == "" { + return nil, errors.New("actor invocation method required") + } + if in.ActorType == "" { + return nil, errors.New("actor invocation actorType required") + } + if in.ActorID == "" { + return nil, errors.New("actor invocation actorID required") + } + + req := &pb.InvokeActorRequest{ + ActorType: in.ActorType, + ActorId: in.ActorID, + Method: in.Method, + Data: in.Data, + } + + resp, err := c.protoClient.InvokeActor(c.withAuthToken(ctx), req) + if err != nil { + return nil, errors.Wrapf(err, "error invoking binding %s/%s", in.ActorType, in.ActorID) + } + + out = &InvokeActorResponse{} + + if resp != nil { + out.Data = resp.Data + } + + return out, nil +} + +// ImplActorClientStub impls the given client stub @actorClientStub, an example of client stub is as followed +/* +type ClientStub struct { +// User defined function + GetUser func(context.Context, *User) (*User, error) + Invoke func(context.Context, string) (string, error) + Get func(context.Context) (string, error) + Post func(context.Context, string) error + StartTimer func(context.Context, *TimerRequest) error + StopTimer func(context.Context, *TimerRequest) error + ... +} + +// Type defined the target type, which should be compatible with server side actor +func (a *ClientStub) Type() string { + return "testActorType" +} + +// ID defined actor ID to be invoked +func (a *ClientStub) ID() string { + return "ActorImplID123456" +}. +*/ +func (c *GRPCClient) ImplActorClientStub(actorClientStub actor.Client, opt ...config.Option) { + serializerType := config.GetConfigFromOptions(opt...).SerializerType + serializer, err := codec.GetActorCodec(serializerType) + if err != nil { + fmt.Printf("[Actor] ERROR: serializer type %s unsupported\n", serializerType) + return + } + + c.implActor(actorClientStub, serializer) +} + +type RegisterActorReminderRequest struct { + ActorType string + ActorID string + Name string + DueTime string + Period string + TTL string + Data []byte +} + +// RegisterActorReminder registers a new reminder to target actor. Then, a reminder would be created and +// invoke actor's ReminderCall function if implemented. +// If server side actor impls this function, it's asserted to actor.ReminderCallee and can be invoked with call period +// and state data as param @in defined. +// Scheduling parameters 'DueTime', 'Period', and 'TTL' are optional. +func (c *GRPCClient) RegisterActorReminder(ctx context.Context, in *RegisterActorReminderRequest) (err error) { + if in == nil { + return errors.New("actor register reminder invocation request param required") + } + if in.ActorType == "" { + return errors.New("actor register reminder invocation actorType required") + } + if in.ActorID == "" { + return errors.New("actor register reminder invocation actorID required") + } + if in.Name == "" { + return errors.New("actor register reminder invocation name required") + } + + req := &pb.RegisterActorReminderRequest{ + ActorType: in.ActorType, + ActorId: in.ActorID, + Name: in.Name, + DueTime: in.DueTime, + Period: in.Period, + Ttl: in.TTL, + Data: in.Data, + } + + _, err = c.protoClient.RegisterActorReminder(c.withAuthToken(ctx), req) + if err != nil { + return errors.Wrapf(err, "error invoking register actor reminder %s/%s", in.ActorType, in.ActorID) + } + return nil +} + +type UnregisterActorReminderRequest struct { + ActorType string + ActorID string + Name string +} + +// UnregisterActorReminder would unregister the actor reminder. +func (c *GRPCClient) UnregisterActorReminder(ctx context.Context, in *UnregisterActorReminderRequest) error { + if in == nil { + return errors.New("actor unregister reminder invocation request param required") + } + if in.ActorType == "" { + return errors.New("actor unregister reminder invocation actorType required") + } + if in.ActorID == "" { + return errors.New("actor unregister reminder invocation actorID required") + } + if in.Name == "" { + return errors.New("actor unregister reminder invocation name required") + } + + req := &pb.UnregisterActorReminderRequest{ + ActorType: in.ActorType, + ActorId: in.ActorID, + Name: in.Name, + } + + _, err := c.protoClient.UnregisterActorReminder(c.withAuthToken(ctx), req) + if err != nil { + return errors.Wrapf(err, "error invoking unregister actor reminder %s/%s", in.ActorType, in.ActorID) + } + return nil +} + +type RenameActorReminderRequest struct { + OldName string + ActorType string + ActorID string + NewName string +} + +// RenameActorReminder would rename the actor reminder. +func (c *GRPCClient) RenameActorReminder(ctx context.Context, in *RenameActorReminderRequest) error { + if in == nil { + return errors.New("actor rename reminder invocation request param required") + } + if in.ActorType == "" { + return errors.New("actor rename reminder invocation actorType required") + } + if in.ActorID == "" { + return errors.New("actor rename reminder invocation actorID required") + } + if in.OldName == "" { + return errors.New("actor rename reminder invocation oldName required") + } + if in.NewName == "" { + return errors.New("actor rename reminder invocation newName required") + } + + req := &pb.RenameActorReminderRequest{ + ActorType: in.ActorType, + ActorId: in.ActorID, + OldName: in.OldName, + NewName: in.NewName, + } + + _, err := c.protoClient.RenameActorReminder(c.withAuthToken(ctx), req) + if err != nil { + return errors.Wrapf(err, "error invoking rename actor reminder %s/%s", in.ActorType, in.ActorID) + } + return nil +} + +type RegisterActorTimerRequest struct { + ActorType string + ActorID string + Name string + DueTime string + Period string + TTL string + Data []byte + CallBack string +} + +// RegisterActorTimer register actor timer as given param @in defined. +// Scheduling parameters 'DueTime', 'Period', and 'TTL' are optional. +func (c *GRPCClient) RegisterActorTimer(ctx context.Context, in *RegisterActorTimerRequest) (err error) { + if in == nil { + return errors.New("actor register timer invocation request param required") + } + if in.ActorType == "" { + return errors.New("actor register timer invocation actorType required") + } + if in.ActorID == "" { + return errors.New("actor register timer invocation actorID required") + } + if in.Name == "" { + return errors.New("actor register timer invocation name required") + } + if in.CallBack == "" { + return errors.New("actor register timer invocation callback function required") + } + + req := &pb.RegisterActorTimerRequest{ + ActorType: in.ActorType, + ActorId: in.ActorID, + Name: in.Name, + DueTime: in.DueTime, + Period: in.Period, + Ttl: in.TTL, + Data: in.Data, + Callback: in.CallBack, + } + + _, err = c.protoClient.RegisterActorTimer(c.withAuthToken(ctx), req) + if err != nil { + return errors.Wrapf(err, "error invoking actor register timer %s/%s", in.ActorType, in.ActorID) + } + + return nil +} + +type UnregisterActorTimerRequest struct { + ActorType string + ActorID string + Name string +} + +// UnregisterActorTimer unregisters actor timer. +func (c *GRPCClient) UnregisterActorTimer(ctx context.Context, in *UnregisterActorTimerRequest) error { + if in == nil { + return errors.New("actor unregister timer invocation request param required") + } + if in.ActorType == "" { + return errors.New("actor unregister timer invocation actorType required") + } + if in.ActorID == "" { + return errors.New("actor unregister timer invocation actorID required") + } + if in.Name == "" { + return errors.New("actor unregister timer invocation name required") + } + req := &pb.UnregisterActorTimerRequest{ + ActorType: in.ActorType, + ActorId: in.ActorID, + Name: in.Name, + } + + _, err := c.protoClient.UnregisterActorTimer(c.withAuthToken(ctx), req) + if err != nil { + return errors.Wrapf(err, "error invoking binding %s/%s", in.ActorType, in.ActorID) + } + + return nil +} + +func (c *GRPCClient) implActor(actor actor.Client, serializer codec.Codec) { + actorValue := reflect.ValueOf(actor) + valueOfActor := actorValue.Elem() + typeOfActor := valueOfActor.Type() + + // check incoming interface, the incoming interface's elem must be a struct. + if typeOfActor.Kind() != reflect.Struct { + fmt.Println("[Actor] ERROR: impl actor client stub failed, incoming interface is not struct") + return + } + + numField := valueOfActor.NumField() + for i := 0; i < numField; i++ { + t := typeOfActor.Field(i) + methodName := t.Name + if methodName == "Type" { + continue + } + f := valueOfActor.Field(i) + if f.Kind() == reflect.Func && f.IsValid() && f.CanSet() { + outNum := t.Type.NumOut() + + if outNum != 1 && outNum != 2 { + fmt.Printf("[Actor] ERROR: method %s of mtype %v has wrong number of in out parameters %d; needs exactly 1/2\n", + t.Name, t.Type.String(), outNum) + continue + } + + // The latest return type of the method must be error. + if returnType := t.Type.Out(outNum - 1); returnType != reflect.Zero(reflect.TypeOf((*error)(nil)).Elem()).Type() { + fmt.Printf("[Actor] ERROR: the latest return type %s of method %q is not error\n", returnType, t.Name) + continue + } + + funcOuts := make([]reflect.Type, outNum) + for i := 0; i < outNum; i++ { + funcOuts[i] = t.Type.Out(i) + } + + f.Set(reflect.MakeFunc(f.Type(), c.makeCallProxyFunction(actor, methodName, funcOuts, serializer))) + } + } +} + +func (c *GRPCClient) makeCallProxyFunction(actor actor.Client, methodName string, outs []reflect.Type, serializer codec.Codec) func(in []reflect.Value) []reflect.Value { + return func(in []reflect.Value) []reflect.Value { + var ( + err error + inIArr []interface{} + reply reflect.Value + ) + + if len(outs) == 2 { + if outs[0].Kind() == reflect.Ptr { + reply = reflect.New(outs[0].Elem()) + } else { + reply = reflect.New(outs[0]) + } + } + + start := 0 + end := len(in) + invCtx := context.Background() + if end > 0 { + if in[0].Type().String() == "context.Context" { + if !in[0].IsNil() { + invCtx = in[0].Interface().(context.Context) + } + start++ + } + } + + if end-start <= 0 { + inIArr = []interface{}{} + } else if end-start == 1 { + inIArr = []interface{}{in[start].Interface()} + } else { + fmt.Println("[Actor] ERROR: param nums is zero or one is allowed by actor") + return nil + } + + var data []byte + if len(inIArr) > 0 { + data, err = json.Marshal(inIArr[0]) + } + if err != nil { + panic(err) + } + + rsp, err := c.InvokeActor(invCtx, &InvokeActorRequest{ + ActorType: actor.Type(), + ActorID: actor.ID(), + Method: methodName, + Data: data, + }) + + if len(outs) == 1 { + return []reflect.Value{reflect.ValueOf(&err).Elem()} + } + + response := reply.Interface() + if rsp != nil { + if err = serializer.Unmarshal(rsp.Data, response); err != nil { + fmt.Printf("[Actor] ERROR: unmarshal response err = %v\n", err) + } + } + if len(outs) == 2 && outs[0].Kind() != reflect.Ptr { + return []reflect.Value{reply.Elem(), reflect.ValueOf(&err).Elem()} + } + return []reflect.Value{reply, reflect.ValueOf(&err).Elem()} + } +} + +type GetActorStateRequest struct { + ActorType string + ActorID string + KeyName string +} + +type GetActorStateResponse struct { + Data []byte +} + +func (c *GRPCClient) GetActorState(ctx context.Context, in *GetActorStateRequest) (*GetActorStateResponse, error) { + if in == nil { + return nil, errors.New("actor get state invocation request param required") + } + if in.ActorType == "" { + return nil, errors.New("actor get state invocation actorType required") + } + if in.ActorID == "" { + return nil, errors.New("actor get state invocation actorID required") + } + if in.KeyName == "" { + return nil, errors.New("actor get state invocation keyName required") + } + rsp, err := c.protoClient.GetActorState(c.withAuthToken(ctx), &pb.GetActorStateRequest{ + ActorId: in.ActorID, + ActorType: in.ActorType, + Key: in.KeyName, + }) + if err != nil { + return nil, errors.Wrapf(err, "error invoking actor get state %s/%s", in.ActorType, in.ActorID) + } + return &GetActorStateResponse{Data: rsp.Data}, nil +} + +type ActorStateOperation struct { + OperationType string + Key string + Value []byte +} + +func (c *GRPCClient) SaveStateTransactionally(ctx context.Context, actorType, actorID string, operations []*ActorStateOperation) error { + if len(operations) == 0 { + return errors.New("actor save state transactionally invocation request param operations is empty") + } + if actorType == "" { + return errors.New("actor save state transactionally invocation actorType required") + } + if actorID == "" { + return errors.New("actor save state transactionally invocation actorID required") + } + grpcOperations := make([]*pb.TransactionalActorStateOperation, 0) + for _, op := range operations { + grpcOperations = append(grpcOperations, &pb.TransactionalActorStateOperation{ + OperationType: op.OperationType, + Key: op.Key, + Value: &anypb.Any{ + Value: op.Value, + }, + }) + } + _, err := c.protoClient.ExecuteActorStateTransaction(c.withAuthToken(ctx), &pb.ExecuteActorStateTransactionRequest{ + ActorType: actorType, + ActorId: actorID, + Operations: grpcOperations, + }) + return err +} diff --git a/vendor/github.com/dapr/go-sdk/client/binding.go b/vendor/github.com/dapr/go-sdk/client/binding.go new file mode 100644 index 00000000000..f503f71c984 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/binding.go @@ -0,0 +1,86 @@ +/* +Copyright 2021 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 client + +import ( + "context" + + "github.com/pkg/errors" + + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" +) + +// InvokeBindingRequest represents binding invocation request. +type InvokeBindingRequest struct { + // Name is name of binding to invoke. + Name string + // Operation is the name of the operation type for the binding to invoke + Operation string + // Data is the input bindings sent + Data []byte + // Metadata is the input binding metadata + Metadata map[string]string +} + +// BindingEvent represents the binding event handler input. +type BindingEvent struct { + // Data is the input bindings sent + Data []byte + // Metadata is the input binding metadata + Metadata map[string]string +} + +// InvokeBinding invokes specific operation on the configured Dapr binding. +// This method covers input, output, and bi-directional bindings. +func (c *GRPCClient) InvokeBinding(ctx context.Context, in *InvokeBindingRequest) (*BindingEvent, error) { + if in == nil { + return nil, errors.New("binding invocation required") + } + if in.Name == "" { + return nil, errors.New("binding invocation name required") + } + if in.Operation == "" { + return nil, errors.New("binding invocation operation required") + } + + req := &pb.InvokeBindingRequest{ + Name: in.Name, + Operation: in.Operation, + Data: in.Data, + Metadata: in.Metadata, + } + + resp, err := c.protoClient.InvokeBinding(c.withAuthToken(ctx), req) + if err != nil { + return nil, errors.Wrapf(err, "error invoking binding %s/%s", in.Name, in.Operation) + } + + if resp != nil { + return &BindingEvent{ + Data: resp.Data, + Metadata: resp.Metadata, + }, nil + } + + return nil, nil +} + +// InvokeOutputBinding invokes configured Dapr binding with data (allows nil).InvokeOutputBinding +// This method differs from InvokeBinding in that it doesn't expect any content being returned from the invoked method. +func (c *GRPCClient) InvokeOutputBinding(ctx context.Context, in *InvokeBindingRequest) error { + if _, err := c.InvokeBinding(ctx, in); err != nil { + return errors.Wrap(err, "error invoking output binding") + } + return nil +} diff --git a/vendor/github.com/dapr/go-sdk/client/client.go b/vendor/github.com/dapr/go-sdk/client/client.go new file mode 100644 index 00000000000..0b5b23d7551 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/client.go @@ -0,0 +1,354 @@ +/* +Copyright 2021 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 client + +import ( + "context" + "fmt" + "log" + "net" + "os" + "strconv" + "sync" + "time" + + "github.com/dapr/go-sdk/actor" + "github.com/dapr/go-sdk/actor/config" + + "github.com/pkg/errors" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/metadata" + "google.golang.org/protobuf/types/known/emptypb" + + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" + + // used to import codec implements. + _ "github.com/dapr/go-sdk/actor/codec/impl" +) + +const ( + daprPortDefault = "50001" + daprPortEnvVarName = "DAPR_GRPC_PORT" /* #nosec */ + traceparentKey = "traceparent" + apiTokenKey = "dapr-api-token" /* #nosec */ + apiTokenEnvVarName = "DAPR_API_TOKEN" /* #nosec */ + clientDefaultTimoutSeconds = 5 + clientTimoutSecondsEnvVarName = "DAPR_CLIENT_TIMEOUT_SECONDS" +) + +var ( + logger = log.New(os.Stdout, "", 0) + _ Client = (*GRPCClient)(nil) + defaultClient Client + doOnce sync.Once +) + +// Client is the interface for Dapr client implementation. +type Client interface { + // InvokeBinding invokes specific operation on the configured Dapr binding. + // This method covers input, output, and bi-directional bindings. + InvokeBinding(ctx context.Context, in *InvokeBindingRequest) (out *BindingEvent, err error) + + // InvokeOutputBinding invokes configured Dapr binding with data.InvokeOutputBinding + // This method differs from InvokeBinding in that it doesn't expect any content being returned from the invoked method. + InvokeOutputBinding(ctx context.Context, in *InvokeBindingRequest) error + + // InvokeMethod invokes service without raw data + InvokeMethod(ctx context.Context, appID, methodName, verb string) (out []byte, err error) + + // InvokeMethodWithContent invokes service with content + InvokeMethodWithContent(ctx context.Context, appID, methodName, verb string, content *DataContent) (out []byte, err error) + + // InvokeMethodWithCustomContent invokes app with custom content (struct + content type). + InvokeMethodWithCustomContent(ctx context.Context, appID, methodName, verb string, contentType string, content interface{}) (out []byte, err error) + + // PublishEvent publishes data onto topic in specific pubsub component. + PublishEvent(ctx context.Context, pubsubName, topicName string, data interface{}, opts ...PublishEventOption) error + + // PublishEventfromCustomContent serializes an struct and publishes its contents as data (JSON) onto topic in specific pubsub component. + // Deprecated: This method is deprecated and will be removed in a future version of the SDK. Please use `PublishEvent` instead. + PublishEventfromCustomContent(ctx context.Context, pubsubName, topicName string, data interface{}) error + + // GetSecret retrieves preconfigured secret from specified store using key. + GetSecret(ctx context.Context, storeName, key string, meta map[string]string) (data map[string]string, err error) + + // GetBulkSecret retrieves all preconfigured secrets for this application. + GetBulkSecret(ctx context.Context, storeName string, meta map[string]string) (data map[string]map[string]string, err error) + + // SaveState saves the raw data into store using default state options. + SaveState(ctx context.Context, storeName, key string, data []byte, meta map[string]string, so ...StateOption) error + + // SaveState saves the raw data into store using provided state options and etag. + SaveStateWithETag(ctx context.Context, storeName, key string, data []byte, etag string, meta map[string]string, so ...StateOption) error + + // SaveBulkState saves multiple state item to store with specified options. + SaveBulkState(ctx context.Context, storeName string, items ...*SetStateItem) error + + // GetState retrieves state from specific store using default consistency option. + GetState(ctx context.Context, storeName, key string, meta map[string]string) (item *StateItem, err error) + + // GetStateWithConsistency retrieves state from specific store using provided state consistency. + GetStateWithConsistency(ctx context.Context, storeName, key string, meta map[string]string, sc StateConsistency) (item *StateItem, err error) + + // GetBulkState retrieves state for multiple keys from specific store. + GetBulkState(ctx context.Context, storeName string, keys []string, meta map[string]string, parallelism int32) ([]*BulkStateItem, error) + + // QueryStateAlpha1 runs a query against state store. + QueryStateAlpha1(ctx context.Context, storeName, query string, meta map[string]string) (*QueryResponse, error) + + // DeleteState deletes content from store using default state options. + DeleteState(ctx context.Context, storeName, key string, meta map[string]string) error + + // DeleteStateWithETag deletes content from store using provided state options and etag. + DeleteStateWithETag(ctx context.Context, storeName, key string, etag *ETag, meta map[string]string, opts *StateOptions) error + + // ExecuteStateTransaction provides way to execute multiple operations on a specified store. + ExecuteStateTransaction(ctx context.Context, storeName string, meta map[string]string, ops []*StateOperation) error + + // GetConfigurationItem can get target configuration item by storeName and key + GetConfigurationItem(ctx context.Context, storeName, key string, opts ...ConfigurationOpt) (*ConfigurationItem, error) + + // GetConfigurationItems can get a list of configuration item by storeName and keys + GetConfigurationItems(ctx context.Context, storeName string, keys []string, opts ...ConfigurationOpt) (map[string]*ConfigurationItem, error) + + // SubscribeConfigurationItems can subscribe the change of configuration items by storeName and keys, and return subscription id + SubscribeConfigurationItems(ctx context.Context, storeName string, keys []string, handler ConfigurationHandleFunction, opts ...ConfigurationOpt) error + + // UnsubscribeConfigurationItems can stop the subscription with target store's and id + UnsubscribeConfigurationItems(ctx context.Context, storeName string, id string, opts ...ConfigurationOpt) error + + // DeleteBulkState deletes content for multiple keys from store. + DeleteBulkState(ctx context.Context, storeName string, keys []string, meta map[string]string) error + + // DeleteBulkStateItems deletes content for multiple items from store. + DeleteBulkStateItems(ctx context.Context, storeName string, items []*DeleteStateItem) error + + // TryLockAlpha1 attempts to grab a lock from a lock store. + TryLockAlpha1(ctx context.Context, storeName string, request *LockRequest) (*LockResponse, error) + + // UnlockAlpha1 deletes unlocks a lock from a lock store. + UnlockAlpha1(ctx context.Context, storeName string, request *UnlockRequest) (*UnlockResponse, error) + + // Shutdown the sidecar. + Shutdown(ctx context.Context) error + + // WithTraceID adds existing trace ID to the outgoing context. + WithTraceID(ctx context.Context, id string) context.Context + + // WithAuthToken sets Dapr API token on the instantiated client. + WithAuthToken(token string) + + // Close cleans up all resources created by the client. + Close() + + // RegisterActorTimer registers an actor timer. + RegisterActorTimer(ctx context.Context, req *RegisterActorTimerRequest) error + + // UnregisterActorTimer unregisters an actor timer. + UnregisterActorTimer(ctx context.Context, req *UnregisterActorTimerRequest) error + + // RegisterActorReminder registers an actor reminder. + RegisterActorReminder(ctx context.Context, req *RegisterActorReminderRequest) error + + // UnregisterActorReminder unregisters an actor reminder. + UnregisterActorReminder(ctx context.Context, req *UnregisterActorReminderRequest) error + + // RenameActorReminder rename an actor reminder. + RenameActorReminder(ctx context.Context, req *RenameActorReminderRequest) error + + // InvokeActor calls a method on an actor. + InvokeActor(ctx context.Context, req *InvokeActorRequest) (*InvokeActorResponse, error) + + // GetActorState get actor state + GetActorState(ctx context.Context, req *GetActorStateRequest) (data *GetActorStateResponse, err error) + + // SaveStateTransactionally save actor state + SaveStateTransactionally(ctx context.Context, actorType, actorID string, operations []*ActorStateOperation) error + + // ImplActorClientStub is to impl user defined actor client stub + ImplActorClientStub(actorClientStub actor.Client, opt ...config.Option) + + // GrpcClient returns the base grpc client if grpc is used and nil otherwise + GrpcClient() pb.DaprClient +} + +// NewClient instantiates Dapr client using DAPR_GRPC_PORT environment variable as port. +// Note, this default factory function creates Dapr client only once. All subsequent invocations +// will return the already created instance. To create multiple instances of the Dapr client, +// use one of the parameterized factory functions: +// +// NewClientWithPort(port string) (client Client, err error) +// NewClientWithAddress(address string) (client Client, err error) +// NewClientWithConnection(conn *grpc.ClientConn) Client +// NewClientWithSocket(socket string) (client Client, err error) +func NewClient() (client Client, err error) { + port := os.Getenv(daprPortEnvVarName) + if port == "" { + port = daprPortDefault + } + var onceErr error + doOnce.Do(func() { + c, err := NewClientWithPort(port) + onceErr = errors.Wrap(err, "error creating default client") + defaultClient = c + }) + + return defaultClient, onceErr +} + +// NewClientWithPort instantiates Dapr using specific gRPC port. +func NewClientWithPort(port string) (client Client, err error) { + if port == "" { + return nil, errors.New("nil port") + } + return NewClientWithAddress(net.JoinHostPort("127.0.0.1", port)) +} + +// NewClientWithAddress instantiates Dapr using specific address (including port). +func NewClientWithAddress(address string) (client Client, err error) { + if address == "" { + return nil, errors.New("nil address") + } + logger.Printf("dapr client initializing for: %s", address) + + timeoutSeconds, err := getClientTimeoutSeconds() + if err != nil { + return nil, err + } + ctx, ctxCancel := context.WithTimeout(context.Background(), time.Duration(timeoutSeconds)*time.Second) + conn, err := grpc.DialContext( + ctx, + address, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithBlock(), + ) + if err != nil { + ctxCancel() + return nil, errors.Wrapf(err, "error creating connection to '%s': %v", address, err) + } + if hasToken := os.Getenv(apiTokenEnvVarName); hasToken != "" { + logger.Println("client uses API token") + } + + return newClientWithConnectionAndCancelFunc(conn, ctxCancel), nil +} + +func getClientTimeoutSeconds() (int, error) { + timeoutStr := os.Getenv(clientTimoutSecondsEnvVarName) + if len(timeoutStr) == 0 { + return clientDefaultTimoutSeconds, nil + } + timeoutVar, err := strconv.Atoi(timeoutStr) + if err != nil { + return 0, err + } + if timeoutVar <= 0 { + return 0, errors.New("incorrect value") + } + return timeoutVar, nil +} + +// NewClientWithSocket instantiates Dapr using specific socket. +func NewClientWithSocket(socket string) (client Client, err error) { + if socket == "" { + return nil, errors.New("nil socket") + } + logger.Printf("dapr client initializing for: %s", socket) + addr := fmt.Sprintf("unix://%s", socket) + conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + return nil, errors.Wrapf(err, "error creating connection to '%s': %v", addr, err) + } + if hasToken := os.Getenv(apiTokenEnvVarName); hasToken != "" { + logger.Println("client uses API token") + } + return NewClientWithConnection(conn), nil +} + +// NewClientWithConnection instantiates Dapr client using specific connection. +func NewClientWithConnection(conn *grpc.ClientConn) Client { + return newClientWithConnectionAndCancelFunc(conn, func() {}) +} + +func newClientWithConnectionAndCancelFunc( + conn *grpc.ClientConn, + cancelFunc context.CancelFunc, +) Client { + return &GRPCClient{ + connection: conn, + ctxCancelFunc: cancelFunc, + protoClient: pb.NewDaprClient(conn), + authToken: os.Getenv(apiTokenEnvVarName), + } +} + +// GRPCClient is the gRPC implementation of Dapr client. +type GRPCClient struct { + connection *grpc.ClientConn + ctxCancelFunc context.CancelFunc + protoClient pb.DaprClient + authToken string +} + +// Close cleans up all resources created by the client. +func (c *GRPCClient) Close() { + c.ctxCancelFunc() + if c.connection != nil { + c.connection.Close() + c.connection = nil + } +} + +// WithAuthToken sets Dapr API token on the instantiated client. +// Allows empty string to reset token on existing client. +func (c *GRPCClient) WithAuthToken(token string) { + c.authToken = token +} + +// WithTraceID adds existing trace ID to the outgoing context. +func (c *GRPCClient) WithTraceID(ctx context.Context, id string) context.Context { + if id == "" { + return ctx + } + logger.Printf("using trace parent ID: %s", id) + md := metadata.Pairs(traceparentKey, id) + return metadata.NewOutgoingContext(ctx, md) +} + +func (c *GRPCClient) withAuthToken(ctx context.Context) context.Context { + if c.authToken == "" { + return ctx + } + return metadata.NewOutgoingContext(ctx, metadata.Pairs(apiTokenKey, c.authToken)) +} + +// Shutdown the sidecar. +func (c *GRPCClient) Shutdown(ctx context.Context) error { + _, err := c.protoClient.Shutdown(c.withAuthToken(ctx), &emptypb.Empty{}) + if err != nil { + return errors.Wrap(err, "error shutting down the sidecar") + } + return nil +} + +// GrpcClient returns the base grpc client. +func (c *GRPCClient) GrpcClient() pb.DaprClient { + return c.protoClient +} + +// GrpcClientConn returns the grpc.ClientConn object used by this client. +func (c *GRPCClient) GrpcClientConn() *grpc.ClientConn { + return c.connection +} diff --git a/vendor/github.com/dapr/go-sdk/client/configuration.go b/vendor/github.com/dapr/go-sdk/client/configuration.go new file mode 100644 index 00000000000..edf23744791 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/configuration.go @@ -0,0 +1,124 @@ +package client + +import ( + "context" + "fmt" + "io" + + "github.com/pkg/errors" + + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" +) + +type ConfigurationItem struct { + Value string + Version string + Metadata map[string]string +} + +type ConfigurationOpt func(map[string]string) + +func WithConfigurationMetadata(key, value string) ConfigurationOpt { + return func(m map[string]string) { + m[key] = value + } +} + +func (c *GRPCClient) GetConfigurationItem(ctx context.Context, storeName, key string, opts ...ConfigurationOpt) (*ConfigurationItem, error) { + items, err := c.GetConfigurationItems(ctx, storeName, []string{key}, opts...) + if err != nil { + return nil, err + } + if len(items) == 0 { + return nil, nil + } + + return items[key], nil +} + +func (c *GRPCClient) GetConfigurationItems(ctx context.Context, storeName string, keys []string, opts ...ConfigurationOpt) (map[string]*ConfigurationItem, error) { + metadata := make(map[string]string) + for _, opt := range opts { + opt(metadata) + } + rsp, err := c.protoClient.GetConfigurationAlpha1(ctx, &pb.GetConfigurationRequest{ + StoreName: storeName, + Keys: keys, + Metadata: metadata, + }) + if err != nil { + return nil, err + } + + configItems := make(map[string]*ConfigurationItem) + for k, v := range rsp.Items { + configItems[k] = &ConfigurationItem{ + Value: v.Value, + Version: v.Version, + Metadata: v.Metadata, + } + } + return configItems, nil +} + +type ConfigurationHandleFunction func(string, map[string]*ConfigurationItem) + +func (c *GRPCClient) SubscribeConfigurationItems(ctx context.Context, storeName string, keys []string, handler ConfigurationHandleFunction, opts ...ConfigurationOpt) error { + metadata := make(map[string]string) + for _, opt := range opts { + opt(metadata) + } + + client, err := c.protoClient.SubscribeConfigurationAlpha1(ctx, &pb.SubscribeConfigurationRequest{ + StoreName: storeName, + Keys: keys, + Metadata: metadata, + }) + if err != nil { + return errors.Errorf("subscribe configuration failed with error = %s", err) + } + + var subscribeID string + stopCh := make(chan struct{}) + go func() { + for { + rsp, err := client.Recv() + if err == io.EOF || rsp == nil { + // receive goroutine would close if unsubscribe is called + fmt.Println("dapr configuration subscribe finished.") + close(stopCh) + break + } + subscribeID = rsp.Id + configurationItems := make(map[string]*ConfigurationItem) + for k, v := range rsp.Items { + configurationItems[k] = &ConfigurationItem{ + Value: v.Value, + Version: v.Version, + Metadata: v.Metadata, + } + } + handler(rsp.Id, configurationItems) + } + }() + select { + case <-ctx.Done(): + return c.UnsubscribeConfigurationItems(context.Background(), storeName, subscribeID) + case <-stopCh: + return nil + } +} + +func (c *GRPCClient) UnsubscribeConfigurationItems(ctx context.Context, storeName string, id string, opts ...ConfigurationOpt) error { + alpha1, err := c.protoClient.UnsubscribeConfigurationAlpha1(ctx, &pb.UnsubscribeConfigurationRequest{ + StoreName: storeName, + Id: id, + }) + if err != nil { + return err + } + if !alpha1.Ok { + return errors.Errorf("unsubscribe error message = %s", alpha1.GetMessage()) + } + return nil +} diff --git a/vendor/github.com/dapr/go-sdk/client/invoke.go b/vendor/github.com/dapr/go-sdk/client/invoke.go new file mode 100644 index 00000000000..7cebd4dd4c9 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/invoke.go @@ -0,0 +1,152 @@ +/* +Copyright 2021 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 client + +import ( + "context" + "encoding/json" + "strings" + + anypb "github.com/golang/protobuf/ptypes/any" + "github.com/pkg/errors" + + v1 "github.com/dapr/go-sdk/dapr/proto/common/v1" + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" +) + +// DataContent the service invocation content. +type DataContent struct { + // Data is the input data + Data []byte + // ContentType is the type of the data content + ContentType string +} + +func (c *GRPCClient) invokeServiceWithRequest(ctx context.Context, req *pb.InvokeServiceRequest) (out []byte, err error) { + if req == nil { + return nil, errors.New("nil request") + } + + resp, err := c.protoClient.InvokeService(c.withAuthToken(ctx), req) + if err != nil { + return nil, err + } + + // allow for service to not return any value + if resp != nil && resp.GetData() != nil { + out = resp.GetData().Value + return + } + + out = nil + return +} + +func queryAndVerbToHTTPExtension(query string, verb string) *v1.HTTPExtension { + if v, ok := v1.HTTPExtension_Verb_value[strings.ToUpper(verb)]; ok { + return &v1.HTTPExtension{Verb: v1.HTTPExtension_Verb(v), Querystring: query} + } + return &v1.HTTPExtension{Verb: v1.HTTPExtension_NONE} +} + +func hasRequiredInvokeArgs(appID, methodName, verb string) error { + if appID == "" { + return errors.New("appID") + } + if methodName == "" { + return errors.New("methodName") + } + if verb == "" { + return errors.New("verb") + } + return nil +} + +// InvokeMethod invokes service without raw data ([]byte). +func (c *GRPCClient) InvokeMethod(ctx context.Context, appID, methodName, verb string) (out []byte, err error) { + if err := hasRequiredInvokeArgs(appID, methodName, verb); err != nil { + return nil, errors.Wrap(err, "missing required parameter") + } + method, query := extractMethodAndQuery(methodName) + req := &pb.InvokeServiceRequest{ + Id: appID, + Message: &v1.InvokeRequest{ + Method: method, + HttpExtension: queryAndVerbToHTTPExtension(query, verb), + }, + } + return c.invokeServiceWithRequest(ctx, req) +} + +// InvokeMethodWithContent invokes service with content (data + content type). +func (c *GRPCClient) InvokeMethodWithContent(ctx context.Context, appID, methodName, verb string, content *DataContent) (out []byte, err error) { + if err := hasRequiredInvokeArgs(appID, methodName, verb); err != nil { + return nil, errors.Wrap(err, "missing required parameter") + } + if content == nil { + return nil, errors.New("content required") + } + method, query := extractMethodAndQuery(methodName) + req := &pb.InvokeServiceRequest{ + Id: appID, + Message: &v1.InvokeRequest{ + Method: method, + Data: &anypb.Any{Value: content.Data}, + ContentType: content.ContentType, + HttpExtension: queryAndVerbToHTTPExtension(query, verb), + }, + } + return c.invokeServiceWithRequest(ctx, req) +} + +// InvokeMethodWithCustomContent invokes service with custom content (struct + content type). +func (c *GRPCClient) InvokeMethodWithCustomContent(ctx context.Context, appID, methodName, verb string, contentType string, content interface{}) ([]byte, error) { + if err := hasRequiredInvokeArgs(appID, methodName, verb); err != nil { + return nil, errors.Wrap(err, "missing required parameter") + } + if contentType == "" { + return nil, errors.New("content type required") + } + if content == nil { + return nil, errors.New("content required") + } + + contentData, err := json.Marshal(content) + if err != nil { + return nil, errors.WithMessage(err, "error serializing input struct") + } + + method, query := extractMethodAndQuery(methodName) + + req := &pb.InvokeServiceRequest{ + Id: appID, + Message: &v1.InvokeRequest{ + Method: method, + Data: &anypb.Any{Value: contentData}, + ContentType: contentType, + HttpExtension: queryAndVerbToHTTPExtension(query, verb), + }, + } + + return c.invokeServiceWithRequest(ctx, req) +} + +func extractMethodAndQuery(name string) (method, query string) { + splitStr := strings.SplitN(name, "?", 2) + method = splitStr[0] + if len(splitStr) == 2 { + query = splitStr[1] + } + return +} diff --git a/vendor/github.com/dapr/go-sdk/client/lock.go b/vendor/github.com/dapr/go-sdk/client/lock.go new file mode 100644 index 00000000000..c5caef083f5 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/lock.go @@ -0,0 +1,100 @@ +/* +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 client + +import ( + "context" + + "github.com/pkg/errors" + + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" +) + +// LockRequest is the lock request object. +type LockRequest struct { + ResourceID string + LockOwner string + ExpiryInSeconds int32 +} + +// UnlockRequest is the unlock request object. +type UnlockRequest struct { + ResourceID string + LockOwner string +} + +// LockResponse is the lock operation response object. +type LockResponse struct { + Success bool +} + +// UnlockResponse is the unlock operation response object. +type UnlockResponse struct { + StatusCode int32 + Status string +} + +// TryLockAlpha1 attempts to grab a lock from a lock store. +func (c *GRPCClient) TryLockAlpha1(ctx context.Context, storeName string, request *LockRequest) (*LockResponse, error) { + if storeName == "" { + return nil, errors.New("storeName is empty") + } + + if request == nil { + return nil, errors.New("request is nil") + } + + req := pb.TryLockRequest{ + ResourceId: request.ResourceID, + LockOwner: request.LockOwner, + ExpiryInSeconds: request.ExpiryInSeconds, + StoreName: storeName, + } + + resp, err := c.protoClient.TryLockAlpha1(ctx, &req) + if err != nil { + return nil, errors.Wrap(err, "error getting lock") + } + + return &LockResponse{ + Success: resp.Success, + }, nil +} + +// UnlockAlpha1 deletes unlocks a lock from a lock store. +func (c *GRPCClient) UnlockAlpha1(ctx context.Context, storeName string, request *UnlockRequest) (*UnlockResponse, error) { + if storeName == "" { + return nil, errors.New("storeName is empty") + } + + if request == nil { + return nil, errors.New("request is nil") + } + + req := pb.UnlockRequest{ + ResourceId: request.ResourceID, + LockOwner: request.LockOwner, + StoreName: storeName, + } + + resp, err := c.protoClient.UnlockAlpha1(ctx, &req) + if err != nil { + return nil, errors.Wrap(err, "error getting lock") + } + + return &UnlockResponse{ + StatusCode: int32(resp.Status), + Status: pb.UnlockResponse_Status_name[int32(resp.Status)], + }, nil +} diff --git a/vendor/github.com/dapr/go-sdk/client/pubsub.go b/vendor/github.com/dapr/go-sdk/client/pubsub.go new file mode 100644 index 00000000000..e3020ba54bc --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/pubsub.go @@ -0,0 +1,112 @@ +/* +Copyright 2021 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 client + +import ( + "context" + "encoding/json" + "log" + + "github.com/pkg/errors" + + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" +) + +const ( + rawPayload = "rawPayload" + trueValue = "true" +) + +// PublishEventOption is the type for the functional option. +type PublishEventOption func(*pb.PublishEventRequest) + +// PublishEvent publishes data onto specific pubsub topic. +func (c *GRPCClient) PublishEvent(ctx context.Context, pubsubName, topicName string, data interface{}, opts ...PublishEventOption) error { + if pubsubName == "" { + return errors.New("pubsubName name required") + } + if topicName == "" { + return errors.New("topic name required") + } + + request := &pb.PublishEventRequest{ + PubsubName: pubsubName, + Topic: topicName, + } + for _, o := range opts { + o(request) + } + + if data != nil { + switch d := data.(type) { + case []byte: + request.Data = d + case string: + request.Data = []byte(d) + default: + var err error + request.DataContentType = "application/json" + request.Data, err = json.Marshal(d) + if err != nil { + return errors.WithMessage(err, "error serializing input struct") + } + } + } + + _, err := c.protoClient.PublishEvent(c.withAuthToken(ctx), request) + if err != nil { + return errors.Wrapf(err, "error publishing event unto %s topic", topicName) + } + + return nil +} + +// PublishEventWithContentType can be passed as option to PublishEvent to set an explicit Content-Type. +func PublishEventWithContentType(contentType string) PublishEventOption { + return func(e *pb.PublishEventRequest) { + e.DataContentType = contentType + } +} + +// PublishEventWithMetadata can be passed as option to PublishEvent to set metadata. +func PublishEventWithMetadata(metadata map[string]string) PublishEventOption { + return func(e *pb.PublishEventRequest) { + e.Metadata = metadata + } +} + +// PublishEventWithRawPayload can be passed as option to PublishEvent to set rawPayload metadata. +func PublishEventWithRawPayload() PublishEventOption { + return func(e *pb.PublishEventRequest) { + if e.Metadata == nil { + e.Metadata = map[string]string{rawPayload: trueValue} + } else { + e.Metadata[rawPayload] = trueValue + } + } +} + +// PublishEventfromCustomContent serializes an struct and publishes its contents as data (JSON) onto topic in specific pubsub component. +// Deprecated: This method is deprecated and will be removed in a future version of the SDK. Please use `PublishEvent` instead. +func (c *GRPCClient) PublishEventfromCustomContent(ctx context.Context, pubsubName, topicName string, data interface{}) error { + log.Println("DEPRECATED: client.PublishEventfromCustomContent is deprecated and will be removed in a future version of the SDK. Please use `PublishEvent` instead.") + + // Perform the JSON marshaling here just in case someone passed a []byte or string as data + enc, err := json.Marshal(data) + if err != nil { + return errors.WithMessage(err, "error serializing input struct") + } + + return c.PublishEvent(ctx, pubsubName, topicName, enc, PublishEventWithContentType("application/json")) +} diff --git a/vendor/github.com/dapr/go-sdk/client/secret.go b/vendor/github.com/dapr/go-sdk/client/secret.go new file mode 100644 index 00000000000..47356aea3d3 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/secret.go @@ -0,0 +1,80 @@ +/* +Copyright 2021 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 client + +import ( + "context" + + "github.com/pkg/errors" + + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" +) + +// GetSecret retrieves preconfigured secret from specified store using key. +func (c *GRPCClient) GetSecret(ctx context.Context, storeName, key string, meta map[string]string) (data map[string]string, err error) { + if storeName == "" { + return nil, errors.New("nil storeName") + } + if key == "" { + return nil, errors.New("nil key") + } + + req := &pb.GetSecretRequest{ + Key: key, + StoreName: storeName, + Metadata: meta, + } + + resp, err := c.protoClient.GetSecret(c.withAuthToken(ctx), req) + if err != nil { + return nil, errors.Wrap(err, "error invoking service") + } + + if resp != nil { + data = resp.GetData() + } + + return +} + +// GetBulkSecret retrieves all preconfigured secrets for this application. +func (c *GRPCClient) GetBulkSecret(ctx context.Context, storeName string, meta map[string]string) (data map[string]map[string]string, err error) { + if storeName == "" { + return nil, errors.New("nil storeName") + } + + req := &pb.GetBulkSecretRequest{ + StoreName: storeName, + Metadata: meta, + } + + resp, err := c.protoClient.GetBulkSecret(c.withAuthToken(ctx), req) + if err != nil { + return nil, errors.Wrap(err, "error invoking service") + } + + if resp != nil { + data = map[string]map[string]string{} + + for secretName, secretResponse := range resp.Data { + data[secretName] = map[string]string{} + + for k, v := range secretResponse.Secrets { + data[secretName][k] = v + } + } + } + + return +} diff --git a/vendor/github.com/dapr/go-sdk/client/state.go b/vendor/github.com/dapr/go-sdk/client/state.go new file mode 100644 index 00000000000..174e85f3734 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/client/state.go @@ -0,0 +1,526 @@ +/* +Copyright 2021 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 client + +import ( + "context" + "time" + + "github.com/golang/protobuf/ptypes/duration" + "github.com/pkg/errors" + + v1 "github.com/dapr/go-sdk/dapr/proto/common/v1" + pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1" +) + +const ( + // StateConsistencyUndefined is the undefined value for state consistency. + StateConsistencyUndefined StateConsistency = 0 + // StateConsistencyEventual represents eventual state consistency value. + StateConsistencyEventual StateConsistency = 1 + // StateConsistencyStrong represents strong state consistency value. + StateConsistencyStrong StateConsistency = 2 + + // StateConcurrencyUndefined is the undefined value for state concurrency. + StateConcurrencyUndefined StateConcurrency = 0 + // StateConcurrencyFirstWrite represents first write concurrency value. + StateConcurrencyFirstWrite StateConcurrency = 1 + // StateConcurrencyLastWrite represents last write concurrency value. + StateConcurrencyLastWrite StateConcurrency = 2 + + // StateOperationTypeUndefined is the undefined value for state operation type. + StateOperationTypeUndefined OperationType = 0 + // StateOperationTypeUpsert represents upsert operation type value. + StateOperationTypeUpsert OperationType = 1 + // StateOperationTypeDelete represents delete operation type value. + StateOperationTypeDelete OperationType = 2 + // UndefinedType represents undefined type value. + UndefinedType = "undefined" +) + +type ( + // StateConsistency is the consistency enum type. + StateConsistency int + // StateConcurrency is the concurrency enum type. + StateConcurrency int + // OperationType is the operation enum type. + OperationType int +) + +// GetPBConsistency get consistency pb value. +func (s StateConsistency) GetPBConsistency() v1.StateOptions_StateConsistency { + return v1.StateOptions_StateConsistency(s) +} + +// GetPBConcurrency get concurrency pb value. +func (s StateConcurrency) GetPBConcurrency() v1.StateOptions_StateConcurrency { + return v1.StateOptions_StateConcurrency(s) +} + +// String returns the string value of the OperationType. +func (o OperationType) String() string { + names := [...]string{ + UndefinedType, + "upsert", + "delete", + } + if o < StateOperationTypeUpsert || o > StateOperationTypeDelete { + return UndefinedType + } + + return names[o] +} + +// String returns the string value of the StateConsistency. +func (s StateConsistency) String() string { + names := [...]string{ + UndefinedType, + "strong", + "eventual", + } + if s < StateConsistencyStrong || s > StateConsistencyEventual { + return UndefinedType + } + + return names[s] +} + +// String returns the string value of the StateConcurrency. +func (s StateConcurrency) String() string { + names := [...]string{ + UndefinedType, + "first-write", + "last-write", + } + if s < StateConcurrencyFirstWrite || s > StateConcurrencyLastWrite { + return UndefinedType + } + + return names[s] +} + +var stateOptionDefault = &v1.StateOptions{ + Concurrency: v1.StateOptions_CONCURRENCY_LAST_WRITE, + Consistency: v1.StateOptions_CONSISTENCY_STRONG, +} + +// StateOperation is a collection of StateItems with a store name. +type StateOperation struct { + Type OperationType + Item *SetStateItem +} + +// StateItem represents a single state item. +type StateItem struct { + Key string + Value []byte + Etag string + Metadata map[string]string +} + +// BulkStateItem represents a single state item. +type BulkStateItem struct { + Key string + Value []byte + Etag string + Metadata map[string]string + Error string +} + +// SetStateItem represents a single state to be persisted. +type SetStateItem struct { + Key string + Value []byte + Etag *ETag + Metadata map[string]string + Options *StateOptions +} + +// QueryItem represents a single query result item. +type QueryItem struct { + Key string + Value []byte + Etag string + Error string +} + +// QueryResponse represents a query result. +type QueryResponse struct { + Results []QueryItem + Token string + Metadata map[string]string +} + +// DeleteStateItem represents a single state to be deleted. +type DeleteStateItem SetStateItem + +// ETag represents an versioned record information. +type ETag struct { + Value string +} + +// StateOptions represents the state store persistence policy. +type StateOptions struct { + Concurrency StateConcurrency + Consistency StateConsistency +} + +// StateOption StateOptions's function type. +type StateOption func(*StateOptions) + +// WithConcurrency set StateOptions's Concurrency. +func WithConcurrency(concurrency StateConcurrency) StateOption { + return func(so *StateOptions) { + so.Concurrency = concurrency + } +} + +// WithConsistency set StateOptions's consistency. +func WithConsistency(consistency StateConsistency) StateOption { + return func(so *StateOptions) { + so.Consistency = consistency + } +} + +func toProtoSaveStateItem(si *SetStateItem) (item *v1.StateItem) { + s := &v1.StateItem{ + Key: si.Key, + Metadata: si.Metadata, + Value: si.Value, + Options: toProtoStateOptions(si.Options), + } + + if si.Etag != nil { + s.Etag = &v1.Etag{ + Value: si.Etag.Value, + } + } + + return s +} + +func toProtoStateOptions(so *StateOptions) (opts *v1.StateOptions) { + if so == nil { + return copyStateOptionDefaultPB() + } + return &v1.StateOptions{ + Concurrency: v1.StateOptions_StateConcurrency(so.Concurrency), + Consistency: v1.StateOptions_StateConsistency(so.Consistency), + } +} + +func copyStateOptionDefaultPB() *v1.StateOptions { + return &v1.StateOptions{ + Concurrency: stateOptionDefault.GetConcurrency(), + Consistency: stateOptionDefault.GetConsistency(), + } +} + +func copyStateOptionDefault() *StateOptions { + return &StateOptions{ + Concurrency: StateConcurrency(stateOptionDefault.GetConcurrency()), + Consistency: StateConsistency(stateOptionDefault.GetConsistency()), + } +} + +func toProtoDuration(d time.Duration) *duration.Duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &duration.Duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} + +// ExecuteStateTransaction provides way to execute multiple operations on a specified store. +func (c *GRPCClient) ExecuteStateTransaction(ctx context.Context, storeName string, meta map[string]string, ops []*StateOperation) error { + if storeName == "" { + return errors.New("nil storeName") + } + if len(ops) == 0 { + return nil + } + + items := make([]*pb.TransactionalStateOperation, 0) + for _, op := range ops { + item := &pb.TransactionalStateOperation{ + OperationType: op.Type.String(), + Request: toProtoSaveStateItem(op.Item), + } + items = append(items, item) + } + + req := &pb.ExecuteStateTransactionRequest{ + Metadata: meta, + StoreName: storeName, + Operations: items, + } + _, err := c.protoClient.ExecuteStateTransaction(c.withAuthToken(ctx), req) + if err != nil { + return errors.Wrap(err, "error executing state transaction") + } + return nil +} + +// SaveState saves the raw data into store, default options: strong, last-write. +func (c *GRPCClient) SaveState(ctx context.Context, storeName, key string, data []byte, meta map[string]string, so ...StateOption) error { + return c.SaveStateWithETag(ctx, storeName, key, data, "", meta, so...) +} + +// SaveStateWithETag saves the raw data into store using provided state options and etag. +func (c *GRPCClient) SaveStateWithETag(ctx context.Context, storeName, key string, data []byte, etag string, meta map[string]string, so ...StateOption) error { + stateOptions := new(StateOptions) + for _, o := range so { + o(stateOptions) + } + if len(so) == 0 { + stateOptions = copyStateOptionDefault() + } + item := &SetStateItem{ + Key: key, + Value: data, + Metadata: meta, + Options: stateOptions, + } + if etag != "" { + item.Etag = &ETag{Value: etag} + } + return c.SaveBulkState(ctx, storeName, item) +} + +// SaveBulkState saves the multiple state item to store. +func (c *GRPCClient) SaveBulkState(ctx context.Context, storeName string, items ...*SetStateItem) error { + if storeName == "" { + return errors.New("nil store") + } + if items == nil { + return errors.New("nil item") + } + + req := &pb.SaveStateRequest{ + StoreName: storeName, + States: make([]*v1.StateItem, 0), + } + + for _, si := range items { + item := toProtoSaveStateItem(si) + req.States = append(req.States, item) + } + + _, err := c.protoClient.SaveState(c.withAuthToken(ctx), req) + if err != nil { + return errors.Wrap(err, "error saving state") + } + return nil +} + +// GetBulkState retrieves state for multiple keys from specific store. +func (c *GRPCClient) GetBulkState(ctx context.Context, storeName string, keys []string, meta map[string]string, parallelism int32) ([]*BulkStateItem, error) { + if storeName == "" { + return nil, errors.New("nil store") + } + if len(keys) == 0 { + return nil, errors.New("keys required") + } + items := make([]*BulkStateItem, 0) + + req := &pb.GetBulkStateRequest{ + StoreName: storeName, + Keys: keys, + Metadata: meta, + Parallelism: parallelism, + } + + results, err := c.protoClient.GetBulkState(c.withAuthToken(ctx), req) + if err != nil { + return nil, errors.Wrap(err, "error getting state") + } + + if results == nil || results.Items == nil { + return items, nil + } + + for _, r := range results.Items { + item := &BulkStateItem{ + Key: r.Key, + Etag: r.Etag, + Value: r.Data, + Metadata: r.Metadata, + Error: r.Error, + } + items = append(items, item) + } + + return items, nil +} + +// GetState retrieves state from specific store using default consistency option. +func (c *GRPCClient) GetState(ctx context.Context, storeName, key string, meta map[string]string) (item *StateItem, err error) { + return c.GetStateWithConsistency(ctx, storeName, key, meta, StateConsistencyStrong) +} + +// GetStateWithConsistency retrieves state from specific store using provided state consistency. +func (c *GRPCClient) GetStateWithConsistency(ctx context.Context, storeName, key string, meta map[string]string, sc StateConsistency) (*StateItem, error) { + if err := hasRequiredStateArgs(storeName, key); err != nil { + return nil, errors.Wrap(err, "missing required arguments") + } + + req := &pb.GetStateRequest{ + StoreName: storeName, + Key: key, + Consistency: v1.StateOptions_StateConsistency(sc), + Metadata: meta, + } + + result, err := c.protoClient.GetState(c.withAuthToken(ctx), req) + if err != nil { + return nil, errors.Wrap(err, "error getting state") + } + + return &StateItem{ + Etag: result.Etag, + Key: key, + Value: result.Data, + Metadata: result.Metadata, + }, nil +} + +// QueryStateAlpha1 runs a query against state store. +func (c *GRPCClient) QueryStateAlpha1(ctx context.Context, storeName, query string, meta map[string]string) (*QueryResponse, error) { + if storeName == "" { + return nil, errors.New("store name is not set") + } + if query == "" { + return nil, errors.New("query is not set") + } + req := &pb.QueryStateRequest{ + StoreName: storeName, + Query: query, + Metadata: meta, + } + resp, err := c.protoClient.QueryStateAlpha1(c.withAuthToken(ctx), req) + if err != nil { + return nil, errors.Wrap(err, "error querying state") + } + + ret := &QueryResponse{ + Results: make([]QueryItem, len(resp.Results)), + Token: resp.Token, + Metadata: resp.Metadata, + } + for i, item := range resp.Results { + ret.Results[i].Key = item.Key + ret.Results[i].Value = item.Data + ret.Results[i].Etag = item.Etag + ret.Results[i].Error = item.Error + } + + return ret, nil +} + +// DeleteState deletes content from store using default state options. +func (c *GRPCClient) DeleteState(ctx context.Context, storeName, key string, meta map[string]string) error { + return c.DeleteStateWithETag(ctx, storeName, key, nil, meta, nil) +} + +// DeleteStateWithETag deletes content from store using provided state options and etag. +func (c *GRPCClient) DeleteStateWithETag(ctx context.Context, storeName, key string, etag *ETag, meta map[string]string, opts *StateOptions) error { + if err := hasRequiredStateArgs(storeName, key); err != nil { + return errors.Wrap(err, "missing required arguments") + } + + req := &pb.DeleteStateRequest{ + StoreName: storeName, + Key: key, + Options: toProtoStateOptions(opts), + Metadata: meta, + } + + if etag != nil { + req.Etag = &v1.Etag{ + Value: etag.Value, + } + } + + _, err := c.protoClient.DeleteState(c.withAuthToken(ctx), req) + if err != nil { + return errors.Wrap(err, "error deleting state") + } + + return nil +} + +// DeleteBulkState deletes content for multiple keys from store. +func (c *GRPCClient) DeleteBulkState(ctx context.Context, storeName string, keys []string, meta map[string]string) error { + if len(keys) == 0 { + return nil + } + + items := make([]*DeleteStateItem, 0, len(keys)) + for i := 0; i < len(keys); i++ { + item := &DeleteStateItem{ + Key: keys[i], + Metadata: meta, + } + items = append(items, item) + } + + return c.DeleteBulkStateItems(ctx, storeName, items) +} + +// DeleteBulkStateItems deletes content for multiple items from store. +func (c *GRPCClient) DeleteBulkStateItems(ctx context.Context, storeName string, items []*DeleteStateItem) error { + if len(items) == 0 { + return nil + } + + states := make([]*v1.StateItem, 0, len(items)) + for i := 0; i < len(items); i++ { + item := items[i] + if err := hasRequiredStateArgs(storeName, item.Key); err != nil { + return errors.Wrap(err, "missing required arguments") + } + + state := &v1.StateItem{ + Key: item.Key, + Metadata: item.Metadata, + Options: toProtoStateOptions(item.Options), + } + if item.Etag != nil { + state.Etag = &v1.Etag{ + Value: item.Etag.Value, + } + } + states = append(states, state) + } + + req := &pb.DeleteBulkStateRequest{ + StoreName: storeName, + States: states, + } + _, err := c.protoClient.DeleteBulkState(c.withAuthToken(ctx), req) + + return err +} + +func hasRequiredStateArgs(storeName, key string) error { + if storeName == "" { + return errors.New("store") + } + if key == "" { + return errors.New("key") + } + return nil +} diff --git a/vendor/github.com/dapr/go-sdk/dapr/proto/common/v1/common.pb.go b/vendor/github.com/dapr/go-sdk/dapr/proto/common/v1/common.pb.go new file mode 100644 index 00000000000..7c304cfceb4 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/dapr/proto/common/v1/common.pb.go @@ -0,0 +1,943 @@ +// +//Copyright 2021 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.21.1 +// source: dapr/proto/common/v1/common.proto + +package common + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Type of HTTP 1.1 Methods +// RFC 7231: https://tools.ietf.org/html/rfc7231#page-24 +// RFC 5789: https://datatracker.ietf.org/doc/html/rfc5789 +type HTTPExtension_Verb int32 + +const ( + HTTPExtension_NONE HTTPExtension_Verb = 0 + HTTPExtension_GET HTTPExtension_Verb = 1 + HTTPExtension_HEAD HTTPExtension_Verb = 2 + HTTPExtension_POST HTTPExtension_Verb = 3 + HTTPExtension_PUT HTTPExtension_Verb = 4 + HTTPExtension_DELETE HTTPExtension_Verb = 5 + HTTPExtension_CONNECT HTTPExtension_Verb = 6 + HTTPExtension_OPTIONS HTTPExtension_Verb = 7 + HTTPExtension_TRACE HTTPExtension_Verb = 8 + HTTPExtension_PATCH HTTPExtension_Verb = 9 +) + +// Enum value maps for HTTPExtension_Verb. +var ( + HTTPExtension_Verb_name = map[int32]string{ + 0: "NONE", + 1: "GET", + 2: "HEAD", + 3: "POST", + 4: "PUT", + 5: "DELETE", + 6: "CONNECT", + 7: "OPTIONS", + 8: "TRACE", + 9: "PATCH", + } + HTTPExtension_Verb_value = map[string]int32{ + "NONE": 0, + "GET": 1, + "HEAD": 2, + "POST": 3, + "PUT": 4, + "DELETE": 5, + "CONNECT": 6, + "OPTIONS": 7, + "TRACE": 8, + "PATCH": 9, + } +) + +func (x HTTPExtension_Verb) Enum() *HTTPExtension_Verb { + p := new(HTTPExtension_Verb) + *p = x + return p +} + +func (x HTTPExtension_Verb) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (HTTPExtension_Verb) Descriptor() protoreflect.EnumDescriptor { + return file_dapr_proto_common_v1_common_proto_enumTypes[0].Descriptor() +} + +func (HTTPExtension_Verb) Type() protoreflect.EnumType { + return &file_dapr_proto_common_v1_common_proto_enumTypes[0] +} + +func (x HTTPExtension_Verb) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use HTTPExtension_Verb.Descriptor instead. +func (HTTPExtension_Verb) EnumDescriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{0, 0} +} + +// Enum describing the supported concurrency for state. +type StateOptions_StateConcurrency int32 + +const ( + StateOptions_CONCURRENCY_UNSPECIFIED StateOptions_StateConcurrency = 0 + StateOptions_CONCURRENCY_FIRST_WRITE StateOptions_StateConcurrency = 1 + StateOptions_CONCURRENCY_LAST_WRITE StateOptions_StateConcurrency = 2 +) + +// Enum value maps for StateOptions_StateConcurrency. +var ( + StateOptions_StateConcurrency_name = map[int32]string{ + 0: "CONCURRENCY_UNSPECIFIED", + 1: "CONCURRENCY_FIRST_WRITE", + 2: "CONCURRENCY_LAST_WRITE", + } + StateOptions_StateConcurrency_value = map[string]int32{ + "CONCURRENCY_UNSPECIFIED": 0, + "CONCURRENCY_FIRST_WRITE": 1, + "CONCURRENCY_LAST_WRITE": 2, + } +) + +func (x StateOptions_StateConcurrency) Enum() *StateOptions_StateConcurrency { + p := new(StateOptions_StateConcurrency) + *p = x + return p +} + +func (x StateOptions_StateConcurrency) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StateOptions_StateConcurrency) Descriptor() protoreflect.EnumDescriptor { + return file_dapr_proto_common_v1_common_proto_enumTypes[1].Descriptor() +} + +func (StateOptions_StateConcurrency) Type() protoreflect.EnumType { + return &file_dapr_proto_common_v1_common_proto_enumTypes[1] +} + +func (x StateOptions_StateConcurrency) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StateOptions_StateConcurrency.Descriptor instead. +func (StateOptions_StateConcurrency) EnumDescriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{5, 0} +} + +// Enum describing the supported consistency for state. +type StateOptions_StateConsistency int32 + +const ( + StateOptions_CONSISTENCY_UNSPECIFIED StateOptions_StateConsistency = 0 + StateOptions_CONSISTENCY_EVENTUAL StateOptions_StateConsistency = 1 + StateOptions_CONSISTENCY_STRONG StateOptions_StateConsistency = 2 +) + +// Enum value maps for StateOptions_StateConsistency. +var ( + StateOptions_StateConsistency_name = map[int32]string{ + 0: "CONSISTENCY_UNSPECIFIED", + 1: "CONSISTENCY_EVENTUAL", + 2: "CONSISTENCY_STRONG", + } + StateOptions_StateConsistency_value = map[string]int32{ + "CONSISTENCY_UNSPECIFIED": 0, + "CONSISTENCY_EVENTUAL": 1, + "CONSISTENCY_STRONG": 2, + } +) + +func (x StateOptions_StateConsistency) Enum() *StateOptions_StateConsistency { + p := new(StateOptions_StateConsistency) + *p = x + return p +} + +func (x StateOptions_StateConsistency) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StateOptions_StateConsistency) Descriptor() protoreflect.EnumDescriptor { + return file_dapr_proto_common_v1_common_proto_enumTypes[2].Descriptor() +} + +func (StateOptions_StateConsistency) Type() protoreflect.EnumType { + return &file_dapr_proto_common_v1_common_proto_enumTypes[2] +} + +func (x StateOptions_StateConsistency) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StateOptions_StateConsistency.Descriptor instead. +func (StateOptions_StateConsistency) EnumDescriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{5, 1} +} + +// HTTPExtension includes HTTP verb and querystring +// when Dapr runtime delivers HTTP content. +// +// For example, when callers calls http invoke api +// POST http://localhost:3500/v1.0/invoke//method/?query1=value1&query2=value2 +// +// Dapr runtime will parse POST as a verb and extract querystring to quersytring map. +type HTTPExtension struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. HTTP verb. + Verb HTTPExtension_Verb `protobuf:"varint,1,opt,name=verb,proto3,enum=dapr.proto.common.v1.HTTPExtension_Verb" json:"verb,omitempty"` + // Optional. querystring represents an encoded HTTP url query string in the following format: name=value&name2=value2 + Querystring string `protobuf:"bytes,2,opt,name=querystring,proto3" json:"querystring,omitempty"` +} + +func (x *HTTPExtension) Reset() { + *x = HTTPExtension{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HTTPExtension) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HTTPExtension) ProtoMessage() {} + +func (x *HTTPExtension) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[0] + 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 HTTPExtension.ProtoReflect.Descriptor instead. +func (*HTTPExtension) Descriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{0} +} + +func (x *HTTPExtension) GetVerb() HTTPExtension_Verb { + if x != nil { + return x.Verb + } + return HTTPExtension_NONE +} + +func (x *HTTPExtension) GetQuerystring() string { + if x != nil { + return x.Querystring + } + return "" +} + +// InvokeRequest is the message to invoke a method with the data. +// This message is used in InvokeService of Dapr gRPC Service and OnInvoke +// of AppCallback gRPC service. +type InvokeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. method is a method name which will be invoked by caller. + Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` + // Required. Bytes value or Protobuf message which caller sent. + // Dapr treats Any.value as bytes type if Any.type_url is unset. + Data *anypb.Any `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The type of data content. + // + // This field is required if data delivers http request body + // Otherwise, this is optional. + ContentType string `protobuf:"bytes,3,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + // HTTP specific fields if request conveys http-compatible request. + // + // This field is required for http-compatible request. Otherwise, + // this field is optional. + HttpExtension *HTTPExtension `protobuf:"bytes,4,opt,name=http_extension,json=httpExtension,proto3" json:"http_extension,omitempty"` +} + +func (x *InvokeRequest) Reset() { + *x = InvokeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InvokeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InvokeRequest) ProtoMessage() {} + +func (x *InvokeRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[1] + 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 InvokeRequest.ProtoReflect.Descriptor instead. +func (*InvokeRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{1} +} + +func (x *InvokeRequest) GetMethod() string { + if x != nil { + return x.Method + } + return "" +} + +func (x *InvokeRequest) GetData() *anypb.Any { + if x != nil { + return x.Data + } + return nil +} + +func (x *InvokeRequest) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +func (x *InvokeRequest) GetHttpExtension() *HTTPExtension { + if x != nil { + return x.HttpExtension + } + return nil +} + +// InvokeResponse is the response message inclduing data and its content type +// from app callback. +// This message is used in InvokeService of Dapr gRPC Service and OnInvoke +// of AppCallback gRPC service. +type InvokeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The content body of InvokeService response. + Data *anypb.Any `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + // Required. The type of data content. + ContentType string `protobuf:"bytes,2,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` +} + +func (x *InvokeResponse) Reset() { + *x = InvokeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InvokeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InvokeResponse) ProtoMessage() {} + +func (x *InvokeResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[2] + 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 InvokeResponse.ProtoReflect.Descriptor instead. +func (*InvokeResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{2} +} + +func (x *InvokeResponse) GetData() *anypb.Any { + if x != nil { + return x.Data + } + return nil +} + +func (x *InvokeResponse) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +// StateItem represents state key, value, and additional options to save state. +type StateItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The state key + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // Required. The state data for key + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + // The entity tag which represents the specific version of data. + // The exact ETag format is defined by the corresponding data store. + Etag *Etag `protobuf:"bytes,3,opt,name=etag,proto3" json:"etag,omitempty"` + // The metadata which will be passed to state store component. + Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Options for concurrency and consistency to save the state. + Options *StateOptions `protobuf:"bytes,5,opt,name=options,proto3" json:"options,omitempty"` +} + +func (x *StateItem) Reset() { + *x = StateItem{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StateItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StateItem) ProtoMessage() {} + +func (x *StateItem) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[3] + 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 StateItem.ProtoReflect.Descriptor instead. +func (*StateItem) Descriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{3} +} + +func (x *StateItem) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *StateItem) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +func (x *StateItem) GetEtag() *Etag { + if x != nil { + return x.Etag + } + return nil +} + +func (x *StateItem) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *StateItem) GetOptions() *StateOptions { + if x != nil { + return x.Options + } + return nil +} + +// Etag represents a state item version +type Etag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // value sets the etag value + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *Etag) Reset() { + *x = Etag{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Etag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Etag) ProtoMessage() {} + +func (x *Etag) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[4] + 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 Etag.ProtoReflect.Descriptor instead. +func (*Etag) Descriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{4} +} + +func (x *Etag) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// StateOptions configures concurrency and consistency for state operations +type StateOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Concurrency StateOptions_StateConcurrency `protobuf:"varint,1,opt,name=concurrency,proto3,enum=dapr.proto.common.v1.StateOptions_StateConcurrency" json:"concurrency,omitempty"` + Consistency StateOptions_StateConsistency `protobuf:"varint,2,opt,name=consistency,proto3,enum=dapr.proto.common.v1.StateOptions_StateConsistency" json:"consistency,omitempty"` +} + +func (x *StateOptions) Reset() { + *x = StateOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StateOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StateOptions) ProtoMessage() {} + +func (x *StateOptions) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[5] + 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 StateOptions.ProtoReflect.Descriptor instead. +func (*StateOptions) Descriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{5} +} + +func (x *StateOptions) GetConcurrency() StateOptions_StateConcurrency { + if x != nil { + return x.Concurrency + } + return StateOptions_CONCURRENCY_UNSPECIFIED +} + +func (x *StateOptions) GetConsistency() StateOptions_StateConsistency { + if x != nil { + return x.Consistency + } + return StateOptions_CONSISTENCY_UNSPECIFIED +} + +// ConfigurationItem represents all the configuration with its name(key). +type ConfigurationItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The value of configuration item. + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + // Version is response only and cannot be fetched. Store is not expected to keep all versions available + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + // the metadata which will be passed to/from configuration store component. + 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"` +} + +func (x *ConfigurationItem) Reset() { + *x = ConfigurationItem{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConfigurationItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigurationItem) ProtoMessage() {} + +func (x *ConfigurationItem) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_common_v1_common_proto_msgTypes[6] + 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 ConfigurationItem.ProtoReflect.Descriptor instead. +func (*ConfigurationItem) Descriptor() ([]byte, []int) { + return file_dapr_proto_common_v1_common_proto_rawDescGZIP(), []int{6} +} + +func (x *ConfigurationItem) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +func (x *ConfigurationItem) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *ConfigurationItem) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +var File_dapr_proto_common_v1_common_proto protoreflect.FileDescriptor + +var file_dapr_proto_common_v1_common_proto_rawDesc = []byte{ + 0x0a, 0x21, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe3, 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x04, 0x76, 0x65, 0x72, 0x62, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x52, 0x04, + 0x76, 0x65, 0x72, 0x62, 0x12, 0x20, 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x72, 0x0a, 0x04, 0x56, 0x65, 0x72, 0x62, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x45, 0x41, 0x44, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x50, + 0x4f, 0x53, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x04, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, + 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x08, 0x12, + 0x09, 0x0a, 0x05, 0x50, 0x41, 0x54, 0x43, 0x48, 0x10, 0x09, 0x22, 0xc0, 0x01, 0x0a, 0x0d, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x4a, 0x0a, 0x0e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x48, 0x54, 0x54, 0x50, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, + 0x68, 0x74, 0x74, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x0a, + 0x0e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa9, 0x02, 0x0a, + 0x09, 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, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x61, 0x67, 0x52, 0x04, 0x65, 0x74, + 0x61, 0x67, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 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, 0x3c, 0x0a, + 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x1c, 0x0a, 0x04, 0x45, 0x74, 0x61, 0x67, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x89, 0x03, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x55, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x68, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x4e, + 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x4e, 0x43, 0x55, 0x52, + 0x52, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, + 0x45, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4e, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, + 0x43, 0x59, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x02, 0x22, + 0x61, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, + 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x55, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4f, + 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x53, 0x54, 0x52, 0x4f, 0x4e, 0x47, + 0x10, 0x02, 0x22, 0xd3, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 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, 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, 0x42, 0x69, 0x0a, 0x0a, 0x69, 0x6f, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x5a, 0x2f, 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, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 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 ( + file_dapr_proto_common_v1_common_proto_rawDescOnce sync.Once + file_dapr_proto_common_v1_common_proto_rawDescData = file_dapr_proto_common_v1_common_proto_rawDesc +) + +func file_dapr_proto_common_v1_common_proto_rawDescGZIP() []byte { + file_dapr_proto_common_v1_common_proto_rawDescOnce.Do(func() { + file_dapr_proto_common_v1_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_dapr_proto_common_v1_common_proto_rawDescData) + }) + return file_dapr_proto_common_v1_common_proto_rawDescData +} + +var file_dapr_proto_common_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_dapr_proto_common_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_dapr_proto_common_v1_common_proto_goTypes = []interface{}{ + (HTTPExtension_Verb)(0), // 0: dapr.proto.common.v1.HTTPExtension.Verb + (StateOptions_StateConcurrency)(0), // 1: dapr.proto.common.v1.StateOptions.StateConcurrency + (StateOptions_StateConsistency)(0), // 2: dapr.proto.common.v1.StateOptions.StateConsistency + (*HTTPExtension)(nil), // 3: dapr.proto.common.v1.HTTPExtension + (*InvokeRequest)(nil), // 4: dapr.proto.common.v1.InvokeRequest + (*InvokeResponse)(nil), // 5: dapr.proto.common.v1.InvokeResponse + (*StateItem)(nil), // 6: dapr.proto.common.v1.StateItem + (*Etag)(nil), // 7: dapr.proto.common.v1.Etag + (*StateOptions)(nil), // 8: dapr.proto.common.v1.StateOptions + (*ConfigurationItem)(nil), // 9: dapr.proto.common.v1.ConfigurationItem + nil, // 10: dapr.proto.common.v1.StateItem.MetadataEntry + nil, // 11: dapr.proto.common.v1.ConfigurationItem.MetadataEntry + (*anypb.Any)(nil), // 12: google.protobuf.Any +} +var file_dapr_proto_common_v1_common_proto_depIdxs = []int32{ + 0, // 0: dapr.proto.common.v1.HTTPExtension.verb:type_name -> dapr.proto.common.v1.HTTPExtension.Verb + 12, // 1: dapr.proto.common.v1.InvokeRequest.data:type_name -> google.protobuf.Any + 3, // 2: dapr.proto.common.v1.InvokeRequest.http_extension:type_name -> dapr.proto.common.v1.HTTPExtension + 12, // 3: dapr.proto.common.v1.InvokeResponse.data:type_name -> google.protobuf.Any + 7, // 4: dapr.proto.common.v1.StateItem.etag:type_name -> dapr.proto.common.v1.Etag + 10, // 5: dapr.proto.common.v1.StateItem.metadata:type_name -> dapr.proto.common.v1.StateItem.MetadataEntry + 8, // 6: dapr.proto.common.v1.StateItem.options:type_name -> dapr.proto.common.v1.StateOptions + 1, // 7: dapr.proto.common.v1.StateOptions.concurrency:type_name -> dapr.proto.common.v1.StateOptions.StateConcurrency + 2, // 8: dapr.proto.common.v1.StateOptions.consistency:type_name -> dapr.proto.common.v1.StateOptions.StateConsistency + 11, // 9: dapr.proto.common.v1.ConfigurationItem.metadata:type_name -> dapr.proto.common.v1.ConfigurationItem.MetadataEntry + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_dapr_proto_common_v1_common_proto_init() } +func file_dapr_proto_common_v1_common_proto_init() { + if File_dapr_proto_common_v1_common_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_dapr_proto_common_v1_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HTTPExtension); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_common_v1_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvokeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_common_v1_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvokeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_common_v1_common_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_common_v1_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Etag); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_common_v1_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateOptions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_common_v1_common_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigurationItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_dapr_proto_common_v1_common_proto_rawDesc, + NumEnums: 3, + NumMessages: 9, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_dapr_proto_common_v1_common_proto_goTypes, + DependencyIndexes: file_dapr_proto_common_v1_common_proto_depIdxs, + EnumInfos: file_dapr_proto_common_v1_common_proto_enumTypes, + MessageInfos: file_dapr_proto_common_v1_common_proto_msgTypes, + }.Build() + File_dapr_proto_common_v1_common_proto = out.File + file_dapr_proto_common_v1_common_proto_rawDesc = nil + file_dapr_proto_common_v1_common_proto_goTypes = nil + file_dapr_proto_common_v1_common_proto_depIdxs = nil +} diff --git a/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/appcallback.pb.go b/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/appcallback.pb.go new file mode 100644 index 00000000000..be7813f2d6a --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/appcallback.pb.go @@ -0,0 +1,1184 @@ +// +//Copyright 2021 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.21.1 +// source: dapr/proto/runtime/v1/appcallback.proto + +package runtime + +import ( + v1 "github.com/dapr/go-sdk/dapr/proto/common/v1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// TopicEventResponseStatus allows apps to have finer control over handling of the message. +type TopicEventResponse_TopicEventResponseStatus int32 + +const ( + // SUCCESS is the default behavior: message is acknowledged and not retried or logged. + TopicEventResponse_SUCCESS TopicEventResponse_TopicEventResponseStatus = 0 + // RETRY status signals Dapr to retry the message as part of an expected scenario (no warning is logged). + TopicEventResponse_RETRY TopicEventResponse_TopicEventResponseStatus = 1 + // DROP status signals Dapr to drop the message as part of an unexpected scenario (warning is logged). + TopicEventResponse_DROP TopicEventResponse_TopicEventResponseStatus = 2 +) + +// Enum value maps for TopicEventResponse_TopicEventResponseStatus. +var ( + TopicEventResponse_TopicEventResponseStatus_name = map[int32]string{ + 0: "SUCCESS", + 1: "RETRY", + 2: "DROP", + } + TopicEventResponse_TopicEventResponseStatus_value = map[string]int32{ + "SUCCESS": 0, + "RETRY": 1, + "DROP": 2, + } +) + +func (x TopicEventResponse_TopicEventResponseStatus) Enum() *TopicEventResponse_TopicEventResponseStatus { + p := new(TopicEventResponse_TopicEventResponseStatus) + *p = x + return p +} + +func (x TopicEventResponse_TopicEventResponseStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TopicEventResponse_TopicEventResponseStatus) Descriptor() protoreflect.EnumDescriptor { + return file_dapr_proto_runtime_v1_appcallback_proto_enumTypes[0].Descriptor() +} + +func (TopicEventResponse_TopicEventResponseStatus) Type() protoreflect.EnumType { + return &file_dapr_proto_runtime_v1_appcallback_proto_enumTypes[0] +} + +func (x TopicEventResponse_TopicEventResponseStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TopicEventResponse_TopicEventResponseStatus.Descriptor instead. +func (TopicEventResponse_TopicEventResponseStatus) EnumDescriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{1, 0} +} + +// BindingEventConcurrency is the kind of concurrency +type BindingEventResponse_BindingEventConcurrency int32 + +const ( + // SEQUENTIAL sends data to output bindings specified in "to" sequentially. + BindingEventResponse_SEQUENTIAL BindingEventResponse_BindingEventConcurrency = 0 + // PARALLEL sends data to output bindings specified in "to" in parallel. + BindingEventResponse_PARALLEL BindingEventResponse_BindingEventConcurrency = 1 +) + +// Enum value maps for BindingEventResponse_BindingEventConcurrency. +var ( + BindingEventResponse_BindingEventConcurrency_name = map[int32]string{ + 0: "SEQUENTIAL", + 1: "PARALLEL", + } + BindingEventResponse_BindingEventConcurrency_value = map[string]int32{ + "SEQUENTIAL": 0, + "PARALLEL": 1, + } +) + +func (x BindingEventResponse_BindingEventConcurrency) Enum() *BindingEventResponse_BindingEventConcurrency { + p := new(BindingEventResponse_BindingEventConcurrency) + *p = x + return p +} + +func (x BindingEventResponse_BindingEventConcurrency) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BindingEventResponse_BindingEventConcurrency) Descriptor() protoreflect.EnumDescriptor { + return file_dapr_proto_runtime_v1_appcallback_proto_enumTypes[1].Descriptor() +} + +func (BindingEventResponse_BindingEventConcurrency) Type() protoreflect.EnumType { + return &file_dapr_proto_runtime_v1_appcallback_proto_enumTypes[1] +} + +func (x BindingEventResponse_BindingEventConcurrency) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BindingEventResponse_BindingEventConcurrency.Descriptor instead. +func (BindingEventResponse_BindingEventConcurrency) EnumDescriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{3, 0} +} + +// TopicEventRequest message is compatible with CloudEvent spec v1.0 +// https://github.com/cloudevents/spec/blob/v1.0/spec.md +type TopicEventRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id identifies the event. Producers MUST ensure that source + id + // is unique for each distinct event. If a duplicate event is re-sent + // (e.g. due to a network error) it MAY have the same id. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // source identifies the context in which an event happened. + // Often this will include information such as the type of the + // event source, the organization publishing the event or the process + // that produced the event. The exact syntax and semantics behind + // the data encoded in the URI is defined by the event producer. + Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + // The type of event related to the originating occurrence. + Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` + // The version of the CloudEvents specification. + SpecVersion string `protobuf:"bytes,4,opt,name=spec_version,json=specVersion,proto3" json:"spec_version,omitempty"` + // The content type of data value. + DataContentType string `protobuf:"bytes,5,opt,name=data_content_type,json=dataContentType,proto3" json:"data_content_type,omitempty"` + // The content of the event. + Data []byte `protobuf:"bytes,7,opt,name=data,proto3" json:"data,omitempty"` + // The pubsub topic which publisher sent to. + Topic string `protobuf:"bytes,6,opt,name=topic,proto3" json:"topic,omitempty"` + // The name of the pubsub the publisher sent to. + PubsubName string `protobuf:"bytes,8,opt,name=pubsub_name,json=pubsubName,proto3" json:"pubsub_name,omitempty"` + // The matching path from TopicSubscription/routes (if specified) for this event. + // This value is used by OnTopicEvent to "switch" inside the handler. + Path string `protobuf:"bytes,9,opt,name=path,proto3" json:"path,omitempty"` +} + +func (x *TopicEventRequest) Reset() { + *x = TopicEventRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TopicEventRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TopicEventRequest) ProtoMessage() {} + +func (x *TopicEventRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[0] + 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 TopicEventRequest.ProtoReflect.Descriptor instead. +func (*TopicEventRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{0} +} + +func (x *TopicEventRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *TopicEventRequest) GetSource() string { + if x != nil { + return x.Source + } + return "" +} + +func (x *TopicEventRequest) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *TopicEventRequest) GetSpecVersion() string { + if x != nil { + return x.SpecVersion + } + return "" +} + +func (x *TopicEventRequest) GetDataContentType() string { + if x != nil { + return x.DataContentType + } + return "" +} + +func (x *TopicEventRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *TopicEventRequest) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *TopicEventRequest) GetPubsubName() string { + if x != nil { + return x.PubsubName + } + return "" +} + +func (x *TopicEventRequest) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +// TopicEventResponse is response from app on published message +type TopicEventResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of output bindings. + Status TopicEventResponse_TopicEventResponseStatus `protobuf:"varint,1,opt,name=status,proto3,enum=dapr.proto.runtime.v1.TopicEventResponse_TopicEventResponseStatus" json:"status,omitempty"` +} + +func (x *TopicEventResponse) Reset() { + *x = TopicEventResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TopicEventResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TopicEventResponse) ProtoMessage() {} + +func (x *TopicEventResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[1] + 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 TopicEventResponse.ProtoReflect.Descriptor instead. +func (*TopicEventResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{1} +} + +func (x *TopicEventResponse) GetStatus() TopicEventResponse_TopicEventResponseStatus { + if x != nil { + return x.Status + } + return TopicEventResponse_SUCCESS +} + +// BindingEventRequest represents input bindings event. +type BindingEventRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The name of the input binding component. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Required. The payload that the input bindings sent + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The metadata set by the input binging components. + 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"` +} + +func (x *BindingEventRequest) Reset() { + *x = BindingEventRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BindingEventRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BindingEventRequest) ProtoMessage() {} + +func (x *BindingEventRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[2] + 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 BindingEventRequest.ProtoReflect.Descriptor instead. +func (*BindingEventRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{2} +} + +func (x *BindingEventRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BindingEventRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *BindingEventRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// BindingEventResponse includes operations to save state or +// send data to output bindings optionally. +type BindingEventResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of state store where states are saved. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The state key values which will be stored in store_name. + States []*v1.StateItem `protobuf:"bytes,2,rep,name=states,proto3" json:"states,omitempty"` + // The list of output bindings. + To []string `protobuf:"bytes,3,rep,name=to,proto3" json:"to,omitempty"` + // The content which will be sent to "to" output bindings. + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + // The concurrency of output bindings to send data to + // "to" output bindings list. The default is SEQUENTIAL. + Concurrency BindingEventResponse_BindingEventConcurrency `protobuf:"varint,5,opt,name=concurrency,proto3,enum=dapr.proto.runtime.v1.BindingEventResponse_BindingEventConcurrency" json:"concurrency,omitempty"` +} + +func (x *BindingEventResponse) Reset() { + *x = BindingEventResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BindingEventResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BindingEventResponse) ProtoMessage() {} + +func (x *BindingEventResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[3] + 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 BindingEventResponse.ProtoReflect.Descriptor instead. +func (*BindingEventResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{3} +} + +func (x *BindingEventResponse) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *BindingEventResponse) GetStates() []*v1.StateItem { + if x != nil { + return x.States + } + return nil +} + +func (x *BindingEventResponse) GetTo() []string { + if x != nil { + return x.To + } + return nil +} + +func (x *BindingEventResponse) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *BindingEventResponse) GetConcurrency() BindingEventResponse_BindingEventConcurrency { + if x != nil { + return x.Concurrency + } + return BindingEventResponse_SEQUENTIAL +} + +// ListTopicSubscriptionsResponse is the message including the list of the subscribing topics. +type ListTopicSubscriptionsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of topics. + Subscriptions []*TopicSubscription `protobuf:"bytes,1,rep,name=subscriptions,proto3" json:"subscriptions,omitempty"` +} + +func (x *ListTopicSubscriptionsResponse) Reset() { + *x = ListTopicSubscriptionsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListTopicSubscriptionsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTopicSubscriptionsResponse) ProtoMessage() {} + +func (x *ListTopicSubscriptionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[4] + 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 ListTopicSubscriptionsResponse.ProtoReflect.Descriptor instead. +func (*ListTopicSubscriptionsResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{4} +} + +func (x *ListTopicSubscriptionsResponse) GetSubscriptions() []*TopicSubscription { + if x != nil { + return x.Subscriptions + } + return nil +} + +// TopicSubscription represents topic and metadata. +type TopicSubscription struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The name of the pubsub containing the topic below to subscribe to. + PubsubName string `protobuf:"bytes,1,opt,name=pubsub_name,json=pubsubName,proto3" json:"pubsub_name,omitempty"` + // Required. The name of topic which will be subscribed + Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` + // The optional properties used for this topic's subscription e.g. session id + 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"` + // The optional routing rules to match against. In the gRPC interface, OnTopicEvent + // is still invoked but the matching path is sent in the TopicEventRequest. + Routes *TopicRoutes `protobuf:"bytes,5,opt,name=routes,proto3" json:"routes,omitempty"` + // The optional dead letter queue for this topic to send events to. + DeadLetterTopic string `protobuf:"bytes,6,opt,name=dead_letter_topic,json=deadLetterTopic,proto3" json:"dead_letter_topic,omitempty"` +} + +func (x *TopicSubscription) Reset() { + *x = TopicSubscription{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TopicSubscription) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TopicSubscription) ProtoMessage() {} + +func (x *TopicSubscription) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[5] + 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 TopicSubscription.ProtoReflect.Descriptor instead. +func (*TopicSubscription) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{5} +} + +func (x *TopicSubscription) GetPubsubName() string { + if x != nil { + return x.PubsubName + } + return "" +} + +func (x *TopicSubscription) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *TopicSubscription) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *TopicSubscription) GetRoutes() *TopicRoutes { + if x != nil { + return x.Routes + } + return nil +} + +func (x *TopicSubscription) GetDeadLetterTopic() string { + if x != nil { + return x.DeadLetterTopic + } + return "" +} + +type TopicRoutes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of rules for this topic. + Rules []*TopicRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` + // The default path for this topic. + Default string `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"` +} + +func (x *TopicRoutes) Reset() { + *x = TopicRoutes{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TopicRoutes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TopicRoutes) ProtoMessage() {} + +func (x *TopicRoutes) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[6] + 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 TopicRoutes.ProtoReflect.Descriptor instead. +func (*TopicRoutes) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{6} +} + +func (x *TopicRoutes) GetRules() []*TopicRule { + if x != nil { + return x.Rules + } + return nil +} + +func (x *TopicRoutes) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +type TopicRule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The optional CEL expression used to match the event. + // If the match is not specified, then the route is considered + // the default. + Match string `protobuf:"bytes,1,opt,name=match,proto3" json:"match,omitempty"` + // The path used to identify matches for this subscription. + // This value is passed in TopicEventRequest and used by OnTopicEvent to "switch" + // inside the handler. + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` +} + +func (x *TopicRule) Reset() { + *x = TopicRule{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TopicRule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TopicRule) ProtoMessage() {} + +func (x *TopicRule) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[7] + 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 TopicRule.ProtoReflect.Descriptor instead. +func (*TopicRule) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{7} +} + +func (x *TopicRule) GetMatch() string { + if x != nil { + return x.Match + } + return "" +} + +func (x *TopicRule) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +// ListInputBindingsResponse is the message including the list of input bindings. +type ListInputBindingsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of input bindings. + Bindings []string `protobuf:"bytes,1,rep,name=bindings,proto3" json:"bindings,omitempty"` +} + +func (x *ListInputBindingsResponse) Reset() { + *x = ListInputBindingsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListInputBindingsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListInputBindingsResponse) ProtoMessage() {} + +func (x *ListInputBindingsResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[8] + 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 ListInputBindingsResponse.ProtoReflect.Descriptor instead. +func (*ListInputBindingsResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{8} +} + +func (x *ListInputBindingsResponse) GetBindings() []string { + if x != nil { + return x.Bindings + } + return nil +} + +// HealthCheckResponse is the message with the response to the health check. +// This message is currently empty as used as placeholder. +type HealthCheckResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *HealthCheckResponse) Reset() { + *x = HealthCheckResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HealthCheckResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HealthCheckResponse) ProtoMessage() {} + +func (x *HealthCheckResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[9] + 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 HealthCheckResponse.ProtoReflect.Descriptor instead. +func (*HealthCheckResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP(), []int{9} +} + +var File_dapr_proto_runtime_v1_appcallback_proto protoreflect.FileDescriptor + +var file_dapr_proto_runtime_v1_appcallback_proto_rawDesc = []byte{ + 0x0a, 0x27, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x64, 0x61, 0x70, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x64, + 0x61, 0x70, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0xfd, 0x01, 0x0a, 0x11, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x22, 0xae, 0x01, 0x0a, 0x12, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 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, + 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x3c, 0x0a, 0x18, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x52, 0x45, 0x54, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x52, 0x4f, 0x50, 0x10, + 0x02, 0x22, 0xd0, 0x01, 0x0a, 0x13, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x54, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 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, 0x42, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0xb2, 0x02, 0x0a, 0x14, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x37, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x65, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x43, + 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x22, 0x37, 0x0a, 0x17, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x0a, 0x53, + 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, + 0x41, 0x52, 0x41, 0x4c, 0x4c, 0x45, 0x4c, 0x10, 0x01, 0x22, 0x70, 0x0a, 0x1e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 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, 0x54, 0x6f, 0x70, 0x69, 0x63, + 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, 0x22, 0xc3, 0x02, 0x0a, 0x11, + 0x54, 0x6f, 0x70, 0x69, 0x63, 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, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x64, 0x61, 0x70, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 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, 0x3a, 0x0a, 0x06, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, + 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, 0x61, 0x64, + 0x5f, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x06, 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, 0x5f, 0x0a, 0x0b, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, + 0x12, 0x36, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x75, 0x6c, + 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x35, 0x0a, 0x09, 0x54, 0x6f, 0x70, 0x69, 0x63, 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, 0x37, 0x0a, 0x19, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x86, 0x04, 0x0a, 0x0b, 0x41, 0x70, + 0x70, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x57, 0x0a, 0x08, 0x4f, 0x6e, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x23, 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, 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, 0x69, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x35, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, + 0x0c, 0x4f, 0x6e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, + 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, + 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 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, 0x30, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0e, 0x4f, 0x6e, 0x42, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 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, + 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x42, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x32, 0x6d, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x53, 0x0a, 0x0b, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 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, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x79, 0x0a, 0x0a, 0x69, 0x6f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x76, 0x31, 0x42, + 0x15, 0x44, 0x61, 0x70, 0x72, 0x41, 0x70, 0x70, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 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, 0x20, 0x44, 0x61, 0x70, 0x72, + 0x2e, 0x41, 0x70, 0x70, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 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 ( + file_dapr_proto_runtime_v1_appcallback_proto_rawDescOnce sync.Once + file_dapr_proto_runtime_v1_appcallback_proto_rawDescData = file_dapr_proto_runtime_v1_appcallback_proto_rawDesc +) + +func file_dapr_proto_runtime_v1_appcallback_proto_rawDescGZIP() []byte { + file_dapr_proto_runtime_v1_appcallback_proto_rawDescOnce.Do(func() { + file_dapr_proto_runtime_v1_appcallback_proto_rawDescData = protoimpl.X.CompressGZIP(file_dapr_proto_runtime_v1_appcallback_proto_rawDescData) + }) + return file_dapr_proto_runtime_v1_appcallback_proto_rawDescData +} + +var file_dapr_proto_runtime_v1_appcallback_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_dapr_proto_runtime_v1_appcallback_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_dapr_proto_runtime_v1_appcallback_proto_goTypes = []interface{}{ + (TopicEventResponse_TopicEventResponseStatus)(0), // 0: dapr.proto.runtime.v1.TopicEventResponse.TopicEventResponseStatus + (BindingEventResponse_BindingEventConcurrency)(0), // 1: dapr.proto.runtime.v1.BindingEventResponse.BindingEventConcurrency + (*TopicEventRequest)(nil), // 2: dapr.proto.runtime.v1.TopicEventRequest + (*TopicEventResponse)(nil), // 3: dapr.proto.runtime.v1.TopicEventResponse + (*BindingEventRequest)(nil), // 4: dapr.proto.runtime.v1.BindingEventRequest + (*BindingEventResponse)(nil), // 5: dapr.proto.runtime.v1.BindingEventResponse + (*ListTopicSubscriptionsResponse)(nil), // 6: dapr.proto.runtime.v1.ListTopicSubscriptionsResponse + (*TopicSubscription)(nil), // 7: dapr.proto.runtime.v1.TopicSubscription + (*TopicRoutes)(nil), // 8: dapr.proto.runtime.v1.TopicRoutes + (*TopicRule)(nil), // 9: dapr.proto.runtime.v1.TopicRule + (*ListInputBindingsResponse)(nil), // 10: dapr.proto.runtime.v1.ListInputBindingsResponse + (*HealthCheckResponse)(nil), // 11: dapr.proto.runtime.v1.HealthCheckResponse + nil, // 12: dapr.proto.runtime.v1.BindingEventRequest.MetadataEntry + nil, // 13: dapr.proto.runtime.v1.TopicSubscription.MetadataEntry + (*v1.StateItem)(nil), // 14: dapr.proto.common.v1.StateItem + (*v1.InvokeRequest)(nil), // 15: dapr.proto.common.v1.InvokeRequest + (*emptypb.Empty)(nil), // 16: google.protobuf.Empty + (*v1.InvokeResponse)(nil), // 17: dapr.proto.common.v1.InvokeResponse +} +var file_dapr_proto_runtime_v1_appcallback_proto_depIdxs = []int32{ + 0, // 0: dapr.proto.runtime.v1.TopicEventResponse.status:type_name -> dapr.proto.runtime.v1.TopicEventResponse.TopicEventResponseStatus + 12, // 1: dapr.proto.runtime.v1.BindingEventRequest.metadata:type_name -> dapr.proto.runtime.v1.BindingEventRequest.MetadataEntry + 14, // 2: dapr.proto.runtime.v1.BindingEventResponse.states:type_name -> dapr.proto.common.v1.StateItem + 1, // 3: dapr.proto.runtime.v1.BindingEventResponse.concurrency:type_name -> dapr.proto.runtime.v1.BindingEventResponse.BindingEventConcurrency + 7, // 4: dapr.proto.runtime.v1.ListTopicSubscriptionsResponse.subscriptions:type_name -> dapr.proto.runtime.v1.TopicSubscription + 13, // 5: dapr.proto.runtime.v1.TopicSubscription.metadata:type_name -> dapr.proto.runtime.v1.TopicSubscription.MetadataEntry + 8, // 6: dapr.proto.runtime.v1.TopicSubscription.routes:type_name -> dapr.proto.runtime.v1.TopicRoutes + 9, // 7: dapr.proto.runtime.v1.TopicRoutes.rules:type_name -> dapr.proto.runtime.v1.TopicRule + 15, // 8: dapr.proto.runtime.v1.AppCallback.OnInvoke:input_type -> dapr.proto.common.v1.InvokeRequest + 16, // 9: dapr.proto.runtime.v1.AppCallback.ListTopicSubscriptions:input_type -> google.protobuf.Empty + 2, // 10: dapr.proto.runtime.v1.AppCallback.OnTopicEvent:input_type -> dapr.proto.runtime.v1.TopicEventRequest + 16, // 11: dapr.proto.runtime.v1.AppCallback.ListInputBindings:input_type -> google.protobuf.Empty + 4, // 12: dapr.proto.runtime.v1.AppCallback.OnBindingEvent:input_type -> dapr.proto.runtime.v1.BindingEventRequest + 16, // 13: dapr.proto.runtime.v1.AppCallbackHealthCheck.HealthCheck:input_type -> google.protobuf.Empty + 17, // 14: dapr.proto.runtime.v1.AppCallback.OnInvoke:output_type -> dapr.proto.common.v1.InvokeResponse + 6, // 15: dapr.proto.runtime.v1.AppCallback.ListTopicSubscriptions:output_type -> dapr.proto.runtime.v1.ListTopicSubscriptionsResponse + 3, // 16: dapr.proto.runtime.v1.AppCallback.OnTopicEvent:output_type -> dapr.proto.runtime.v1.TopicEventResponse + 10, // 17: dapr.proto.runtime.v1.AppCallback.ListInputBindings:output_type -> dapr.proto.runtime.v1.ListInputBindingsResponse + 5, // 18: dapr.proto.runtime.v1.AppCallback.OnBindingEvent:output_type -> dapr.proto.runtime.v1.BindingEventResponse + 11, // 19: dapr.proto.runtime.v1.AppCallbackHealthCheck.HealthCheck:output_type -> dapr.proto.runtime.v1.HealthCheckResponse + 14, // [14:20] is the sub-list for method output_type + 8, // [8:14] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name +} + +func init() { file_dapr_proto_runtime_v1_appcallback_proto_init() } +func file_dapr_proto_runtime_v1_appcallback_proto_init() { + if File_dapr_proto_runtime_v1_appcallback_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopicEventRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopicEventResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BindingEventRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BindingEventResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListTopicSubscriptionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopicSubscription); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopicRoutes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopicRule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListInputBindingsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dapr_proto_runtime_v1_appcallback_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HealthCheckResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_dapr_proto_runtime_v1_appcallback_proto_rawDesc, + NumEnums: 2, + NumMessages: 12, + NumExtensions: 0, + NumServices: 2, + }, + GoTypes: file_dapr_proto_runtime_v1_appcallback_proto_goTypes, + DependencyIndexes: file_dapr_proto_runtime_v1_appcallback_proto_depIdxs, + EnumInfos: file_dapr_proto_runtime_v1_appcallback_proto_enumTypes, + MessageInfos: file_dapr_proto_runtime_v1_appcallback_proto_msgTypes, + }.Build() + File_dapr_proto_runtime_v1_appcallback_proto = out.File + file_dapr_proto_runtime_v1_appcallback_proto_rawDesc = nil + file_dapr_proto_runtime_v1_appcallback_proto_goTypes = nil + file_dapr_proto_runtime_v1_appcallback_proto_depIdxs = nil +} diff --git a/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/appcallback_grpc.pb.go b/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/appcallback_grpc.pb.go new file mode 100644 index 00000000000..7a374e2369b --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/appcallback_grpc.pb.go @@ -0,0 +1,351 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.1 +// source: dapr/proto/runtime/v1/appcallback.proto + +package runtime + +import ( + context "context" + v1 "github.com/dapr/go-sdk/dapr/proto/common/v1" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// AppCallbackClient is the client API for AppCallback service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type AppCallbackClient interface { + // Invokes service method with InvokeRequest. + OnInvoke(ctx context.Context, in *v1.InvokeRequest, opts ...grpc.CallOption) (*v1.InvokeResponse, error) + // Lists all topics subscribed by this app. + ListTopicSubscriptions(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListTopicSubscriptionsResponse, error) + // Subscribes events from Pubsub + OnTopicEvent(ctx context.Context, in *TopicEventRequest, opts ...grpc.CallOption) (*TopicEventResponse, error) + // Lists all input bindings subscribed by this app. + ListInputBindings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListInputBindingsResponse, error) + // Listens events from the input bindings + // + // User application can save the states or send the events to the output + // bindings optionally by returning BindingEventResponse. + OnBindingEvent(ctx context.Context, in *BindingEventRequest, opts ...grpc.CallOption) (*BindingEventResponse, error) +} + +type appCallbackClient struct { + cc grpc.ClientConnInterface +} + +func NewAppCallbackClient(cc grpc.ClientConnInterface) AppCallbackClient { + return &appCallbackClient{cc} +} + +func (c *appCallbackClient) OnInvoke(ctx context.Context, in *v1.InvokeRequest, opts ...grpc.CallOption) (*v1.InvokeResponse, error) { + out := new(v1.InvokeResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.AppCallback/OnInvoke", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *appCallbackClient) ListTopicSubscriptions(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListTopicSubscriptionsResponse, error) { + out := new(ListTopicSubscriptionsResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.AppCallback/ListTopicSubscriptions", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *appCallbackClient) OnTopicEvent(ctx context.Context, in *TopicEventRequest, opts ...grpc.CallOption) (*TopicEventResponse, error) { + out := new(TopicEventResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.AppCallback/OnTopicEvent", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *appCallbackClient) ListInputBindings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListInputBindingsResponse, error) { + out := new(ListInputBindingsResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.AppCallback/ListInputBindings", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *appCallbackClient) OnBindingEvent(ctx context.Context, in *BindingEventRequest, opts ...grpc.CallOption) (*BindingEventResponse, error) { + out := new(BindingEventResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.AppCallback/OnBindingEvent", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AppCallbackServer is the server API for AppCallback service. +// All implementations should embed UnimplementedAppCallbackServer +// for forward compatibility +type AppCallbackServer interface { + // Invokes service method with InvokeRequest. + OnInvoke(context.Context, *v1.InvokeRequest) (*v1.InvokeResponse, error) + // Lists all topics subscribed by this app. + ListTopicSubscriptions(context.Context, *emptypb.Empty) (*ListTopicSubscriptionsResponse, error) + // Subscribes events from Pubsub + OnTopicEvent(context.Context, *TopicEventRequest) (*TopicEventResponse, error) + // Lists all input bindings subscribed by this app. + ListInputBindings(context.Context, *emptypb.Empty) (*ListInputBindingsResponse, error) + // Listens events from the input bindings + // + // User application can save the states or send the events to the output + // bindings optionally by returning BindingEventResponse. + OnBindingEvent(context.Context, *BindingEventRequest) (*BindingEventResponse, error) +} + +// UnimplementedAppCallbackServer should be embedded to have forward compatible implementations. +type UnimplementedAppCallbackServer struct { +} + +func (UnimplementedAppCallbackServer) OnInvoke(context.Context, *v1.InvokeRequest) (*v1.InvokeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OnInvoke not implemented") +} +func (UnimplementedAppCallbackServer) ListTopicSubscriptions(context.Context, *emptypb.Empty) (*ListTopicSubscriptionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListTopicSubscriptions not implemented") +} +func (UnimplementedAppCallbackServer) OnTopicEvent(context.Context, *TopicEventRequest) (*TopicEventResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OnTopicEvent not implemented") +} +func (UnimplementedAppCallbackServer) ListInputBindings(context.Context, *emptypb.Empty) (*ListInputBindingsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListInputBindings not implemented") +} +func (UnimplementedAppCallbackServer) OnBindingEvent(context.Context, *BindingEventRequest) (*BindingEventResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OnBindingEvent not implemented") +} + +// UnsafeAppCallbackServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AppCallbackServer will +// result in compilation errors. +type UnsafeAppCallbackServer interface { + mustEmbedUnimplementedAppCallbackServer() +} + +func RegisterAppCallbackServer(s grpc.ServiceRegistrar, srv AppCallbackServer) { + s.RegisterService(&AppCallback_ServiceDesc, srv) +} + +func _AppCallback_OnInvoke_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(v1.InvokeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AppCallbackServer).OnInvoke(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.AppCallback/OnInvoke", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AppCallbackServer).OnInvoke(ctx, req.(*v1.InvokeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AppCallback_ListTopicSubscriptions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AppCallbackServer).ListTopicSubscriptions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.AppCallback/ListTopicSubscriptions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AppCallbackServer).ListTopicSubscriptions(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AppCallback_OnTopicEvent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TopicEventRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AppCallbackServer).OnTopicEvent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.AppCallback/OnTopicEvent", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AppCallbackServer).OnTopicEvent(ctx, req.(*TopicEventRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AppCallback_ListInputBindings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AppCallbackServer).ListInputBindings(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.AppCallback/ListInputBindings", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AppCallbackServer).ListInputBindings(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AppCallback_OnBindingEvent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BindingEventRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AppCallbackServer).OnBindingEvent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.AppCallback/OnBindingEvent", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AppCallbackServer).OnBindingEvent(ctx, req.(*BindingEventRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AppCallback_ServiceDesc is the grpc.ServiceDesc for AppCallback service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AppCallback_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "dapr.proto.runtime.v1.AppCallback", + HandlerType: (*AppCallbackServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "OnInvoke", + Handler: _AppCallback_OnInvoke_Handler, + }, + { + MethodName: "ListTopicSubscriptions", + Handler: _AppCallback_ListTopicSubscriptions_Handler, + }, + { + MethodName: "OnTopicEvent", + Handler: _AppCallback_OnTopicEvent_Handler, + }, + { + MethodName: "ListInputBindings", + Handler: _AppCallback_ListInputBindings_Handler, + }, + { + MethodName: "OnBindingEvent", + Handler: _AppCallback_OnBindingEvent_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "dapr/proto/runtime/v1/appcallback.proto", +} + +// AppCallbackHealthCheckClient is the client API for AppCallbackHealthCheck service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type AppCallbackHealthCheckClient interface { + // Health check. + HealthCheck(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HealthCheckResponse, error) +} + +type appCallbackHealthCheckClient struct { + cc grpc.ClientConnInterface +} + +func NewAppCallbackHealthCheckClient(cc grpc.ClientConnInterface) AppCallbackHealthCheckClient { + return &appCallbackHealthCheckClient{cc} +} + +func (c *appCallbackHealthCheckClient) HealthCheck(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HealthCheckResponse, error) { + out := new(HealthCheckResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.AppCallbackHealthCheck/HealthCheck", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AppCallbackHealthCheckServer is the server API for AppCallbackHealthCheck service. +// All implementations should embed UnimplementedAppCallbackHealthCheckServer +// for forward compatibility +type AppCallbackHealthCheckServer interface { + // Health check. + HealthCheck(context.Context, *emptypb.Empty) (*HealthCheckResponse, error) +} + +// UnimplementedAppCallbackHealthCheckServer should be embedded to have forward compatible implementations. +type UnimplementedAppCallbackHealthCheckServer struct { +} + +func (UnimplementedAppCallbackHealthCheckServer) HealthCheck(context.Context, *emptypb.Empty) (*HealthCheckResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method HealthCheck not implemented") +} + +// UnsafeAppCallbackHealthCheckServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AppCallbackHealthCheckServer will +// result in compilation errors. +type UnsafeAppCallbackHealthCheckServer interface { + mustEmbedUnimplementedAppCallbackHealthCheckServer() +} + +func RegisterAppCallbackHealthCheckServer(s grpc.ServiceRegistrar, srv AppCallbackHealthCheckServer) { + s.RegisterService(&AppCallbackHealthCheck_ServiceDesc, srv) +} + +func _AppCallbackHealthCheck_HealthCheck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AppCallbackHealthCheckServer).HealthCheck(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.AppCallbackHealthCheck/HealthCheck", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AppCallbackHealthCheckServer).HealthCheck(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +// AppCallbackHealthCheck_ServiceDesc is the grpc.ServiceDesc for AppCallbackHealthCheck service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AppCallbackHealthCheck_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "dapr.proto.runtime.v1.AppCallbackHealthCheck", + HandlerType: (*AppCallbackHealthCheckServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "HealthCheck", + Handler: _AppCallbackHealthCheck_HealthCheck_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "dapr/proto/runtime/v1/appcallback.proto", +} diff --git a/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/dapr.pb.go b/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/dapr.pb.go new file mode 100644 index 00000000000..9038fb7237c --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/dapr.pb.go @@ -0,0 +1,4654 @@ +// +//Copyright 2021 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.21.1 +// source: dapr/proto/runtime/v1/dapr.proto + +package runtime + +import ( + reflect "reflect" + sync "sync" + + v1 "github.com/dapr/go-sdk/dapr/proto/common/v1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type UnlockResponse_Status int32 + +const ( + UnlockResponse_SUCCESS UnlockResponse_Status = 0 + UnlockResponse_LOCK_DOES_NOT_EXIST UnlockResponse_Status = 1 + UnlockResponse_LOCK_BELONGS_TO_OTHERS UnlockResponse_Status = 2 + UnlockResponse_INTERNAL_ERROR UnlockResponse_Status = 3 +) + +// Enum value maps for UnlockResponse_Status. +var ( + UnlockResponse_Status_name = map[int32]string{ + 0: "SUCCESS", + 1: "LOCK_DOES_NOT_EXIST", + 2: "LOCK_BELONGS_TO_OTHERS", + 3: "INTERNAL_ERROR", + } + UnlockResponse_Status_value = map[string]int32{ + "SUCCESS": 0, + "LOCK_DOES_NOT_EXIST": 1, + "LOCK_BELONGS_TO_OTHERS": 2, + "INTERNAL_ERROR": 3, + } +) + +func (x UnlockResponse_Status) Enum() *UnlockResponse_Status { + p := new(UnlockResponse_Status) + *p = x + return p +} + +func (x UnlockResponse_Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (UnlockResponse_Status) Descriptor() protoreflect.EnumDescriptor { + return file_dapr_proto_runtime_v1_dapr_proto_enumTypes[0].Descriptor() +} + +func (UnlockResponse_Status) Type() protoreflect.EnumType { + return &file_dapr_proto_runtime_v1_dapr_proto_enumTypes[0] +} + +func (x UnlockResponse_Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use UnlockResponse_Status.Descriptor instead. +func (UnlockResponse_Status) EnumDescriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{46, 0} +} + +// InvokeServiceRequest represents the request message for Service invocation. +type InvokeServiceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. Callee's app id. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Required. message which will be delivered to callee. + Message *v1.InvokeRequest `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *InvokeServiceRequest) Reset() { + *x = InvokeServiceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InvokeServiceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InvokeServiceRequest) ProtoMessage() {} + +func (x *InvokeServiceRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[0] + 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 InvokeServiceRequest.ProtoReflect.Descriptor instead. +func (*InvokeServiceRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{0} +} + +func (x *InvokeServiceRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *InvokeServiceRequest) GetMessage() *v1.InvokeRequest { + if x != nil { + return x.Message + } + return nil +} + +// GetStateRequest is the message to get key-value states from specific state store. +type GetStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of state store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The key of the desired state + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // The read consistency of the state store. + Consistency v1.StateOptions_StateConsistency `protobuf:"varint,3,opt,name=consistency,proto3,enum=dapr.proto.common.v1.StateOptions_StateConsistency" json:"consistency,omitempty"` + // The metadata which will be sent to state store components. + Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetStateRequest) Reset() { + *x = GetStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStateRequest) ProtoMessage() {} + +func (x *GetStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[1] + 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 GetStateRequest.ProtoReflect.Descriptor instead. +func (*GetStateRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{1} +} + +func (x *GetStateRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *GetStateRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *GetStateRequest) GetConsistency() v1.StateOptions_StateConsistency { + if x != nil { + return x.Consistency + } + return v1.StateOptions_StateConsistency(0) +} + +func (x *GetStateRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// GetBulkStateRequest is the message to get a list of key-value states from specific state store. +type GetBulkStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of state store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The keys to get. + Keys []string `protobuf:"bytes,2,rep,name=keys,proto3" json:"keys,omitempty"` + // The number of parallel operations executed on the state store for a get operation. + Parallelism int32 `protobuf:"varint,3,opt,name=parallelism,proto3" json:"parallelism,omitempty"` + // The metadata which will be sent to state store components. + Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetBulkStateRequest) Reset() { + *x = GetBulkStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetBulkStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBulkStateRequest) ProtoMessage() {} + +func (x *GetBulkStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[2] + 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 GetBulkStateRequest.ProtoReflect.Descriptor instead. +func (*GetBulkStateRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{2} +} + +func (x *GetBulkStateRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *GetBulkStateRequest) GetKeys() []string { + if x != nil { + return x.Keys + } + return nil +} + +func (x *GetBulkStateRequest) GetParallelism() int32 { + if x != nil { + return x.Parallelism + } + return 0 +} + +func (x *GetBulkStateRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// GetBulkStateResponse is the response conveying the list of state values. +type GetBulkStateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of items containing the keys to get values for. + Items []*BulkStateItem `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` +} + +func (x *GetBulkStateResponse) Reset() { + *x = GetBulkStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetBulkStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBulkStateResponse) ProtoMessage() {} + +func (x *GetBulkStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[3] + 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 GetBulkStateResponse.ProtoReflect.Descriptor instead. +func (*GetBulkStateResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{3} +} + +func (x *GetBulkStateResponse) GetItems() []*BulkStateItem { + if x != nil { + return x.Items + } + return nil +} + +// BulkStateItem is the response item for a bulk get operation. +// Return values include the item key, data and etag. +type BulkStateItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // state item key + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // The byte array data + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The entity tag which represents the specific version of data. + // ETag format is defined by the corresponding data store. + Etag string `protobuf:"bytes,3,opt,name=etag,proto3" json:"etag,omitempty"` + // The error that was returned from the state store in case of a failed get operation. + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + // The metadata which will be sent to app. + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *BulkStateItem) Reset() { + *x = BulkStateItem{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkStateItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkStateItem) ProtoMessage() {} + +func (x *BulkStateItem) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[4] + 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 BulkStateItem.ProtoReflect.Descriptor instead. +func (*BulkStateItem) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{4} +} + +func (x *BulkStateItem) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *BulkStateItem) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *BulkStateItem) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *BulkStateItem) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *BulkStateItem) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// GetStateResponse is the response conveying the state value and etag. +type GetStateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The byte array data + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + // The entity tag which represents the specific version of data. + // ETag format is defined by the corresponding data store. + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` + // The metadata which will be sent to app. + 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"` +} + +func (x *GetStateResponse) Reset() { + *x = GetStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStateResponse) ProtoMessage() {} + +func (x *GetStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[5] + 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 GetStateResponse.ProtoReflect.Descriptor instead. +func (*GetStateResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{5} +} + +func (x *GetStateResponse) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *GetStateResponse) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *GetStateResponse) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// DeleteStateRequest is the message to delete key-value states in the specific state store. +type DeleteStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of state store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The key of the desired state + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // The entity tag which represents the specific version of data. + // The exact ETag format is defined by the corresponding data store. + Etag *v1.Etag `protobuf:"bytes,3,opt,name=etag,proto3" json:"etag,omitempty"` + // State operation options which includes concurrency/ + // consistency/retry_policy. + Options *v1.StateOptions `protobuf:"bytes,4,opt,name=options,proto3" json:"options,omitempty"` + // The metadata which will be sent to state store components. + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *DeleteStateRequest) Reset() { + *x = DeleteStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteStateRequest) ProtoMessage() {} + +func (x *DeleteStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[6] + 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 DeleteStateRequest.ProtoReflect.Descriptor instead. +func (*DeleteStateRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{6} +} + +func (x *DeleteStateRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *DeleteStateRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *DeleteStateRequest) GetEtag() *v1.Etag { + if x != nil { + return x.Etag + } + return nil +} + +func (x *DeleteStateRequest) GetOptions() *v1.StateOptions { + if x != nil { + return x.Options + } + return nil +} + +func (x *DeleteStateRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// DeleteBulkStateRequest is the message to delete a list of key-value states from specific state store. +type DeleteBulkStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of state store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The array of the state key values. + States []*v1.StateItem `protobuf:"bytes,2,rep,name=states,proto3" json:"states,omitempty"` +} + +func (x *DeleteBulkStateRequest) Reset() { + *x = DeleteBulkStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteBulkStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteBulkStateRequest) ProtoMessage() {} + +func (x *DeleteBulkStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[7] + 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 DeleteBulkStateRequest.ProtoReflect.Descriptor instead. +func (*DeleteBulkStateRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{7} +} + +func (x *DeleteBulkStateRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *DeleteBulkStateRequest) GetStates() []*v1.StateItem { + if x != nil { + return x.States + } + return nil +} + +// SaveStateRequest is the message to save multiple states into state store. +type SaveStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of state store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The array of the state key values. + States []*v1.StateItem `protobuf:"bytes,2,rep,name=states,proto3" json:"states,omitempty"` +} + +func (x *SaveStateRequest) Reset() { + *x = SaveStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SaveStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SaveStateRequest) ProtoMessage() {} + +func (x *SaveStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[8] + 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 SaveStateRequest.ProtoReflect.Descriptor instead. +func (*SaveStateRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{8} +} + +func (x *SaveStateRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *SaveStateRequest) GetStates() []*v1.StateItem { + if x != nil { + return x.States + } + return nil +} + +// QueryStateRequest is the message to query state store. +type QueryStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of state store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The query in JSON format. + Query string `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` + // The metadata which will be sent to state store components. + 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"` +} + +func (x *QueryStateRequest) Reset() { + *x = QueryStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryStateRequest) ProtoMessage() {} + +func (x *QueryStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[9] + 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 QueryStateRequest.ProtoReflect.Descriptor instead. +func (*QueryStateRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{9} +} + +func (x *QueryStateRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *QueryStateRequest) GetQuery() string { + if x != nil { + return x.Query + } + return "" +} + +func (x *QueryStateRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +type QueryStateItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The object key. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // The object value. + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The entity tag which represents the specific version of data. + // ETag format is defined by the corresponding data store. + Etag string `protobuf:"bytes,3,opt,name=etag,proto3" json:"etag,omitempty"` + // The error message indicating an error in processing of the query result. + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *QueryStateItem) Reset() { + *x = QueryStateItem{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryStateItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryStateItem) ProtoMessage() {} + +func (x *QueryStateItem) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[10] + 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 QueryStateItem.ProtoReflect.Descriptor instead. +func (*QueryStateItem) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{10} +} + +func (x *QueryStateItem) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *QueryStateItem) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *QueryStateItem) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *QueryStateItem) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +// QueryStateResponse is the response conveying the query results. +type QueryStateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // An array of query results. + Results []*QueryStateItem `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + // Pagination token. + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` + // The metadata which will be sent to app. + 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"` +} + +func (x *QueryStateResponse) Reset() { + *x = QueryStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryStateResponse) ProtoMessage() {} + +func (x *QueryStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[11] + 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 QueryStateResponse.ProtoReflect.Descriptor instead. +func (*QueryStateResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{11} +} + +func (x *QueryStateResponse) GetResults() []*QueryStateItem { + if x != nil { + return x.Results + } + return nil +} + +func (x *QueryStateResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *QueryStateResponse) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// PublishEventRequest is the message to publish event data to pubsub topic +type PublishEventRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the pubsub component + PubsubName string `protobuf:"bytes,1,opt,name=pubsub_name,json=pubsubName,proto3" json:"pubsub_name,omitempty"` + // The pubsub topic + Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` + // The data which will be published to topic. + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + // The content type for the data (optional). + DataContentType string `protobuf:"bytes,4,opt,name=data_content_type,json=dataContentType,proto3" json:"data_content_type,omitempty"` + // The metadata passing to pub components + // + // metadata property: + // - key : the key of the message. + Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *PublishEventRequest) Reset() { + *x = PublishEventRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PublishEventRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PublishEventRequest) ProtoMessage() {} + +func (x *PublishEventRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[12] + 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 PublishEventRequest.ProtoReflect.Descriptor instead. +func (*PublishEventRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{12} +} + +func (x *PublishEventRequest) GetPubsubName() string { + if x != nil { + return x.PubsubName + } + return "" +} + +func (x *PublishEventRequest) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *PublishEventRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *PublishEventRequest) GetDataContentType() string { + if x != nil { + return x.DataContentType + } + return "" +} + +func (x *PublishEventRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// InvokeBindingRequest is the message to send data to output bindings +type InvokeBindingRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the output binding to invoke. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The data which will be sent to output binding. + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The metadata passing to output binding components + // + // Common metadata property: + // - ttlInSeconds : the time to live in seconds for the message. + // If set in the binding definition will cause all messages to + // have a default time to live. The message ttl overrides any value + // in the binding definition. + 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"` + // The name of the operation type for the binding to invoke + Operation string `protobuf:"bytes,4,opt,name=operation,proto3" json:"operation,omitempty"` +} + +func (x *InvokeBindingRequest) Reset() { + *x = InvokeBindingRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InvokeBindingRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InvokeBindingRequest) ProtoMessage() {} + +func (x *InvokeBindingRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[13] + 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 InvokeBindingRequest.ProtoReflect.Descriptor instead. +func (*InvokeBindingRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{13} +} + +func (x *InvokeBindingRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *InvokeBindingRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *InvokeBindingRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *InvokeBindingRequest) GetOperation() string { + if x != nil { + return x.Operation + } + return "" +} + +// InvokeBindingResponse is the message returned from an output binding invocation +type InvokeBindingResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The data which will be sent to output binding. + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + // The metadata returned from an external system + Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *InvokeBindingResponse) Reset() { + *x = InvokeBindingResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InvokeBindingResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InvokeBindingResponse) ProtoMessage() {} + +func (x *InvokeBindingResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[14] + 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 InvokeBindingResponse.ProtoReflect.Descriptor instead. +func (*InvokeBindingResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{14} +} + +func (x *InvokeBindingResponse) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *InvokeBindingResponse) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// GetSecretRequest is the message to get secret from secret store. +type GetSecretRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of secret store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The name of secret key. + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // The metadata which will be sent to secret store components. + 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"` +} + +func (x *GetSecretRequest) Reset() { + *x = GetSecretRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSecretRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSecretRequest) ProtoMessage() {} + +func (x *GetSecretRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[15] + 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 GetSecretRequest.ProtoReflect.Descriptor instead. +func (*GetSecretRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{15} +} + +func (x *GetSecretRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *GetSecretRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *GetSecretRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// GetSecretResponse is the response message to convey the requested secret. +type GetSecretResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // data is the secret value. Some secret store, such as kubernetes secret + // store, can save multiple secrets for single secret key. + Data map[string]string `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetSecretResponse) Reset() { + *x = GetSecretResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSecretResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSecretResponse) ProtoMessage() {} + +func (x *GetSecretResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[16] + 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 GetSecretResponse.ProtoReflect.Descriptor instead. +func (*GetSecretResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{16} +} + +func (x *GetSecretResponse) GetData() map[string]string { + if x != nil { + return x.Data + } + return nil +} + +// GetBulkSecretRequest is the message to get the secrets from secret store. +type GetBulkSecretRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of secret store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The metadata which will be sent to secret store components. + Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetBulkSecretRequest) Reset() { + *x = GetBulkSecretRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetBulkSecretRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBulkSecretRequest) ProtoMessage() {} + +func (x *GetBulkSecretRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[17] + 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 GetBulkSecretRequest.ProtoReflect.Descriptor instead. +func (*GetBulkSecretRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{17} +} + +func (x *GetBulkSecretRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *GetBulkSecretRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// SecretResponse is a map of decrypted string/string values +type SecretResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Secrets map[string]string `protobuf:"bytes,1,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *SecretResponse) Reset() { + *x = SecretResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecretResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecretResponse) ProtoMessage() {} + +func (x *SecretResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[18] + 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 SecretResponse.ProtoReflect.Descriptor instead. +func (*SecretResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{18} +} + +func (x *SecretResponse) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +// GetBulkSecretResponse is the response message to convey the requested secrets. +type GetBulkSecretResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // data hold the secret values. Some secret store, such as kubernetes secret + // store, can save multiple secrets for single secret key. + Data map[string]*SecretResponse `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetBulkSecretResponse) Reset() { + *x = GetBulkSecretResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetBulkSecretResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBulkSecretResponse) ProtoMessage() {} + +func (x *GetBulkSecretResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_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 GetBulkSecretResponse.ProtoReflect.Descriptor instead. +func (*GetBulkSecretResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{19} +} + +func (x *GetBulkSecretResponse) GetData() map[string]*SecretResponse { + if x != nil { + return x.Data + } + return nil +} + +// TransactionalStateOperation is the message to execute a specified operation with a key-value pair. +type TransactionalStateOperation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The type of operation to be executed + OperationType string `protobuf:"bytes,1,opt,name=operationType,proto3" json:"operationType,omitempty"` + // State values to be operated on + Request *v1.StateItem `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` +} + +func (x *TransactionalStateOperation) Reset() { + *x = TransactionalStateOperation{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionalStateOperation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionalStateOperation) ProtoMessage() {} + +func (x *TransactionalStateOperation) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[20] + 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 TransactionalStateOperation.ProtoReflect.Descriptor instead. +func (*TransactionalStateOperation) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{20} +} + +func (x *TransactionalStateOperation) GetOperationType() string { + if x != nil { + return x.OperationType + } + return "" +} + +func (x *TransactionalStateOperation) GetRequest() *v1.StateItem { + if x != nil { + return x.Request + } + return nil +} + +// ExecuteStateTransactionRequest is the message to execute multiple operations on a specified store. +type ExecuteStateTransactionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. name of state store. + StoreName string `protobuf:"bytes,1,opt,name=storeName,proto3" json:"storeName,omitempty"` + // Required. transactional operation list. + Operations []*TransactionalStateOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` + // The metadata used for transactional operations. + 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"` +} + +func (x *ExecuteStateTransactionRequest) Reset() { + *x = ExecuteStateTransactionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecuteStateTransactionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecuteStateTransactionRequest) ProtoMessage() {} + +func (x *ExecuteStateTransactionRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[21] + 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 ExecuteStateTransactionRequest.ProtoReflect.Descriptor instead. +func (*ExecuteStateTransactionRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{21} +} + +func (x *ExecuteStateTransactionRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *ExecuteStateTransactionRequest) GetOperations() []*TransactionalStateOperation { + if x != nil { + return x.Operations + } + return nil +} + +func (x *ExecuteStateTransactionRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// RegisterActorTimerRequest is the message to register a timer for an actor of a given type and id. +type RegisterActorTimerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActorType string `protobuf:"bytes,1,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"` + ActorId string `protobuf:"bytes,2,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + DueTime string `protobuf:"bytes,4,opt,name=due_time,json=dueTime,proto3" json:"due_time,omitempty"` + Period string `protobuf:"bytes,5,opt,name=period,proto3" json:"period,omitempty"` + Callback string `protobuf:"bytes,6,opt,name=callback,proto3" json:"callback,omitempty"` + Data []byte `protobuf:"bytes,7,opt,name=data,proto3" json:"data,omitempty"` + Ttl string `protobuf:"bytes,8,opt,name=ttl,proto3" json:"ttl,omitempty"` +} + +func (x *RegisterActorTimerRequest) Reset() { + *x = RegisterActorTimerRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterActorTimerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterActorTimerRequest) ProtoMessage() {} + +func (x *RegisterActorTimerRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[22] + 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 RegisterActorTimerRequest.ProtoReflect.Descriptor instead. +func (*RegisterActorTimerRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{22} +} + +func (x *RegisterActorTimerRequest) GetActorType() string { + if x != nil { + return x.ActorType + } + return "" +} + +func (x *RegisterActorTimerRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *RegisterActorTimerRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RegisterActorTimerRequest) GetDueTime() string { + if x != nil { + return x.DueTime + } + return "" +} + +func (x *RegisterActorTimerRequest) GetPeriod() string { + if x != nil { + return x.Period + } + return "" +} + +func (x *RegisterActorTimerRequest) GetCallback() string { + if x != nil { + return x.Callback + } + return "" +} + +func (x *RegisterActorTimerRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *RegisterActorTimerRequest) GetTtl() string { + if x != nil { + return x.Ttl + } + return "" +} + +// UnregisterActorTimerRequest is the message to unregister an actor timer +type UnregisterActorTimerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActorType string `protobuf:"bytes,1,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"` + ActorId string `protobuf:"bytes,2,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *UnregisterActorTimerRequest) Reset() { + *x = UnregisterActorTimerRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnregisterActorTimerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnregisterActorTimerRequest) ProtoMessage() {} + +func (x *UnregisterActorTimerRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[23] + 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 UnregisterActorTimerRequest.ProtoReflect.Descriptor instead. +func (*UnregisterActorTimerRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{23} +} + +func (x *UnregisterActorTimerRequest) GetActorType() string { + if x != nil { + return x.ActorType + } + return "" +} + +func (x *UnregisterActorTimerRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *UnregisterActorTimerRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// RegisterActorReminderRequest is the message to register a reminder for an actor of a given type and id. +type RegisterActorReminderRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActorType string `protobuf:"bytes,1,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"` + ActorId string `protobuf:"bytes,2,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + DueTime string `protobuf:"bytes,4,opt,name=due_time,json=dueTime,proto3" json:"due_time,omitempty"` + Period string `protobuf:"bytes,5,opt,name=period,proto3" json:"period,omitempty"` + Data []byte `protobuf:"bytes,6,opt,name=data,proto3" json:"data,omitempty"` + Ttl string `protobuf:"bytes,7,opt,name=ttl,proto3" json:"ttl,omitempty"` +} + +func (x *RegisterActorReminderRequest) Reset() { + *x = RegisterActorReminderRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterActorReminderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterActorReminderRequest) ProtoMessage() {} + +func (x *RegisterActorReminderRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[24] + 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 RegisterActorReminderRequest.ProtoReflect.Descriptor instead. +func (*RegisterActorReminderRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{24} +} + +func (x *RegisterActorReminderRequest) GetActorType() string { + if x != nil { + return x.ActorType + } + return "" +} + +func (x *RegisterActorReminderRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *RegisterActorReminderRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RegisterActorReminderRequest) GetDueTime() string { + if x != nil { + return x.DueTime + } + return "" +} + +func (x *RegisterActorReminderRequest) GetPeriod() string { + if x != nil { + return x.Period + } + return "" +} + +func (x *RegisterActorReminderRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *RegisterActorReminderRequest) GetTtl() string { + if x != nil { + return x.Ttl + } + return "" +} + +// UnregisterActorReminderRequest is the message to unregister an actor reminder. +type UnregisterActorReminderRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActorType string `protobuf:"bytes,1,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"` + ActorId string `protobuf:"bytes,2,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *UnregisterActorReminderRequest) Reset() { + *x = UnregisterActorReminderRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnregisterActorReminderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnregisterActorReminderRequest) ProtoMessage() {} + +func (x *UnregisterActorReminderRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[25] + 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 UnregisterActorReminderRequest.ProtoReflect.Descriptor instead. +func (*UnregisterActorReminderRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{25} +} + +func (x *UnregisterActorReminderRequest) GetActorType() string { + if x != nil { + return x.ActorType + } + return "" +} + +func (x *UnregisterActorReminderRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *UnregisterActorReminderRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// RenameActorReminderRequest is the message to rename an actor reminder. +type RenameActorReminderRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActorType string `protobuf:"bytes,1,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"` + ActorId string `protobuf:"bytes,2,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + OldName string `protobuf:"bytes,3,opt,name=old_name,json=oldName,proto3" json:"old_name,omitempty"` + NewName string `protobuf:"bytes,4,opt,name=new_name,json=newName,proto3" json:"new_name,omitempty"` +} + +func (x *RenameActorReminderRequest) Reset() { + *x = RenameActorReminderRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RenameActorReminderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RenameActorReminderRequest) ProtoMessage() {} + +func (x *RenameActorReminderRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_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 RenameActorReminderRequest.ProtoReflect.Descriptor instead. +func (*RenameActorReminderRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{26} +} + +func (x *RenameActorReminderRequest) GetActorType() string { + if x != nil { + return x.ActorType + } + return "" +} + +func (x *RenameActorReminderRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *RenameActorReminderRequest) GetOldName() string { + if x != nil { + return x.OldName + } + return "" +} + +func (x *RenameActorReminderRequest) GetNewName() string { + if x != nil { + return x.NewName + } + return "" +} + +// GetActorStateRequest is the message to get key-value states from specific actor. +type GetActorStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActorType string `protobuf:"bytes,1,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"` + ActorId string `protobuf:"bytes,2,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *GetActorStateRequest) Reset() { + *x = GetActorStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetActorStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActorStateRequest) ProtoMessage() {} + +func (x *GetActorStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[27] + 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 GetActorStateRequest.ProtoReflect.Descriptor instead. +func (*GetActorStateRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{27} +} + +func (x *GetActorStateRequest) GetActorType() string { + if x != nil { + return x.ActorType + } + return "" +} + +func (x *GetActorStateRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *GetActorStateRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +// GetActorStateResponse is the response conveying the actor's state value. +type GetActorStateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *GetActorStateResponse) Reset() { + *x = GetActorStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetActorStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActorStateResponse) ProtoMessage() {} + +func (x *GetActorStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[28] + 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 GetActorStateResponse.ProtoReflect.Descriptor instead. +func (*GetActorStateResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{28} +} + +func (x *GetActorStateResponse) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// ExecuteActorStateTransactionRequest is the message to execute multiple operations on a specified actor. +type ExecuteActorStateTransactionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActorType string `protobuf:"bytes,1,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"` + ActorId string `protobuf:"bytes,2,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + Operations []*TransactionalActorStateOperation `protobuf:"bytes,3,rep,name=operations,proto3" json:"operations,omitempty"` +} + +func (x *ExecuteActorStateTransactionRequest) Reset() { + *x = ExecuteActorStateTransactionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecuteActorStateTransactionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecuteActorStateTransactionRequest) ProtoMessage() {} + +func (x *ExecuteActorStateTransactionRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[29] + 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 ExecuteActorStateTransactionRequest.ProtoReflect.Descriptor instead. +func (*ExecuteActorStateTransactionRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{29} +} + +func (x *ExecuteActorStateTransactionRequest) GetActorType() string { + if x != nil { + return x.ActorType + } + return "" +} + +func (x *ExecuteActorStateTransactionRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *ExecuteActorStateTransactionRequest) GetOperations() []*TransactionalActorStateOperation { + if x != nil { + return x.Operations + } + return nil +} + +// TransactionalActorStateOperation is the message to execute a specified operation with a key-value pair. +type TransactionalActorStateOperation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OperationType string `protobuf:"bytes,1,opt,name=operationType,proto3" json:"operationType,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Value *anypb.Any `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *TransactionalActorStateOperation) Reset() { + *x = TransactionalActorStateOperation{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionalActorStateOperation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionalActorStateOperation) ProtoMessage() {} + +func (x *TransactionalActorStateOperation) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[30] + 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 TransactionalActorStateOperation.ProtoReflect.Descriptor instead. +func (*TransactionalActorStateOperation) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{30} +} + +func (x *TransactionalActorStateOperation) GetOperationType() string { + if x != nil { + return x.OperationType + } + return "" +} + +func (x *TransactionalActorStateOperation) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *TransactionalActorStateOperation) GetValue() *anypb.Any { + if x != nil { + return x.Value + } + return nil +} + +// InvokeActorRequest is the message to call an actor. +type InvokeActorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActorType string `protobuf:"bytes,1,opt,name=actor_type,json=actorType,proto3" json:"actor_type,omitempty"` + ActorId string `protobuf:"bytes,2,opt,name=actor_id,json=actorId,proto3" json:"actor_id,omitempty"` + Method string `protobuf:"bytes,3,opt,name=method,proto3" json:"method,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *InvokeActorRequest) Reset() { + *x = InvokeActorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InvokeActorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InvokeActorRequest) ProtoMessage() {} + +func (x *InvokeActorRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[31] + 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 InvokeActorRequest.ProtoReflect.Descriptor instead. +func (*InvokeActorRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{31} +} + +func (x *InvokeActorRequest) GetActorType() string { + if x != nil { + return x.ActorType + } + return "" +} + +func (x *InvokeActorRequest) GetActorId() string { + if x != nil { + return x.ActorId + } + return "" +} + +func (x *InvokeActorRequest) GetMethod() string { + if x != nil { + return x.Method + } + return "" +} + +func (x *InvokeActorRequest) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// InvokeActorResponse is the method that returns an actor invocation response. +type InvokeActorResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *InvokeActorResponse) Reset() { + *x = InvokeActorResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InvokeActorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InvokeActorResponse) ProtoMessage() {} + +func (x *InvokeActorResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[32] + 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 InvokeActorResponse.ProtoReflect.Descriptor instead. +func (*InvokeActorResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{32} +} + +func (x *InvokeActorResponse) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// GetMetadataResponse is a message that is returned on GetMetadata rpc call +type GetMetadataResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + 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"` +} + +func (x *GetMetadataResponse) Reset() { + *x = GetMetadataResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMetadataResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMetadataResponse) ProtoMessage() {} + +func (x *GetMetadataResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[33] + 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 GetMetadataResponse.ProtoReflect.Descriptor instead. +func (*GetMetadataResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{33} +} + +func (x *GetMetadataResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GetMetadataResponse) GetActiveActorsCount() []*ActiveActorsCount { + if x != nil { + return x.ActiveActorsCount + } + return nil +} + +func (x *GetMetadataResponse) GetRegisteredComponents() []*RegisteredComponents { + if x != nil { + return x.RegisteredComponents + } + return nil +} + +func (x *GetMetadataResponse) GetExtendedMetadata() map[string]string { + if x != nil { + return x.ExtendedMetadata + } + return nil +} + +type ActiveActorsCount struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Count int32 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` +} + +func (x *ActiveActorsCount) Reset() { + *x = ActiveActorsCount{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActiveActorsCount) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActiveActorsCount) ProtoMessage() {} + +func (x *ActiveActorsCount) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[34] + 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 ActiveActorsCount.ProtoReflect.Descriptor instead. +func (*ActiveActorsCount) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{34} +} + +func (x *ActiveActorsCount) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *ActiveActorsCount) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + +type RegisteredComponents struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Capabilities []string `protobuf:"bytes,4,rep,name=capabilities,proto3" json:"capabilities,omitempty"` +} + +func (x *RegisteredComponents) Reset() { + *x = RegisteredComponents{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisteredComponents) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisteredComponents) ProtoMessage() {} + +func (x *RegisteredComponents) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[35] + 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 RegisteredComponents.ProtoReflect.Descriptor instead. +func (*RegisteredComponents) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{35} +} + +func (x *RegisteredComponents) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RegisteredComponents) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *RegisteredComponents) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *RegisteredComponents) GetCapabilities() []string { + if x != nil { + return x.Capabilities + } + return nil +} + +type SetMetadataRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *SetMetadataRequest) Reset() { + *x = SetMetadataRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetMetadataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetMetadataRequest) ProtoMessage() {} + +func (x *SetMetadataRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[36] + 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 SetMetadataRequest.ProtoReflect.Descriptor instead. +func (*SetMetadataRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{36} +} + +func (x *SetMetadataRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *SetMetadataRequest) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// GetConfigurationRequest is the message to get a list of key-value configuration from specified configuration store. +type GetConfigurationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The name of configuration store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // Optional. The key of the configuration item to fetch. + // If set, only query for the specified configuration items. + // Empty list means fetch all. + Keys []string `protobuf:"bytes,2,rep,name=keys,proto3" json:"keys,omitempty"` + // Optional. The metadata which will be sent to configuration store components. + 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"` +} + +func (x *GetConfigurationRequest) Reset() { + *x = GetConfigurationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetConfigurationRequest) ProtoMessage() {} + +func (x *GetConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[37] + 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 GetConfigurationRequest.ProtoReflect.Descriptor instead. +func (*GetConfigurationRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{37} +} + +func (x *GetConfigurationRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *GetConfigurationRequest) GetKeys() []string { + if x != nil { + return x.Keys + } + return nil +} + +func (x *GetConfigurationRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// GetConfigurationResponse is the response conveying the list of configuration values. +// It should be the FULL configuration of specified application which contains all of its configuration items. +type GetConfigurationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Items map[string]*v1.ConfigurationItem `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetConfigurationResponse) Reset() { + *x = GetConfigurationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetConfigurationResponse) ProtoMessage() {} + +func (x *GetConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[38] + 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 GetConfigurationResponse.ProtoReflect.Descriptor instead. +func (*GetConfigurationResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{38} +} + +func (x *GetConfigurationResponse) GetItems() map[string]*v1.ConfigurationItem { + if x != nil { + return x.Items + } + return nil +} + +// SubscribeConfigurationRequest is the message to get a list of key-value configuration from specified configuration store. +type SubscribeConfigurationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of configuration store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // Optional. The key of the configuration item to fetch. + // If set, only query for the specified configuration items. + // Empty list means fetch all. + Keys []string `protobuf:"bytes,2,rep,name=keys,proto3" json:"keys,omitempty"` + // The metadata which will be sent to configuration store components. + 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"` +} + +func (x *SubscribeConfigurationRequest) Reset() { + *x = SubscribeConfigurationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeConfigurationRequest) ProtoMessage() {} + +func (x *SubscribeConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[39] + 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 SubscribeConfigurationRequest.ProtoReflect.Descriptor instead. +func (*SubscribeConfigurationRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{39} +} + +func (x *SubscribeConfigurationRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *SubscribeConfigurationRequest) GetKeys() []string { + if x != nil { + return x.Keys + } + return nil +} + +func (x *SubscribeConfigurationRequest) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +// UnSubscribeConfigurationRequest is the message to stop watching the key-value configuration. +type UnsubscribeConfigurationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of configuration store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The id to unsubscribe. + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *UnsubscribeConfigurationRequest) Reset() { + *x = UnsubscribeConfigurationRequest{} + 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 *UnsubscribeConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnsubscribeConfigurationRequest) ProtoMessage() {} + +func (x *UnsubscribeConfigurationRequest) 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 UnsubscribeConfigurationRequest.ProtoReflect.Descriptor instead. +func (*UnsubscribeConfigurationRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{40} +} + +func (x *UnsubscribeConfigurationRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *UnsubscribeConfigurationRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type SubscribeConfigurationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Subscribe id, used to stop subscription. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // The list of items containing configuration values + Items map[string]*v1.ConfigurationItem `protobuf:"bytes,2,rep,name=items,proto3" json:"items,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *SubscribeConfigurationResponse) Reset() { + *x = SubscribeConfigurationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeConfigurationResponse) ProtoMessage() {} + +func (x *SubscribeConfigurationResponse) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeConfigurationResponse.ProtoReflect.Descriptor instead. +func (*SubscribeConfigurationResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{41} +} + +func (x *SubscribeConfigurationResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SubscribeConfigurationResponse) GetItems() map[string]*v1.ConfigurationItem { + if x != nil { + return x.Items + } + return nil +} + +type UnsubscribeConfigurationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *UnsubscribeConfigurationResponse) Reset() { + *x = UnsubscribeConfigurationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnsubscribeConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnsubscribeConfigurationResponse) ProtoMessage() {} + +func (x *UnsubscribeConfigurationResponse) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnsubscribeConfigurationResponse.ProtoReflect.Descriptor instead. +func (*UnsubscribeConfigurationResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{42} +} + +func (x *UnsubscribeConfigurationResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *UnsubscribeConfigurationResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +type TryLockRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The lock store name,e.g. `redis`. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // Required. resource_id is the lock key. e.g. `order_id_111` + // It stands for "which resource I want to protect" + ResourceId string `protobuf:"bytes,2,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + // Required. lock_owner indicate the identifier of lock owner. + // You can generate a uuid as lock_owner.For example,in golang: + // + // req.LockOwner = uuid.New().String() + // + // This field is per request,not per process,so it is different for each request, + // which aims to prevent multi-thread in the same process trying the same lock concurrently. + // + // The reason why we don't make it automatically generated is: + // 1. If it is automatically generated,there must be a 'my_lock_owner_id' field in the response. + // This name is so weird that we think it is inappropriate to put it into the api spec + // 2. If we change the field 'my_lock_owner_id' in the response to 'lock_owner',which means the current lock owner of this lock, + // we find that in some lock services users can't get the current lock owner.Actually users don't need it at all. + // 3. When reentrant lock is needed,the existing lock_owner is required to identify client and check "whether this client can reenter this lock". + // So this field in the request shouldn't be removed. + LockOwner string `protobuf:"bytes,3,opt,name=lock_owner,json=lockOwner,proto3" json:"lock_owner,omitempty"` + // Required. The time before expiry.The time unit is second. + ExpiryInSeconds int32 `protobuf:"varint,4,opt,name=expiryInSeconds,proto3" json:"expiryInSeconds,omitempty"` +} + +func (x *TryLockRequest) Reset() { + *x = TryLockRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TryLockRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TryLockRequest) ProtoMessage() {} + +func (x *TryLockRequest) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TryLockRequest.ProtoReflect.Descriptor instead. +func (*TryLockRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{43} +} + +func (x *TryLockRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *TryLockRequest) GetResourceId() string { + if x != nil { + return x.ResourceId + } + return "" +} + +func (x *TryLockRequest) GetLockOwner() string { + if x != nil { + return x.LockOwner + } + return "" +} + +func (x *TryLockRequest) GetExpiryInSeconds() int32 { + if x != nil { + return x.ExpiryInSeconds + } + return 0 +} + +type TryLockResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *TryLockResponse) Reset() { + *x = TryLockResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TryLockResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TryLockResponse) ProtoMessage() {} + +func (x *TryLockResponse) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TryLockResponse.ProtoReflect.Descriptor instead. +func (*TryLockResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{44} +} + +func (x *TryLockResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +type UnlockRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // resource_id is the lock key. + ResourceId string `protobuf:"bytes,2,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + LockOwner string `protobuf:"bytes,3,opt,name=lock_owner,json=lockOwner,proto3" json:"lock_owner,omitempty"` +} + +func (x *UnlockRequest) Reset() { + *x = UnlockRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnlockRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnlockRequest) ProtoMessage() {} + +func (x *UnlockRequest) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnlockRequest.ProtoReflect.Descriptor instead. +func (*UnlockRequest) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{45} +} + +func (x *UnlockRequest) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *UnlockRequest) GetResourceId() string { + if x != nil { + return x.ResourceId + } + return "" +} + +func (x *UnlockRequest) GetLockOwner() string { + if x != nil { + return x.LockOwner + } + return "" +} + +type UnlockResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status UnlockResponse_Status `protobuf:"varint,1,opt,name=status,proto3,enum=dapr.proto.runtime.v1.UnlockResponse_Status" json:"status,omitempty"` +} + +func (x *UnlockResponse) Reset() { + *x = UnlockResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dapr_proto_runtime_v1_dapr_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnlockResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnlockResponse) ProtoMessage() {} + +func (x *UnlockResponse) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnlockResponse.ProtoReflect.Descriptor instead. +func (*UnlockResponse) Descriptor() ([]byte, []int) { + return file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP(), []int{46} +} + +func (x *UnlockResponse) GetStatus() UnlockResponse_Status { + if x != nil { + return x.Status + } + return UnlockResponse_SUCCESS +} + +var File_dapr_proto_runtime_v1_dapr_proto protoreflect.FileDescriptor + +var file_dapr_proto_runtime_v1_dapr_proto_rawDesc = []byte{ + 0x0a, 0x20, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x15, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x21, 0x64, 0x61, 0x70, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x65, 0x0a, 0x14, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 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, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa8, 0x02, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x55, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 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, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0xfd, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, + 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x12, 0x54, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x47, 0x65, + 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x52, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 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, 0xec, 0x01, 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, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 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, 0x4e, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, + 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, 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, 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, 0xca, 0x01, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 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, 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, 0xc5, 0x02, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, + 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, + 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x61, 0x67, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x3c, + 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 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, 0x70, + 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x65, 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, 0x37, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x22, 0x6a, 0x0a, 0x10, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x37, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0xd9, 0x01, 0x0a, + 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 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, 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, 0x60, 0x0a, 0x0e, 0x51, 0x75, 0x65, 0x72, + 0x79, 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, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 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, 0x22, 0xfd, 0x01, 0x0a, 0x12, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x25, 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, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 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, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x9f, 0x02, 0x0a, 0x13, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 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, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, + 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x54, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 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, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, + 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, 0xf0, 0x01, 0x0a, + 0x14, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x55, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x39, 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, 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, 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 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, + 0xc0, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 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, 0x12, 0x56, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 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, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0xd3, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 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, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 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, 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, 0x94, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 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, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 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, + 0xc9, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 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, 0x55, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 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, 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, 0x9a, 0x01, 0x0a, 0x0e, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, + 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x32, 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, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 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, 0xc3, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x36, 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, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5e, + 0x0a, 0x09, 0x44, 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, 0x3b, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 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, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x7e, + 0x0a, 0x1b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, + 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb0, + 0x02, 0x0a, 0x1e, 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, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x52, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x32, 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, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x5f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 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, 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, 0xde, 0x01, 0x0a, 0x19, 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, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x64, 0x75, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x64, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, + 0x74, 0x6c, 0x22, 0x6b, 0x0a, 0x1b, 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, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0xc5, 0x01, 0x0a, 0x1c, 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, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x64, 0x75, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x64, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0x6e, 0x0a, 0x1e, 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, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x1a, 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, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, + 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, + 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x62, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x2b, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0xb8, 0x01, 0x0a, 0x23, 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, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0a, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7a, 0x0a, 0x12, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 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, 0x95, 0x03, 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, 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, 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, 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, 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, 0x99, 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, + 0x28, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x49, 0x6e, 0x53, 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, 0x32, + 0xba, 0x16, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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 ( + file_dapr_proto_runtime_v1_dapr_proto_rawDescOnce sync.Once + file_dapr_proto_runtime_v1_dapr_proto_rawDescData = file_dapr_proto_runtime_v1_dapr_proto_rawDesc +) + +func file_dapr_proto_runtime_v1_dapr_proto_rawDescGZIP() []byte { + file_dapr_proto_runtime_v1_dapr_proto_rawDescOnce.Do(func() { + file_dapr_proto_runtime_v1_dapr_proto_rawDescData = protoimpl.X.CompressGZIP(file_dapr_proto_runtime_v1_dapr_proto_rawDescData) + }) + return file_dapr_proto_runtime_v1_dapr_proto_rawDescData +} + +var file_dapr_proto_runtime_v1_dapr_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_dapr_proto_runtime_v1_dapr_proto_msgTypes = make([]protoimpl.MessageInfo, 68) +var file_dapr_proto_runtime_v1_dapr_proto_goTypes = []interface{}{ + (UnlockResponse_Status)(0), // 0: dapr.proto.runtime.v1.UnlockResponse.Status + (*InvokeServiceRequest)(nil), // 1: dapr.proto.runtime.v1.InvokeServiceRequest + (*GetStateRequest)(nil), // 2: dapr.proto.runtime.v1.GetStateRequest + (*GetBulkStateRequest)(nil), // 3: dapr.proto.runtime.v1.GetBulkStateRequest + (*GetBulkStateResponse)(nil), // 4: dapr.proto.runtime.v1.GetBulkStateResponse + (*BulkStateItem)(nil), // 5: dapr.proto.runtime.v1.BulkStateItem + (*GetStateResponse)(nil), // 6: dapr.proto.runtime.v1.GetStateResponse + (*DeleteStateRequest)(nil), // 7: dapr.proto.runtime.v1.DeleteStateRequest + (*DeleteBulkStateRequest)(nil), // 8: dapr.proto.runtime.v1.DeleteBulkStateRequest + (*SaveStateRequest)(nil), // 9: dapr.proto.runtime.v1.SaveStateRequest + (*QueryStateRequest)(nil), // 10: dapr.proto.runtime.v1.QueryStateRequest + (*QueryStateItem)(nil), // 11: dapr.proto.runtime.v1.QueryStateItem + (*QueryStateResponse)(nil), // 12: dapr.proto.runtime.v1.QueryStateResponse + (*PublishEventRequest)(nil), // 13: dapr.proto.runtime.v1.PublishEventRequest + (*InvokeBindingRequest)(nil), // 14: dapr.proto.runtime.v1.InvokeBindingRequest + (*InvokeBindingResponse)(nil), // 15: dapr.proto.runtime.v1.InvokeBindingResponse + (*GetSecretRequest)(nil), // 16: dapr.proto.runtime.v1.GetSecretRequest + (*GetSecretResponse)(nil), // 17: dapr.proto.runtime.v1.GetSecretResponse + (*GetBulkSecretRequest)(nil), // 18: dapr.proto.runtime.v1.GetBulkSecretRequest + (*SecretResponse)(nil), // 19: dapr.proto.runtime.v1.SecretResponse + (*GetBulkSecretResponse)(nil), // 20: dapr.proto.runtime.v1.GetBulkSecretResponse + (*TransactionalStateOperation)(nil), // 21: dapr.proto.runtime.v1.TransactionalStateOperation + (*ExecuteStateTransactionRequest)(nil), // 22: dapr.proto.runtime.v1.ExecuteStateTransactionRequest + (*RegisterActorTimerRequest)(nil), // 23: dapr.proto.runtime.v1.RegisterActorTimerRequest + (*UnregisterActorTimerRequest)(nil), // 24: dapr.proto.runtime.v1.UnregisterActorTimerRequest + (*RegisterActorReminderRequest)(nil), // 25: dapr.proto.runtime.v1.RegisterActorReminderRequest + (*UnregisterActorReminderRequest)(nil), // 26: dapr.proto.runtime.v1.UnregisterActorReminderRequest + (*RenameActorReminderRequest)(nil), // 27: dapr.proto.runtime.v1.RenameActorReminderRequest + (*GetActorStateRequest)(nil), // 28: dapr.proto.runtime.v1.GetActorStateRequest + (*GetActorStateResponse)(nil), // 29: dapr.proto.runtime.v1.GetActorStateResponse + (*ExecuteActorStateTransactionRequest)(nil), // 30: dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest + (*TransactionalActorStateOperation)(nil), // 31: dapr.proto.runtime.v1.TransactionalActorStateOperation + (*InvokeActorRequest)(nil), // 32: dapr.proto.runtime.v1.InvokeActorRequest + (*InvokeActorResponse)(nil), // 33: dapr.proto.runtime.v1.InvokeActorResponse + (*GetMetadataResponse)(nil), // 34: dapr.proto.runtime.v1.GetMetadataResponse + (*ActiveActorsCount)(nil), // 35: dapr.proto.runtime.v1.ActiveActorsCount + (*RegisteredComponents)(nil), // 36: dapr.proto.runtime.v1.RegisteredComponents + (*SetMetadataRequest)(nil), // 37: dapr.proto.runtime.v1.SetMetadataRequest + (*GetConfigurationRequest)(nil), // 38: dapr.proto.runtime.v1.GetConfigurationRequest + (*GetConfigurationResponse)(nil), // 39: dapr.proto.runtime.v1.GetConfigurationResponse + (*SubscribeConfigurationRequest)(nil), // 40: dapr.proto.runtime.v1.SubscribeConfigurationRequest + (*UnsubscribeConfigurationRequest)(nil), // 41: dapr.proto.runtime.v1.UnsubscribeConfigurationRequest + (*SubscribeConfigurationResponse)(nil), // 42: dapr.proto.runtime.v1.SubscribeConfigurationResponse + (*UnsubscribeConfigurationResponse)(nil), // 43: dapr.proto.runtime.v1.UnsubscribeConfigurationResponse + (*TryLockRequest)(nil), // 44: dapr.proto.runtime.v1.TryLockRequest + (*TryLockResponse)(nil), // 45: dapr.proto.runtime.v1.TryLockResponse + (*UnlockRequest)(nil), // 46: dapr.proto.runtime.v1.UnlockRequest + (*UnlockResponse)(nil), // 47: dapr.proto.runtime.v1.UnlockResponse + nil, // 48: dapr.proto.runtime.v1.GetStateRequest.MetadataEntry + nil, // 49: dapr.proto.runtime.v1.GetBulkStateRequest.MetadataEntry + nil, // 50: dapr.proto.runtime.v1.BulkStateItem.MetadataEntry + nil, // 51: dapr.proto.runtime.v1.GetStateResponse.MetadataEntry + nil, // 52: dapr.proto.runtime.v1.DeleteStateRequest.MetadataEntry + nil, // 53: dapr.proto.runtime.v1.QueryStateRequest.MetadataEntry + nil, // 54: dapr.proto.runtime.v1.QueryStateResponse.MetadataEntry + nil, // 55: dapr.proto.runtime.v1.PublishEventRequest.MetadataEntry + nil, // 56: dapr.proto.runtime.v1.InvokeBindingRequest.MetadataEntry + nil, // 57: dapr.proto.runtime.v1.InvokeBindingResponse.MetadataEntry + nil, // 58: dapr.proto.runtime.v1.GetSecretRequest.MetadataEntry + nil, // 59: dapr.proto.runtime.v1.GetSecretResponse.DataEntry + nil, // 60: dapr.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry + nil, // 61: dapr.proto.runtime.v1.SecretResponse.SecretsEntry + nil, // 62: dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry + nil, // 63: dapr.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry + nil, // 64: dapr.proto.runtime.v1.GetMetadataResponse.ExtendedMetadataEntry + nil, // 65: dapr.proto.runtime.v1.GetConfigurationRequest.MetadataEntry + nil, // 66: dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry + nil, // 67: dapr.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry + nil, // 68: dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry + (*v1.InvokeRequest)(nil), // 69: dapr.proto.common.v1.InvokeRequest + (v1.StateOptions_StateConsistency)(0), // 70: dapr.proto.common.v1.StateOptions.StateConsistency + (*v1.Etag)(nil), // 71: dapr.proto.common.v1.Etag + (*v1.StateOptions)(nil), // 72: dapr.proto.common.v1.StateOptions + (*v1.StateItem)(nil), // 73: dapr.proto.common.v1.StateItem + (*anypb.Any)(nil), // 74: google.protobuf.Any + (*v1.ConfigurationItem)(nil), // 75: dapr.proto.common.v1.ConfigurationItem + (*emptypb.Empty)(nil), // 76: google.protobuf.Empty + (*v1.InvokeResponse)(nil), // 77: dapr.proto.common.v1.InvokeResponse +} +var file_dapr_proto_runtime_v1_dapr_proto_depIdxs = []int32{ + 69, // 0: dapr.proto.runtime.v1.InvokeServiceRequest.message:type_name -> dapr.proto.common.v1.InvokeRequest + 70, // 1: dapr.proto.runtime.v1.GetStateRequest.consistency:type_name -> dapr.proto.common.v1.StateOptions.StateConsistency + 48, // 2: dapr.proto.runtime.v1.GetStateRequest.metadata:type_name -> dapr.proto.runtime.v1.GetStateRequest.MetadataEntry + 49, // 3: dapr.proto.runtime.v1.GetBulkStateRequest.metadata:type_name -> dapr.proto.runtime.v1.GetBulkStateRequest.MetadataEntry + 5, // 4: dapr.proto.runtime.v1.GetBulkStateResponse.items:type_name -> dapr.proto.runtime.v1.BulkStateItem + 50, // 5: dapr.proto.runtime.v1.BulkStateItem.metadata:type_name -> dapr.proto.runtime.v1.BulkStateItem.MetadataEntry + 51, // 6: dapr.proto.runtime.v1.GetStateResponse.metadata:type_name -> dapr.proto.runtime.v1.GetStateResponse.MetadataEntry + 71, // 7: dapr.proto.runtime.v1.DeleteStateRequest.etag:type_name -> dapr.proto.common.v1.Etag + 72, // 8: dapr.proto.runtime.v1.DeleteStateRequest.options:type_name -> dapr.proto.common.v1.StateOptions + 52, // 9: dapr.proto.runtime.v1.DeleteStateRequest.metadata:type_name -> dapr.proto.runtime.v1.DeleteStateRequest.MetadataEntry + 73, // 10: dapr.proto.runtime.v1.DeleteBulkStateRequest.states:type_name -> dapr.proto.common.v1.StateItem + 73, // 11: dapr.proto.runtime.v1.SaveStateRequest.states:type_name -> dapr.proto.common.v1.StateItem + 53, // 12: dapr.proto.runtime.v1.QueryStateRequest.metadata:type_name -> dapr.proto.runtime.v1.QueryStateRequest.MetadataEntry + 11, // 13: dapr.proto.runtime.v1.QueryStateResponse.results:type_name -> dapr.proto.runtime.v1.QueryStateItem + 54, // 14: dapr.proto.runtime.v1.QueryStateResponse.metadata:type_name -> dapr.proto.runtime.v1.QueryStateResponse.MetadataEntry + 55, // 15: dapr.proto.runtime.v1.PublishEventRequest.metadata:type_name -> dapr.proto.runtime.v1.PublishEventRequest.MetadataEntry + 56, // 16: dapr.proto.runtime.v1.InvokeBindingRequest.metadata:type_name -> dapr.proto.runtime.v1.InvokeBindingRequest.MetadataEntry + 57, // 17: dapr.proto.runtime.v1.InvokeBindingResponse.metadata:type_name -> dapr.proto.runtime.v1.InvokeBindingResponse.MetadataEntry + 58, // 18: dapr.proto.runtime.v1.GetSecretRequest.metadata:type_name -> dapr.proto.runtime.v1.GetSecretRequest.MetadataEntry + 59, // 19: dapr.proto.runtime.v1.GetSecretResponse.data:type_name -> dapr.proto.runtime.v1.GetSecretResponse.DataEntry + 60, // 20: dapr.proto.runtime.v1.GetBulkSecretRequest.metadata:type_name -> dapr.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry + 61, // 21: dapr.proto.runtime.v1.SecretResponse.secrets:type_name -> dapr.proto.runtime.v1.SecretResponse.SecretsEntry + 62, // 22: dapr.proto.runtime.v1.GetBulkSecretResponse.data:type_name -> dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry + 73, // 23: dapr.proto.runtime.v1.TransactionalStateOperation.request:type_name -> dapr.proto.common.v1.StateItem + 21, // 24: dapr.proto.runtime.v1.ExecuteStateTransactionRequest.operations:type_name -> dapr.proto.runtime.v1.TransactionalStateOperation + 63, // 25: dapr.proto.runtime.v1.ExecuteStateTransactionRequest.metadata:type_name -> dapr.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry + 31, // 26: dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest.operations:type_name -> dapr.proto.runtime.v1.TransactionalActorStateOperation + 74, // 27: dapr.proto.runtime.v1.TransactionalActorStateOperation.value:type_name -> google.protobuf.Any + 35, // 28: dapr.proto.runtime.v1.GetMetadataResponse.active_actors_count:type_name -> dapr.proto.runtime.v1.ActiveActorsCount + 36, // 29: dapr.proto.runtime.v1.GetMetadataResponse.registered_components:type_name -> dapr.proto.runtime.v1.RegisteredComponents + 64, // 30: dapr.proto.runtime.v1.GetMetadataResponse.extended_metadata:type_name -> dapr.proto.runtime.v1.GetMetadataResponse.ExtendedMetadataEntry + 65, // 31: dapr.proto.runtime.v1.GetConfigurationRequest.metadata:type_name -> dapr.proto.runtime.v1.GetConfigurationRequest.MetadataEntry + 66, // 32: dapr.proto.runtime.v1.GetConfigurationResponse.items:type_name -> dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry + 67, // 33: dapr.proto.runtime.v1.SubscribeConfigurationRequest.metadata:type_name -> dapr.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry + 68, // 34: dapr.proto.runtime.v1.SubscribeConfigurationResponse.items:type_name -> dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry + 0, // 35: dapr.proto.runtime.v1.UnlockResponse.status:type_name -> dapr.proto.runtime.v1.UnlockResponse.Status + 19, // 36: dapr.proto.runtime.v1.GetBulkSecretResponse.DataEntry.value:type_name -> dapr.proto.runtime.v1.SecretResponse + 75, // 37: dapr.proto.runtime.v1.GetConfigurationResponse.ItemsEntry.value:type_name -> dapr.proto.common.v1.ConfigurationItem + 75, // 38: dapr.proto.runtime.v1.SubscribeConfigurationResponse.ItemsEntry.value:type_name -> dapr.proto.common.v1.ConfigurationItem + 1, // 39: dapr.proto.runtime.v1.Dapr.InvokeService:input_type -> dapr.proto.runtime.v1.InvokeServiceRequest + 2, // 40: dapr.proto.runtime.v1.Dapr.GetState:input_type -> dapr.proto.runtime.v1.GetStateRequest + 3, // 41: dapr.proto.runtime.v1.Dapr.GetBulkState:input_type -> dapr.proto.runtime.v1.GetBulkStateRequest + 9, // 42: dapr.proto.runtime.v1.Dapr.SaveState:input_type -> dapr.proto.runtime.v1.SaveStateRequest + 10, // 43: dapr.proto.runtime.v1.Dapr.QueryStateAlpha1:input_type -> dapr.proto.runtime.v1.QueryStateRequest + 7, // 44: dapr.proto.runtime.v1.Dapr.DeleteState:input_type -> dapr.proto.runtime.v1.DeleteStateRequest + 8, // 45: dapr.proto.runtime.v1.Dapr.DeleteBulkState:input_type -> dapr.proto.runtime.v1.DeleteBulkStateRequest + 22, // 46: dapr.proto.runtime.v1.Dapr.ExecuteStateTransaction:input_type -> dapr.proto.runtime.v1.ExecuteStateTransactionRequest + 13, // 47: dapr.proto.runtime.v1.Dapr.PublishEvent:input_type -> dapr.proto.runtime.v1.PublishEventRequest + 14, // 48: dapr.proto.runtime.v1.Dapr.InvokeBinding:input_type -> dapr.proto.runtime.v1.InvokeBindingRequest + 16, // 49: dapr.proto.runtime.v1.Dapr.GetSecret:input_type -> dapr.proto.runtime.v1.GetSecretRequest + 18, // 50: dapr.proto.runtime.v1.Dapr.GetBulkSecret:input_type -> dapr.proto.runtime.v1.GetBulkSecretRequest + 23, // 51: dapr.proto.runtime.v1.Dapr.RegisterActorTimer:input_type -> dapr.proto.runtime.v1.RegisterActorTimerRequest + 24, // 52: dapr.proto.runtime.v1.Dapr.UnregisterActorTimer:input_type -> dapr.proto.runtime.v1.UnregisterActorTimerRequest + 25, // 53: dapr.proto.runtime.v1.Dapr.RegisterActorReminder:input_type -> dapr.proto.runtime.v1.RegisterActorReminderRequest + 26, // 54: dapr.proto.runtime.v1.Dapr.UnregisterActorReminder:input_type -> dapr.proto.runtime.v1.UnregisterActorReminderRequest + 27, // 55: dapr.proto.runtime.v1.Dapr.RenameActorReminder:input_type -> dapr.proto.runtime.v1.RenameActorReminderRequest + 28, // 56: dapr.proto.runtime.v1.Dapr.GetActorState:input_type -> dapr.proto.runtime.v1.GetActorStateRequest + 30, // 57: dapr.proto.runtime.v1.Dapr.ExecuteActorStateTransaction:input_type -> dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest + 32, // 58: dapr.proto.runtime.v1.Dapr.InvokeActor:input_type -> dapr.proto.runtime.v1.InvokeActorRequest + 38, // 59: dapr.proto.runtime.v1.Dapr.GetConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.GetConfigurationRequest + 40, // 60: dapr.proto.runtime.v1.Dapr.SubscribeConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.SubscribeConfigurationRequest + 41, // 61: dapr.proto.runtime.v1.Dapr.UnsubscribeConfigurationAlpha1:input_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationRequest + 44, // 62: dapr.proto.runtime.v1.Dapr.TryLockAlpha1:input_type -> dapr.proto.runtime.v1.TryLockRequest + 46, // 63: dapr.proto.runtime.v1.Dapr.UnlockAlpha1:input_type -> dapr.proto.runtime.v1.UnlockRequest + 76, // 64: dapr.proto.runtime.v1.Dapr.GetMetadata:input_type -> google.protobuf.Empty + 37, // 65: dapr.proto.runtime.v1.Dapr.SetMetadata:input_type -> dapr.proto.runtime.v1.SetMetadataRequest + 76, // 66: dapr.proto.runtime.v1.Dapr.Shutdown:input_type -> google.protobuf.Empty + 77, // 67: dapr.proto.runtime.v1.Dapr.InvokeService:output_type -> dapr.proto.common.v1.InvokeResponse + 6, // 68: dapr.proto.runtime.v1.Dapr.GetState:output_type -> dapr.proto.runtime.v1.GetStateResponse + 4, // 69: dapr.proto.runtime.v1.Dapr.GetBulkState:output_type -> dapr.proto.runtime.v1.GetBulkStateResponse + 76, // 70: dapr.proto.runtime.v1.Dapr.SaveState:output_type -> google.protobuf.Empty + 12, // 71: dapr.proto.runtime.v1.Dapr.QueryStateAlpha1:output_type -> dapr.proto.runtime.v1.QueryStateResponse + 76, // 72: dapr.proto.runtime.v1.Dapr.DeleteState:output_type -> google.protobuf.Empty + 76, // 73: dapr.proto.runtime.v1.Dapr.DeleteBulkState:output_type -> google.protobuf.Empty + 76, // 74: dapr.proto.runtime.v1.Dapr.ExecuteStateTransaction:output_type -> google.protobuf.Empty + 76, // 75: dapr.proto.runtime.v1.Dapr.PublishEvent:output_type -> google.protobuf.Empty + 15, // 76: dapr.proto.runtime.v1.Dapr.InvokeBinding:output_type -> dapr.proto.runtime.v1.InvokeBindingResponse + 17, // 77: dapr.proto.runtime.v1.Dapr.GetSecret:output_type -> dapr.proto.runtime.v1.GetSecretResponse + 20, // 78: dapr.proto.runtime.v1.Dapr.GetBulkSecret:output_type -> dapr.proto.runtime.v1.GetBulkSecretResponse + 76, // 79: dapr.proto.runtime.v1.Dapr.RegisterActorTimer:output_type -> google.protobuf.Empty + 76, // 80: dapr.proto.runtime.v1.Dapr.UnregisterActorTimer:output_type -> google.protobuf.Empty + 76, // 81: dapr.proto.runtime.v1.Dapr.RegisterActorReminder:output_type -> google.protobuf.Empty + 76, // 82: dapr.proto.runtime.v1.Dapr.UnregisterActorReminder:output_type -> google.protobuf.Empty + 76, // 83: dapr.proto.runtime.v1.Dapr.RenameActorReminder:output_type -> google.protobuf.Empty + 29, // 84: dapr.proto.runtime.v1.Dapr.GetActorState:output_type -> dapr.proto.runtime.v1.GetActorStateResponse + 76, // 85: dapr.proto.runtime.v1.Dapr.ExecuteActorStateTransaction:output_type -> google.protobuf.Empty + 33, // 86: dapr.proto.runtime.v1.Dapr.InvokeActor:output_type -> dapr.proto.runtime.v1.InvokeActorResponse + 39, // 87: dapr.proto.runtime.v1.Dapr.GetConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.GetConfigurationResponse + 42, // 88: dapr.proto.runtime.v1.Dapr.SubscribeConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.SubscribeConfigurationResponse + 43, // 89: dapr.proto.runtime.v1.Dapr.UnsubscribeConfigurationAlpha1:output_type -> dapr.proto.runtime.v1.UnsubscribeConfigurationResponse + 45, // 90: dapr.proto.runtime.v1.Dapr.TryLockAlpha1:output_type -> dapr.proto.runtime.v1.TryLockResponse + 47, // 91: dapr.proto.runtime.v1.Dapr.UnlockAlpha1:output_type -> dapr.proto.runtime.v1.UnlockResponse + 34, // 92: dapr.proto.runtime.v1.Dapr.GetMetadata:output_type -> dapr.proto.runtime.v1.GetMetadataResponse + 76, // 93: dapr.proto.runtime.v1.Dapr.SetMetadata:output_type -> google.protobuf.Empty + 76, // 94: dapr.proto.runtime.v1.Dapr.Shutdown:output_type -> google.protobuf.Empty + 67, // [67:95] is the sub-list for method output_type + 39, // [39:67] is the sub-list for method input_type + 39, // [39:39] is the sub-list for extension type_name + 39, // [39:39] is the sub-list for extension extendee + 0, // [0:39] is the sub-list for field type_name +} + +func init() { file_dapr_proto_runtime_v1_dapr_proto_init() } +func file_dapr_proto_runtime_v1_dapr_proto_init() { + if File_dapr_proto_runtime_v1_dapr_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_dapr_proto_runtime_v1_dapr_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvokeServiceRequest); 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[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStateRequest); 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[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBulkStateRequest); 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[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBulkStateResponse); 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[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkStateItem); 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[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStateResponse); 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[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStateRequest); 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[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteBulkStateRequest); 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[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SaveStateRequest); 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[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryStateRequest); 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[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryStateItem); 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[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryStateResponse); 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[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PublishEventRequest); 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[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvokeBindingRequest); 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[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvokeBindingResponse); 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[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSecretRequest); 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[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSecretResponse); 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[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBulkSecretRequest); 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[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecretResponse); 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[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBulkSecretResponse); 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[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionalStateOperation); 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[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteStateTransactionRequest); 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[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterActorTimerRequest); 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[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnregisterActorTimerRequest); 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[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterActorReminderRequest); 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[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnregisterActorReminderRequest); 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[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RenameActorReminderRequest); 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[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetActorStateRequest); 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[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetActorStateResponse); 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[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteActorStateTransactionRequest); 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[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionalActorStateOperation); 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[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvokeActorRequest); 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[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvokeActorResponse); 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[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMetadataResponse); 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[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActiveActorsCount); 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[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisteredComponents); 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[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetMetadataRequest); 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[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetConfigurationRequest); 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[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetConfigurationResponse); 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[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeConfigurationRequest); 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[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnsubscribeConfigurationRequest); 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[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeConfigurationResponse); 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[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnsubscribeConfigurationResponse); 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[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TryLockRequest); 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[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TryLockResponse); 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[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnlockRequest); 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[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnlockResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_dapr_proto_runtime_v1_dapr_proto_rawDesc, + NumEnums: 1, + NumMessages: 68, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_dapr_proto_runtime_v1_dapr_proto_goTypes, + DependencyIndexes: file_dapr_proto_runtime_v1_dapr_proto_depIdxs, + EnumInfos: file_dapr_proto_runtime_v1_dapr_proto_enumTypes, + MessageInfos: file_dapr_proto_runtime_v1_dapr_proto_msgTypes, + }.Build() + File_dapr_proto_runtime_v1_dapr_proto = out.File + file_dapr_proto_runtime_v1_dapr_proto_rawDesc = nil + file_dapr_proto_runtime_v1_dapr_proto_goTypes = nil + file_dapr_proto_runtime_v1_dapr_proto_depIdxs = nil +} diff --git a/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/dapr_grpc.pb.go b/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/dapr_grpc.pb.go new file mode 100644 index 00000000000..72c54233575 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/dapr/proto/runtime/v1/dapr_grpc.pb.go @@ -0,0 +1,1162 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.1 +// source: dapr/proto/runtime/v1/dapr.proto + +package runtime + +import ( + context "context" + + v1 "github.com/dapr/go-sdk/dapr/proto/common/v1" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// DaprClient is the client API for Dapr service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type DaprClient interface { + // Invokes a method on a remote Dapr app. + InvokeService(ctx context.Context, in *InvokeServiceRequest, opts ...grpc.CallOption) (*v1.InvokeResponse, error) + // Gets the state for a specific key. + GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateResponse, error) + // Gets a bulk of state items for a list of keys + GetBulkState(ctx context.Context, in *GetBulkStateRequest, opts ...grpc.CallOption) (*GetBulkStateResponse, error) + // Saves the state for a specific key. + SaveState(ctx context.Context, in *SaveStateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Queries the state. + QueryStateAlpha1(ctx context.Context, in *QueryStateRequest, opts ...grpc.CallOption) (*QueryStateResponse, error) + // Deletes the state for a specific key. + DeleteState(ctx context.Context, in *DeleteStateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Deletes a bulk of state items for a list of keys + DeleteBulkState(ctx context.Context, in *DeleteBulkStateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Executes transactions for a specified store + ExecuteStateTransaction(ctx context.Context, in *ExecuteStateTransactionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Publishes events to the specific topic. + PublishEvent(ctx context.Context, in *PublishEventRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Invokes binding data to specific output bindings + InvokeBinding(ctx context.Context, in *InvokeBindingRequest, opts ...grpc.CallOption) (*InvokeBindingResponse, error) + // Gets secrets from secret stores. + GetSecret(ctx context.Context, in *GetSecretRequest, opts ...grpc.CallOption) (*GetSecretResponse, error) + // Gets a bulk of secrets + GetBulkSecret(ctx context.Context, in *GetBulkSecretRequest, opts ...grpc.CallOption) (*GetBulkSecretResponse, error) + // Register an actor timer. + RegisterActorTimer(ctx context.Context, in *RegisterActorTimerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Unregister an actor timer. + UnregisterActorTimer(ctx context.Context, in *UnregisterActorTimerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Register an actor reminder. + RegisterActorReminder(ctx context.Context, in *RegisterActorReminderRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Unregister an actor reminder. + UnregisterActorReminder(ctx context.Context, in *UnregisterActorReminderRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Rename an actor reminder. + RenameActorReminder(ctx context.Context, in *RenameActorReminderRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Gets the state for a specific actor. + GetActorState(ctx context.Context, in *GetActorStateRequest, opts ...grpc.CallOption) (*GetActorStateResponse, error) + // Executes state transactions for a specified actor + ExecuteActorStateTransaction(ctx context.Context, in *ExecuteActorStateTransactionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // InvokeActor calls a method on an actor. + InvokeActor(ctx context.Context, in *InvokeActorRequest, opts ...grpc.CallOption) (*InvokeActorResponse, error) + // GetConfiguration gets configuration from configuration store. + GetConfigurationAlpha1(ctx context.Context, in *GetConfigurationRequest, opts ...grpc.CallOption) (*GetConfigurationResponse, error) + // SubscribeConfiguration gets configuration from configuration store and subscribe the updates event by grpc stream + SubscribeConfigurationAlpha1(ctx context.Context, in *SubscribeConfigurationRequest, opts ...grpc.CallOption) (Dapr_SubscribeConfigurationAlpha1Client, error) + // UnSubscribeConfiguration unsubscribe the subscription of configuration + UnsubscribeConfigurationAlpha1(ctx context.Context, in *UnsubscribeConfigurationRequest, opts ...grpc.CallOption) (*UnsubscribeConfigurationResponse, error) + // TryLockAlpha1 tries to get a lock with an expiry. + TryLockAlpha1(ctx context.Context, in *TryLockRequest, opts ...grpc.CallOption) (*TryLockResponse, error) + // UnlockAlpha1 unlocks a lock. + UnlockAlpha1(ctx context.Context, in *UnlockRequest, opts ...grpc.CallOption) (*UnlockResponse, error) + // Gets metadata of the sidecar + GetMetadata(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetMetadataResponse, error) + // Sets value in extended metadata of the sidecar + SetMetadata(ctx context.Context, in *SetMetadataRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // Shutdown the sidecar + Shutdown(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) +} + +type daprClient struct { + cc grpc.ClientConnInterface +} + +func NewDaprClient(cc grpc.ClientConnInterface) DaprClient { + return &daprClient{cc} +} + +func (c *daprClient) InvokeService(ctx context.Context, in *InvokeServiceRequest, opts ...grpc.CallOption) (*v1.InvokeResponse, error) { + out := new(v1.InvokeResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/InvokeService", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateResponse, error) { + out := new(GetStateResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/GetState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) GetBulkState(ctx context.Context, in *GetBulkStateRequest, opts ...grpc.CallOption) (*GetBulkStateResponse, error) { + out := new(GetBulkStateResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/GetBulkState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) SaveState(ctx context.Context, in *SaveStateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/SaveState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) QueryStateAlpha1(ctx context.Context, in *QueryStateRequest, opts ...grpc.CallOption) (*QueryStateResponse, error) { + out := new(QueryStateResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/QueryStateAlpha1", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) DeleteState(ctx context.Context, in *DeleteStateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/DeleteState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) DeleteBulkState(ctx context.Context, in *DeleteBulkStateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/DeleteBulkState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) ExecuteStateTransaction(ctx context.Context, in *ExecuteStateTransactionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/ExecuteStateTransaction", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) PublishEvent(ctx context.Context, in *PublishEventRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/PublishEvent", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) InvokeBinding(ctx context.Context, in *InvokeBindingRequest, opts ...grpc.CallOption) (*InvokeBindingResponse, error) { + out := new(InvokeBindingResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/InvokeBinding", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) GetSecret(ctx context.Context, in *GetSecretRequest, opts ...grpc.CallOption) (*GetSecretResponse, error) { + out := new(GetSecretResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/GetSecret", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) GetBulkSecret(ctx context.Context, in *GetBulkSecretRequest, opts ...grpc.CallOption) (*GetBulkSecretResponse, error) { + out := new(GetBulkSecretResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/GetBulkSecret", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) RegisterActorTimer(ctx context.Context, in *RegisterActorTimerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/RegisterActorTimer", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) UnregisterActorTimer(ctx context.Context, in *UnregisterActorTimerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/UnregisterActorTimer", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) RegisterActorReminder(ctx context.Context, in *RegisterActorReminderRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/RegisterActorReminder", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) UnregisterActorReminder(ctx context.Context, in *UnregisterActorReminderRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/UnregisterActorReminder", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) RenameActorReminder(ctx context.Context, in *RenameActorReminderRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/RenameActorReminder", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) GetActorState(ctx context.Context, in *GetActorStateRequest, opts ...grpc.CallOption) (*GetActorStateResponse, error) { + out := new(GetActorStateResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/GetActorState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) ExecuteActorStateTransaction(ctx context.Context, in *ExecuteActorStateTransactionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/ExecuteActorStateTransaction", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) InvokeActor(ctx context.Context, in *InvokeActorRequest, opts ...grpc.CallOption) (*InvokeActorResponse, error) { + out := new(InvokeActorResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/InvokeActor", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) GetConfigurationAlpha1(ctx context.Context, in *GetConfigurationRequest, opts ...grpc.CallOption) (*GetConfigurationResponse, error) { + out := new(GetConfigurationResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/GetConfigurationAlpha1", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) SubscribeConfigurationAlpha1(ctx context.Context, in *SubscribeConfigurationRequest, opts ...grpc.CallOption) (Dapr_SubscribeConfigurationAlpha1Client, error) { + stream, err := c.cc.NewStream(ctx, &Dapr_ServiceDesc.Streams[0], "/dapr.proto.runtime.v1.Dapr/SubscribeConfigurationAlpha1", opts...) + if err != nil { + return nil, err + } + x := &daprSubscribeConfigurationAlpha1Client{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Dapr_SubscribeConfigurationAlpha1Client interface { + Recv() (*SubscribeConfigurationResponse, error) + grpc.ClientStream +} + +type daprSubscribeConfigurationAlpha1Client struct { + grpc.ClientStream +} + +func (x *daprSubscribeConfigurationAlpha1Client) Recv() (*SubscribeConfigurationResponse, error) { + m := new(SubscribeConfigurationResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *daprClient) UnsubscribeConfigurationAlpha1(ctx context.Context, in *UnsubscribeConfigurationRequest, opts ...grpc.CallOption) (*UnsubscribeConfigurationResponse, error) { + out := new(UnsubscribeConfigurationResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/UnsubscribeConfigurationAlpha1", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) TryLockAlpha1(ctx context.Context, in *TryLockRequest, opts ...grpc.CallOption) (*TryLockResponse, error) { + out := new(TryLockResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/TryLockAlpha1", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) UnlockAlpha1(ctx context.Context, in *UnlockRequest, opts ...grpc.CallOption) (*UnlockResponse, error) { + out := new(UnlockResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/UnlockAlpha1", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) GetMetadata(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetMetadataResponse, error) { + out := new(GetMetadataResponse) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/GetMetadata", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) SetMetadata(ctx context.Context, in *SetMetadataRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/SetMetadata", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *daprClient) Shutdown(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, "/dapr.proto.runtime.v1.Dapr/Shutdown", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// DaprServer is the server API for Dapr service. +// All implementations should embed UnimplementedDaprServer +// for forward compatibility +type DaprServer interface { + // Invokes a method on a remote Dapr app. + InvokeService(context.Context, *InvokeServiceRequest) (*v1.InvokeResponse, error) + // Gets the state for a specific key. + GetState(context.Context, *GetStateRequest) (*GetStateResponse, error) + // Gets a bulk of state items for a list of keys + GetBulkState(context.Context, *GetBulkStateRequest) (*GetBulkStateResponse, error) + // Saves the state for a specific key. + SaveState(context.Context, *SaveStateRequest) (*emptypb.Empty, error) + // Queries the state. + QueryStateAlpha1(context.Context, *QueryStateRequest) (*QueryStateResponse, error) + // Deletes the state for a specific key. + DeleteState(context.Context, *DeleteStateRequest) (*emptypb.Empty, error) + // Deletes a bulk of state items for a list of keys + DeleteBulkState(context.Context, *DeleteBulkStateRequest) (*emptypb.Empty, error) + // Executes transactions for a specified store + ExecuteStateTransaction(context.Context, *ExecuteStateTransactionRequest) (*emptypb.Empty, error) + // Publishes events to the specific topic. + PublishEvent(context.Context, *PublishEventRequest) (*emptypb.Empty, error) + // Invokes binding data to specific output bindings + InvokeBinding(context.Context, *InvokeBindingRequest) (*InvokeBindingResponse, error) + // Gets secrets from secret stores. + GetSecret(context.Context, *GetSecretRequest) (*GetSecretResponse, error) + // Gets a bulk of secrets + GetBulkSecret(context.Context, *GetBulkSecretRequest) (*GetBulkSecretResponse, error) + // Register an actor timer. + RegisterActorTimer(context.Context, *RegisterActorTimerRequest) (*emptypb.Empty, error) + // Unregister an actor timer. + UnregisterActorTimer(context.Context, *UnregisterActorTimerRequest) (*emptypb.Empty, error) + // Register an actor reminder. + RegisterActorReminder(context.Context, *RegisterActorReminderRequest) (*emptypb.Empty, error) + // Unregister an actor reminder. + UnregisterActorReminder(context.Context, *UnregisterActorReminderRequest) (*emptypb.Empty, error) + // Rename an actor reminder. + RenameActorReminder(context.Context, *RenameActorReminderRequest) (*emptypb.Empty, error) + // Gets the state for a specific actor. + GetActorState(context.Context, *GetActorStateRequest) (*GetActorStateResponse, error) + // Executes state transactions for a specified actor + ExecuteActorStateTransaction(context.Context, *ExecuteActorStateTransactionRequest) (*emptypb.Empty, error) + // InvokeActor calls a method on an actor. + InvokeActor(context.Context, *InvokeActorRequest) (*InvokeActorResponse, error) + // GetConfiguration gets configuration from configuration store. + GetConfigurationAlpha1(context.Context, *GetConfigurationRequest) (*GetConfigurationResponse, error) + // SubscribeConfiguration gets configuration from configuration store and subscribe the updates event by grpc stream + SubscribeConfigurationAlpha1(*SubscribeConfigurationRequest, Dapr_SubscribeConfigurationAlpha1Server) error + // UnSubscribeConfiguration unsubscribe the subscription of configuration + UnsubscribeConfigurationAlpha1(context.Context, *UnsubscribeConfigurationRequest) (*UnsubscribeConfigurationResponse, error) + // TryLockAlpha1 tries to get a lock with an expiry. + TryLockAlpha1(context.Context, *TryLockRequest) (*TryLockResponse, error) + // UnlockAlpha1 unlocks a lock. + UnlockAlpha1(context.Context, *UnlockRequest) (*UnlockResponse, error) + // Gets metadata of the sidecar + GetMetadata(context.Context, *emptypb.Empty) (*GetMetadataResponse, error) + // Sets value in extended metadata of the sidecar + SetMetadata(context.Context, *SetMetadataRequest) (*emptypb.Empty, error) + // Shutdown the sidecar + Shutdown(context.Context, *emptypb.Empty) (*emptypb.Empty, error) +} + +// UnimplementedDaprServer should be embedded to have forward compatible implementations. +type UnimplementedDaprServer struct { +} + +func (UnimplementedDaprServer) InvokeService(context.Context, *InvokeServiceRequest) (*v1.InvokeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InvokeService not implemented") +} +func (UnimplementedDaprServer) GetState(context.Context, *GetStateRequest) (*GetStateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (UnimplementedDaprServer) GetBulkState(context.Context, *GetBulkStateRequest) (*GetBulkStateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetBulkState not implemented") +} +func (UnimplementedDaprServer) SaveState(context.Context, *SaveStateRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SaveState not implemented") +} +func (UnimplementedDaprServer) QueryStateAlpha1(context.Context, *QueryStateRequest) (*QueryStateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryStateAlpha1 not implemented") +} +func (UnimplementedDaprServer) DeleteState(context.Context, *DeleteStateRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteState not implemented") +} +func (UnimplementedDaprServer) DeleteBulkState(context.Context, *DeleteBulkStateRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteBulkState not implemented") +} +func (UnimplementedDaprServer) ExecuteStateTransaction(context.Context, *ExecuteStateTransactionRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExecuteStateTransaction not implemented") +} +func (UnimplementedDaprServer) PublishEvent(context.Context, *PublishEventRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method PublishEvent not implemented") +} +func (UnimplementedDaprServer) InvokeBinding(context.Context, *InvokeBindingRequest) (*InvokeBindingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InvokeBinding not implemented") +} +func (UnimplementedDaprServer) GetSecret(context.Context, *GetSecretRequest) (*GetSecretResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSecret not implemented") +} +func (UnimplementedDaprServer) GetBulkSecret(context.Context, *GetBulkSecretRequest) (*GetBulkSecretResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetBulkSecret not implemented") +} +func (UnimplementedDaprServer) RegisterActorTimer(context.Context, *RegisterActorTimerRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterActorTimer not implemented") +} +func (UnimplementedDaprServer) UnregisterActorTimer(context.Context, *UnregisterActorTimerRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnregisterActorTimer not implemented") +} +func (UnimplementedDaprServer) RegisterActorReminder(context.Context, *RegisterActorReminderRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterActorReminder not implemented") +} +func (UnimplementedDaprServer) UnregisterActorReminder(context.Context, *UnregisterActorReminderRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnregisterActorReminder not implemented") +} +func (UnimplementedDaprServer) RenameActorReminder(context.Context, *RenameActorReminderRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RenameActorReminder not implemented") +} +func (UnimplementedDaprServer) GetActorState(context.Context, *GetActorStateRequest) (*GetActorStateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetActorState not implemented") +} +func (UnimplementedDaprServer) ExecuteActorStateTransaction(context.Context, *ExecuteActorStateTransactionRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExecuteActorStateTransaction not implemented") +} +func (UnimplementedDaprServer) InvokeActor(context.Context, *InvokeActorRequest) (*InvokeActorResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InvokeActor not implemented") +} +func (UnimplementedDaprServer) GetConfigurationAlpha1(context.Context, *GetConfigurationRequest) (*GetConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetConfigurationAlpha1 not implemented") +} +func (UnimplementedDaprServer) SubscribeConfigurationAlpha1(*SubscribeConfigurationRequest, Dapr_SubscribeConfigurationAlpha1Server) error { + return status.Errorf(codes.Unimplemented, "method SubscribeConfigurationAlpha1 not implemented") +} +func (UnimplementedDaprServer) UnsubscribeConfigurationAlpha1(context.Context, *UnsubscribeConfigurationRequest) (*UnsubscribeConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnsubscribeConfigurationAlpha1 not implemented") +} +func (UnimplementedDaprServer) TryLockAlpha1(context.Context, *TryLockRequest) (*TryLockResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TryLockAlpha1 not implemented") +} +func (UnimplementedDaprServer) UnlockAlpha1(context.Context, *UnlockRequest) (*UnlockResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnlockAlpha1 not implemented") +} +func (UnimplementedDaprServer) GetMetadata(context.Context, *emptypb.Empty) (*GetMetadataResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetMetadata not implemented") +} +func (UnimplementedDaprServer) SetMetadata(context.Context, *SetMetadataRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetMetadata not implemented") +} +func (UnimplementedDaprServer) Shutdown(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented") +} + +// UnsafeDaprServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to DaprServer will +// result in compilation errors. +type UnsafeDaprServer interface { + mustEmbedUnimplementedDaprServer() +} + +func RegisterDaprServer(s grpc.ServiceRegistrar, srv DaprServer) { + s.RegisterService(&Dapr_ServiceDesc, srv) +} + +func _Dapr_InvokeService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InvokeServiceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).InvokeService(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/InvokeService", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).InvokeService(ctx, req.(*InvokeServiceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).GetState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/GetState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).GetState(ctx, req.(*GetStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_GetBulkState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetBulkStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).GetBulkState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/GetBulkState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).GetBulkState(ctx, req.(*GetBulkStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_SaveState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SaveStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).SaveState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/SaveState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).SaveState(ctx, req.(*SaveStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_QueryStateAlpha1_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).QueryStateAlpha1(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/QueryStateAlpha1", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).QueryStateAlpha1(ctx, req.(*QueryStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_DeleteState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).DeleteState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/DeleteState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).DeleteState(ctx, req.(*DeleteStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_DeleteBulkState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteBulkStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).DeleteBulkState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/DeleteBulkState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).DeleteBulkState(ctx, req.(*DeleteBulkStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_ExecuteStateTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExecuteStateTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).ExecuteStateTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/ExecuteStateTransaction", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).ExecuteStateTransaction(ctx, req.(*ExecuteStateTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_PublishEvent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PublishEventRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).PublishEvent(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/PublishEvent", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).PublishEvent(ctx, req.(*PublishEventRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_InvokeBinding_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InvokeBindingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).InvokeBinding(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/InvokeBinding", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).InvokeBinding(ctx, req.(*InvokeBindingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_GetSecret_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSecretRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).GetSecret(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/GetSecret", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).GetSecret(ctx, req.(*GetSecretRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_GetBulkSecret_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetBulkSecretRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).GetBulkSecret(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/GetBulkSecret", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).GetBulkSecret(ctx, req.(*GetBulkSecretRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_RegisterActorTimer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterActorTimerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).RegisterActorTimer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/RegisterActorTimer", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).RegisterActorTimer(ctx, req.(*RegisterActorTimerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_UnregisterActorTimer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UnregisterActorTimerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).UnregisterActorTimer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/UnregisterActorTimer", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).UnregisterActorTimer(ctx, req.(*UnregisterActorTimerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_RegisterActorReminder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterActorReminderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).RegisterActorReminder(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/RegisterActorReminder", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).RegisterActorReminder(ctx, req.(*RegisterActorReminderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_UnregisterActorReminder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UnregisterActorReminderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).UnregisterActorReminder(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/UnregisterActorReminder", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).UnregisterActorReminder(ctx, req.(*UnregisterActorReminderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_RenameActorReminder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RenameActorReminderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).RenameActorReminder(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/RenameActorReminder", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).RenameActorReminder(ctx, req.(*RenameActorReminderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_GetActorState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetActorStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).GetActorState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/GetActorState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).GetActorState(ctx, req.(*GetActorStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_ExecuteActorStateTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExecuteActorStateTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).ExecuteActorStateTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/ExecuteActorStateTransaction", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).ExecuteActorStateTransaction(ctx, req.(*ExecuteActorStateTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_InvokeActor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InvokeActorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).InvokeActor(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/InvokeActor", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).InvokeActor(ctx, req.(*InvokeActorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_GetConfigurationAlpha1_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).GetConfigurationAlpha1(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/GetConfigurationAlpha1", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).GetConfigurationAlpha1(ctx, req.(*GetConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_SubscribeConfigurationAlpha1_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeConfigurationRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(DaprServer).SubscribeConfigurationAlpha1(m, &daprSubscribeConfigurationAlpha1Server{stream}) +} + +type Dapr_SubscribeConfigurationAlpha1Server interface { + Send(*SubscribeConfigurationResponse) error + grpc.ServerStream +} + +type daprSubscribeConfigurationAlpha1Server struct { + grpc.ServerStream +} + +func (x *daprSubscribeConfigurationAlpha1Server) Send(m *SubscribeConfigurationResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _Dapr_UnsubscribeConfigurationAlpha1_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UnsubscribeConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).UnsubscribeConfigurationAlpha1(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/UnsubscribeConfigurationAlpha1", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).UnsubscribeConfigurationAlpha1(ctx, req.(*UnsubscribeConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_TryLockAlpha1_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TryLockRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).TryLockAlpha1(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/TryLockAlpha1", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).TryLockAlpha1(ctx, req.(*TryLockRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_UnlockAlpha1_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UnlockRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).UnlockAlpha1(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/UnlockAlpha1", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).UnlockAlpha1(ctx, req.(*UnlockRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_GetMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).GetMetadata(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/GetMetadata", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).GetMetadata(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_SetMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetMetadataRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).SetMetadata(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/SetMetadata", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).SetMetadata(ctx, req.(*SetMetadataRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Dapr_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DaprServer).Shutdown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dapr.proto.runtime.v1.Dapr/Shutdown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DaprServer).Shutdown(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +// Dapr_ServiceDesc is the grpc.ServiceDesc for Dapr service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Dapr_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "dapr.proto.runtime.v1.Dapr", + HandlerType: (*DaprServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "InvokeService", + Handler: _Dapr_InvokeService_Handler, + }, + { + MethodName: "GetState", + Handler: _Dapr_GetState_Handler, + }, + { + MethodName: "GetBulkState", + Handler: _Dapr_GetBulkState_Handler, + }, + { + MethodName: "SaveState", + Handler: _Dapr_SaveState_Handler, + }, + { + MethodName: "QueryStateAlpha1", + Handler: _Dapr_QueryStateAlpha1_Handler, + }, + { + MethodName: "DeleteState", + Handler: _Dapr_DeleteState_Handler, + }, + { + MethodName: "DeleteBulkState", + Handler: _Dapr_DeleteBulkState_Handler, + }, + { + MethodName: "ExecuteStateTransaction", + Handler: _Dapr_ExecuteStateTransaction_Handler, + }, + { + MethodName: "PublishEvent", + Handler: _Dapr_PublishEvent_Handler, + }, + { + MethodName: "InvokeBinding", + Handler: _Dapr_InvokeBinding_Handler, + }, + { + MethodName: "GetSecret", + Handler: _Dapr_GetSecret_Handler, + }, + { + MethodName: "GetBulkSecret", + Handler: _Dapr_GetBulkSecret_Handler, + }, + { + MethodName: "RegisterActorTimer", + Handler: _Dapr_RegisterActorTimer_Handler, + }, + { + MethodName: "UnregisterActorTimer", + Handler: _Dapr_UnregisterActorTimer_Handler, + }, + { + MethodName: "RegisterActorReminder", + Handler: _Dapr_RegisterActorReminder_Handler, + }, + { + MethodName: "UnregisterActorReminder", + Handler: _Dapr_UnregisterActorReminder_Handler, + }, + { + MethodName: "RenameActorReminder", + Handler: _Dapr_RenameActorReminder_Handler, + }, + { + MethodName: "GetActorState", + Handler: _Dapr_GetActorState_Handler, + }, + { + MethodName: "ExecuteActorStateTransaction", + Handler: _Dapr_ExecuteActorStateTransaction_Handler, + }, + { + MethodName: "InvokeActor", + Handler: _Dapr_InvokeActor_Handler, + }, + { + MethodName: "GetConfigurationAlpha1", + Handler: _Dapr_GetConfigurationAlpha1_Handler, + }, + { + MethodName: "UnsubscribeConfigurationAlpha1", + Handler: _Dapr_UnsubscribeConfigurationAlpha1_Handler, + }, + { + MethodName: "TryLockAlpha1", + Handler: _Dapr_TryLockAlpha1_Handler, + }, + { + MethodName: "UnlockAlpha1", + Handler: _Dapr_UnlockAlpha1_Handler, + }, + { + MethodName: "GetMetadata", + Handler: _Dapr_GetMetadata_Handler, + }, + { + MethodName: "SetMetadata", + Handler: _Dapr_SetMetadata_Handler, + }, + { + MethodName: "Shutdown", + Handler: _Dapr_Shutdown_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "SubscribeConfigurationAlpha1", + Handler: _Dapr_SubscribeConfigurationAlpha1_Handler, + ServerStreams: true, + }, + }, + Metadata: "dapr/proto/runtime/v1/dapr.proto", +} diff --git a/vendor/github.com/dapr/go-sdk/service/common/service.go b/vendor/github.com/dapr/go-sdk/service/common/service.go new file mode 100644 index 00000000000..345f9a4f1a0 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/common/service.go @@ -0,0 +1,55 @@ +/* +Copyright 2021 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 common + +import ( + "context" + + "github.com/dapr/go-sdk/actor" + "github.com/dapr/go-sdk/actor/config" +) + +const ( + // AppAPITokenEnvVar is the environment variable for app api token. + AppAPITokenEnvVar = "APP_API_TOKEN" /* #nosec */ + APITokenKey = "dapr-api-token" /* #nosec */ +) + +// Service represents Dapr callback service. +type Service interface { + // AddHealthCheckHandler sets a health check handler, name: http (router) and grpc (invalid). + AddHealthCheckHandler(name string, fn HealthCheckHandler) error + // AddServiceInvocationHandler appends provided service invocation handler with its name to the service. + AddServiceInvocationHandler(name string, fn ServiceInvocationHandler) error + // AddTopicEventHandler appends provided event handler with its topic and optional metadata to the service. + // Note, retries are only considered when there is an error. Lack of error is considered as a success + AddTopicEventHandler(sub *Subscription, fn TopicEventHandler) error + // AddBindingInvocationHandler appends provided binding invocation handler with its name to the service. + AddBindingInvocationHandler(name string, fn BindingInvocationHandler) error + // RegisterActorImplFactory Register a new actor to actor runtime of go sdk + RegisterActorImplFactory(f actor.Factory, opts ...config.Option) + // Start starts service. + Start() error + // Stop stops the previously started service. + Stop() error + // Gracefully stops the previous started service + GracefulStop() error +} + +type ( + ServiceInvocationHandler func(ctx context.Context, in *InvocationEvent) (out *Content, err error) + TopicEventHandler func(ctx context.Context, e *TopicEvent) (retry bool, err error) + BindingInvocationHandler func(ctx context.Context, in *BindingEvent) (out []byte, err error) + HealthCheckHandler func(context.Context) error +) diff --git a/vendor/github.com/dapr/go-sdk/service/common/type.go b/vendor/github.com/dapr/go-sdk/service/common/type.go new file mode 100644 index 00000000000..1883b3c3d79 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/common/type.go @@ -0,0 +1,118 @@ +/* +Copyright 2021 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 common + +import ( + "encoding/json" +) + +// TopicEvent is the content of the inbound topic message. +type TopicEvent struct { + // ID identifies the event. + ID string `json:"id"` + // The version of the CloudEvents specification. + SpecVersion string `json:"specversion"` + // The type of event related to the originating occurrence. + Type string `json:"type"` + // Source identifies the context in which an event happened. + Source string `json:"source"` + // The content type of data value. + DataContentType string `json:"datacontenttype"` + // The content of the event. + // Note, this is why the gRPC and HTTP implementations need separate structs for cloud events. + Data interface{} `json:"data"` + // The content of the event represented as raw bytes. + // This can be deserialized into a Go struct using `Struct`. + RawData []byte `json:"-"` + // The base64 encoding content of the event. + // Note, this is processing rawPayload and binary content types. + // This field is deprecated and will be removed in the future. + DataBase64 string `json:"data_base64,omitempty"` + // Cloud event subject + Subject string `json:"subject"` + // The pubsub topic which publisher sent to. + Topic string `json:"topic"` + // PubsubName is name of the pub/sub this message came from + PubsubName string `json:"pubsubname"` +} + +func (e *TopicEvent) Struct(target interface{}) error { + // TODO: Enhance to inspect DataContentType for the best + // deserialization method. + return json.Unmarshal(e.RawData, target) +} + +// InvocationEvent represents the input and output of binding invocation. +type InvocationEvent struct { + // Data is the payload that the input bindings sent. + Data []byte `json:"data"` + // ContentType of the Data + ContentType string `json:"contentType"` + // DataTypeURL is the resource URL that uniquely identifies the type of the serialized + DataTypeURL string `json:"typeUrl,omitempty"` + // Verb is the HTTP verb that was used to invoke this service. + Verb string `json:"-"` + // QueryString represents an encoded HTTP url query string in the following format: name=value&name2=value2 + QueryString string `json:"-"` +} + +// Content is a generic data content. +type Content struct { + // Data is the payload that the input bindings sent. + Data []byte `json:"data"` + // ContentType of the Data + ContentType string `json:"contentType"` + // DataTypeURL is the resource URL that uniquely identifies the type of the serialized + DataTypeURL string `json:"typeUrl,omitempty"` +} + +// BindingEvent represents the binding event handler input. +type BindingEvent struct { + // Data is the input bindings sent + Data []byte `json:"data"` + // Metadata is the input binding metadata + Metadata map[string]string `json:"metadata,omitempty"` +} + +// Subscription represents single topic subscription. +type Subscription struct { + // PubsubName is name of the pub/sub this message came from + PubsubName string `json:"pubsubname"` + // Topic is the name of the topic + Topic string `json:"topic"` + // Metadata is the subscription metadata + Metadata map[string]string `json:"metadata,omitempty"` + // Route is the route of the handler where HTTP topic events should be published (passed as Path in gRPC) + Route string `json:"route"` + // Match is the CEL expression to match on the CloudEvent envelope. + Match string `json:"match"` + // Priority is the priority in which to evaluate the match (lower to higher). + Priority int `json:"priority"` + // DisableTopicValidation allows to receive events from publisher topics that differ from the subscribed topic. + DisableTopicValidation bool `json:"disableTopicValidation"` +} + +const ( + // SubscriptionResponseStatusSuccess means message is processed successfully. + SubscriptionResponseStatusSuccess = "SUCCESS" + // SubscriptionResponseStatusRetry means message to be retried by Dapr. + SubscriptionResponseStatusRetry = "RETRY" + // SubscriptionResponseStatusDrop means warning is logged and message is dropped. + SubscriptionResponseStatusDrop = "DROP" +) + +// SubscriptionResponse represents the response handling hint from subscriber to Dapr. +type SubscriptionResponse struct { + Status string `json:"status"` +} diff --git a/vendor/github.com/dapr/go-sdk/service/http/Readme.md b/vendor/github.com/dapr/go-sdk/service/http/Readme.md new file mode 100644 index 00000000000..6f28a344516 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/http/Readme.md @@ -0,0 +1,114 @@ +# Dapr HTTP Service SDK for Go + +Start by importing Dapr Go `service/http` package: + +```go +daprd "github.com/dapr/go-sdk/service/http" +``` + +## Creating and Starting Service + +To create an HTTP Dapr service, first, create a Dapr callback instance with a specific address: + +```go +s := daprd.NewService(":8080") +``` + +Or with address and an existing `http.ServeMux` in case you want to combine existing server implementations: + +```go +mux := http.NewServeMux() +mux.HandleFunc("/", myOtherHandler) +s := daprd.NewServiceWithMux(":8080", mux) +``` + +Once you create a service instance, you can "attach" to that service any number of event, binding, and service invocation logic handlers as shown below. Onces the logic is defined, you are ready to start the service: + +```go +if err := s.Start(); err != nil && err != http.ErrServerClosed { + log.Fatalf("error: %v", err) +} +``` + +## Event Handling + +To handle events from specific topic you need to add at least one topic event handler before starting the service: + +```go +sub := &common.Subscription{ + PubsubName: "messages", + Topic: "topic1", + Route: "/events", +} +err := s.AddTopicEventHandler(sub, eventHandler) +if err != nil { + log.Fatalf("error adding topic subscription: %v", err) +} +``` + +The handler method itself can be any method with the expected signature: + +```go +func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err error) { + log.Printf("event - PubsubName:%s, Topic:%s, ID:%s, Data: %v", e.PubsubName, e.Topic, e.ID, e.Data) + // do something with the event + return true, nil +} +``` + +## Service Invocation Handler + +To handle service invocations you will need to add at least one service invocation handler before starting the service: + +```go +if err := s.AddServiceInvocationHandler("/echo", echoHandler); err != nil { + log.Fatalf("error adding invocation handler: %v", err) +} +``` + +The handler method itself can be any method with the expected signature: + +```go +func echoHandler(ctx context.Context, in *common.InvocationEvent) (out *common.Content, err error) { + log.Printf("echo - ContentType:%s, Verb:%s, QueryString:%s, %+v", in.ContentType, in.Verb, in.QueryString, string(in.Data)) + // do something with the invocation here + out = &common.Content{ + Data: in.Data, + ContentType: in.ContentType, + DataTypeURL: in.DataTypeURL, + } + return +} +``` + +## Binding Invocation Handler + +To handle binding invocations you will need to add at least one binding invocation handler before starting the service: + +```go +if err := s.AddBindingInvocationHandler("/run", runHandler); err != nil { + log.Fatalf("error adding binding handler: %v", err) +} +``` + +The handler method itself can be any method with the expected signature: + +```go +func runHandler(ctx context.Context, in *common.BindingEvent) (out []byte, err error) { + log.Printf("binding - Data:%v, Meta:%v", in.Data, in.Metadata) + // do something with the invocation here + return nil, nil +} +``` + +## Templates + +To accelerate your HTTP Dapr app development in Go even further you can use one of the GitHub templates integrating the HTTP Dapr callback package: + +* [Dapr HTTP Event Subscriber in Go](https://github.com/mchmarny/dapr-http-event-subscriber-template) - Template project to jump start your Dapr event subscriber service with HTTP development +* [Dapr HTTP cron Handler in Go](https://github.com/mchmarny/dapr-http-cron-handler-template) - Template project to jump start your Dapr service development for scheduled workloads + + +## Contributing to Dapr Go client + +See the [Contribution Guide](../../CONTRIBUTING.md) to get started with building and developing. diff --git a/vendor/github.com/dapr/go-sdk/service/http/binding.go b/vendor/github.com/dapr/go-sdk/service/http/binding.go new file mode 100644 index 00000000000..fc8175acb5d --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/http/binding.go @@ -0,0 +1,84 @@ +/* +Copyright 2021 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 ( + "fmt" + "io/ioutil" + "net/http" + "strings" + + "github.com/dapr/go-sdk/service/common" +) + +// AddBindingInvocationHandler appends provided binding invocation handler with its route to the service. +func (s *Server) AddBindingInvocationHandler(route string, fn common.BindingInvocationHandler) error { + if route == "" { + return fmt.Errorf("binding route required") + } + if fn == nil { + return fmt.Errorf("binding handler required") + } + + if !strings.HasPrefix(route, "/") { + route = fmt.Sprintf("/%s", route) + } + + s.mux.Handle(route, optionsHandler(http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + var content []byte + if r.ContentLength > 0 { + body, err := ioutil.ReadAll(r.Body) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + content = body + } + + // assuming Dapr doesn't pass multiple values for key + meta := map[string]string{} + for k, values := range r.Header { + // TODO: Need to figure out how to parse out only the headers set in the binding + Traceparent + // if k == "raceparent" || strings.HasPrefix(k, "dapr") { + for _, v := range values { + meta[k] = v + } + // } + } + + // execute handler + in := &common.BindingEvent{ + Data: content, + Metadata: meta, + } + out, err := fn(r.Context(), in) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if out == nil { + out = []byte("{}") + } + + w.Header().Add("Content-Type", "application/json") + if _, err := w.Write(out); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + }))) + + return nil +} diff --git a/vendor/github.com/dapr/go-sdk/service/http/health_check.go b/vendor/github.com/dapr/go-sdk/service/http/health_check.go new file mode 100644 index 00000000000..3f4ca7c15b4 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/http/health_check.go @@ -0,0 +1,45 @@ +/* +Copyright 2021 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 ( + "fmt" + "net/http" + "strings" + + "github.com/dapr/go-sdk/service/common" +) + +// AddHealthCheckHandler appends provided app health check handler. +func (s *Server) AddHealthCheckHandler(route string, fn common.HealthCheckHandler) error { + if fn == nil { + return fmt.Errorf("health check handler required") + } + + if !strings.HasPrefix(route, "/") { + route = fmt.Sprintf("/%s", route) + } + + s.mux.Handle(route, optionsHandler(http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + if err := fn(r.Context()); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusNoContent) + }))) + + return nil +} diff --git a/vendor/github.com/dapr/go-sdk/service/http/invoke.go b/vendor/github.com/dapr/go-sdk/service/http/invoke.go new file mode 100644 index 00000000000..d70fc3968a4 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/http/invoke.go @@ -0,0 +1,85 @@ +/* +Copyright 2021 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 ( + "fmt" + "io/ioutil" + "net/http" + "strings" + + "github.com/dapr/go-sdk/service/common" +) + +// AddServiceInvocationHandler appends provided service invocation handler with its route to the service. +func (s *Server) AddServiceInvocationHandler(route string, fn common.ServiceInvocationHandler) error { + if route == "" || route == "/" { + return fmt.Errorf("service route required") + } + + if fn == nil { + return fmt.Errorf("invocation handler required") + } + + if !strings.HasPrefix(route, "/") { + route = fmt.Sprintf("/%s", route) + } + + s.mux.Handle(route, optionsHandler(http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + if s.authToken != "" { + token := r.Header.Get(common.APITokenKey) + if token == "" || token != s.authToken { + http.Error(w, "authentication failed.", http.StatusNonAuthoritativeInfo) + return + } + } + // capture http args + e := &common.InvocationEvent{ + Verb: r.Method, + QueryString: r.URL.RawQuery, + ContentType: r.Header.Get("Content-type"), + } + + // check for post with no data + if r.ContentLength > 0 { + content, err := ioutil.ReadAll(r.Body) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + e.Data = content + } + + // execute handler + o, err := fn(r.Context(), e) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + // write to response if handler returned data + if o != nil && o.Data != nil { + if o.ContentType != "" { + w.Header().Set("Content-type", o.ContentType) + } + if _, err := w.Write(o.Data); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } + }))) + + return nil +} diff --git a/vendor/github.com/dapr/go-sdk/service/http/service.go b/vendor/github.com/dapr/go-sdk/service/http/service.go new file mode 100644 index 00000000000..7c553ded407 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/http/service.go @@ -0,0 +1,103 @@ +/* +Copyright 2021 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 ( + "context" + "net/http" + "os" + "time" + + "github.com/gorilla/mux" + + "github.com/dapr/go-sdk/actor" + "github.com/dapr/go-sdk/actor/config" + "github.com/dapr/go-sdk/actor/runtime" + "github.com/dapr/go-sdk/service/common" + "github.com/dapr/go-sdk/service/internal" +) + +// NewService creates new Service. +func NewService(address string) common.Service { + return newServer(address, nil) +} + +// NewServiceWithMux creates new Service with existing http mux. +func NewServiceWithMux(address string, mux *mux.Router) common.Service { + return newServer(address, mux) +} + +func newServer(address string, router *mux.Router) *Server { + if router == nil { + router = mux.NewRouter() + } + return &Server{ + address: address, + httpServer: &http.Server{ + Addr: address, + Handler: router, + }, + mux: router, + topicRegistrar: make(internal.TopicRegistrar), + authToken: os.Getenv(common.AppAPITokenEnvVar), + } +} + +// Server is the HTTP server wrapping mux many Dapr helpers. +type Server struct { + address string + mux *mux.Router + httpServer *http.Server + topicRegistrar internal.TopicRegistrar + authToken string +} + +func (s *Server) RegisterActorImplFactory(f actor.Factory, opts ...config.Option) { + runtime.GetActorRuntimeInstance().RegisterActorFactory(f, opts...) +} + +// Start starts the HTTP handler. Blocks while serving. +func (s *Server) Start() error { + s.registerBaseHandler() + return s.httpServer.ListenAndServe() +} + +// Stop stops previously started HTTP service with a five second timeout. +func (s *Server) Stop() error { + ctxShutDown, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + return s.httpServer.Shutdown(ctxShutDown) +} + +func (s *Server) GracefulStop() error { + return s.Stop() +} + +func setOptions(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "POST,OPTIONS") + w.Header().Set("Access-Control-Allow-Headers", "authorization, origin, content-type, accept") + w.Header().Set("Allow", "POST,OPTIONS") +} + +func optionsHandler(h http.Handler) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodOptions { + setOptions(w, r) + } else { + h.ServeHTTP(w, r) + } + } +} diff --git a/vendor/github.com/dapr/go-sdk/service/http/topic.go b/vendor/github.com/dapr/go-sdk/service/http/topic.go new file mode 100644 index 00000000000..27c4bb2909a --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/http/topic.go @@ -0,0 +1,295 @@ +/* +Copyright 2021 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 ( + "encoding/base64" + "encoding/json" + "errors" + "io/ioutil" + "net/http" + + "github.com/gorilla/mux" + + actorErr "github.com/dapr/go-sdk/actor/error" + "github.com/dapr/go-sdk/actor/runtime" + "github.com/dapr/go-sdk/service/common" + "github.com/dapr/go-sdk/service/internal" +) + +const ( + // PubSubHandlerSuccessStatusCode is the successful ack code for pubsub event appcallback response. + PubSubHandlerSuccessStatusCode int = http.StatusOK + + // PubSubHandlerRetryStatusCode is the error response code (nack) pubsub event appcallback response. + PubSubHandlerRetryStatusCode int = http.StatusInternalServerError + + // PubSubHandlerDropStatusCode is the pubsub event appcallback response code indicating that Dapr should drop that message. + PubSubHandlerDropStatusCode int = http.StatusSeeOther +) + +// topicEventJSON is identical to `common.TopicEvent` +// except for it treats `data` as a json.RawMessage so it can +// be used as bytes or interface{}. +type topicEventJSON struct { + // ID identifies the event. + ID string `json:"id"` + // The version of the CloudEvents specification. + SpecVersion string `json:"specversion"` + // The type of event related to the originating occurrence. + Type string `json:"type"` + // Source identifies the context in which an event happened. + Source string `json:"source"` + // The content type of data value. + DataContentType string `json:"datacontenttype"` + // The content of the event. + // Note, this is why the gRPC and HTTP implementations need separate structs for cloud events. + Data json.RawMessage `json:"data"` + // The base64 encoding content of the event. + // Note, this is processing rawPayload and binary content types. + DataBase64 string `json:"data_base64,omitempty"` + // Cloud event subject + Subject string `json:"subject"` + // The pubsub topic which publisher sent to. + Topic string `json:"topic"` + // PubsubName is name of the pub/sub this message came from + PubsubName string `json:"pubsubname"` +} + +func (s *Server) registerBaseHandler() { + // register subscribe handler + f := func(w http.ResponseWriter, r *http.Request) { + subs := make([]*internal.TopicSubscription, 0, len(s.topicRegistrar)) + for _, s := range s.topicRegistrar { + subs = append(subs, s.Subscription) + } + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(subs); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } + s.mux.HandleFunc("/dapr/subscribe", f) + + // register health check handler + fHealth := func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + } + s.mux.HandleFunc("/healthz", fHealth).Methods(http.MethodGet) + + // register actor config handler + fRegister := func(w http.ResponseWriter, r *http.Request) { + data, err := runtime.GetActorRuntimeInstance().GetJSONSerializedConfig() + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusOK) + if _, err = w.Write(data); err != nil { + return + } + } + s.mux.HandleFunc("/dapr/config", fRegister).Methods(http.MethodGet) + + // register actor method invoke handler + fInvoke := func(w http.ResponseWriter, r *http.Request) { + varsMap := mux.Vars(r) + actorType := varsMap["actorType"] + actorID := varsMap["actorId"] + methodName := varsMap["methodName"] + reqData, _ := ioutil.ReadAll(r.Body) + rspData, err := runtime.GetActorRuntimeInstance().InvokeActorMethod(actorType, actorID, methodName, reqData) + if err == actorErr.ErrActorTypeNotFound { + w.WriteHeader(http.StatusNotFound) + return + } + if err != actorErr.Success { + w.WriteHeader(http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusOK) + _, _ = w.Write(rspData) + } + s.mux.HandleFunc("/actors/{actorType}/{actorId}/method/{methodName}", fInvoke).Methods(http.MethodPut) + + // register deactivate actor handler + fDelete := func(w http.ResponseWriter, r *http.Request) { + varsMap := mux.Vars(r) + actorType := varsMap["actorType"] + actorID := varsMap["actorId"] + err := runtime.GetActorRuntimeInstance().Deactivate(actorType, actorID) + if err == actorErr.ErrActorTypeNotFound || err == actorErr.ErrActorIDNotFound { + w.WriteHeader(http.StatusNotFound) + } + if err != actorErr.Success { + w.WriteHeader(http.StatusInternalServerError) + } + w.WriteHeader(http.StatusOK) + } + s.mux.HandleFunc("/actors/{actorType}/{actorId}", fDelete).Methods(http.MethodDelete) + + // register actor reminder invoke handler + fReminder := func(w http.ResponseWriter, r *http.Request) { + varsMap := mux.Vars(r) + actorType := varsMap["actorType"] + actorID := varsMap["actorId"] + reminderName := varsMap["reminderName"] + reqData, _ := ioutil.ReadAll(r.Body) + err := runtime.GetActorRuntimeInstance().InvokeReminder(actorType, actorID, reminderName, reqData) + if err == actorErr.ErrActorTypeNotFound { + w.WriteHeader(http.StatusNotFound) + } + if err != actorErr.Success { + w.WriteHeader(http.StatusInternalServerError) + } + w.WriteHeader(http.StatusOK) + } + s.mux.HandleFunc("/actors/{actorType}/{actorId}/method/remind/{reminderName}", fReminder).Methods(http.MethodPut) + + // register actor timer invoke handler + fTimer := func(w http.ResponseWriter, r *http.Request) { + varsMap := mux.Vars(r) + actorType := varsMap["actorType"] + actorID := varsMap["actorId"] + timerName := varsMap["timerName"] + reqData, _ := ioutil.ReadAll(r.Body) + err := runtime.GetActorRuntimeInstance().InvokeTimer(actorType, actorID, timerName, reqData) + if err == actorErr.ErrActorTypeNotFound { + w.WriteHeader(http.StatusNotFound) + } + if err != actorErr.Success { + w.WriteHeader(http.StatusInternalServerError) + } + w.WriteHeader(http.StatusOK) + } + s.mux.HandleFunc("/actors/{actorType}/{actorId}/method/timer/{timerName}", fTimer).Methods(http.MethodPut) +} + +// AddTopicEventHandler appends provided event handler with it's name to the service. +func (s *Server) AddTopicEventHandler(sub *common.Subscription, fn common.TopicEventHandler) error { + if sub == nil { + return errors.New("subscription required") + } + // Route is only required for HTTP but should be specified for the + // app protocol to be interchangeable. + if sub.Route == "" { + return errors.New("handler route name") + } + if err := s.topicRegistrar.AddSubscription(sub, fn); err != nil { + return err + } + + s.mux.Handle(sub.Route, optionsHandler(http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + // check for post with no data + if r.ContentLength == 0 { + http.Error(w, "nil content", PubSubHandlerDropStatusCode) + return + } + + // deserialize the event + var in topicEventJSON + if err := json.NewDecoder(r.Body).Decode(&in); err != nil { + http.Error(w, err.Error(), PubSubHandlerDropStatusCode) + return + } + + if in.PubsubName == "" { + in.Topic = sub.PubsubName + } + if in.Topic == "" { + in.Topic = sub.Topic + } + + var data interface{} + var rawData []byte + if len(in.Data) > 0 { + rawData = []byte(in.Data) + data = rawData + var v interface{} + // We can assume that rawData is valid JSON + // without checking in.DataContentType == "application/json". + if err := json.Unmarshal(rawData, &v); err == nil { + data = v + // Handling of JSON base64 encoded or escaped in a string. + if str, ok := v.(string); ok { + // This is the path that will most likely succeed. + var vString interface{} + if err := json.Unmarshal([]byte(str), &vString); err == nil { + data = vString + } else if decoded, err := base64.StdEncoding.DecodeString(str); err == nil { + // Decoded Base64 encoded JSON does not seem to be in the spec + // but it is in existing unit tests so this handles that case. + var vBase64 interface{} + if err := json.Unmarshal(decoded, &vBase64); err == nil { + data = vBase64 + } + } + } + } + } else if in.DataBase64 != "" { + var err error + rawData, err = base64.StdEncoding.DecodeString(in.DataBase64) + if err == nil { + data = rawData + if in.DataContentType == "application/json" { + var v interface{} + if err := json.Unmarshal(rawData, &v); err == nil { + data = v + } + } + } + } + + te := common.TopicEvent{ + ID: in.ID, + SpecVersion: in.SpecVersion, + Type: in.Type, + Source: in.Source, + DataContentType: in.DataContentType, + Data: data, + RawData: rawData, + DataBase64: in.DataBase64, + Subject: in.Subject, + PubsubName: in.PubsubName, + Topic: in.Topic, + } + + w.Header().Add("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + + // execute user handler + retry, err := fn(r.Context(), &te) + if err == nil { + writeStatus(w, common.SubscriptionResponseStatusSuccess) + return + } + + if retry { + writeStatus(w, common.SubscriptionResponseStatusRetry) + return + } + + writeStatus(w, common.SubscriptionResponseStatusDrop) + }))) + + return nil +} + +func writeStatus(w http.ResponseWriter, s string) { + status := &common.SubscriptionResponse{Status: s} + if err := json.NewEncoder(w).Encode(status); err != nil { + http.Error(w, err.Error(), PubSubHandlerRetryStatusCode) + } +} diff --git a/vendor/github.com/dapr/go-sdk/service/internal/topicregistrar.go b/vendor/github.com/dapr/go-sdk/service/internal/topicregistrar.go new file mode 100644 index 00000000000..ec4efb9e080 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/internal/topicregistrar.go @@ -0,0 +1,64 @@ +package internal + +import ( + "errors" + "fmt" + + "github.com/dapr/go-sdk/service/common" +) + +// TopicRegistrar is a map of - to `TopicRegistration` +// and acts as a lookup as the application is building up subscriptions with +// potentially multiple routes per topic. +type TopicRegistrar map[string]*TopicRegistration + +// TopicRegistration encapsulates the subscription and handlers. +type TopicRegistration struct { + Subscription *TopicSubscription + DefaultHandler common.TopicEventHandler + RouteHandlers map[string]common.TopicEventHandler +} + +func (m TopicRegistrar) AddSubscription(sub *common.Subscription, fn common.TopicEventHandler) error { + if sub.Topic == "" { + return errors.New("topic name required") + } + if sub.PubsubName == "" { + return errors.New("pub/sub name required") + } + if fn == nil { + return fmt.Errorf("topic handler required") + } + + var key string + if !sub.DisableTopicValidation { + key = sub.PubsubName + "-" + sub.Topic + } else { + key = sub.PubsubName + } + + ts, ok := m[key] + if !ok { + ts = &TopicRegistration{ + Subscription: NewTopicSubscription(sub.PubsubName, sub.Topic), + RouteHandlers: make(map[string]common.TopicEventHandler), + DefaultHandler: nil, + } + ts.Subscription.SetMetadata(sub.Metadata) + m[key] = ts + } + + if sub.Match != "" { + if err := ts.Subscription.AddRoutingRule(sub.Route, sub.Match, sub.Priority); err != nil { + return err + } + } else { + if err := ts.Subscription.SetDefaultRoute(sub.Route); err != nil { + return err + } + ts.DefaultHandler = fn + } + ts.RouteHandlers[sub.Route] = fn + + return nil +} diff --git a/vendor/github.com/dapr/go-sdk/service/internal/topicsubscription.go b/vendor/github.com/dapr/go-sdk/service/internal/topicsubscription.go new file mode 100644 index 00000000000..ca628993767 --- /dev/null +++ b/vendor/github.com/dapr/go-sdk/service/internal/topicsubscription.go @@ -0,0 +1,112 @@ +package internal + +import ( + "errors" + "fmt" + "sort" +) + +// TopicSubscription internally represents single topic subscription. +type TopicSubscription struct { + // PubsubName is name of the pub/sub this message came from. + PubsubName string `json:"pubsubname"` + // Topic is the name of the topic. + Topic string `json:"topic"` + // Route is the route of the handler where HTTP topic events should be published (passed as Path in gRPC). + Route string `json:"route,omitempty"` + // Routes specify multiple routes where topic events should be sent. + Routes *TopicRoutes `json:"routes,omitempty"` + // Metadata is the subscription metadata. + Metadata map[string]string `json:"metadata,omitempty"` +} + +// TopicRoutes encapsulates the default route and multiple routing rules. +type TopicRoutes struct { + Rules []TopicRule `json:"rules,omitempty"` + Default string `json:"default,omitempty"` + + // priority is used to track duplicate priorities where priority > 0. + // when priority is not specified (0), then the order in which they + // were added is used. + priorities map[int]struct{} +} + +// TopicRule represents a single routing rule. +type TopicRule struct { + // Match is the CEL expression to match on the CloudEvent envelope. + Match string `json:"match"` + // Path is the HTTP path to post the event to (passed as Path in gRPC). + Path string `json:"path"` + // priority is the optional priority order (low to high) for this rule. + priority int `json:"-"` +} + +// NewTopicSubscription creates a new `TopicSubscription`. +func NewTopicSubscription(pubsubName, topic string) *TopicSubscription { + return &TopicSubscription{ //nolint:exhaustivestruct + PubsubName: pubsubName, + Topic: topic, + } +} + +// SetMetadata sets the metadata for the subscription if not already set. +// An error is returned if it is already set. +func (s *TopicSubscription) SetMetadata(metadata map[string]string) error { + if s.Metadata != nil { + return fmt.Errorf("subscription for topic %s on pubsub %s already has metadata set", s.Topic, s.PubsubName) + } + s.Metadata = metadata + + return nil +} + +// SetDefaultRoute sets the default route if not already set. +// An error is returned if it is already set. +func (s *TopicSubscription) SetDefaultRoute(path string) error { + if s.Routes == nil { + if s.Route != "" { + return fmt.Errorf("subscription for topic %s on pubsub %s already has route %s", s.Topic, s.PubsubName, s.Route) + } + s.Route = path + } else { + if s.Routes.Default != "" { + return fmt.Errorf("subscription for topic %s on pubsub %s already has route %s", s.Topic, s.PubsubName, s.Routes.Default) + } + s.Routes.Default = path + } + + return nil +} + +// AddRoutingRule adds a routing rule. +// An error is returned if a there id a duplicate priority > 1. +func (s *TopicSubscription) AddRoutingRule(path, match string, priority int) error { + if path == "" { + return errors.New("path is required for routing rules") + } + if s.Routes == nil { + s.Routes = &TopicRoutes{ //nolint:exhaustivestruct + Default: s.Route, + priorities: map[int]struct{}{}, + } + s.Route = "" + } + if priority > 0 { + if _, exists := s.Routes.priorities[priority]; exists { + return fmt.Errorf("subscription for topic %s on pubsub %s already has a routing rule with priority %d", s.Topic, s.PubsubName, priority) + } + } + s.Routes.Rules = append(s.Routes.Rules, TopicRule{ + Match: match, + Path: path, + priority: priority, + }) + sort.SliceStable(s.Routes.Rules, func(i, j int) bool { + return s.Routes.Rules[i].priority < s.Routes.Rules[j].priority + }) + if priority > 0 { + s.Routes.priorities[priority] = struct{}{} + } + + return nil +} diff --git a/vendor/github.com/evanphx/json-patch/.gitignore b/vendor/github.com/evanphx/json-patch/.gitignore new file mode 100644 index 00000000000..b7ed7f956df --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/.gitignore @@ -0,0 +1,6 @@ +# editor and IDE paraphernalia +.idea +.vscode + +# macOS paraphernalia +.DS_Store diff --git a/vendor/github.com/evanphx/json-patch/LICENSE b/vendor/github.com/evanphx/json-patch/LICENSE new file mode 100644 index 00000000000..df76d7d7716 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2014, Evan Phoenix +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the Evan Phoenix nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/evanphx/json-patch/README.md b/vendor/github.com/evanphx/json-patch/README.md new file mode 100644 index 00000000000..28e35169375 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/README.md @@ -0,0 +1,317 @@ +# JSON-Patch +`jsonpatch` is a library which provides functionality for both applying +[RFC6902 JSON patches](http://tools.ietf.org/html/rfc6902) against documents, as +well as for calculating & applying [RFC7396 JSON merge patches](https://tools.ietf.org/html/rfc7396). + +[![GoDoc](https://godoc.org/github.com/evanphx/json-patch?status.svg)](http://godoc.org/github.com/evanphx/json-patch) +[![Build Status](https://travis-ci.org/evanphx/json-patch.svg?branch=master)](https://travis-ci.org/evanphx/json-patch) +[![Report Card](https://goreportcard.com/badge/github.com/evanphx/json-patch)](https://goreportcard.com/report/github.com/evanphx/json-patch) + +# Get It! + +**Latest and greatest**: +```bash +go get -u github.com/evanphx/json-patch/v5 +``` + +**Stable Versions**: +* Version 5: `go get -u gopkg.in/evanphx/json-patch.v5` +* Version 4: `go get -u gopkg.in/evanphx/json-patch.v4` + +(previous versions below `v3` are unavailable) + +# Use It! +* [Create and apply a merge patch](#create-and-apply-a-merge-patch) +* [Create and apply a JSON Patch](#create-and-apply-a-json-patch) +* [Comparing JSON documents](#comparing-json-documents) +* [Combine merge patches](#combine-merge-patches) + + +# Configuration + +* There is a global configuration variable `jsonpatch.SupportNegativeIndices`. + This defaults to `true` and enables the non-standard practice of allowing + negative indices to mean indices starting at the end of an array. This + functionality can be disabled by setting `jsonpatch.SupportNegativeIndices = + false`. + +* There is a global configuration variable `jsonpatch.AccumulatedCopySizeLimit`, + which limits the total size increase in bytes caused by "copy" operations in a + patch. It defaults to 0, which means there is no limit. + +These global variables control the behavior of `jsonpatch.Apply`. + +An alternative to `jsonpatch.Apply` is `jsonpatch.ApplyWithOptions` whose behavior +is controlled by an `options` parameter of type `*jsonpatch.ApplyOptions`. + +Structure `jsonpatch.ApplyOptions` includes the configuration options above +and adds two new options: `AllowMissingPathOnRemove` and `EnsurePathExistsOnAdd`. + +When `AllowMissingPathOnRemove` is set to `true`, `jsonpatch.ApplyWithOptions` will ignore +`remove` operations whose `path` points to a non-existent location in the JSON document. +`AllowMissingPathOnRemove` defaults to `false` which will lead to `jsonpatch.ApplyWithOptions` +returning an error when hitting a missing `path` on `remove`. + +When `EnsurePathExistsOnAdd` is set to `true`, `jsonpatch.ApplyWithOptions` will make sure +that `add` operations produce all the `path` elements that are missing from the target object. + +Use `jsonpatch.NewApplyOptions` to create an instance of `jsonpatch.ApplyOptions` +whose values are populated from the global configuration variables. + +## Create and apply a merge patch +Given both an original JSON document and a modified JSON document, you can create +a [Merge Patch](https://tools.ietf.org/html/rfc7396) document. + +It can describe the changes needed to convert from the original to the +modified JSON document. + +Once you have a merge patch, you can apply it to other JSON documents using the +`jsonpatch.MergePatch(document, patch)` function. + +```go +package main + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" +) + +func main() { + // Let's create a merge patch from these two documents... + original := []byte(`{"name": "John", "age": 24, "height": 3.21}`) + target := []byte(`{"name": "Jane", "age": 24}`) + + patch, err := jsonpatch.CreateMergePatch(original, target) + if err != nil { + panic(err) + } + + // Now lets apply the patch against a different JSON document... + + alternative := []byte(`{"name": "Tina", "age": 28, "height": 3.75}`) + modifiedAlternative, err := jsonpatch.MergePatch(alternative, patch) + + fmt.Printf("patch document: %s\n", patch) + fmt.Printf("updated alternative doc: %s\n", modifiedAlternative) +} +``` + +When ran, you get the following output: + +```bash +$ go run main.go +patch document: {"height":null,"name":"Jane"} +updated alternative doc: {"age":28,"name":"Jane"} +``` + +## Create and apply a JSON Patch +You can create patch objects using `DecodePatch([]byte)`, which can then +be applied against JSON documents. + +The following is an example of creating a patch from two operations, and +applying it against a JSON document. + +```go +package main + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" +) + +func main() { + original := []byte(`{"name": "John", "age": 24, "height": 3.21}`) + patchJSON := []byte(`[ + {"op": "replace", "path": "/name", "value": "Jane"}, + {"op": "remove", "path": "/height"} + ]`) + + patch, err := jsonpatch.DecodePatch(patchJSON) + if err != nil { + panic(err) + } + + modified, err := patch.Apply(original) + if err != nil { + panic(err) + } + + fmt.Printf("Original document: %s\n", original) + fmt.Printf("Modified document: %s\n", modified) +} +``` + +When ran, you get the following output: + +```bash +$ go run main.go +Original document: {"name": "John", "age": 24, "height": 3.21} +Modified document: {"age":24,"name":"Jane"} +``` + +## Comparing JSON documents +Due to potential whitespace and ordering differences, one cannot simply compare +JSON strings or byte-arrays directly. + +As such, you can instead use `jsonpatch.Equal(document1, document2)` to +determine if two JSON documents are _structurally_ equal. This ignores +whitespace differences, and key-value ordering. + +```go +package main + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" +) + +func main() { + original := []byte(`{"name": "John", "age": 24, "height": 3.21}`) + similar := []byte(` + { + "age": 24, + "height": 3.21, + "name": "John" + } + `) + different := []byte(`{"name": "Jane", "age": 20, "height": 3.37}`) + + if jsonpatch.Equal(original, similar) { + fmt.Println(`"original" is structurally equal to "similar"`) + } + + if !jsonpatch.Equal(original, different) { + fmt.Println(`"original" is _not_ structurally equal to "different"`) + } +} +``` + +When ran, you get the following output: +```bash +$ go run main.go +"original" is structurally equal to "similar" +"original" is _not_ structurally equal to "different" +``` + +## Combine merge patches +Given two JSON merge patch documents, it is possible to combine them into a +single merge patch which can describe both set of changes. + +The resulting merge patch can be used such that applying it results in a +document structurally similar as merging each merge patch to the document +in succession. + +```go +package main + +import ( + "fmt" + + jsonpatch "github.com/evanphx/json-patch" +) + +func main() { + original := []byte(`{"name": "John", "age": 24, "height": 3.21}`) + + nameAndHeight := []byte(`{"height":null,"name":"Jane"}`) + ageAndEyes := []byte(`{"age":4.23,"eyes":"blue"}`) + + // Let's combine these merge patch documents... + combinedPatch, err := jsonpatch.MergeMergePatches(nameAndHeight, ageAndEyes) + if err != nil { + panic(err) + } + + // Apply each patch individual against the original document + withoutCombinedPatch, err := jsonpatch.MergePatch(original, nameAndHeight) + if err != nil { + panic(err) + } + + withoutCombinedPatch, err = jsonpatch.MergePatch(withoutCombinedPatch, ageAndEyes) + if err != nil { + panic(err) + } + + // Apply the combined patch against the original document + + withCombinedPatch, err := jsonpatch.MergePatch(original, combinedPatch) + if err != nil { + panic(err) + } + + // Do both result in the same thing? They should! + if jsonpatch.Equal(withCombinedPatch, withoutCombinedPatch) { + fmt.Println("Both JSON documents are structurally the same!") + } + + fmt.Printf("combined merge patch: %s", combinedPatch) +} +``` + +When ran, you get the following output: +```bash +$ go run main.go +Both JSON documents are structurally the same! +combined merge patch: {"age":4.23,"eyes":"blue","height":null,"name":"Jane"} +``` + +# CLI for comparing JSON documents +You can install the commandline program `json-patch`. + +This program can take multiple JSON patch documents as arguments, +and fed a JSON document from `stdin`. It will apply the patch(es) against +the document and output the modified doc. + +**patch.1.json** +```json +[ + {"op": "replace", "path": "/name", "value": "Jane"}, + {"op": "remove", "path": "/height"} +] +``` + +**patch.2.json** +```json +[ + {"op": "add", "path": "/address", "value": "123 Main St"}, + {"op": "replace", "path": "/age", "value": "21"} +] +``` + +**document.json** +```json +{ + "name": "John", + "age": 24, + "height": 3.21 +} +``` + +You can then run: + +```bash +$ go install github.com/evanphx/json-patch/cmd/json-patch +$ cat document.json | json-patch -p patch.1.json -p patch.2.json +{"address":"123 Main St","age":"21","name":"Jane"} +``` + +# Help It! +Contributions are welcomed! Leave [an issue](https://github.com/evanphx/json-patch/issues) +or [create a PR](https://github.com/evanphx/json-patch/compare). + + +Before creating a pull request, we'd ask that you make sure tests are passing +and that you have added new tests when applicable. + +Contributors can run tests using: + +```bash +go test -cover ./... +``` + +Builds for pull requests are tested automatically +using [TravisCI](https://travis-ci.org/evanphx/json-patch). diff --git a/vendor/github.com/evanphx/json-patch/errors.go b/vendor/github.com/evanphx/json-patch/errors.go new file mode 100644 index 00000000000..75304b4437c --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/errors.go @@ -0,0 +1,38 @@ +package jsonpatch + +import "fmt" + +// AccumulatedCopySizeError is an error type returned when the accumulated size +// increase caused by copy operations in a patch operation has exceeded the +// limit. +type AccumulatedCopySizeError struct { + limit int64 + accumulated int64 +} + +// NewAccumulatedCopySizeError returns an AccumulatedCopySizeError. +func NewAccumulatedCopySizeError(l, a int64) *AccumulatedCopySizeError { + return &AccumulatedCopySizeError{limit: l, accumulated: a} +} + +// Error implements the error interface. +func (a *AccumulatedCopySizeError) Error() string { + return fmt.Sprintf("Unable to complete the copy, the accumulated size increase of copy is %d, exceeding the limit %d", a.accumulated, a.limit) +} + +// ArraySizeError is an error type returned when the array size has exceeded +// the limit. +type ArraySizeError struct { + limit int + size int +} + +// NewArraySizeError returns an ArraySizeError. +func NewArraySizeError(l, s int) *ArraySizeError { + return &ArraySizeError{limit: l, size: s} +} + +// Error implements the error interface. +func (a *ArraySizeError) Error() string { + return fmt.Sprintf("Unable to create array of size %d, limit is %d", a.size, a.limit) +} diff --git a/vendor/github.com/evanphx/json-patch/merge.go b/vendor/github.com/evanphx/json-patch/merge.go new file mode 100644 index 00000000000..ad88d40181c --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/merge.go @@ -0,0 +1,389 @@ +package jsonpatch + +import ( + "bytes" + "encoding/json" + "fmt" + "reflect" +) + +func merge(cur, patch *lazyNode, mergeMerge bool) *lazyNode { + curDoc, err := cur.intoDoc() + + if err != nil { + pruneNulls(patch) + return patch + } + + patchDoc, err := patch.intoDoc() + + if err != nil { + return patch + } + + mergeDocs(curDoc, patchDoc, mergeMerge) + + return cur +} + +func mergeDocs(doc, patch *partialDoc, mergeMerge bool) { + for k, v := range *patch { + if v == nil { + if mergeMerge { + (*doc)[k] = nil + } else { + delete(*doc, k) + } + } else { + cur, ok := (*doc)[k] + + if !ok || cur == nil { + if !mergeMerge { + pruneNulls(v) + } + + (*doc)[k] = v + } else { + (*doc)[k] = merge(cur, v, mergeMerge) + } + } + } +} + +func pruneNulls(n *lazyNode) { + sub, err := n.intoDoc() + + if err == nil { + pruneDocNulls(sub) + } else { + ary, err := n.intoAry() + + if err == nil { + pruneAryNulls(ary) + } + } +} + +func pruneDocNulls(doc *partialDoc) *partialDoc { + for k, v := range *doc { + if v == nil { + delete(*doc, k) + } else { + pruneNulls(v) + } + } + + return doc +} + +func pruneAryNulls(ary *partialArray) *partialArray { + newAry := []*lazyNode{} + + for _, v := range *ary { + if v != nil { + pruneNulls(v) + } + newAry = append(newAry, v) + } + + *ary = newAry + + return ary +} + +var ErrBadJSONDoc = fmt.Errorf("Invalid JSON Document") +var ErrBadJSONPatch = fmt.Errorf("Invalid JSON Patch") +var errBadMergeTypes = fmt.Errorf("Mismatched JSON Documents") + +// MergeMergePatches merges two merge patches together, such that +// applying this resulting merged merge patch to a document yields the same +// as merging each merge patch to the document in succession. +func MergeMergePatches(patch1Data, patch2Data []byte) ([]byte, error) { + return doMergePatch(patch1Data, patch2Data, true) +} + +// MergePatch merges the patchData into the docData. +func MergePatch(docData, patchData []byte) ([]byte, error) { + return doMergePatch(docData, patchData, false) +} + +func doMergePatch(docData, patchData []byte, mergeMerge bool) ([]byte, error) { + doc := &partialDoc{} + + docErr := json.Unmarshal(docData, doc) + + patch := &partialDoc{} + + patchErr := json.Unmarshal(patchData, patch) + + if _, ok := docErr.(*json.SyntaxError); ok { + return nil, ErrBadJSONDoc + } + + if _, ok := patchErr.(*json.SyntaxError); ok { + return nil, ErrBadJSONPatch + } + + if docErr == nil && *doc == nil { + return nil, ErrBadJSONDoc + } + + if patchErr == nil && *patch == nil { + return nil, ErrBadJSONPatch + } + + if docErr != nil || patchErr != nil { + // Not an error, just not a doc, so we turn straight into the patch + if patchErr == nil { + if mergeMerge { + doc = patch + } else { + doc = pruneDocNulls(patch) + } + } else { + patchAry := &partialArray{} + patchErr = json.Unmarshal(patchData, patchAry) + + if patchErr != nil { + return nil, ErrBadJSONPatch + } + + pruneAryNulls(patchAry) + + out, patchErr := json.Marshal(patchAry) + + if patchErr != nil { + return nil, ErrBadJSONPatch + } + + return out, nil + } + } else { + mergeDocs(doc, patch, mergeMerge) + } + + return json.Marshal(doc) +} + +// resemblesJSONArray indicates whether the byte-slice "appears" to be +// a JSON array or not. +// False-positives are possible, as this function does not check the internal +// structure of the array. It only checks that the outer syntax is present and +// correct. +func resemblesJSONArray(input []byte) bool { + input = bytes.TrimSpace(input) + + hasPrefix := bytes.HasPrefix(input, []byte("[")) + hasSuffix := bytes.HasSuffix(input, []byte("]")) + + return hasPrefix && hasSuffix +} + +// CreateMergePatch will return a merge patch document capable of converting +// the original document(s) to the modified document(s). +// The parameters can be bytes of either two JSON Documents, or two arrays of +// JSON documents. +// The merge patch returned follows the specification defined at http://tools.ietf.org/html/draft-ietf-appsawg-json-merge-patch-07 +func CreateMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalResemblesArray := resemblesJSONArray(originalJSON) + modifiedResemblesArray := resemblesJSONArray(modifiedJSON) + + // Do both byte-slices seem like JSON arrays? + if originalResemblesArray && modifiedResemblesArray { + return createArrayMergePatch(originalJSON, modifiedJSON) + } + + // Are both byte-slices are not arrays? Then they are likely JSON objects... + if !originalResemblesArray && !modifiedResemblesArray { + return createObjectMergePatch(originalJSON, modifiedJSON) + } + + // None of the above? Then return an error because of mismatched types. + return nil, errBadMergeTypes +} + +// createObjectMergePatch will return a merge-patch document capable of +// converting the original document to the modified document. +func createObjectMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalDoc := map[string]interface{}{} + modifiedDoc := map[string]interface{}{} + + err := json.Unmarshal(originalJSON, &originalDoc) + if err != nil { + return nil, ErrBadJSONDoc + } + + err = json.Unmarshal(modifiedJSON, &modifiedDoc) + if err != nil { + return nil, ErrBadJSONDoc + } + + dest, err := getDiff(originalDoc, modifiedDoc) + if err != nil { + return nil, err + } + + return json.Marshal(dest) +} + +// createArrayMergePatch will return an array of merge-patch documents capable +// of converting the original document to the modified document for each +// pair of JSON documents provided in the arrays. +// Arrays of mismatched sizes will result in an error. +func createArrayMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) { + originalDocs := []json.RawMessage{} + modifiedDocs := []json.RawMessage{} + + err := json.Unmarshal(originalJSON, &originalDocs) + if err != nil { + return nil, ErrBadJSONDoc + } + + err = json.Unmarshal(modifiedJSON, &modifiedDocs) + if err != nil { + return nil, ErrBadJSONDoc + } + + total := len(originalDocs) + if len(modifiedDocs) != total { + return nil, ErrBadJSONDoc + } + + result := []json.RawMessage{} + for i := 0; i < len(originalDocs); i++ { + original := originalDocs[i] + modified := modifiedDocs[i] + + patch, err := createObjectMergePatch(original, modified) + if err != nil { + return nil, err + } + + result = append(result, json.RawMessage(patch)) + } + + return json.Marshal(result) +} + +// Returns true if the array matches (must be json types). +// As is idiomatic for go, an empty array is not the same as a nil array. +func matchesArray(a, b []interface{}) bool { + if len(a) != len(b) { + return false + } + if (a == nil && b != nil) || (a != nil && b == nil) { + return false + } + for i := range a { + if !matchesValue(a[i], b[i]) { + return false + } + } + return true +} + +// Returns true if the values matches (must be json types) +// The types of the values must match, otherwise it will always return false +// If two map[string]interface{} are given, all elements must match. +func matchesValue(av, bv interface{}) bool { + if reflect.TypeOf(av) != reflect.TypeOf(bv) { + return false + } + switch at := av.(type) { + case string: + bt := bv.(string) + if bt == at { + return true + } + case float64: + bt := bv.(float64) + if bt == at { + return true + } + case bool: + bt := bv.(bool) + if bt == at { + return true + } + case nil: + // Both nil, fine. + return true + case map[string]interface{}: + bt := bv.(map[string]interface{}) + if len(bt) != len(at) { + return false + } + for key := range bt { + av, aOK := at[key] + bv, bOK := bt[key] + if aOK != bOK { + return false + } + if !matchesValue(av, bv) { + return false + } + } + return true + case []interface{}: + bt := bv.([]interface{}) + return matchesArray(at, bt) + } + return false +} + +// getDiff returns the (recursive) difference between a and b as a map[string]interface{}. +func getDiff(a, b map[string]interface{}) (map[string]interface{}, error) { + into := map[string]interface{}{} + for key, bv := range b { + av, ok := a[key] + // value was added + if !ok { + into[key] = bv + continue + } + // If types have changed, replace completely + if reflect.TypeOf(av) != reflect.TypeOf(bv) { + into[key] = bv + continue + } + // Types are the same, compare values + switch at := av.(type) { + case map[string]interface{}: + bt := bv.(map[string]interface{}) + dst := make(map[string]interface{}, len(bt)) + dst, err := getDiff(at, bt) + if err != nil { + return nil, err + } + if len(dst) > 0 { + into[key] = dst + } + case string, float64, bool: + if !matchesValue(av, bv) { + into[key] = bv + } + case []interface{}: + bt := bv.([]interface{}) + if !matchesArray(at, bt) { + into[key] = bv + } + case nil: + switch bv.(type) { + case nil: + // Both nil, fine. + default: + into[key] = bv + } + default: + panic(fmt.Sprintf("Unknown type:%T in key %s", av, key)) + } + } + // Now add all deleted values as nil + for key := range a { + _, found := b[key] + if !found { + into[key] = nil + } + } + return into, nil +} diff --git a/vendor/github.com/evanphx/json-patch/patch.go b/vendor/github.com/evanphx/json-patch/patch.go new file mode 100644 index 00000000000..dc2b7e51e60 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/patch.go @@ -0,0 +1,851 @@ +package jsonpatch + +import ( + "bytes" + "encoding/json" + "fmt" + "strconv" + "strings" + + "github.com/pkg/errors" +) + +const ( + eRaw = iota + eDoc + eAry +) + +var ( + // SupportNegativeIndices decides whether to support non-standard practice of + // allowing negative indices to mean indices starting at the end of an array. + // Default to true. + SupportNegativeIndices bool = true + // AccumulatedCopySizeLimit limits the total size increase in bytes caused by + // "copy" operations in a patch. + AccumulatedCopySizeLimit int64 = 0 +) + +var ( + ErrTestFailed = errors.New("test failed") + ErrMissing = errors.New("missing value") + ErrUnknownType = errors.New("unknown object type") + ErrInvalid = errors.New("invalid state detected") + ErrInvalidIndex = errors.New("invalid index referenced") +) + +type lazyNode struct { + raw *json.RawMessage + doc partialDoc + ary partialArray + which int +} + +// Operation is a single JSON-Patch step, such as a single 'add' operation. +type Operation map[string]*json.RawMessage + +// Patch is an ordered collection of Operations. +type Patch []Operation + +type partialDoc map[string]*lazyNode +type partialArray []*lazyNode + +type container interface { + get(key string) (*lazyNode, error) + set(key string, val *lazyNode) error + add(key string, val *lazyNode) error + remove(key string) error +} + +func newLazyNode(raw *json.RawMessage) *lazyNode { + return &lazyNode{raw: raw, doc: nil, ary: nil, which: eRaw} +} + +func (n *lazyNode) MarshalJSON() ([]byte, error) { + switch n.which { + case eRaw: + return json.Marshal(n.raw) + case eDoc: + return json.Marshal(n.doc) + case eAry: + return json.Marshal(n.ary) + default: + return nil, ErrUnknownType + } +} + +func (n *lazyNode) UnmarshalJSON(data []byte) error { + dest := make(json.RawMessage, len(data)) + copy(dest, data) + n.raw = &dest + n.which = eRaw + return nil +} + +func deepCopy(src *lazyNode) (*lazyNode, int, error) { + if src == nil { + return nil, 0, nil + } + a, err := src.MarshalJSON() + if err != nil { + return nil, 0, err + } + sz := len(a) + ra := make(json.RawMessage, sz) + copy(ra, a) + return newLazyNode(&ra), sz, nil +} + +func (n *lazyNode) intoDoc() (*partialDoc, error) { + if n.which == eDoc { + return &n.doc, nil + } + + if n.raw == nil { + return nil, ErrInvalid + } + + err := json.Unmarshal(*n.raw, &n.doc) + + if err != nil { + return nil, err + } + + n.which = eDoc + return &n.doc, nil +} + +func (n *lazyNode) intoAry() (*partialArray, error) { + if n.which == eAry { + return &n.ary, nil + } + + if n.raw == nil { + return nil, ErrInvalid + } + + err := json.Unmarshal(*n.raw, &n.ary) + + if err != nil { + return nil, err + } + + n.which = eAry + return &n.ary, nil +} + +func (n *lazyNode) compact() []byte { + buf := &bytes.Buffer{} + + if n.raw == nil { + return nil + } + + err := json.Compact(buf, *n.raw) + + if err != nil { + return *n.raw + } + + return buf.Bytes() +} + +func (n *lazyNode) tryDoc() bool { + if n.raw == nil { + return false + } + + err := json.Unmarshal(*n.raw, &n.doc) + + if err != nil { + return false + } + + n.which = eDoc + return true +} + +func (n *lazyNode) tryAry() bool { + if n.raw == nil { + return false + } + + err := json.Unmarshal(*n.raw, &n.ary) + + if err != nil { + return false + } + + n.which = eAry + return true +} + +func (n *lazyNode) equal(o *lazyNode) bool { + if n.which == eRaw { + if !n.tryDoc() && !n.tryAry() { + if o.which != eRaw { + return false + } + + return bytes.Equal(n.compact(), o.compact()) + } + } + + if n.which == eDoc { + if o.which == eRaw { + if !o.tryDoc() { + return false + } + } + + if o.which != eDoc { + return false + } + + if len(n.doc) != len(o.doc) { + return false + } + + for k, v := range n.doc { + ov, ok := o.doc[k] + + if !ok { + return false + } + + if (v == nil) != (ov == nil) { + return false + } + + if v == nil && ov == nil { + continue + } + + if !v.equal(ov) { + return false + } + } + + return true + } + + if o.which != eAry && !o.tryAry() { + return false + } + + if len(n.ary) != len(o.ary) { + return false + } + + for idx, val := range n.ary { + if !val.equal(o.ary[idx]) { + return false + } + } + + return true +} + +// Kind reads the "op" field of the Operation. +func (o Operation) Kind() string { + if obj, ok := o["op"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown" + } + + return op + } + + return "unknown" +} + +// Path reads the "path" field of the Operation. +func (o Operation) Path() (string, error) { + if obj, ok := o["path"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown", err + } + + return op, nil + } + + return "unknown", errors.Wrapf(ErrMissing, "operation missing path field") +} + +// From reads the "from" field of the Operation. +func (o Operation) From() (string, error) { + if obj, ok := o["from"]; ok && obj != nil { + var op string + + err := json.Unmarshal(*obj, &op) + + if err != nil { + return "unknown", err + } + + return op, nil + } + + return "unknown", errors.Wrapf(ErrMissing, "operation, missing from field") +} + +func (o Operation) value() *lazyNode { + if obj, ok := o["value"]; ok { + return newLazyNode(obj) + } + + return nil +} + +// ValueInterface decodes the operation value into an interface. +func (o Operation) ValueInterface() (interface{}, error) { + if obj, ok := o["value"]; ok && obj != nil { + var v interface{} + + err := json.Unmarshal(*obj, &v) + + if err != nil { + return nil, err + } + + return v, nil + } + + return nil, errors.Wrapf(ErrMissing, "operation, missing value field") +} + +func isArray(buf []byte) bool { +Loop: + for _, c := range buf { + switch c { + case ' ': + case '\n': + case '\t': + continue + case '[': + return true + default: + break Loop + } + } + + return false +} + +func findObject(pd *container, path string) (container, string) { + doc := *pd + + split := strings.Split(path, "/") + + if len(split) < 2 { + return nil, "" + } + + parts := split[1 : len(split)-1] + + key := split[len(split)-1] + + var err error + + for _, part := range parts { + + next, ok := doc.get(decodePatchKey(part)) + + if next == nil || ok != nil { + return nil, "" + } + + if isArray(*next.raw) { + doc, err = next.intoAry() + + if err != nil { + return nil, "" + } + } else { + doc, err = next.intoDoc() + + if err != nil { + return nil, "" + } + } + } + + return doc, decodePatchKey(key) +} + +func (d *partialDoc) set(key string, val *lazyNode) error { + (*d)[key] = val + return nil +} + +func (d *partialDoc) add(key string, val *lazyNode) error { + (*d)[key] = val + return nil +} + +func (d *partialDoc) get(key string) (*lazyNode, error) { + return (*d)[key], nil +} + +func (d *partialDoc) remove(key string) error { + _, ok := (*d)[key] + if !ok { + return errors.Wrapf(ErrMissing, "Unable to remove nonexistent key: %s", key) + } + + delete(*d, key) + return nil +} + +// set should only be used to implement the "replace" operation, so "key" must +// be an already existing index in "d". +func (d *partialArray) set(key string, val *lazyNode) error { + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + + if idx < 0 { + if !SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(*d) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(*d) + } + + (*d)[idx] = val + return nil +} + +func (d *partialArray) add(key string, val *lazyNode) error { + if key == "-" { + *d = append(*d, val) + return nil + } + + idx, err := strconv.Atoi(key) + if err != nil { + return errors.Wrapf(err, "value was not a proper array index: '%s'", key) + } + + sz := len(*d) + 1 + + ary := make([]*lazyNode, sz) + + cur := *d + + if idx >= len(ary) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + if idx < 0 { + if !SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(ary) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(ary) + } + + copy(ary[0:idx], cur[0:idx]) + ary[idx] = val + copy(ary[idx+1:], cur[idx:]) + + *d = ary + return nil +} + +func (d *partialArray) get(key string) (*lazyNode, error) { + idx, err := strconv.Atoi(key) + + if err != nil { + return nil, err + } + + if idx < 0 { + if !SupportNegativeIndices { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(*d) { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(*d) + } + + if idx >= len(*d) { + return nil, errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + return (*d)[idx], nil +} + +func (d *partialArray) remove(key string) error { + idx, err := strconv.Atoi(key) + if err != nil { + return err + } + + cur := *d + + if idx >= len(cur) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + + if idx < 0 { + if !SupportNegativeIndices { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + if idx < -len(cur) { + return errors.Wrapf(ErrInvalidIndex, "Unable to access invalid index: %d", idx) + } + idx += len(cur) + } + + ary := make([]*lazyNode, len(cur)-1) + + copy(ary[0:idx], cur[0:idx]) + copy(ary[idx:], cur[idx+1:]) + + *d = ary + return nil + +} + +func (p Patch) add(doc *container, op Operation) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "add operation failed to decode path") + } + + con, key := findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "add operation does not apply: doc is missing path: \"%s\"", path) + } + + err = con.add(key, op.value()) + if err != nil { + return errors.Wrapf(err, "error in add for path: '%s'", path) + } + + return nil +} + +func (p Patch) remove(doc *container, op Operation) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "remove operation failed to decode path") + } + + con, key := findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "remove operation does not apply: doc is missing path: \"%s\"", path) + } + + err = con.remove(key) + if err != nil { + return errors.Wrapf(err, "error in remove for path: '%s'", path) + } + + return nil +} + +func (p Patch) replace(doc *container, op Operation) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "replace operation failed to decode path") + } + + if path == "" { + val := op.value() + + if val.which == eRaw { + if !val.tryDoc() { + if !val.tryAry() { + return errors.Wrapf(err, "replace operation value must be object or array") + } + } + } + + switch val.which { + case eAry: + *doc = &val.ary + case eDoc: + *doc = &val.doc + case eRaw: + return errors.Wrapf(err, "replace operation hit impossible case") + } + + return nil + } + + con, key := findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "replace operation does not apply: doc is missing path: %s", path) + } + + _, ok := con.get(key) + if ok != nil { + return errors.Wrapf(ErrMissing, "replace operation does not apply: doc is missing key: %s", path) + } + + err = con.set(key, op.value()) + if err != nil { + return errors.Wrapf(err, "error in remove for path: '%s'", path) + } + + return nil +} + +func (p Patch) move(doc *container, op Operation) error { + from, err := op.From() + if err != nil { + return errors.Wrapf(err, "move operation failed to decode from") + } + + con, key := findObject(doc, from) + + if con == nil { + return errors.Wrapf(ErrMissing, "move operation does not apply: doc is missing from path: %s", from) + } + + val, err := con.get(key) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", key) + } + + err = con.remove(key) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", key) + } + + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "move operation failed to decode path") + } + + con, key = findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "move operation does not apply: doc is missing destination path: %s", path) + } + + err = con.add(key, val) + if err != nil { + return errors.Wrapf(err, "error in move for path: '%s'", path) + } + + return nil +} + +func (p Patch) test(doc *container, op Operation) error { + path, err := op.Path() + if err != nil { + return errors.Wrapf(err, "test operation failed to decode path") + } + + if path == "" { + var self lazyNode + + switch sv := (*doc).(type) { + case *partialDoc: + self.doc = *sv + self.which = eDoc + case *partialArray: + self.ary = *sv + self.which = eAry + } + + if self.equal(op.value()) { + return nil + } + + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } + + con, key := findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "test operation does not apply: is missing path: %s", path) + } + + val, err := con.get(key) + if err != nil { + return errors.Wrapf(err, "error in test for path: '%s'", path) + } + + if val == nil { + if op.value().raw == nil { + return nil + } + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } else if op.value() == nil { + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } + + if val.equal(op.value()) { + return nil + } + + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) +} + +func (p Patch) copy(doc *container, op Operation, accumulatedCopySize *int64) error { + from, err := op.From() + if err != nil { + return errors.Wrapf(err, "copy operation failed to decode from") + } + + con, key := findObject(doc, from) + + if con == nil { + return errors.Wrapf(ErrMissing, "copy operation does not apply: doc is missing from path: %s", from) + } + + val, err := con.get(key) + if err != nil { + return errors.Wrapf(err, "error in copy for from: '%s'", from) + } + + path, err := op.Path() + if err != nil { + return errors.Wrapf(ErrMissing, "copy operation failed to decode path") + } + + con, key = findObject(doc, path) + + if con == nil { + return errors.Wrapf(ErrMissing, "copy operation does not apply: doc is missing destination path: %s", path) + } + + valCopy, sz, err := deepCopy(val) + if err != nil { + return errors.Wrapf(err, "error while performing deep copy") + } + + (*accumulatedCopySize) += int64(sz) + if AccumulatedCopySizeLimit > 0 && *accumulatedCopySize > AccumulatedCopySizeLimit { + return NewAccumulatedCopySizeError(AccumulatedCopySizeLimit, *accumulatedCopySize) + } + + err = con.add(key, valCopy) + if err != nil { + return errors.Wrapf(err, "error while adding value during copy") + } + + return nil +} + +// Equal indicates if 2 JSON documents have the same structural equality. +func Equal(a, b []byte) bool { + ra := make(json.RawMessage, len(a)) + copy(ra, a) + la := newLazyNode(&ra) + + rb := make(json.RawMessage, len(b)) + copy(rb, b) + lb := newLazyNode(&rb) + + return la.equal(lb) +} + +// DecodePatch decodes the passed JSON document as an RFC 6902 patch. +func DecodePatch(buf []byte) (Patch, error) { + var p Patch + + err := json.Unmarshal(buf, &p) + + if err != nil { + return nil, err + } + + return p, nil +} + +// Apply mutates a JSON document according to the patch, and returns the new +// document. +func (p Patch) Apply(doc []byte) ([]byte, error) { + return p.ApplyIndent(doc, "") +} + +// ApplyIndent mutates a JSON document according to the patch, and returns the new +// document indented. +func (p Patch) ApplyIndent(doc []byte, indent string) ([]byte, error) { + if len(doc) == 0 { + return doc, nil + } + + var pd container + if doc[0] == '[' { + pd = &partialArray{} + } else { + pd = &partialDoc{} + } + + err := json.Unmarshal(doc, pd) + + if err != nil { + return nil, err + } + + err = nil + + var accumulatedCopySize int64 + + for _, op := range p { + switch op.Kind() { + case "add": + err = p.add(&pd, op) + case "remove": + err = p.remove(&pd, op) + case "replace": + err = p.replace(&pd, op) + case "move": + err = p.move(&pd, op) + case "test": + err = p.test(&pd, op) + case "copy": + err = p.copy(&pd, op, &accumulatedCopySize) + default: + err = fmt.Errorf("Unexpected kind: %s", op.Kind()) + } + + if err != nil { + return nil, err + } + } + + if indent != "" { + return json.MarshalIndent(pd, "", indent) + } + + return json.Marshal(pd) +} + +// From http://tools.ietf.org/html/rfc6901#section-4 : +// +// Evaluation of each reference token begins by decoding any escaped +// character sequence. This is performed by first transforming any +// occurrence of the sequence '~1' to '/', and then transforming any +// occurrence of the sequence '~0' to '~'. + +var ( + rfc6901Decoder = strings.NewReplacer("~1", "/", "~0", "~") +) + +func decodePatchKey(k string) string { + return rfc6901Decoder.Replace(k) +} diff --git a/vendor/github.com/googleapis/enterprise-certificate-proxy/client/client.go b/vendor/github.com/googleapis/enterprise-certificate-proxy/client/client.go index 0ba9da7d6bf..aecaff59ee8 100644 --- a/vendor/github.com/googleapis/enterprise-certificate-proxy/client/client.go +++ b/vendor/github.com/googleapis/enterprise-certificate-proxy/client/client.go @@ -15,6 +15,8 @@ import ( "encoding/gob" "fmt" "io" + "io/ioutil" + "log" "net/rpc" "os" "os/exec" @@ -42,6 +44,17 @@ func (c *Connection) Close() error { return werr } +// If ECP Logging is enabled return true +// Otherwise return false +func enableECPLogging() bool { + if os.Getenv("ENABLE_ENTERPRISE_CERTIFICATE_LOGS") != "" { + return true + } + + log.SetOutput(ioutil.Discard) + return false +} + func init() { gob.Register(crypto.SHA256) gob.Register(&rsa.PSSOptions{}) @@ -72,9 +85,9 @@ func (k *Key) Close() error { if err := k.cmd.Process.Kill(); err != nil { return fmt.Errorf("failed to kill signer process: %w", err) } - if err := k.cmd.Wait(); err.Error() != "signal: killed" { - return fmt.Errorf("signer process was not killed: %w", err) - } + // Wait for cmd to exit and release resources. Since the process is forcefully killed, this + // will return a non-nil error (varies by OS), which we will ignore. + k.cmd.Wait() // The Pipes connecting the RPC client should have been closed when the signer subprocess was killed. // Calling `k.client.Close()` before `k.cmd.Process.Kill()` or `k.cmd.Wait()` _will_ cause a segfault. if err := k.client.Close(); err.Error() != "close |0: file already closed" { @@ -105,6 +118,7 @@ func (k *Key) Sign(_ io.Reader, digest []byte, opts crypto.SignerOpts) (signed [ // // The config file also specifies which certificate the signer should use. func Cred(configFilePath string) (*Key, error) { + enableECPLogging() if configFilePath == "" { configFilePath = util.GetDefaultConfigFilePath() } diff --git a/vendor/google.golang.org/api/googleapi/googleapi.go b/vendor/google.golang.org/api/googleapi/googleapi.go index 65b125abd2c..b328a7976ab 100644 --- a/vendor/google.golang.org/api/googleapi/googleapi.go +++ b/vendor/google.golang.org/api/googleapi/googleapi.go @@ -186,8 +186,9 @@ func CheckMediaResponse(res *http.Response) error { } slurp, _ := ioutil.ReadAll(io.LimitReader(res.Body, 1<<20)) return &Error{ - Code: res.StatusCode, - Body: string(slurp), + Code: res.StatusCode, + Body: string(slurp), + Header: res.Header, } } diff --git a/vendor/google.golang.org/api/googleapi/transport/apikey.go b/vendor/google.golang.org/api/googleapi/transport/apikey.go new file mode 100644 index 00000000000..f5d826c2a19 --- /dev/null +++ b/vendor/google.golang.org/api/googleapi/transport/apikey.go @@ -0,0 +1,44 @@ +// Copyright 2012 Google LLC. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package transport contains HTTP transports used to make +// authenticated API requests. +// +// This package is DEPRECATED. Users should instead use, +// +// service, err := NewService(..., option.WithAPIKey(...)) +package transport + +import ( + "errors" + "net/http" +) + +// APIKey is an HTTP Transport which wraps an underlying transport and +// appends an API Key "key" parameter to the URL of outgoing requests. +// +// Deprecated: please use NewService(..., option.WithAPIKey(...)) instead. +type APIKey struct { + // Key is the API Key to set on requests. + Key string + + // Transport is the underlying HTTP transport. + // If nil, http.DefaultTransport is used. + Transport http.RoundTripper +} + +func (t *APIKey) RoundTrip(req *http.Request) (*http.Response, error) { + rt := t.Transport + if rt == nil { + rt = http.DefaultTransport + if rt == nil { + return nil, errors.New("googleapi/transport: no Transport specified or available") + } + } + newReq := *req + args := newReq.URL.Query() + args.Set("key", t.Key) + newReq.URL.RawQuery = args.Encode() + return rt.RoundTrip(&newReq) +} diff --git a/vendor/google.golang.org/api/internal/version.go b/vendor/google.golang.org/api/internal/version.go index df7f58f1c69..2c1b8c1abe6 100644 --- a/vendor/google.golang.org/api/internal/version.go +++ b/vendor/google.golang.org/api/internal/version.go @@ -5,4 +5,4 @@ package internal // Version is the current tagged release of the library. -const Version = "0.103.0" +const Version = "0.108.0" diff --git a/vendor/google.golang.org/api/option/internaloption/internaloption.go b/vendor/google.golang.org/api/option/internaloption/internaloption.go index 343a5a965eb..cc7ebfe277b 100644 --- a/vendor/google.golang.org/api/option/internaloption/internaloption.go +++ b/vendor/google.golang.org/api/option/internaloption/internaloption.go @@ -134,3 +134,10 @@ type withCreds google.Credentials func (w *withCreds) Apply(o *internal.DialSettings) { o.InternalCredentials = (*google.Credentials)(w) } + +// EmbeddableAdapter is a no-op option.ClientOption that allow libraries to +// create their own client options by embedding this type into their own +// client-specific option wrapper. See example for usage. +type EmbeddableAdapter struct{} + +func (*EmbeddableAdapter) Apply(_ *internal.DialSettings) {} diff --git a/vendor/google.golang.org/api/option/option.go b/vendor/google.golang.org/api/option/option.go index f56a8c1d906..b2085a1949a 100644 --- a/vendor/google.golang.org/api/option/option.go +++ b/vendor/google.golang.org/api/option/option.go @@ -96,7 +96,9 @@ func (w withScopes) Apply(o *internal.DialSettings) { copy(o.Scopes, w) } -// WithUserAgent returns a ClientOption that sets the User-Agent. +// WithUserAgent returns a ClientOption that sets the User-Agent. This option +// is incompatible with the [WithHTTPClient] option. If you wish to provide a +// custom client you will need to add this header via RoundTripper middleware. func WithUserAgent(ua string) ClientOption { return withUA(ua) } diff --git a/vendor/google.golang.org/api/transport/grpc/dial.go b/vendor/google.golang.org/api/transport/grpc/dial.go index c86f56507f5..efcc8e6c641 100644 --- a/vendor/google.golang.org/api/transport/grpc/dial.go +++ b/vendor/google.golang.org/api/transport/grpc/dial.go @@ -25,6 +25,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials" grpcgoogle "google.golang.org/grpc/credentials/google" + grpcinsecure "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/oauth" // Install grpclb, which is required for direct path. @@ -126,10 +127,26 @@ func dial(ctx context.Context, insecure bool, o *internal.DialSettings) (*grpc.C if err != nil { return nil, err } - var grpcOpts []grpc.DialOption + + var transportCreds credentials.TransportCredentials if insecure { - grpcOpts = []grpc.DialOption{grpc.WithInsecure()} - } else if !o.NoAuth { + transportCreds = grpcinsecure.NewCredentials() + } else { + transportCreds = credentials.NewTLS(&tls.Config{ + GetClientCertificate: clientCertSource, + }) + } + + // Initialize gRPC dial options with transport-level security options. + grpcOpts := []grpc.DialOption{ + grpc.WithTransportCredentials(transportCreds), + } + + // Authentication can only be sent when communicating over a secure connection. + // + // TODO: Should we be more lenient in the future and allow sending credentials + // when dialing an insecure connection? + if !o.NoAuth && !insecure { if o.APIKey != "" { log.Print("API keys are not supported for gRPC APIs. Remove the WithAPIKey option from your client-creating call.") } @@ -142,8 +159,17 @@ func dial(ctx context.Context, insecure bool, o *internal.DialSettings) (*grpc.C o.QuotaProject = internal.QuotaProjectFromCreds(creds) } + grpcOpts = append(grpcOpts, + grpc.WithPerRPCCredentials(grpcTokenSource{ + TokenSource: oauth.TokenSource{creds.TokenSource}, + quotaProject: o.QuotaProject, + requestReason: o.RequestReason, + }), + ) + // Attempt Direct Path: if isDirectPathEnabled(endpoint, o) && isTokenSourceDirectPathCompatible(creds.TokenSource, o) && metadata.OnGCE() { + // Overwrite all of the previously specific DialOptions, DirectPath uses its own set of credentials and certificates. grpcOpts = []grpc.DialOption{ grpc.WithCredentialsBundle(grpcgoogle.NewDefaultCredentialsWithOptions(grpcgoogle.DefaultCredentialsOptions{oauth.TokenSource{creds.TokenSource}}))} if timeoutDialerOption != nil { @@ -153,9 +179,9 @@ func dial(ctx context.Context, insecure bool, o *internal.DialSettings) (*grpc.C if strings.EqualFold(os.Getenv(enableDirectPathXds), "true") { // google-c2p resolver target must not have a port number if addr, _, err := net.SplitHostPort(endpoint); err == nil { - endpoint = "google-c2p-experimental:///" + addr + endpoint = "google-c2p:///" + addr } else { - endpoint = "google-c2p-experimental:///" + endpoint + endpoint = "google-c2p:///" + endpoint } } else { if !strings.HasPrefix(endpoint, "dns:///") { @@ -169,18 +195,6 @@ func dial(ctx context.Context, insecure bool, o *internal.DialSettings) (*grpc.C grpc.WithDefaultServiceConfig(`{"loadBalancingConfig":[{"grpclb":{"childPolicy":[{"pick_first":{}}]}}]}`)) } // TODO(cbro): add support for system parameters (quota project, request reason) via chained interceptor. - } else { - tlsConfig := &tls.Config{ - GetClientCertificate: clientCertSource, - } - grpcOpts = []grpc.DialOption{ - grpc.WithPerRPCCredentials(grpcTokenSource{ - TokenSource: oauth.TokenSource{creds.TokenSource}, - quotaProject: o.QuotaProject, - requestReason: o.RequestReason, - }), - grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)), - } } } diff --git a/vendor/google.golang.org/api/transport/http/configure_http2_go116.go b/vendor/google.golang.org/api/transport/http/configure_http2_go116.go new file mode 100644 index 00000000000..305a6929c88 --- /dev/null +++ b/vendor/google.golang.org/api/transport/http/configure_http2_go116.go @@ -0,0 +1,26 @@ +// Copyright 2021 Google LLC. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.16 +// +build go1.16 + +package http + +import ( + "net/http" + "time" + + "golang.org/x/net/http2" +) + +// configureHTTP2 configures the ReadIdleTimeout HTTP/2 option for the +// transport. This allows broken idle connections to be pruned more quickly, +// preventing the client from attempting to re-use connections that will no +// longer work. +func configureHTTP2(trans *http.Transport) { + http2Trans, err := http2.ConfigureTransports(trans) + if err == nil { + http2Trans.ReadIdleTimeout = time.Second * 31 + } +} diff --git a/vendor/google.golang.org/api/transport/http/configure_http2_not_go116.go b/vendor/google.golang.org/api/transport/http/configure_http2_not_go116.go new file mode 100644 index 00000000000..d2742d283a6 --- /dev/null +++ b/vendor/google.golang.org/api/transport/http/configure_http2_not_go116.go @@ -0,0 +1,17 @@ +// Copyright 2021 Google LLC. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.16 +// +build !go1.16 + +package http + +import ( + "net/http" +) + +// configureHTTP2 configures the ReadIdleTimeout HTTP/2 option for the +// transport. The interface to do this is only available in Go 1.16 and up, so +// this performs a no-op. +func configureHTTP2(trans *http.Transport) {} diff --git a/vendor/google.golang.org/api/transport/http/dial.go b/vendor/google.golang.org/api/transport/http/dial.go new file mode 100644 index 00000000000..cab709f0c05 --- /dev/null +++ b/vendor/google.golang.org/api/transport/http/dial.go @@ -0,0 +1,223 @@ +// Copyright 2015 Google LLC. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package http supports network connections to HTTP servers. +// This package is not intended for use by end developers. Use the +// google.golang.org/api/option package to configure API clients. +package http + +import ( + "context" + "crypto/tls" + "errors" + "net" + "net/http" + "time" + + "go.opencensus.io/plugin/ochttp" + "golang.org/x/oauth2" + "google.golang.org/api/googleapi/transport" + "google.golang.org/api/internal" + "google.golang.org/api/option" + "google.golang.org/api/transport/cert" + "google.golang.org/api/transport/http/internal/propagation" + "google.golang.org/api/transport/internal/dca" +) + +// NewClient returns an HTTP client for use communicating with a Google cloud +// service, configured with the given ClientOptions. It also returns the endpoint +// for the service as specified in the options. +func NewClient(ctx context.Context, opts ...option.ClientOption) (*http.Client, string, error) { + settings, err := newSettings(opts) + if err != nil { + return nil, "", err + } + clientCertSource, endpoint, err := dca.GetClientCertificateSourceAndEndpoint(settings) + if err != nil { + return nil, "", err + } + // TODO(cbro): consider injecting the User-Agent even if an explicit HTTP client is provided? + if settings.HTTPClient != nil { + return settings.HTTPClient, endpoint, nil + } + trans, err := newTransport(ctx, defaultBaseTransport(ctx, clientCertSource), settings) + if err != nil { + return nil, "", err + } + return &http.Client{Transport: trans}, endpoint, nil +} + +// NewTransport creates an http.RoundTripper for use communicating with a Google +// cloud service, configured with the given ClientOptions. Its RoundTrip method delegates to base. +func NewTransport(ctx context.Context, base http.RoundTripper, opts ...option.ClientOption) (http.RoundTripper, error) { + settings, err := newSettings(opts) + if err != nil { + return nil, err + } + if settings.HTTPClient != nil { + return nil, errors.New("transport/http: WithHTTPClient passed to NewTransport") + } + return newTransport(ctx, base, settings) +} + +func newTransport(ctx context.Context, base http.RoundTripper, settings *internal.DialSettings) (http.RoundTripper, error) { + paramTransport := ¶meterTransport{ + base: base, + userAgent: settings.UserAgent, + quotaProject: settings.QuotaProject, + requestReason: settings.RequestReason, + } + var trans http.RoundTripper = paramTransport + trans = addOCTransport(trans, settings) + switch { + case settings.NoAuth: + // Do nothing. + case settings.APIKey != "": + trans = &transport.APIKey{ + Transport: trans, + Key: settings.APIKey, + } + default: + creds, err := internal.Creds(ctx, settings) + if err != nil { + return nil, err + } + if paramTransport.quotaProject == "" { + paramTransport.quotaProject = internal.QuotaProjectFromCreds(creds) + } + + ts := creds.TokenSource + if settings.ImpersonationConfig == nil && settings.TokenSource != nil { + ts = settings.TokenSource + } + trans = &oauth2.Transport{ + Base: trans, + Source: ts, + } + } + return trans, nil +} + +func newSettings(opts []option.ClientOption) (*internal.DialSettings, error) { + var o internal.DialSettings + for _, opt := range opts { + opt.Apply(&o) + } + if err := o.Validate(); err != nil { + return nil, err + } + if o.GRPCConn != nil { + return nil, errors.New("unsupported gRPC connection specified") + } + return &o, nil +} + +type parameterTransport struct { + userAgent string + quotaProject string + requestReason string + + base http.RoundTripper +} + +func (t *parameterTransport) RoundTrip(req *http.Request) (*http.Response, error) { + rt := t.base + if rt == nil { + return nil, errors.New("transport: no Transport specified") + } + newReq := *req + newReq.Header = make(http.Header) + for k, vv := range req.Header { + newReq.Header[k] = vv + } + if t.userAgent != "" { + // TODO(cbro): append to existing User-Agent header? + newReq.Header.Set("User-Agent", t.userAgent) + } + + // Attach system parameters into the header + if t.quotaProject != "" { + newReq.Header.Set("X-Goog-User-Project", t.quotaProject) + } + if t.requestReason != "" { + newReq.Header.Set("X-Goog-Request-Reason", t.requestReason) + } + + return rt.RoundTrip(&newReq) +} + +// Set at init time by dial_appengine.go. If nil, we're not on App Engine. +var appengineUrlfetchHook func(context.Context) http.RoundTripper + +// defaultBaseTransport returns the base HTTP transport. +// On App Engine, this is urlfetch.Transport. +// Otherwise, use a default transport, taking most defaults from +// http.DefaultTransport. +// If TLSCertificate is available, set TLSClientConfig as well. +func defaultBaseTransport(ctx context.Context, clientCertSource cert.Source) http.RoundTripper { + if appengineUrlfetchHook != nil { + return appengineUrlfetchHook(ctx) + } + + // Copy http.DefaultTransport except for MaxIdleConnsPerHost setting, + // which is increased due to reported performance issues under load in the GCS + // client. Transport.Clone is only available in Go 1.13 and up. + trans := clonedTransport(http.DefaultTransport) + if trans == nil { + trans = fallbackBaseTransport() + } + trans.MaxIdleConnsPerHost = 100 + + if clientCertSource != nil { + trans.TLSClientConfig = &tls.Config{ + GetClientCertificate: clientCertSource, + } + } + + // If possible, configure http2 transport in order to use ReadIdleTimeout + // setting. This can only be done in Go 1.16 and up. + configureHTTP2(trans) + + return trans +} + +// fallbackBaseTransport is used in httpHeaderMaxSize { + return trace.SpanContext{}, false + } + + // Parse the trace id field. + slash := strings.Index(h, `/`) + if slash == -1 { + return trace.SpanContext{}, false + } + tid, h := h[:slash], h[slash+1:] + + buf, err := hex.DecodeString(tid) + if err != nil { + return trace.SpanContext{}, false + } + copy(sc.TraceID[:], buf) + + // Parse the span id field. + spanstr := h + semicolon := strings.Index(h, `;`) + if semicolon != -1 { + spanstr, h = h[:semicolon], h[semicolon+1:] + } + sid, err := strconv.ParseUint(spanstr, 10, 64) + if err != nil { + return trace.SpanContext{}, false + } + binary.BigEndian.PutUint64(sc.SpanID[:], sid) + + // Parse the options field, options field is optional. + if !strings.HasPrefix(h, "o=") { + return sc, true + } + o, err := strconv.ParseUint(h[2:], 10, 64) + if err != nil { + return trace.SpanContext{}, false + } + sc.TraceOptions = trace.TraceOptions(o) + return sc, true +} + +// SpanContextToRequest modifies the given request to include a Stackdriver Trace header. +func (f *HTTPFormat) SpanContextToRequest(sc trace.SpanContext, req *http.Request) { + sid := binary.BigEndian.Uint64(sc.SpanID[:]) + header := fmt.Sprintf("%s/%d;o=%d", hex.EncodeToString(sc.TraceID[:]), sid, int64(sc.TraceOptions)) + req.Header.Set(httpHeader, header) +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/rand/rand.go b/vendor/k8s.io/apimachinery/pkg/util/rand/rand.go new file mode 100644 index 00000000000..82a473bb146 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/rand/rand.go @@ -0,0 +1,127 @@ +/* +Copyright 2015 The Kubernetes 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 rand provides utilities related to randomization. +package rand + +import ( + "math/rand" + "sync" + "time" +) + +var rng = struct { + sync.Mutex + rand *rand.Rand +}{ + rand: rand.New(rand.NewSource(time.Now().UnixNano())), +} + +// Int returns a non-negative pseudo-random int. +func Int() int { + rng.Lock() + defer rng.Unlock() + return rng.rand.Int() +} + +// Intn generates an integer in range [0,max). +// By design this should panic if input is invalid, <= 0. +func Intn(max int) int { + rng.Lock() + defer rng.Unlock() + return rng.rand.Intn(max) +} + +// IntnRange generates an integer in range [min,max). +// By design this should panic if input is invalid, <= 0. +func IntnRange(min, max int) int { + rng.Lock() + defer rng.Unlock() + return rng.rand.Intn(max-min) + min +} + +// IntnRange generates an int64 integer in range [min,max). +// By design this should panic if input is invalid, <= 0. +func Int63nRange(min, max int64) int64 { + rng.Lock() + defer rng.Unlock() + return rng.rand.Int63n(max-min) + min +} + +// Seed seeds the rng with the provided seed. +func Seed(seed int64) { + rng.Lock() + defer rng.Unlock() + + rng.rand = rand.New(rand.NewSource(seed)) +} + +// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n) +// from the default Source. +func Perm(n int) []int { + rng.Lock() + defer rng.Unlock() + return rng.rand.Perm(n) +} + +const ( + // We omit vowels from the set of available characters to reduce the chances + // of "bad words" being formed. + alphanums = "bcdfghjklmnpqrstvwxz2456789" + // No. of bits required to index into alphanums string. + alphanumsIdxBits = 5 + // Mask used to extract last alphanumsIdxBits of an int. + alphanumsIdxMask = 1<>= alphanumsIdxBits + remaining-- + } + return string(b) +} + +// SafeEncodeString encodes s using the same characters as rand.String. This reduces the chances of bad words and +// ensures that strings generated from hash functions appear consistent throughout the API. +func SafeEncodeString(s string) string { + r := make([]byte, len(s)) + for i, b := range []rune(s) { + r[i] = alphanums[(int(b) % len(alphanums))] + } + return string(r) +} diff --git a/vendor/k8s.io/client-go/testing/actions.go b/vendor/k8s.io/client-go/testing/actions.go new file mode 100644 index 00000000000..c8ae0aaf5d4 --- /dev/null +++ b/vendor/k8s.io/client-go/testing/actions.go @@ -0,0 +1,698 @@ +/* +Copyright 2015 The Kubernetes 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 testing + +import ( + "fmt" + "path" + "strings" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" +) + +func NewRootGetAction(resource schema.GroupVersionResource, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Name = name + + return action +} + +func NewGetAction(resource schema.GroupVersionResource, namespace, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Namespace = namespace + action.Name = name + + return action +} + +func NewGetSubresourceAction(resource schema.GroupVersionResource, namespace, subresource, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Subresource = subresource + action.Namespace = namespace + action.Name = name + + return action +} + +func NewRootGetSubresourceAction(resource schema.GroupVersionResource, subresource, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Subresource = subresource + action.Name = name + + return action +} + +func NewRootListAction(resource schema.GroupVersionResource, kind schema.GroupVersionKind, opts interface{}) ListActionImpl { + action := ListActionImpl{} + action.Verb = "list" + action.Resource = resource + action.Kind = kind + labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) + action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} + + return action +} + +func NewListAction(resource schema.GroupVersionResource, kind schema.GroupVersionKind, namespace string, opts interface{}) ListActionImpl { + action := ListActionImpl{} + action.Verb = "list" + action.Resource = resource + action.Kind = kind + action.Namespace = namespace + labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) + action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} + + return action +} + +func NewRootCreateAction(resource schema.GroupVersionResource, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource + action.Object = object + + return action +} + +func NewCreateAction(resource schema.GroupVersionResource, namespace string, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource + action.Namespace = namespace + action.Object = object + + return action +} + +func NewRootCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource string, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource + action.Subresource = subresource + action.Name = name + action.Object = object + + return action +} + +func NewCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource, namespace string, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource + action.Namespace = namespace + action.Subresource = subresource + action.Name = name + action.Object = object + + return action +} + +func NewRootUpdateAction(resource schema.GroupVersionResource, object runtime.Object) UpdateActionImpl { + action := UpdateActionImpl{} + action.Verb = "update" + action.Resource = resource + action.Object = object + + return action +} + +func NewUpdateAction(resource schema.GroupVersionResource, namespace string, object runtime.Object) UpdateActionImpl { + action := UpdateActionImpl{} + action.Verb = "update" + action.Resource = resource + action.Namespace = namespace + action.Object = object + + return action +} + +func NewRootPatchAction(resource schema.GroupVersionResource, name string, pt types.PatchType, patch []byte) PatchActionImpl { + action := PatchActionImpl{} + action.Verb = "patch" + action.Resource = resource + action.Name = name + action.PatchType = pt + action.Patch = patch + + return action +} + +func NewPatchAction(resource schema.GroupVersionResource, namespace string, name string, pt types.PatchType, patch []byte) PatchActionImpl { + action := PatchActionImpl{} + action.Verb = "patch" + action.Resource = resource + action.Namespace = namespace + action.Name = name + action.PatchType = pt + action.Patch = patch + + return action +} + +func NewRootPatchSubresourceAction(resource schema.GroupVersionResource, name string, pt types.PatchType, patch []byte, subresources ...string) PatchActionImpl { + action := PatchActionImpl{} + action.Verb = "patch" + action.Resource = resource + action.Subresource = path.Join(subresources...) + action.Name = name + action.PatchType = pt + action.Patch = patch + + return action +} + +func NewPatchSubresourceAction(resource schema.GroupVersionResource, namespace, name string, pt types.PatchType, patch []byte, subresources ...string) PatchActionImpl { + action := PatchActionImpl{} + action.Verb = "patch" + action.Resource = resource + action.Subresource = path.Join(subresources...) + action.Namespace = namespace + action.Name = name + action.PatchType = pt + action.Patch = patch + + return action +} + +func NewRootUpdateSubresourceAction(resource schema.GroupVersionResource, subresource string, object runtime.Object) UpdateActionImpl { + action := UpdateActionImpl{} + action.Verb = "update" + action.Resource = resource + action.Subresource = subresource + action.Object = object + + return action +} +func NewUpdateSubresourceAction(resource schema.GroupVersionResource, subresource string, namespace string, object runtime.Object) UpdateActionImpl { + action := UpdateActionImpl{} + action.Verb = "update" + action.Resource = resource + action.Subresource = subresource + action.Namespace = namespace + action.Object = object + + return action +} + +func NewRootDeleteAction(resource schema.GroupVersionResource, name string) DeleteActionImpl { + return NewRootDeleteActionWithOptions(resource, name, metav1.DeleteOptions{}) +} + +func NewRootDeleteActionWithOptions(resource schema.GroupVersionResource, name string, opts metav1.DeleteOptions) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Name = name + action.DeleteOptions = opts + + return action +} + +func NewRootDeleteSubresourceAction(resource schema.GroupVersionResource, subresource string, name string) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Subresource = subresource + action.Name = name + + return action +} + +func NewDeleteAction(resource schema.GroupVersionResource, namespace, name string) DeleteActionImpl { + return NewDeleteActionWithOptions(resource, namespace, name, metav1.DeleteOptions{}) +} + +func NewDeleteActionWithOptions(resource schema.GroupVersionResource, namespace, name string, opts metav1.DeleteOptions) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Namespace = namespace + action.Name = name + action.DeleteOptions = opts + + return action +} + +func NewDeleteSubresourceAction(resource schema.GroupVersionResource, subresource, namespace, name string) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Subresource = subresource + action.Namespace = namespace + action.Name = name + + return action +} + +func NewRootDeleteCollectionAction(resource schema.GroupVersionResource, opts interface{}) DeleteCollectionActionImpl { + action := DeleteCollectionActionImpl{} + action.Verb = "delete-collection" + action.Resource = resource + labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) + action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} + + return action +} + +func NewDeleteCollectionAction(resource schema.GroupVersionResource, namespace string, opts interface{}) DeleteCollectionActionImpl { + action := DeleteCollectionActionImpl{} + action.Verb = "delete-collection" + action.Resource = resource + action.Namespace = namespace + labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) + action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} + + return action +} + +func NewRootWatchAction(resource schema.GroupVersionResource, opts interface{}) WatchActionImpl { + action := WatchActionImpl{} + action.Verb = "watch" + action.Resource = resource + labelSelector, fieldSelector, resourceVersion := ExtractFromListOptions(opts) + action.WatchRestrictions = WatchRestrictions{labelSelector, fieldSelector, resourceVersion} + + return action +} + +func ExtractFromListOptions(opts interface{}) (labelSelector labels.Selector, fieldSelector fields.Selector, resourceVersion string) { + var err error + switch t := opts.(type) { + case metav1.ListOptions: + labelSelector, err = labels.Parse(t.LabelSelector) + if err != nil { + panic(fmt.Errorf("invalid selector %q: %v", t.LabelSelector, err)) + } + fieldSelector, err = fields.ParseSelector(t.FieldSelector) + if err != nil { + panic(fmt.Errorf("invalid selector %q: %v", t.FieldSelector, err)) + } + resourceVersion = t.ResourceVersion + default: + panic(fmt.Errorf("expect a ListOptions %T", opts)) + } + if labelSelector == nil { + labelSelector = labels.Everything() + } + if fieldSelector == nil { + fieldSelector = fields.Everything() + } + return labelSelector, fieldSelector, resourceVersion +} + +func NewWatchAction(resource schema.GroupVersionResource, namespace string, opts interface{}) WatchActionImpl { + action := WatchActionImpl{} + action.Verb = "watch" + action.Resource = resource + action.Namespace = namespace + labelSelector, fieldSelector, resourceVersion := ExtractFromListOptions(opts) + action.WatchRestrictions = WatchRestrictions{labelSelector, fieldSelector, resourceVersion} + + return action +} + +func NewProxyGetAction(resource schema.GroupVersionResource, namespace, scheme, name, port, path string, params map[string]string) ProxyGetActionImpl { + action := ProxyGetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Namespace = namespace + action.Scheme = scheme + action.Name = name + action.Port = port + action.Path = path + action.Params = params + return action +} + +type ListRestrictions struct { + Labels labels.Selector + Fields fields.Selector +} +type WatchRestrictions struct { + Labels labels.Selector + Fields fields.Selector + ResourceVersion string +} + +type Action interface { + GetNamespace() string + GetVerb() string + GetResource() schema.GroupVersionResource + GetSubresource() string + Matches(verb, resource string) bool + + // DeepCopy is used to copy an action to avoid any risk of accidental mutation. Most people never need to call this + // because the invocation logic deep copies before calls to storage and reactors. + DeepCopy() Action +} + +type GenericAction interface { + Action + GetValue() interface{} +} + +type GetAction interface { + Action + GetName() string +} + +type ListAction interface { + Action + GetListRestrictions() ListRestrictions +} + +type CreateAction interface { + Action + GetObject() runtime.Object +} + +type UpdateAction interface { + Action + GetObject() runtime.Object +} + +type DeleteAction interface { + Action + GetName() string + GetDeleteOptions() metav1.DeleteOptions +} + +type DeleteCollectionAction interface { + Action + GetListRestrictions() ListRestrictions +} + +type PatchAction interface { + Action + GetName() string + GetPatchType() types.PatchType + GetPatch() []byte +} + +type WatchAction interface { + Action + GetWatchRestrictions() WatchRestrictions +} + +type ProxyGetAction interface { + Action + GetScheme() string + GetName() string + GetPort() string + GetPath() string + GetParams() map[string]string +} + +type ActionImpl struct { + Namespace string + Verb string + Resource schema.GroupVersionResource + Subresource string +} + +func (a ActionImpl) GetNamespace() string { + return a.Namespace +} +func (a ActionImpl) GetVerb() string { + return a.Verb +} +func (a ActionImpl) GetResource() schema.GroupVersionResource { + return a.Resource +} +func (a ActionImpl) GetSubresource() string { + return a.Subresource +} +func (a ActionImpl) Matches(verb, resource string) bool { + // Stay backwards compatible. + if !strings.Contains(resource, "/") { + return strings.EqualFold(verb, a.Verb) && + strings.EqualFold(resource, a.Resource.Resource) + } + + parts := strings.SplitN(resource, "/", 2) + topresource, subresource := parts[0], parts[1] + + return strings.EqualFold(verb, a.Verb) && + strings.EqualFold(topresource, a.Resource.Resource) && + strings.EqualFold(subresource, a.Subresource) +} +func (a ActionImpl) DeepCopy() Action { + ret := a + return ret +} + +type GenericActionImpl struct { + ActionImpl + Value interface{} +} + +func (a GenericActionImpl) GetValue() interface{} { + return a.Value +} + +func (a GenericActionImpl) DeepCopy() Action { + return GenericActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + // TODO this is wrong, but no worse than before + Value: a.Value, + } +} + +type GetActionImpl struct { + ActionImpl + Name string +} + +func (a GetActionImpl) GetName() string { + return a.Name +} + +func (a GetActionImpl) DeepCopy() Action { + return GetActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + } +} + +type ListActionImpl struct { + ActionImpl + Kind schema.GroupVersionKind + Name string + ListRestrictions ListRestrictions +} + +func (a ListActionImpl) GetKind() schema.GroupVersionKind { + return a.Kind +} + +func (a ListActionImpl) GetListRestrictions() ListRestrictions { + return a.ListRestrictions +} + +func (a ListActionImpl) DeepCopy() Action { + return ListActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Kind: a.Kind, + Name: a.Name, + ListRestrictions: ListRestrictions{ + Labels: a.ListRestrictions.Labels.DeepCopySelector(), + Fields: a.ListRestrictions.Fields.DeepCopySelector(), + }, + } +} + +type CreateActionImpl struct { + ActionImpl + Name string + Object runtime.Object +} + +func (a CreateActionImpl) GetObject() runtime.Object { + return a.Object +} + +func (a CreateActionImpl) DeepCopy() Action { + return CreateActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + Object: a.Object.DeepCopyObject(), + } +} + +type UpdateActionImpl struct { + ActionImpl + Object runtime.Object +} + +func (a UpdateActionImpl) GetObject() runtime.Object { + return a.Object +} + +func (a UpdateActionImpl) DeepCopy() Action { + return UpdateActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Object: a.Object.DeepCopyObject(), + } +} + +type PatchActionImpl struct { + ActionImpl + Name string + PatchType types.PatchType + Patch []byte +} + +func (a PatchActionImpl) GetName() string { + return a.Name +} + +func (a PatchActionImpl) GetPatch() []byte { + return a.Patch +} + +func (a PatchActionImpl) GetPatchType() types.PatchType { + return a.PatchType +} + +func (a PatchActionImpl) DeepCopy() Action { + patch := make([]byte, len(a.Patch)) + copy(patch, a.Patch) + return PatchActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + PatchType: a.PatchType, + Patch: patch, + } +} + +type DeleteActionImpl struct { + ActionImpl + Name string + DeleteOptions metav1.DeleteOptions +} + +func (a DeleteActionImpl) GetName() string { + return a.Name +} + +func (a DeleteActionImpl) GetDeleteOptions() metav1.DeleteOptions { + return a.DeleteOptions +} + +func (a DeleteActionImpl) DeepCopy() Action { + return DeleteActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + DeleteOptions: *a.DeleteOptions.DeepCopy(), + } +} + +type DeleteCollectionActionImpl struct { + ActionImpl + ListRestrictions ListRestrictions +} + +func (a DeleteCollectionActionImpl) GetListRestrictions() ListRestrictions { + return a.ListRestrictions +} + +func (a DeleteCollectionActionImpl) DeepCopy() Action { + return DeleteCollectionActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + ListRestrictions: ListRestrictions{ + Labels: a.ListRestrictions.Labels.DeepCopySelector(), + Fields: a.ListRestrictions.Fields.DeepCopySelector(), + }, + } +} + +type WatchActionImpl struct { + ActionImpl + WatchRestrictions WatchRestrictions +} + +func (a WatchActionImpl) GetWatchRestrictions() WatchRestrictions { + return a.WatchRestrictions +} + +func (a WatchActionImpl) DeepCopy() Action { + return WatchActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + WatchRestrictions: WatchRestrictions{ + Labels: a.WatchRestrictions.Labels.DeepCopySelector(), + Fields: a.WatchRestrictions.Fields.DeepCopySelector(), + ResourceVersion: a.WatchRestrictions.ResourceVersion, + }, + } +} + +type ProxyGetActionImpl struct { + ActionImpl + Scheme string + Name string + Port string + Path string + Params map[string]string +} + +func (a ProxyGetActionImpl) GetScheme() string { + return a.Scheme +} + +func (a ProxyGetActionImpl) GetName() string { + return a.Name +} + +func (a ProxyGetActionImpl) GetPort() string { + return a.Port +} + +func (a ProxyGetActionImpl) GetPath() string { + return a.Path +} + +func (a ProxyGetActionImpl) GetParams() map[string]string { + return a.Params +} + +func (a ProxyGetActionImpl) DeepCopy() Action { + params := map[string]string{} + for k, v := range a.Params { + params[k] = v + } + return ProxyGetActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Scheme: a.Scheme, + Name: a.Name, + Port: a.Port, + Path: a.Path, + Params: params, + } +} diff --git a/vendor/k8s.io/client-go/testing/fake.go b/vendor/k8s.io/client-go/testing/fake.go new file mode 100644 index 00000000000..3ab9c1b075d --- /dev/null +++ b/vendor/k8s.io/client-go/testing/fake.go @@ -0,0 +1,220 @@ +/* +Copyright 2016 The Kubernetes 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 testing + +import ( + "fmt" + "sync" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + restclient "k8s.io/client-go/rest" +) + +// Fake implements client.Interface. Meant to be embedded into a struct to get +// a default implementation. This makes faking out just the method you want to +// test easier. +type Fake struct { + sync.RWMutex + actions []Action // these may be castable to other types, but "Action" is the minimum + + // ReactionChain is the list of reactors that will be attempted for every + // request in the order they are tried. + ReactionChain []Reactor + // WatchReactionChain is the list of watch reactors that will be attempted + // for every request in the order they are tried. + WatchReactionChain []WatchReactor + // ProxyReactionChain is the list of proxy reactors that will be attempted + // for every request in the order they are tried. + ProxyReactionChain []ProxyReactor + + Resources []*metav1.APIResourceList +} + +// Reactor is an interface to allow the composition of reaction functions. +type Reactor interface { + // Handles indicates whether or not this Reactor deals with a given + // action. + Handles(action Action) bool + // React handles the action and returns results. It may choose to + // delegate by indicated handled=false. + React(action Action) (handled bool, ret runtime.Object, err error) +} + +// WatchReactor is an interface to allow the composition of watch functions. +type WatchReactor interface { + // Handles indicates whether or not this Reactor deals with a given + // action. + Handles(action Action) bool + // React handles a watch action and returns results. It may choose to + // delegate by indicating handled=false. + React(action Action) (handled bool, ret watch.Interface, err error) +} + +// ProxyReactor is an interface to allow the composition of proxy get +// functions. +type ProxyReactor interface { + // Handles indicates whether or not this Reactor deals with a given + // action. + Handles(action Action) bool + // React handles a watch action and returns results. It may choose to + // delegate by indicating handled=false. + React(action Action) (handled bool, ret restclient.ResponseWrapper, err error) +} + +// ReactionFunc is a function that returns an object or error for a given +// Action. If "handled" is false, then the test client will ignore the +// results and continue to the next ReactionFunc. A ReactionFunc can describe +// reactions on subresources by testing the result of the action's +// GetSubresource() method. +type ReactionFunc func(action Action) (handled bool, ret runtime.Object, err error) + +// WatchReactionFunc is a function that returns a watch interface. If +// "handled" is false, then the test client will ignore the results and +// continue to the next ReactionFunc. +type WatchReactionFunc func(action Action) (handled bool, ret watch.Interface, err error) + +// ProxyReactionFunc is a function that returns a ResponseWrapper interface +// for a given Action. If "handled" is false, then the test client will +// ignore the results and continue to the next ProxyReactionFunc. +type ProxyReactionFunc func(action Action) (handled bool, ret restclient.ResponseWrapper, err error) + +// AddReactor appends a reactor to the end of the chain. +func (c *Fake) AddReactor(verb, resource string, reaction ReactionFunc) { + c.ReactionChain = append(c.ReactionChain, &SimpleReactor{verb, resource, reaction}) +} + +// PrependReactor adds a reactor to the beginning of the chain. +func (c *Fake) PrependReactor(verb, resource string, reaction ReactionFunc) { + c.ReactionChain = append([]Reactor{&SimpleReactor{verb, resource, reaction}}, c.ReactionChain...) +} + +// AddWatchReactor appends a reactor to the end of the chain. +func (c *Fake) AddWatchReactor(resource string, reaction WatchReactionFunc) { + c.Lock() + defer c.Unlock() + c.WatchReactionChain = append(c.WatchReactionChain, &SimpleWatchReactor{resource, reaction}) +} + +// PrependWatchReactor adds a reactor to the beginning of the chain. +func (c *Fake) PrependWatchReactor(resource string, reaction WatchReactionFunc) { + c.Lock() + defer c.Unlock() + c.WatchReactionChain = append([]WatchReactor{&SimpleWatchReactor{resource, reaction}}, c.WatchReactionChain...) +} + +// AddProxyReactor appends a reactor to the end of the chain. +func (c *Fake) AddProxyReactor(resource string, reaction ProxyReactionFunc) { + c.ProxyReactionChain = append(c.ProxyReactionChain, &SimpleProxyReactor{resource, reaction}) +} + +// PrependProxyReactor adds a reactor to the beginning of the chain. +func (c *Fake) PrependProxyReactor(resource string, reaction ProxyReactionFunc) { + c.ProxyReactionChain = append([]ProxyReactor{&SimpleProxyReactor{resource, reaction}}, c.ProxyReactionChain...) +} + +// Invokes records the provided Action and then invokes the ReactionFunc that +// handles the action if one exists. defaultReturnObj is expected to be of the +// same type a normal call would return. +func (c *Fake) Invokes(action Action, defaultReturnObj runtime.Object) (runtime.Object, error) { + c.Lock() + defer c.Unlock() + + actionCopy := action.DeepCopy() + c.actions = append(c.actions, action.DeepCopy()) + for _, reactor := range c.ReactionChain { + if !reactor.Handles(actionCopy) { + continue + } + + handled, ret, err := reactor.React(actionCopy) + if !handled { + continue + } + + return ret, err + } + + return defaultReturnObj, nil +} + +// InvokesWatch records the provided Action and then invokes the ReactionFunc +// that handles the action if one exists. +func (c *Fake) InvokesWatch(action Action) (watch.Interface, error) { + c.Lock() + defer c.Unlock() + + actionCopy := action.DeepCopy() + c.actions = append(c.actions, action.DeepCopy()) + for _, reactor := range c.WatchReactionChain { + if !reactor.Handles(actionCopy) { + continue + } + + handled, ret, err := reactor.React(actionCopy) + if !handled { + continue + } + + return ret, err + } + + return nil, fmt.Errorf("unhandled watch: %#v", action) +} + +// InvokesProxy records the provided Action and then invokes the ReactionFunc +// that handles the action if one exists. +func (c *Fake) InvokesProxy(action Action) restclient.ResponseWrapper { + c.Lock() + defer c.Unlock() + + actionCopy := action.DeepCopy() + c.actions = append(c.actions, action.DeepCopy()) + for _, reactor := range c.ProxyReactionChain { + if !reactor.Handles(actionCopy) { + continue + } + + handled, ret, err := reactor.React(actionCopy) + if !handled || err != nil { + continue + } + + return ret + } + + return nil +} + +// ClearActions clears the history of actions called on the fake client. +func (c *Fake) ClearActions() { + c.Lock() + defer c.Unlock() + + c.actions = make([]Action, 0) +} + +// Actions returns a chronologically ordered slice fake actions called on the +// fake client. +func (c *Fake) Actions() []Action { + c.RLock() + defer c.RUnlock() + fa := make([]Action, len(c.actions)) + copy(fa, c.actions) + return fa +} diff --git a/vendor/k8s.io/client-go/testing/fixture.go b/vendor/k8s.io/client-go/testing/fixture.go new file mode 100644 index 00000000000..396840670fd --- /dev/null +++ b/vendor/k8s.io/client-go/testing/fixture.go @@ -0,0 +1,581 @@ +/* +Copyright 2015 The Kubernetes 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 testing + +import ( + "fmt" + "reflect" + "sort" + "strings" + "sync" + + jsonpatch "github.com/evanphx/json-patch" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/json" + "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/apimachinery/pkg/watch" + restclient "k8s.io/client-go/rest" +) + +// ObjectTracker keeps track of objects. It is intended to be used to +// fake calls to a server by returning objects based on their kind, +// namespace and name. +type ObjectTracker interface { + // Add adds an object to the tracker. If object being added + // is a list, its items are added separately. + Add(obj runtime.Object) error + + // Get retrieves the object by its kind, namespace and name. + Get(gvr schema.GroupVersionResource, ns, name string) (runtime.Object, error) + + // Create adds an object to the tracker in the specified namespace. + Create(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error + + // Update updates an existing object in the tracker in the specified namespace. + Update(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error + + // List retrieves all objects of a given kind in the given + // namespace. Only non-List kinds are accepted. + List(gvr schema.GroupVersionResource, gvk schema.GroupVersionKind, ns string) (runtime.Object, error) + + // Delete deletes an existing object from the tracker. If object + // didn't exist in the tracker prior to deletion, Delete returns + // no error. + Delete(gvr schema.GroupVersionResource, ns, name string) error + + // Watch watches objects from the tracker. Watch returns a channel + // which will push added / modified / deleted object. + Watch(gvr schema.GroupVersionResource, ns string) (watch.Interface, error) +} + +// ObjectScheme abstracts the implementation of common operations on objects. +type ObjectScheme interface { + runtime.ObjectCreater + runtime.ObjectTyper +} + +// ObjectReaction returns a ReactionFunc that applies core.Action to +// the given tracker. +func ObjectReaction(tracker ObjectTracker) ReactionFunc { + return func(action Action) (bool, runtime.Object, error) { + ns := action.GetNamespace() + gvr := action.GetResource() + // Here and below we need to switch on implementation types, + // not on interfaces, as some interfaces are identical + // (e.g. UpdateAction and CreateAction), so if we use them, + // updates and creates end up matching the same case branch. + switch action := action.(type) { + + case ListActionImpl: + obj, err := tracker.List(gvr, action.GetKind(), ns) + return true, obj, err + + case GetActionImpl: + obj, err := tracker.Get(gvr, ns, action.GetName()) + return true, obj, err + + case CreateActionImpl: + objMeta, err := meta.Accessor(action.GetObject()) + if err != nil { + return true, nil, err + } + if action.GetSubresource() == "" { + err = tracker.Create(gvr, action.GetObject(), ns) + } else { + oldObj, getOldObjErr := tracker.Get(gvr, ns, objMeta.GetName()) + if getOldObjErr != nil { + return true, nil, getOldObjErr + } + // Check whether the existing historical object type is the same as the current operation object type that needs to be updated, and if it is the same, perform the update operation. + if reflect.TypeOf(oldObj) == reflect.TypeOf(action.GetObject()) { + // TODO: Currently we're handling subresource creation as an update + // on the enclosing resource. This works for some subresources but + // might not be generic enough. + err = tracker.Update(gvr, action.GetObject(), ns) + } else { + // If the historical object type is different from the current object type, need to make sure we return the object submitted,don't persist the submitted object in the tracker. + return true, action.GetObject(), nil + } + } + if err != nil { + return true, nil, err + } + obj, err := tracker.Get(gvr, ns, objMeta.GetName()) + return true, obj, err + + case UpdateActionImpl: + objMeta, err := meta.Accessor(action.GetObject()) + if err != nil { + return true, nil, err + } + err = tracker.Update(gvr, action.GetObject(), ns) + if err != nil { + return true, nil, err + } + obj, err := tracker.Get(gvr, ns, objMeta.GetName()) + return true, obj, err + + case DeleteActionImpl: + err := tracker.Delete(gvr, ns, action.GetName()) + if err != nil { + return true, nil, err + } + return true, nil, nil + + case PatchActionImpl: + obj, err := tracker.Get(gvr, ns, action.GetName()) + if err != nil { + return true, nil, err + } + + old, err := json.Marshal(obj) + if err != nil { + return true, nil, err + } + + // reset the object in preparation to unmarshal, since unmarshal does not guarantee that fields + // in obj that are removed by patch are cleared + value := reflect.ValueOf(obj) + value.Elem().Set(reflect.New(value.Type().Elem()).Elem()) + + switch action.GetPatchType() { + case types.JSONPatchType: + patch, err := jsonpatch.DecodePatch(action.GetPatch()) + if err != nil { + return true, nil, err + } + modified, err := patch.Apply(old) + if err != nil { + return true, nil, err + } + + if err = json.Unmarshal(modified, obj); err != nil { + return true, nil, err + } + case types.MergePatchType: + modified, err := jsonpatch.MergePatch(old, action.GetPatch()) + if err != nil { + return true, nil, err + } + + if err := json.Unmarshal(modified, obj); err != nil { + return true, nil, err + } + case types.StrategicMergePatchType, types.ApplyPatchType: + mergedByte, err := strategicpatch.StrategicMergePatch(old, action.GetPatch(), obj) + if err != nil { + return true, nil, err + } + if err = json.Unmarshal(mergedByte, obj); err != nil { + return true, nil, err + } + default: + return true, nil, fmt.Errorf("PatchType is not supported") + } + + if err = tracker.Update(gvr, obj, ns); err != nil { + return true, nil, err + } + + return true, obj, nil + + default: + return false, nil, fmt.Errorf("no reaction implemented for %s", action) + } + } +} + +type tracker struct { + scheme ObjectScheme + decoder runtime.Decoder + lock sync.RWMutex + objects map[schema.GroupVersionResource]map[types.NamespacedName]runtime.Object + // The value type of watchers is a map of which the key is either a namespace or + // all/non namespace aka "" and its value is list of fake watchers. + // Manipulations on resources will broadcast the notification events into the + // watchers' channel. Note that too many unhandled events (currently 100, + // see apimachinery/pkg/watch.DefaultChanSize) will cause a panic. + watchers map[schema.GroupVersionResource]map[string][]*watch.RaceFreeFakeWatcher +} + +var _ ObjectTracker = &tracker{} + +// NewObjectTracker returns an ObjectTracker that can be used to keep track +// of objects for the fake clientset. Mostly useful for unit tests. +func NewObjectTracker(scheme ObjectScheme, decoder runtime.Decoder) ObjectTracker { + return &tracker{ + scheme: scheme, + decoder: decoder, + objects: make(map[schema.GroupVersionResource]map[types.NamespacedName]runtime.Object), + watchers: make(map[schema.GroupVersionResource]map[string][]*watch.RaceFreeFakeWatcher), + } +} + +func (t *tracker) List(gvr schema.GroupVersionResource, gvk schema.GroupVersionKind, ns string) (runtime.Object, error) { + // Heuristic for list kind: original kind + List suffix. Might + // not always be true but this tracker has a pretty limited + // understanding of the actual API model. + listGVK := gvk + listGVK.Kind = listGVK.Kind + "List" + // GVK does have the concept of "internal version". The scheme recognizes + // the runtime.APIVersionInternal, but not the empty string. + if listGVK.Version == "" { + listGVK.Version = runtime.APIVersionInternal + } + + list, err := t.scheme.New(listGVK) + if err != nil { + return nil, err + } + + if !meta.IsListType(list) { + return nil, fmt.Errorf("%q is not a list type", listGVK.Kind) + } + + t.lock.RLock() + defer t.lock.RUnlock() + + objs, ok := t.objects[gvr] + if !ok { + return list, nil + } + + matchingObjs, err := filterByNamespace(objs, ns) + if err != nil { + return nil, err + } + if err := meta.SetList(list, matchingObjs); err != nil { + return nil, err + } + return list.DeepCopyObject(), nil +} + +func (t *tracker) Watch(gvr schema.GroupVersionResource, ns string) (watch.Interface, error) { + t.lock.Lock() + defer t.lock.Unlock() + + fakewatcher := watch.NewRaceFreeFake() + + if _, exists := t.watchers[gvr]; !exists { + t.watchers[gvr] = make(map[string][]*watch.RaceFreeFakeWatcher) + } + t.watchers[gvr][ns] = append(t.watchers[gvr][ns], fakewatcher) + return fakewatcher, nil +} + +func (t *tracker) Get(gvr schema.GroupVersionResource, ns, name string) (runtime.Object, error) { + errNotFound := errors.NewNotFound(gvr.GroupResource(), name) + + t.lock.RLock() + defer t.lock.RUnlock() + + objs, ok := t.objects[gvr] + if !ok { + return nil, errNotFound + } + + matchingObj, ok := objs[types.NamespacedName{Namespace: ns, Name: name}] + if !ok { + return nil, errNotFound + } + + // Only one object should match in the tracker if it works + // correctly, as Add/Update methods enforce kind/namespace/name + // uniqueness. + obj := matchingObj.DeepCopyObject() + if status, ok := obj.(*metav1.Status); ok { + if status.Status != metav1.StatusSuccess { + return nil, &errors.StatusError{ErrStatus: *status} + } + } + + return obj, nil +} + +func (t *tracker) Add(obj runtime.Object) error { + if meta.IsListType(obj) { + return t.addList(obj, false) + } + objMeta, err := meta.Accessor(obj) + if err != nil { + return err + } + gvks, _, err := t.scheme.ObjectKinds(obj) + if err != nil { + return err + } + + if partial, ok := obj.(*metav1.PartialObjectMetadata); ok && len(partial.TypeMeta.APIVersion) > 0 { + gvks = []schema.GroupVersionKind{partial.TypeMeta.GroupVersionKind()} + } + + if len(gvks) == 0 { + return fmt.Errorf("no registered kinds for %v", obj) + } + for _, gvk := range gvks { + // NOTE: UnsafeGuessKindToResource is a heuristic and default match. The + // actual registration in apiserver can specify arbitrary route for a + // gvk. If a test uses such objects, it cannot preset the tracker with + // objects via Add(). Instead, it should trigger the Create() function + // of the tracker, where an arbitrary gvr can be specified. + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + // Resource doesn't have the concept of "__internal" version, just set it to "". + if gvr.Version == runtime.APIVersionInternal { + gvr.Version = "" + } + + err := t.add(gvr, obj, objMeta.GetNamespace(), false) + if err != nil { + return err + } + } + return nil +} + +func (t *tracker) Create(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error { + return t.add(gvr, obj, ns, false) +} + +func (t *tracker) Update(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error { + return t.add(gvr, obj, ns, true) +} + +func (t *tracker) getWatches(gvr schema.GroupVersionResource, ns string) []*watch.RaceFreeFakeWatcher { + watches := []*watch.RaceFreeFakeWatcher{} + if t.watchers[gvr] != nil { + if w := t.watchers[gvr][ns]; w != nil { + watches = append(watches, w...) + } + if ns != metav1.NamespaceAll { + if w := t.watchers[gvr][metav1.NamespaceAll]; w != nil { + watches = append(watches, w...) + } + } + } + return watches +} + +func (t *tracker) add(gvr schema.GroupVersionResource, obj runtime.Object, ns string, replaceExisting bool) error { + t.lock.Lock() + defer t.lock.Unlock() + + gr := gvr.GroupResource() + + // To avoid the object from being accidentally modified by caller + // after it's been added to the tracker, we always store the deep + // copy. + obj = obj.DeepCopyObject() + + newMeta, err := meta.Accessor(obj) + if err != nil { + return err + } + + // Propagate namespace to the new object if hasn't already been set. + if len(newMeta.GetNamespace()) == 0 { + newMeta.SetNamespace(ns) + } + + if ns != newMeta.GetNamespace() { + msg := fmt.Sprintf("request namespace does not match object namespace, request: %q object: %q", ns, newMeta.GetNamespace()) + return errors.NewBadRequest(msg) + } + + _, ok := t.objects[gvr] + if !ok { + t.objects[gvr] = make(map[types.NamespacedName]runtime.Object) + } + + namespacedName := types.NamespacedName{Namespace: newMeta.GetNamespace(), Name: newMeta.GetName()} + if _, ok = t.objects[gvr][namespacedName]; ok { + if replaceExisting { + for _, w := range t.getWatches(gvr, ns) { + // To avoid the object from being accidentally modified by watcher + w.Modify(obj.DeepCopyObject()) + } + t.objects[gvr][namespacedName] = obj + return nil + } + return errors.NewAlreadyExists(gr, newMeta.GetName()) + } + + if replaceExisting { + // Tried to update but no matching object was found. + return errors.NewNotFound(gr, newMeta.GetName()) + } + + t.objects[gvr][namespacedName] = obj + + for _, w := range t.getWatches(gvr, ns) { + // To avoid the object from being accidentally modified by watcher + w.Add(obj.DeepCopyObject()) + } + + return nil +} + +func (t *tracker) addList(obj runtime.Object, replaceExisting bool) error { + list, err := meta.ExtractList(obj) + if err != nil { + return err + } + errs := runtime.DecodeList(list, t.decoder) + if len(errs) > 0 { + return errs[0] + } + for _, obj := range list { + if err := t.Add(obj); err != nil { + return err + } + } + return nil +} + +func (t *tracker) Delete(gvr schema.GroupVersionResource, ns, name string) error { + t.lock.Lock() + defer t.lock.Unlock() + + objs, ok := t.objects[gvr] + if !ok { + return errors.NewNotFound(gvr.GroupResource(), name) + } + + namespacedName := types.NamespacedName{Namespace: ns, Name: name} + obj, ok := objs[namespacedName] + if !ok { + return errors.NewNotFound(gvr.GroupResource(), name) + } + + delete(objs, namespacedName) + for _, w := range t.getWatches(gvr, ns) { + w.Delete(obj.DeepCopyObject()) + } + return nil +} + +// filterByNamespace returns all objects in the collection that +// match provided namespace. Empty namespace matches +// non-namespaced objects. +func filterByNamespace(objs map[types.NamespacedName]runtime.Object, ns string) ([]runtime.Object, error) { + var res []runtime.Object + + for _, obj := range objs { + acc, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + if ns != "" && acc.GetNamespace() != ns { + continue + } + res = append(res, obj) + } + + // Sort res to get deterministic order. + sort.Slice(res, func(i, j int) bool { + acc1, _ := meta.Accessor(res[i]) + acc2, _ := meta.Accessor(res[j]) + if acc1.GetNamespace() != acc2.GetNamespace() { + return acc1.GetNamespace() < acc2.GetNamespace() + } + return acc1.GetName() < acc2.GetName() + }) + return res, nil +} + +func DefaultWatchReactor(watchInterface watch.Interface, err error) WatchReactionFunc { + return func(action Action) (bool, watch.Interface, error) { + return true, watchInterface, err + } +} + +// SimpleReactor is a Reactor. Each reaction function is attached to a given verb,resource tuple. "*" in either field matches everything for that value. +// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions +type SimpleReactor struct { + Verb string + Resource string + + Reaction ReactionFunc +} + +func (r *SimpleReactor) Handles(action Action) bool { + verbCovers := r.Verb == "*" || r.Verb == action.GetVerb() + if !verbCovers { + return false + } + + return resourceCovers(r.Resource, action) +} + +func (r *SimpleReactor) React(action Action) (bool, runtime.Object, error) { + return r.Reaction(action) +} + +// SimpleWatchReactor is a WatchReactor. Each reaction function is attached to a given resource. "*" matches everything for that value. +// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions +type SimpleWatchReactor struct { + Resource string + + Reaction WatchReactionFunc +} + +func (r *SimpleWatchReactor) Handles(action Action) bool { + return resourceCovers(r.Resource, action) +} + +func (r *SimpleWatchReactor) React(action Action) (bool, watch.Interface, error) { + return r.Reaction(action) +} + +// SimpleProxyReactor is a ProxyReactor. Each reaction function is attached to a given resource. "*" matches everything for that value. +// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions. +type SimpleProxyReactor struct { + Resource string + + Reaction ProxyReactionFunc +} + +func (r *SimpleProxyReactor) Handles(action Action) bool { + return resourceCovers(r.Resource, action) +} + +func (r *SimpleProxyReactor) React(action Action) (bool, restclient.ResponseWrapper, error) { + return r.Reaction(action) +} + +func resourceCovers(resource string, action Action) bool { + if resource == "*" { + return true + } + + if resource == action.GetResource().Resource { + return true + } + + if index := strings.Index(resource, "/"); index != -1 && + resource[:index] == action.GetResource().Resource && + resource[index+1:] == action.GetSubresource() { + return true + } + + return false +} diff --git a/vendor/k8s.io/client-go/testing/interface.go b/vendor/k8s.io/client-go/testing/interface.go new file mode 100644 index 00000000000..266c6ba3f54 --- /dev/null +++ b/vendor/k8s.io/client-go/testing/interface.go @@ -0,0 +1,66 @@ +/* +Copyright 2021 The Kubernetes 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 testing + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + restclient "k8s.io/client-go/rest" +) + +type FakeClient interface { + // Tracker gives access to the ObjectTracker internal to the fake client. + Tracker() ObjectTracker + + // AddReactor appends a reactor to the end of the chain. + AddReactor(verb, resource string, reaction ReactionFunc) + + // PrependReactor adds a reactor to the beginning of the chain. + PrependReactor(verb, resource string, reaction ReactionFunc) + + // AddWatchReactor appends a reactor to the end of the chain. + AddWatchReactor(resource string, reaction WatchReactionFunc) + + // PrependWatchReactor adds a reactor to the beginning of the chain. + PrependWatchReactor(resource string, reaction WatchReactionFunc) + + // AddProxyReactor appends a reactor to the end of the chain. + AddProxyReactor(resource string, reaction ProxyReactionFunc) + + // PrependProxyReactor adds a reactor to the beginning of the chain. + PrependProxyReactor(resource string, reaction ProxyReactionFunc) + + // Invokes records the provided Action and then invokes the ReactionFunc that + // handles the action if one exists. defaultReturnObj is expected to be of the + // same type a normal call would return. + Invokes(action Action, defaultReturnObj runtime.Object) (runtime.Object, error) + + // InvokesWatch records the provided Action and then invokes the ReactionFunc + // that handles the action if one exists. + InvokesWatch(action Action) (watch.Interface, error) + + // InvokesProxy records the provided Action and then invokes the ReactionFunc + // that handles the action if one exists. + InvokesProxy(action Action) restclient.ResponseWrapper + + // ClearActions clears the history of actions called on the fake client. + ClearActions() + + // Actions returns a chronologically ordered slice fake actions called on the + // fake client. + Actions() []Action +} diff --git a/vendor/modules.txt b/vendor/modules.txt index fa728bfb017..d05ce005223 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -9,7 +9,7 @@ cloud.google.com/go/compute/metadata cloud.google.com/go/monitoring/apiv3/v2 cloud.google.com/go/monitoring/apiv3/v2/monitoringpb cloud.google.com/go/monitoring/internal -# cloud.google.com/go/trace v1.4.0 +# cloud.google.com/go/trace v1.8.0 ## explicit; go 1.19 cloud.google.com/go/trace/apiv2 cloud.google.com/go/trace/apiv2/tracepb @@ -125,6 +125,24 @@ github.com/containerd/containerd/remotes/docker/auth github.com/containerd/containerd/remotes/docker/schema1 github.com/containerd/containerd/remotes/errors github.com/containerd/containerd/version +# github.com/dapr/go-sdk v1.6.0 +## explicit; go 1.17 +github.com/dapr/go-sdk/actor +github.com/dapr/go-sdk/actor/api +github.com/dapr/go-sdk/actor/codec +github.com/dapr/go-sdk/actor/codec/constant +github.com/dapr/go-sdk/actor/codec/impl +github.com/dapr/go-sdk/actor/config +github.com/dapr/go-sdk/actor/error +github.com/dapr/go-sdk/actor/manager +github.com/dapr/go-sdk/actor/runtime +github.com/dapr/go-sdk/actor/state +github.com/dapr/go-sdk/client +github.com/dapr/go-sdk/dapr/proto/common/v1 +github.com/dapr/go-sdk/dapr/proto/runtime/v1 +github.com/dapr/go-sdk/service/common +github.com/dapr/go-sdk/service/http +github.com/dapr/go-sdk/service/internal # github.com/davecgh/go-spew v1.1.1 ## explicit github.com/davecgh/go-spew/spew @@ -190,6 +208,9 @@ github.com/dominikbraun/graph ## explicit; go 1.13 github.com/emicklei/go-restful/v3 github.com/emicklei/go-restful/v3/log +# github.com/evanphx/json-patch v4.12.0+incompatible +## explicit +github.com/evanphx/json-patch # github.com/evanphx/json-patch/v5 v5.6.0 ## explicit; go 1.12 github.com/evanphx/json-patch/v5 @@ -308,8 +329,8 @@ github.com/google/pprof/profile # github.com/google/uuid v1.3.0 ## explicit github.com/google/uuid -# github.com/googleapis/enterprise-certificate-proxy v0.2.0 -## explicit; go 1.18 +# github.com/googleapis/enterprise-certificate-proxy v0.2.1 +## explicit; go 1.19 github.com/googleapis/enterprise-certificate-proxy/client github.com/googleapis/enterprise-certificate-proxy/client/util # github.com/googleapis/gax-go/v2 v2.7.0 @@ -759,9 +780,10 @@ golang.org/x/tools/internal/typeparams # gomodules.xyz/jsonpatch/v2 v2.2.0 ## explicit; go 1.12 gomodules.xyz/jsonpatch/v2 -# google.golang.org/api v0.103.0 +# google.golang.org/api v0.108.0 ## explicit; go 1.19 google.golang.org/api/googleapi +google.golang.org/api/googleapi/transport google.golang.org/api/internal google.golang.org/api/internal/impersonate google.golang.org/api/internal/third_party/uritemplates @@ -771,6 +793,8 @@ google.golang.org/api/option/internaloption google.golang.org/api/support/bundler google.golang.org/api/transport/cert google.golang.org/api/transport/grpc +google.golang.org/api/transport/http +google.golang.org/api/transport/http/internal/propagation google.golang.org/api/transport/internal/dca # google.golang.org/appengine v1.6.7 ## explicit; go 1.11 @@ -786,7 +810,7 @@ google.golang.org/appengine/internal/socket google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/socket google.golang.org/appengine/urlfetch -# google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f +# google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa ## explicit; go 1.19 google.golang.org/genproto/googleapis/api google.golang.org/genproto/googleapis/api/annotations @@ -1026,6 +1050,7 @@ k8s.io/apimachinery/pkg/util/managedfields k8s.io/apimachinery/pkg/util/mergepatch k8s.io/apimachinery/pkg/util/naming k8s.io/apimachinery/pkg/util/net +k8s.io/apimachinery/pkg/util/rand k8s.io/apimachinery/pkg/util/runtime k8s.io/apimachinery/pkg/util/sets k8s.io/apimachinery/pkg/util/strategicpatch @@ -1175,6 +1200,7 @@ k8s.io/client-go/plugin/pkg/client/auth/gcp k8s.io/client-go/rest k8s.io/client-go/rest/watch k8s.io/client-go/restmapper +k8s.io/client-go/testing k8s.io/client-go/tools/auth k8s.io/client-go/tools/cache k8s.io/client-go/tools/clientcmd @@ -1273,6 +1299,7 @@ sigs.k8s.io/controller-runtime/pkg/certwatcher/metrics sigs.k8s.io/controller-runtime/pkg/client sigs.k8s.io/controller-runtime/pkg/client/apiutil sigs.k8s.io/controller-runtime/pkg/client/config +sigs.k8s.io/controller-runtime/pkg/client/fake sigs.k8s.io/controller-runtime/pkg/cluster sigs.k8s.io/controller-runtime/pkg/config sigs.k8s.io/controller-runtime/pkg/config/v1alpha1 diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go new file mode 100644 index 00000000000..4da642319ab --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go @@ -0,0 +1,933 @@ +/* +Copyright 2018 The Kubernetes 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 fake + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + utilrand "k8s.io/apimachinery/pkg/util/rand" + "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/testing" + "sigs.k8s.io/controller-runtime/pkg/internal/field/selector" + + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/apiutil" + "sigs.k8s.io/controller-runtime/pkg/internal/objectutil" +) + +type versionedTracker struct { + testing.ObjectTracker + scheme *runtime.Scheme +} + +type fakeClient struct { + tracker versionedTracker + scheme *runtime.Scheme + restMapper meta.RESTMapper + + // indexes maps each GroupVersionKind (GVK) to the indexes registered for that GVK. + // The inner map maps from index name to IndexerFunc. + indexes map[schema.GroupVersionKind]map[string]client.IndexerFunc + + schemeWriteLock sync.Mutex +} + +var _ client.WithWatch = &fakeClient{} + +const ( + maxNameLength = 63 + randomLength = 5 + maxGeneratedNameLength = maxNameLength - randomLength +) + +// NewFakeClient creates a new fake client for testing. +// You can choose to initialize it with a slice of runtime.Object. +// +// Deprecated: Please use NewClientBuilder instead. +func NewFakeClient(initObjs ...runtime.Object) client.WithWatch { + return NewClientBuilder().WithRuntimeObjects(initObjs...).Build() +} + +// NewFakeClientWithScheme creates a new fake client with the given scheme +// for testing. +// You can choose to initialize it with a slice of runtime.Object. +// +// Deprecated: Please use NewClientBuilder instead. +func NewFakeClientWithScheme(clientScheme *runtime.Scheme, initObjs ...runtime.Object) client.WithWatch { + return NewClientBuilder().WithScheme(clientScheme).WithRuntimeObjects(initObjs...).Build() +} + +// NewClientBuilder returns a new builder to create a fake client. +func NewClientBuilder() *ClientBuilder { + return &ClientBuilder{} +} + +// ClientBuilder builds a fake client. +type ClientBuilder struct { + scheme *runtime.Scheme + restMapper meta.RESTMapper + initObject []client.Object + initLists []client.ObjectList + initRuntimeObjects []runtime.Object + objectTracker testing.ObjectTracker + + // indexes maps each GroupVersionKind (GVK) to the indexes registered for that GVK. + // The inner map maps from index name to IndexerFunc. + indexes map[schema.GroupVersionKind]map[string]client.IndexerFunc +} + +// WithScheme sets this builder's internal scheme. +// If not set, defaults to client-go's global scheme.Scheme. +func (f *ClientBuilder) WithScheme(scheme *runtime.Scheme) *ClientBuilder { + f.scheme = scheme + return f +} + +// WithRESTMapper sets this builder's restMapper. +// The restMapper is directly set as mapper in the Client. This can be used for example +// with a meta.DefaultRESTMapper to provide a static rest mapping. +// If not set, defaults to an empty meta.DefaultRESTMapper. +func (f *ClientBuilder) WithRESTMapper(restMapper meta.RESTMapper) *ClientBuilder { + f.restMapper = restMapper + return f +} + +// WithObjects can be optionally used to initialize this fake client with client.Object(s). +func (f *ClientBuilder) WithObjects(initObjs ...client.Object) *ClientBuilder { + f.initObject = append(f.initObject, initObjs...) + return f +} + +// WithLists can be optionally used to initialize this fake client with client.ObjectList(s). +func (f *ClientBuilder) WithLists(initLists ...client.ObjectList) *ClientBuilder { + f.initLists = append(f.initLists, initLists...) + return f +} + +// WithRuntimeObjects can be optionally used to initialize this fake client with runtime.Object(s). +func (f *ClientBuilder) WithRuntimeObjects(initRuntimeObjs ...runtime.Object) *ClientBuilder { + f.initRuntimeObjects = append(f.initRuntimeObjects, initRuntimeObjs...) + return f +} + +// WithObjectTracker can be optionally used to initialize this fake client with testing.ObjectTracker. +func (f *ClientBuilder) WithObjectTracker(ot testing.ObjectTracker) *ClientBuilder { + f.objectTracker = ot + return f +} + +// WithIndex can be optionally used to register an index with name `field` and indexer `extractValue` +// for API objects of the same GroupVersionKind (GVK) as `obj` in the fake client. +// It can be invoked multiple times, both with objects of the same GVK or different ones. +// Invoking WithIndex twice with the same `field` and GVK (via `obj`) arguments will panic. +// WithIndex retrieves the GVK of `obj` using the scheme registered via WithScheme if +// WithScheme was previously invoked, the default scheme otherwise. +func (f *ClientBuilder) WithIndex(obj runtime.Object, field string, extractValue client.IndexerFunc) *ClientBuilder { + objScheme := f.scheme + if objScheme == nil { + objScheme = scheme.Scheme + } + + gvk, err := apiutil.GVKForObject(obj, objScheme) + if err != nil { + panic(err) + } + + // If this is the first index being registered, we initialize the map storing all the indexes. + if f.indexes == nil { + f.indexes = make(map[schema.GroupVersionKind]map[string]client.IndexerFunc) + } + + // If this is the first index being registered for the GroupVersionKind of `obj`, we initialize + // the map storing the indexes for that GroupVersionKind. + if f.indexes[gvk] == nil { + f.indexes[gvk] = make(map[string]client.IndexerFunc) + } + + if _, fieldAlreadyIndexed := f.indexes[gvk][field]; fieldAlreadyIndexed { + panic(fmt.Errorf("indexer conflict: field %s for GroupVersionKind %v is already indexed", + field, gvk)) + } + + f.indexes[gvk][field] = extractValue + + return f +} + +// Build builds and returns a new fake client. +func (f *ClientBuilder) Build() client.WithWatch { + if f.scheme == nil { + f.scheme = scheme.Scheme + } + if f.restMapper == nil { + f.restMapper = meta.NewDefaultRESTMapper([]schema.GroupVersion{}) + } + + var tracker versionedTracker + + if f.objectTracker == nil { + tracker = versionedTracker{ObjectTracker: testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder()), scheme: f.scheme} + } else { + tracker = versionedTracker{ObjectTracker: f.objectTracker, scheme: f.scheme} + } + + for _, obj := range f.initObject { + if err := tracker.Add(obj); err != nil { + panic(fmt.Errorf("failed to add object %v to fake client: %w", obj, err)) + } + } + for _, obj := range f.initLists { + if err := tracker.Add(obj); err != nil { + panic(fmt.Errorf("failed to add list %v to fake client: %w", obj, err)) + } + } + for _, obj := range f.initRuntimeObjects { + if err := tracker.Add(obj); err != nil { + panic(fmt.Errorf("failed to add runtime object %v to fake client: %w", obj, err)) + } + } + return &fakeClient{ + tracker: tracker, + scheme: f.scheme, + restMapper: f.restMapper, + indexes: f.indexes, + } +} + +const trackerAddResourceVersion = "999" + +func (t versionedTracker) Add(obj runtime.Object) error { + var objects []runtime.Object + if meta.IsListType(obj) { + var err error + objects, err = meta.ExtractList(obj) + if err != nil { + return err + } + } else { + objects = []runtime.Object{obj} + } + for _, obj := range objects { + accessor, err := meta.Accessor(obj) + if err != nil { + return fmt.Errorf("failed to get accessor for object: %w", err) + } + if accessor.GetResourceVersion() == "" { + // We use a "magic" value of 999 here because this field + // is parsed as uint and and 0 is already used in Update. + // As we can't go lower, go very high instead so this can + // be recognized + accessor.SetResourceVersion(trackerAddResourceVersion) + } + + obj, err = convertFromUnstructuredIfNecessary(t.scheme, obj) + if err != nil { + return err + } + if err := t.ObjectTracker.Add(obj); err != nil { + return err + } + } + + return nil +} + +func (t versionedTracker) Create(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error { + accessor, err := meta.Accessor(obj) + if err != nil { + return fmt.Errorf("failed to get accessor for object: %w", err) + } + if accessor.GetName() == "" { + return apierrors.NewInvalid( + obj.GetObjectKind().GroupVersionKind().GroupKind(), + accessor.GetName(), + field.ErrorList{field.Required(field.NewPath("metadata.name"), "name is required")}) + } + if accessor.GetResourceVersion() != "" { + return apierrors.NewBadRequest("resourceVersion can not be set for Create requests") + } + accessor.SetResourceVersion("1") + obj, err = convertFromUnstructuredIfNecessary(t.scheme, obj) + if err != nil { + return err + } + if err := t.ObjectTracker.Create(gvr, obj, ns); err != nil { + accessor.SetResourceVersion("") + return err + } + + return nil +} + +// convertFromUnstructuredIfNecessary will convert *unstructured.Unstructured for a GVK that is recocnized +// by the schema into the whatever the schema produces with New() for said GVK. +// This is required because the tracker unconditionally saves on manipulations, but its List() implementation +// tries to assign whatever it finds into a ListType it gets from schema.New() - Thus we have to ensure +// we save as the very same type, otherwise subsequent List requests will fail. +func convertFromUnstructuredIfNecessary(s *runtime.Scheme, o runtime.Object) (runtime.Object, error) { + u, isUnstructured := o.(*unstructured.Unstructured) + if !isUnstructured || !s.Recognizes(u.GroupVersionKind()) { + return o, nil + } + + typed, err := s.New(u.GroupVersionKind()) + if err != nil { + return nil, fmt.Errorf("scheme recognizes %s but failed to produce an object for it: %w", u.GroupVersionKind().String(), err) + } + + unstructuredSerialized, err := json.Marshal(u) + if err != nil { + return nil, fmt.Errorf("failed to serialize %T: %w", unstructuredSerialized, err) + } + if err := json.Unmarshal(unstructuredSerialized, typed); err != nil { + return nil, fmt.Errorf("failed to unmarshal the content of %T into %T: %w", u, typed, err) + } + + return typed, nil +} + +func (t versionedTracker) Update(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error { + accessor, err := meta.Accessor(obj) + if err != nil { + return fmt.Errorf("failed to get accessor for object: %w", err) + } + + if accessor.GetName() == "" { + return apierrors.NewInvalid( + obj.GetObjectKind().GroupVersionKind().GroupKind(), + accessor.GetName(), + field.ErrorList{field.Required(field.NewPath("metadata.name"), "name is required")}) + } + + gvk := obj.GetObjectKind().GroupVersionKind() + if gvk.Empty() { + gvk, err = apiutil.GVKForObject(obj, t.scheme) + if err != nil { + return err + } + } + + oldObject, err := t.ObjectTracker.Get(gvr, ns, accessor.GetName()) + if err != nil { + // If the resource is not found and the resource allows create on update, issue a + // create instead. + if apierrors.IsNotFound(err) && allowsCreateOnUpdate(gvk) { + return t.Create(gvr, obj, ns) + } + return err + } + + oldAccessor, err := meta.Accessor(oldObject) + if err != nil { + return err + } + + // If the new object does not have the resource version set and it allows unconditional update, + // default it to the resource version of the existing resource + if accessor.GetResourceVersion() == "" && allowsUnconditionalUpdate(gvk) { + accessor.SetResourceVersion(oldAccessor.GetResourceVersion()) + } + if accessor.GetResourceVersion() != oldAccessor.GetResourceVersion() { + return apierrors.NewConflict(gvr.GroupResource(), accessor.GetName(), errors.New("object was modified")) + } + if oldAccessor.GetResourceVersion() == "" { + oldAccessor.SetResourceVersion("0") + } + intResourceVersion, err := strconv.ParseUint(oldAccessor.GetResourceVersion(), 10, 64) + if err != nil { + return fmt.Errorf("can not convert resourceVersion %q to int: %w", oldAccessor.GetResourceVersion(), err) + } + intResourceVersion++ + accessor.SetResourceVersion(strconv.FormatUint(intResourceVersion, 10)) + if !accessor.GetDeletionTimestamp().IsZero() && len(accessor.GetFinalizers()) == 0 { + return t.ObjectTracker.Delete(gvr, accessor.GetNamespace(), accessor.GetName()) + } + obj, err = convertFromUnstructuredIfNecessary(t.scheme, obj) + if err != nil { + return err + } + return t.ObjectTracker.Update(gvr, obj, ns) +} + +func (c *fakeClient) Get(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error { + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + o, err := c.tracker.Get(gvr, key.Namespace, key.Name) + if err != nil { + return err + } + + gvk, err := apiutil.GVKForObject(obj, c.scheme) + if err != nil { + return err + } + ta, err := meta.TypeAccessor(o) + if err != nil { + return err + } + ta.SetKind(gvk.Kind) + ta.SetAPIVersion(gvk.GroupVersion().String()) + + j, err := json.Marshal(o) + if err != nil { + return err + } + decoder := scheme.Codecs.UniversalDecoder() + zero(obj) + _, _, err = decoder.Decode(j, nil, obj) + return err +} + +func (c *fakeClient) Watch(ctx context.Context, list client.ObjectList, opts ...client.ListOption) (watch.Interface, error) { + gvk, err := apiutil.GVKForObject(list, c.scheme) + if err != nil { + return nil, err + } + + gvk.Kind = strings.TrimSuffix(gvk.Kind, "List") + + listOpts := client.ListOptions{} + listOpts.ApplyOptions(opts) + + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + return c.tracker.Watch(gvr, listOpts.Namespace) +} + +func (c *fakeClient) List(ctx context.Context, obj client.ObjectList, opts ...client.ListOption) error { + gvk, err := apiutil.GVKForObject(obj, c.scheme) + if err != nil { + return err + } + + originalKind := gvk.Kind + + gvk.Kind = strings.TrimSuffix(gvk.Kind, "List") + + if _, isUnstructuredList := obj.(*unstructured.UnstructuredList); isUnstructuredList && !c.scheme.Recognizes(gvk) { + // We need to register the ListKind with UnstructuredList: + // https://github.com/kubernetes/kubernetes/blob/7b2776b89fb1be28d4e9203bdeec079be903c103/staging/src/k8s.io/client-go/dynamic/fake/simple.go#L44-L51 + c.schemeWriteLock.Lock() + c.scheme.AddKnownTypeWithName(gvk.GroupVersion().WithKind(gvk.Kind+"List"), &unstructured.UnstructuredList{}) + c.schemeWriteLock.Unlock() + } + + listOpts := client.ListOptions{} + listOpts.ApplyOptions(opts) + + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + o, err := c.tracker.List(gvr, gvk, listOpts.Namespace) + if err != nil { + return err + } + + ta, err := meta.TypeAccessor(o) + if err != nil { + return err + } + ta.SetKind(originalKind) + ta.SetAPIVersion(gvk.GroupVersion().String()) + + j, err := json.Marshal(o) + if err != nil { + return err + } + decoder := scheme.Codecs.UniversalDecoder() + zero(obj) + _, _, err = decoder.Decode(j, nil, obj) + if err != nil { + return err + } + + if listOpts.LabelSelector == nil && listOpts.FieldSelector == nil { + return nil + } + + // If we're here, either a label or field selector are specified (or both), so before we return + // the list we must filter it. If both selectors are set, they are ANDed. + objs, err := meta.ExtractList(obj) + if err != nil { + return err + } + + filteredList, err := c.filterList(objs, gvk, listOpts.LabelSelector, listOpts.FieldSelector) + if err != nil { + return err + } + + return meta.SetList(obj, filteredList) +} + +func (c *fakeClient) filterList(list []runtime.Object, gvk schema.GroupVersionKind, ls labels.Selector, fs fields.Selector) ([]runtime.Object, error) { + // Filter the objects with the label selector + filteredList := list + if ls != nil { + objsFilteredByLabel, err := objectutil.FilterWithLabels(list, ls) + if err != nil { + return nil, err + } + filteredList = objsFilteredByLabel + } + + // Filter the result of the previous pass with the field selector + if fs != nil { + objsFilteredByField, err := c.filterWithFields(filteredList, gvk, fs) + if err != nil { + return nil, err + } + filteredList = objsFilteredByField + } + + return filteredList, nil +} + +func (c *fakeClient) filterWithFields(list []runtime.Object, gvk schema.GroupVersionKind, fs fields.Selector) ([]runtime.Object, error) { + // We only allow filtering on the basis of a single field to ensure consistency with the + // behavior of the cache reader (which we're faking here). + fieldKey, fieldVal, requiresExact := selector.RequiresExactMatch(fs) + if !requiresExact { + return nil, fmt.Errorf("field selector %s is not in one of the two supported forms \"key==val\" or \"key=val\"", + fs) + } + + // Field selection is mimicked via indexes, so there's no sane answer this function can give + // if there are no indexes registered for the GroupVersionKind of the objects in the list. + indexes := c.indexes[gvk] + if len(indexes) == 0 || indexes[fieldKey] == nil { + return nil, fmt.Errorf("List on GroupVersionKind %v specifies selector on field %s, but no "+ + "index with name %s has been registered for GroupVersionKind %v", gvk, fieldKey, fieldKey, gvk) + } + + indexExtractor := indexes[fieldKey] + filteredList := make([]runtime.Object, 0, len(list)) + for _, obj := range list { + if c.objMatchesFieldSelector(obj, indexExtractor, fieldVal) { + filteredList = append(filteredList, obj) + } + } + return filteredList, nil +} + +func (c *fakeClient) objMatchesFieldSelector(o runtime.Object, extractIndex client.IndexerFunc, val string) bool { + obj, isClientObject := o.(client.Object) + if !isClientObject { + panic(fmt.Errorf("expected object %v to be of type client.Object, but it's not", o)) + } + + for _, extractedVal := range extractIndex(obj) { + if extractedVal == val { + return true + } + } + + return false +} + +func (c *fakeClient) Scheme() *runtime.Scheme { + return c.scheme +} + +func (c *fakeClient) RESTMapper() meta.RESTMapper { + return c.restMapper +} + +func (c *fakeClient) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) error { + createOptions := &client.CreateOptions{} + createOptions.ApplyOptions(opts) + + for _, dryRunOpt := range createOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return err + } + + if accessor.GetName() == "" && accessor.GetGenerateName() != "" { + base := accessor.GetGenerateName() + if len(base) > maxGeneratedNameLength { + base = base[:maxGeneratedNameLength] + } + accessor.SetName(fmt.Sprintf("%s%s", base, utilrand.String(randomLength))) + } + + return c.tracker.Create(gvr, obj, accessor.GetNamespace()) +} + +func (c *fakeClient) Delete(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error { + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return err + } + delOptions := client.DeleteOptions{} + delOptions.ApplyOptions(opts) + + for _, dryRunOpt := range delOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + // Check the ResourceVersion if that Precondition was specified. + if delOptions.Preconditions != nil && delOptions.Preconditions.ResourceVersion != nil { + name := accessor.GetName() + dbObj, err := c.tracker.Get(gvr, accessor.GetNamespace(), name) + if err != nil { + return err + } + oldAccessor, err := meta.Accessor(dbObj) + if err != nil { + return err + } + actualRV := oldAccessor.GetResourceVersion() + expectRV := *delOptions.Preconditions.ResourceVersion + if actualRV != expectRV { + msg := fmt.Sprintf( + "the ResourceVersion in the precondition (%s) does not match the ResourceVersion in record (%s). "+ + "The object might have been modified", + expectRV, actualRV) + return apierrors.NewConflict(gvr.GroupResource(), name, errors.New(msg)) + } + } + + return c.deleteObject(gvr, accessor) +} + +func (c *fakeClient) DeleteAllOf(ctx context.Context, obj client.Object, opts ...client.DeleteAllOfOption) error { + gvk, err := apiutil.GVKForObject(obj, c.scheme) + if err != nil { + return err + } + + dcOptions := client.DeleteAllOfOptions{} + dcOptions.ApplyOptions(opts) + + for _, dryRunOpt := range dcOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + o, err := c.tracker.List(gvr, gvk, dcOptions.Namespace) + if err != nil { + return err + } + + objs, err := meta.ExtractList(o) + if err != nil { + return err + } + filteredObjs, err := objectutil.FilterWithLabels(objs, dcOptions.LabelSelector) + if err != nil { + return err + } + for _, o := range filteredObjs { + accessor, err := meta.Accessor(o) + if err != nil { + return err + } + err = c.deleteObject(gvr, accessor) + if err != nil { + return err + } + } + return nil +} + +func (c *fakeClient) Update(ctx context.Context, obj client.Object, opts ...client.UpdateOption) error { + updateOptions := &client.UpdateOptions{} + updateOptions.ApplyOptions(opts) + + for _, dryRunOpt := range updateOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return err + } + return c.tracker.Update(gvr, obj, accessor.GetNamespace()) +} + +func (c *fakeClient) Patch(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.PatchOption) error { + patchOptions := &client.PatchOptions{} + patchOptions.ApplyOptions(opts) + + for _, dryRunOpt := range patchOptions.DryRun { + if dryRunOpt == metav1.DryRunAll { + return nil + } + } + + gvr, err := getGVRFromObject(obj, c.scheme) + if err != nil { + return err + } + accessor, err := meta.Accessor(obj) + if err != nil { + return err + } + data, err := patch.Data(obj) + if err != nil { + return err + } + + reaction := testing.ObjectReaction(c.tracker) + handled, o, err := reaction(testing.NewPatchAction(gvr, accessor.GetNamespace(), accessor.GetName(), patch.Type(), data)) + if err != nil { + return err + } + if !handled { + panic("tracker could not handle patch method") + } + + gvk, err := apiutil.GVKForObject(obj, c.scheme) + if err != nil { + return err + } + ta, err := meta.TypeAccessor(o) + if err != nil { + return err + } + ta.SetKind(gvk.Kind) + ta.SetAPIVersion(gvk.GroupVersion().String()) + + j, err := json.Marshal(o) + if err != nil { + return err + } + decoder := scheme.Codecs.UniversalDecoder() + zero(obj) + _, _, err = decoder.Decode(j, nil, obj) + return err +} + +func (c *fakeClient) Status() client.SubResourceWriter { + return c.SubResource("status") +} + +func (c *fakeClient) SubResource(subResource string) client.SubResourceClient { + return &fakeSubResourceClient{client: c} +} + +func (c *fakeClient) deleteObject(gvr schema.GroupVersionResource, accessor metav1.Object) error { + old, err := c.tracker.Get(gvr, accessor.GetNamespace(), accessor.GetName()) + if err == nil { + oldAccessor, err := meta.Accessor(old) + if err == nil { + if len(oldAccessor.GetFinalizers()) > 0 { + now := metav1.Now() + oldAccessor.SetDeletionTimestamp(&now) + return c.tracker.Update(gvr, old, accessor.GetNamespace()) + } + } + } + + //TODO: implement propagation + return c.tracker.Delete(gvr, accessor.GetNamespace(), accessor.GetName()) +} + +func getGVRFromObject(obj runtime.Object, scheme *runtime.Scheme) (schema.GroupVersionResource, error) { + gvk, err := apiutil.GVKForObject(obj, scheme) + if err != nil { + return schema.GroupVersionResource{}, err + } + gvr, _ := meta.UnsafeGuessKindToResource(gvk) + return gvr, nil +} + +type fakeSubResourceClient struct { + client *fakeClient +} + +func (sw *fakeSubResourceClient) Get(ctx context.Context, obj, subResource client.Object, opts ...client.SubResourceGetOption) error { + panic("fakeSubResourceClient does not support get") +} + +func (sw *fakeSubResourceClient) Create(ctx context.Context, obj client.Object, subResource client.Object, opts ...client.SubResourceCreateOption) error { + panic("fakeSubResourceWriter does not support create") +} + +func (sw *fakeSubResourceClient) Update(ctx context.Context, obj client.Object, opts ...client.SubResourceUpdateOption) error { + // TODO(droot): This results in full update of the obj (spec + subresources). Need + // a way to update subresource only. + updateOptions := client.SubResourceUpdateOptions{} + updateOptions.ApplyOptions(opts) + + body := obj + if updateOptions.SubResourceBody != nil { + body = updateOptions.SubResourceBody + } + return sw.client.Update(ctx, body, &updateOptions.UpdateOptions) +} + +func (sw *fakeSubResourceClient) Patch(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.SubResourcePatchOption) error { + // TODO(droot): This results in full update of the obj (spec + subresources). Need + // a way to update subresource only. + + patchOptions := client.SubResourcePatchOptions{} + patchOptions.ApplyOptions(opts) + + body := obj + if patchOptions.SubResourceBody != nil { + body = patchOptions.SubResourceBody + } + + return sw.client.Patch(ctx, body, patch, &patchOptions.PatchOptions) +} + +func allowsUnconditionalUpdate(gvk schema.GroupVersionKind) bool { + switch gvk.Group { + case "apps": + switch gvk.Kind { + case "ControllerRevision", "DaemonSet", "Deployment", "ReplicaSet", "StatefulSet": + return true + } + case "autoscaling": + switch gvk.Kind { + case "HorizontalPodAutoscaler": + return true + } + case "batch": + switch gvk.Kind { + case "CronJob", "Job": + return true + } + case "certificates": + switch gvk.Kind { + case "Certificates": + return true + } + case "flowcontrol": + switch gvk.Kind { + case "FlowSchema", "PriorityLevelConfiguration": + return true + } + case "networking": + switch gvk.Kind { + case "Ingress", "IngressClass", "NetworkPolicy": + return true + } + case "policy": + switch gvk.Kind { + case "PodSecurityPolicy": + return true + } + case "rbac": + switch gvk.Kind { + case "ClusterRole", "ClusterRoleBinding", "Role", "RoleBinding": + return true + } + case "scheduling": + switch gvk.Kind { + case "PriorityClass": + return true + } + case "settings": + switch gvk.Kind { + case "PodPreset": + return true + } + case "storage": + switch gvk.Kind { + case "StorageClass": + return true + } + case "": + switch gvk.Kind { + case "ConfigMap", "Endpoint", "Event", "LimitRange", "Namespace", "Node", + "PersistentVolume", "PersistentVolumeClaim", "Pod", "PodTemplate", + "ReplicationController", "ResourceQuota", "Secret", "Service", + "ServiceAccount", "EndpointSlice": + return true + } + } + + return false +} + +func allowsCreateOnUpdate(gvk schema.GroupVersionKind) bool { + switch gvk.Group { + case "coordination": + switch gvk.Kind { + case "Lease": + return true + } + case "node": + switch gvk.Kind { + case "RuntimeClass": + return true + } + case "rbac": + switch gvk.Kind { + case "ClusterRole", "ClusterRoleBinding", "Role", "RoleBinding": + return true + } + case "": + switch gvk.Kind { + case "Endpoint", "Event", "LimitRange", "Service": + return true + } + } + + return false +} + +// zero zeros the value of a pointer. +func zero(x interface{}) { + if x == nil { + return + } + res := reflect.ValueOf(x).Elem() + res.Set(reflect.Zero(res.Type())) +} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/doc.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/doc.go new file mode 100644 index 00000000000..d0614666e37 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/doc.go @@ -0,0 +1,38 @@ +/* +Copyright 2018 The Kubernetes 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 fake provides a fake client for testing. + +A fake client is backed by its simple object store indexed by GroupVersionResource. +You can create a fake client with optional objects. + + client := NewFakeClientWithScheme(scheme, initObjs...) // initObjs is a slice of runtime.Object + +You can invoke the methods defined in the Client interface. + +When in doubt, it's almost always better not to use this package and instead use +envtest.Environment with a real client and API server. + +WARNING: ⚠️ Current Limitations / Known Issues with the fake Client ⚠️ + - This client does not have a way to inject specific errors to test handled vs. unhandled errors. + - There is some support for sub resources which can cause issues with tests if you're trying to update + e.g. metadata and status in the same reconcile. + - No OpenAPI validation is performed when creating or updating objects. + - ObjectMeta's `Generation` and `ResourceVersion` don't behave properly, Patch or Update + operations that rely on these fields will fail, or give false positives. +*/ +package fake