From ee809480b59375e4122239c1ec0b96c9c52edb4f Mon Sep 17 00:00:00 2001 From: Hiroto Funakoshi Date: Fri, 19 Jan 2024 14:49:06 +0900 Subject: [PATCH] Add mirror gateway definitions and Implementations (#2262) * add mirror definition and update proto dependencies Signed-off-by: hlts2 * Add mirror gateway component (#1949) * add mirror component Signed-off-by: hlts2 * fix mirror dockerfile path Signed-off-by: hlts2 * fix deepsource warning Signed-off-by: hlts2 * fix insert rpc handler Signed-off-by: hlts2 * deleted unused file Signed-off-by: hlts2 * fix api resource name Signed-off-by: hlts2 * add mirror service and fix handler logic Signed-off-by: hlts2 * fix values and helm template for new configuration Signed-off-by: hlts2 * Format code with gofumpt and prettier * fix template rendering bug of mirror configmap Signed-off-by: hlts2 * fix nil pointer error Signed-off-by: hlts2 * bugfix to advertize different address Signed-off-by: hlts2 * returns error when there is no other mirror gateways Signed-off-by: hlts2 * add info log Signed-off-by: hlts2 * extract only mirror addresses Signed-off-by: hlts2 * fix log variable Signed-off-by: hlts2 * add logging Signed-off-by: hlts2 * bugfix mirror connection logic Signed-off-by: hlts2 * add remove api proxy implementation Signed-off-by: hlts2 * add error handling for register API Signed-off-by: hlts2 * fix debug message Signed-off-by: hlts2 * refactor discover logic Signed-off-by: hlts2 * refactor Signed-off-by: hlts2 * add remove api Signed-off-by: hlts2 * Format code with prettier and gofumpt * add remove api and remove api rollback logic Signed-off-by: hlts2 * refactor Signed-off-by: hlts2 * add update rpc handler Signed-off-by: hlts2 * refactor context variable for grpc method Signed-off-by: hlts2 * fix trace span name Signed-off-by: hlts2 * add getObjects method Signed-off-by: hlts2 * refactor update and remove handler Signed-off-by: hlts2 * Apply suggestions from code review Co-authored-by: Kiichiro YUKAWA * add multi handler implementation Signed-off-by: hlts2 * fix mirror client trace span Signed-off-by: hlts2 * rename discover service to mirror service Signed-off-by: hlts2 * fix build error of bidirectional stream Signed-off-by: hlts2 * add more error handling to search handler Signed-off-by: hlts2 * add debug comment Signed-off-by: hlts2 * add status code log Signed-off-by: hlts2 * add status code log Signed-off-by: hlts2 * add status code log Signed-off-by: hlts2 * fix named return bug Signed-off-by: hlts2 * add debug log Signed-off-by: hlts2 * add debug command Signed-off-by: hlts2 * add debug command Signed-off-by: hlts2 * add debug command Signed-off-by: hlts2 * add force status wrap Signed-off-by: hlts2 * execute upsert method to local cluster's lb Signed-off-by: hlts2 * add target debug log Signed-off-by: hlts2 * fix delete unwrap of circuitbreaker Signed-off-by: hlts2 * refactor error handling for new status parse function Signed-off-by: hlts2 * Format code with prettier and gofumpt * refactor error handling Signed-off-by: hlts2 * style: Format code with prettier and gofumpt * fix error handling for broadcast operation of getobject Signed-off-by: hlts2 * fix error join bug of getobject Signed-off-by: hlts2 * refactor Signed-off-by: hlts2 * deleted unused code Signed-off-by: hlts2 * fix status handling and add address to resource name Signed-off-by: hlts2 * use vald client for update operation Signed-off-by: hlts2 * add rollback test for mirror crud Signed-off-by: hlts2 * style: Format code with prettier and gofumpt * fix variable name Signed-off-by: hlts2 * refactor mirror servie Signed-off-by: hlts2 * deleted unused code Signed-off-by: hlts2 * fix trace attribute and refactor variable name Signed-off-by: hlts2 * add error handling when crud rpc fails Signed-off-by: hlts2 * deleted unused value Signed-off-by: hlts2 * make format Signed-off-by: hlts2 * Revert "make format" This reverts commit f605563f0898987a59f79abc53fb186d560ad0b0. * Apply suggestions from code review Co-authored-by: Kiichiro YUKAWA * apply suggestion Signed-off-by: hlts2 * bugfix and refactor mirror client Signed-off-by: hlts2 --------- Signed-off-by: hlts2 Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> Co-authored-by: Kiichiro YUKAWA * Rename ip to host of proto payload field for mirror gateway (#2031) * fix field name and yaml indent Signed-off-by: hlts2 * make proto/add format Signed-off-by: hlts2 --------- Signed-off-by: hlts2 * make proto/add & make format Signed-off-by: hlts2 * fix docker build for mirror Signed-off-by: hlts2 * Revert "fix docker build for mirror" This reverts commit 53ab94ff7d1a348d870ea624d9a334683333d5f2. * fix docker build error for mirror gateway Signed-off-by: hlts2 * Add Custom Resource for mirror target (#2023) * add mirror definition and update proto dependencies Signed-off-by: hlts2 * Add mirror gateway component (#1949) * add mirror component Signed-off-by: hlts2 * fix mirror dockerfile path Signed-off-by: hlts2 * fix deepsource warning Signed-off-by: hlts2 * fix insert rpc handler Signed-off-by: hlts2 * deleted unused file Signed-off-by: hlts2 * fix api resource name Signed-off-by: hlts2 * add mirror service and fix handler logic Signed-off-by: hlts2 * fix values and helm template for new configuration Signed-off-by: hlts2 * Format code with gofumpt and prettier * fix template rendering bug of mirror configmap Signed-off-by: hlts2 * fix nil pointer error Signed-off-by: hlts2 * bugfix to advertize different address Signed-off-by: hlts2 * returns error when there is no other mirror gateways Signed-off-by: hlts2 * add info log Signed-off-by: hlts2 * extract only mirror addresses Signed-off-by: hlts2 * fix log variable Signed-off-by: hlts2 * add logging Signed-off-by: hlts2 * bugfix mirror connection logic Signed-off-by: hlts2 * add remove api proxy implementation Signed-off-by: hlts2 * add error handling for register API Signed-off-by: hlts2 * fix debug message Signed-off-by: hlts2 * refactor discover logic Signed-off-by: hlts2 * refactor Signed-off-by: hlts2 * add remove api Signed-off-by: hlts2 * Format code with prettier and gofumpt * add remove api and remove api rollback logic Signed-off-by: hlts2 * refactor Signed-off-by: hlts2 * add update rpc handler Signed-off-by: hlts2 * refactor context variable for grpc method Signed-off-by: hlts2 * fix trace span name Signed-off-by: hlts2 * add getObjects method Signed-off-by: hlts2 * refactor update and remove handler Signed-off-by: hlts2 * Apply suggestions from code review Co-authored-by: Kiichiro YUKAWA * add multi handler implementation Signed-off-by: hlts2 * fix mirror client trace span Signed-off-by: hlts2 * rename discover service to mirror service Signed-off-by: hlts2 * fix build error of bidirectional stream Signed-off-by: hlts2 * add more error handling to search handler Signed-off-by: hlts2 * add debug comment Signed-off-by: hlts2 * add status code log Signed-off-by: hlts2 * add status code log Signed-off-by: hlts2 * add status code log Signed-off-by: hlts2 * fix named return bug Signed-off-by: hlts2 * add debug log Signed-off-by: hlts2 * add debug command Signed-off-by: hlts2 * add debug command Signed-off-by: hlts2 * add debug command Signed-off-by: hlts2 * add force status wrap Signed-off-by: hlts2 * execute upsert method to local cluster's lb Signed-off-by: hlts2 * add target debug log Signed-off-by: hlts2 * fix delete unwrap of circuitbreaker Signed-off-by: hlts2 * refactor error handling for new status parse function Signed-off-by: hlts2 * Format code with prettier and gofumpt * refactor error handling Signed-off-by: hlts2 * style: Format code with prettier and gofumpt * fix error handling for broadcast operation of getobject Signed-off-by: hlts2 * fix error join bug of getobject Signed-off-by: hlts2 * refactor Signed-off-by: hlts2 * deleted unused code Signed-off-by: hlts2 * fix status handling and add address to resource name Signed-off-by: hlts2 * use vald client for update operation Signed-off-by: hlts2 * add rollback test for mirror crud Signed-off-by: hlts2 * style: Format code with prettier and gofumpt * fix variable name Signed-off-by: hlts2 * refactor mirror servie Signed-off-by: hlts2 * deleted unused code Signed-off-by: hlts2 * fix trace attribute and refactor variable name Signed-off-by: hlts2 * add error handling when crud rpc fails Signed-off-by: hlts2 * deleted unused value Signed-off-by: hlts2 * make format Signed-off-by: hlts2 * Revert "make format" This reverts commit f605563f0898987a59f79abc53fb186d560ad0b0. * Apply suggestions from code review Co-authored-by: Kiichiro YUKAWA * apply suggestion Signed-off-by: hlts2 * bugfix and refactor mirror client Signed-off-by: hlts2 --------- Signed-off-by: hlts2 Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> Co-authored-by: Kiichiro YUKAWA * add discovery logic for other mirror target Signed-off-by: hlts2 * add k8s template file Signed-off-by: hlts2 * add crd for mirror target resource Signed-off-by: hlts2 * add new values for mirror discovery logic Signed-off-by: hlts2 * style: Format code with gofumpt and prettier * fix schema register error and fix manifest to multi vald cluster Signed-off-by: hlts2 * style: Format code with gofumpt and prettier * bugfix: adapt the service account and add early return Signed-off-by: hlts2 * bugfix: usage of errors join Signed-off-by: hlts2 * bugfix: type conversion bug Signed-off-by: hlts2 * fix metadata hash logic and add mirror group function Signed-off-by: hlts2 * add status handling for network connection Signed-off-by: hlts2 * refactoring Signed-off-by: hlts2 * bugfix: status update handling Signed-off-by: hlts2 * bugfix: update status using status writer Signed-off-by: hlts2 * add status timestamp Signed-off-by: hlts2 * fix yaml field format Signed-off-by: hlts2 * improve status changes handling Signed-off-by: hlts2 * reduced number of status updates Signed-off-by: hlts2 * added status check handling before changing status Signed-off-by: hlts2 * update vald mirror target definition and add new cluster role Signed-off-by: hlts2 * style: Format code with gofumpt and prettier * deploy multiple vald clusters and mirror target resource to connect with each other Signed-off-by: hlts2 * fix e2d test to mirror-gateway and crd view field Signed-off-by: hlts2 * define mirror app name Signed-off-by: hlts2 * deleted unused code Signed-off-by: hlts2 * fix golangci warning Signed-off-by: hlts2 * crd generate command for mirror target using mirror-target-values Signed-off-by: hlts2 * add string field validation Signed-off-by: hlts2 * fix build error Signed-off-by: hlts2 * add configuration comment Signed-off-by: hlts2 * style: Format code with gofumpt and prettier * add image tag for debug Signed-off-by: hlts2 * fix rebase error Signed-off-by: hlts2 * fix wait timeout option Signed-off-by: hlts2 * add new option to set mirror address Signed-off-by: hlts2 * add new comment Signed-off-by: hlts2 * bugfix for ingress configuration Signed-off-by: hlts2 * not create lb ingress when mirror is enabled Signed-off-by: hlts2 * not create filter ingress when mirror is enabled Signed-off-by: hlts2 * add error handling for unimplemented codes error Signed-off-by: hlts2 * bugfix register addr process Signed-off-by: hlts2 * fix build error Signed-off-by: hlts2 * Revert "update docker file for build error" This reverts commit f40986df7d4ffc5eab4c9b324fdf63c0a24cd6e4. * add new package for docker build error Signed-off-by: hlts2 * Add mirror gateway example (#2082) * add example code Signed-off-by: hlts2 * execute search and getobject request to all vald clusters Signed-off-by: hlts2 * fixed to send data to each cluster based on the dataset Signed-off-by: hlts2 --------- Signed-off-by: hlts2 * add mirror target metrics Signed-off-by: hlts2 * fix example ngt dimension Signed-off-by: hlts2 * make proto/all & make format Signed-off-by: hlts2 --------- Signed-off-by: hlts2 Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> Co-authored-by: Kiichiro YUKAWA * fix mirror image tag Signed-off-by: hlts2 * Add mirror gateway document (#2105) * add mirror document Signed-off-by: hlts2 * fix svg to png Signed-off-by: hlts2 * Update docs/api/mirror-gateway.md Co-authored-by: Kiichiro YUKAWA * Update docs/api/mirror-gateway.md Co-authored-by: Kiichiro YUKAWA * Update docs/api/mirror-gateway.md Co-authored-by: Kiichiro YUKAWA * style: Format code with prettier and gofumpt * Update docs/overview/component/mirror-gateway.md Co-authored-by: Kiichiro YUKAWA * Apply suggestions from code review Co-authored-by: Kiichiro YUKAWA * style: Format code with prettier and gofumpt * Apply suggestions from code review * Update docs/overview/component/mirror-gateway.md * fix expand bug for mirror tutorial Signed-off-by: hlts2 * style: Format code with prettier and gofumpt * fix filename typo Signed-off-by: hlts2 * add new link Signed-off-by: hlts2 * add cluster role settings for mirror gateway Signed-off-by: hlts2 * add hdf5 installation section Signed-off-by: hlts2 * Update docs/user-guides/mirroring-configuration.md Co-authored-by: Kiichiro YUKAWA * update link Signed-off-by: hlts2 * delete quote Signed-off-by: hlts2 * update mirror component overview image Signed-off-by: hlts2 * update mirror component overview image Signed-off-by: hlts2 * Update docs/overview/component/mirror-gateway.md Co-authored-by: Kevin Diu * Update docs/overview/component/mirror-gateway.md * Update docs/api/mirror-gateway.md Co-authored-by: Yusuke Kadowaki * Update docs/api/mirror-gateway.md * Update docs/user-guides/mirroring-configuration.md Co-authored-by: Kevin Diu --------- Signed-off-by: hlts2 Co-authored-by: Kiichiro YUKAWA Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> Co-authored-by: Kevin Diu Co-authored-by: Yusuke Kadowaki * merge ingress configuration for lb and filter Signed-off-by: hlts2 * fix duplicate definition error Signed-off-by: hlts2 * make proto/all & make schema update & make format Signed-off-by: hlts2 * fix test execution error for mirror handler Signed-off-by: hlts2 * make proto/all format and update schema and fails build error Signed-off-by: hlts2 * use resuable workflow to build mirror image Signed-off-by: hlts2 * use internal sync package and refactor Signed-off-by: hlts2 * fix error handling Signed-off-by: hlts2 * add network policy settings and update deploy command Signed-off-by: hlts2 * add default setting logic Signed-off-by: hlts2 * add new fileld to crd schema and update crd Signed-off-by: hlts2 * fix make command to deploy vald with mirror components Signed-off-by: hlts2 * add e2e test for mirror Signed-off-by: hlts2 * add debug command to get pod status Signed-off-by: hlts2 * bugfix command Signed-off-by: hlts2 * disable sidecar e2e and add mirror e2e command Signed-off-by: hlts2 * update cluster role Signed-off-by: hlts2 * add cluster-info dump command Signed-off-by: hlts2 * Revert "add cluster-info dump command" This reverts commit 7ece16ff8663a9e10ded8e448af5457dec8c3073. * debug: add logs command Signed-off-by: hlts2 * Revert "debug: add logs command" This reverts commit 454eaf3a071f903e4a6fad6068b65d8aa10a5c6d. * add RemoveByTimestamp for mirror Signed-off-by: hlts2 * fix: update sleep time for operator deploy Signed-off-by: hlts2 * update wait time for vmt Signed-off-by: hlts2 * Returns all connection information in the registration rpc (#2199) * fix: returns all connection information in the registration rpc Signed-off-by: hlts2 * fix: lint warnning Signed-off-by: hlts2 * refactor: deleted unnecessary parameter Signed-off-by: hlts2 --------- Signed-off-by: hlts2 * Add handler logic to continue processing (#2204) * feat: add new crud logic Signed-off-by: hlts2 * refactor code Signed-off-by: hlts2 * refactor: error handling logic Signed-off-by: hlts2 * fix: bugfix error handling for rpc Signed-off-by: hlts2 * feat: add test for RemoveByTimestamp Signed-off-by: hlts2 * fix: fails error test Signed-off-by: hlts2 * refactor: test logic Signed-off-by: hlts2 * fix: add new condition and add test case Signed-off-by: hlts2 * refactor code Signed-off-by: hlts2 * fix: error handling and comment Signed-off-by: hlts2 * fix: test case name and test case order Signed-off-by: hlts2 * fix: execute format Signed-off-by: hlts2 * fix: add new comment Signed-off-by: hlts2 --------- Signed-off-by: hlts2 * Update Mirror Gateway document (#2207) * fix: update mirror document Signed-off-by: hlts2 * fix: format Signed-off-by: hlts2 * feat: add removeByTimestamp section Signed-off-by: hlts2 * fix: grammar warning Signed-off-by: hlts2 * fix: grammar warning and refactor document Signed-off-by: hlts2 * fix: grammar warning Signed-off-by: hlts2 * feat: add mirror gateway troubleshooting docs Signed-off-by: hlts2 * style: format code with Gofumpt and Prettier This commit fixes the style issues introduced in 2c492f7 according to the output from Gofumpt and Prettier. Details: https://github.com/vdaas/vald/pull/2207 * feat: add contents of troubleshooting document Signed-off-by: hlts2 * fix: grammar warning Signed-off-by: hlts2 * fix: grammar Signed-off-by: hlts2 * fix: link path Signed-off-by: hlts2 * fix: invalid link path Signed-off-by: hlts2 * fix: refactor docs Signed-off-by: hlts2 * fix: deleted unnecessary contents Signed-off-by: hlts2 * fix: status handling logic document Signed-off-by: hlts2 * fix: document refactor Signed-off-by: hlts2 * fix: bugfix status handling document Signed-off-by: hlts2 * fix: refactor sentence Signed-off-by: hlts2 --------- Signed-off-by: hlts2 Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> * feat: schema and protobuf update Signed-off-by: hlts2 * fix: reviewdog warning and add comment Signed-off-by: hlts2 * style: format code with Gofumpt and Prettier This commit fixes the style issues introduced in 7d7a690 according to the output from Gofumpt and Prettier. Details: https://github.com/vdaas/vald/pull/2237 * fix: reviewdog warning Signed-off-by: hlts2 * fix: reviewdog warning Signed-off-by: hlts2 * fix: move mirror client mock definition to internal package Signed-off-by: hlts2 * feat: add new handler base logic Signed-off-by: hlts2 * fix: refactor stream list object rpc Signed-off-by: hlts2 * fix: divide logic to other function Signed-off-by: hlts2 * style: format code with Gofumpt and Prettier This commit fixes the style issues introduced in e62a657 according to the output from Gofumpt and Prettier. Details: https://github.com/vdaas/vald/pull/2237 * make proto/all format Signed-off-by: hlts2 * fix: return grpc error Signed-off-by: hlts2 * fix: make proto/all format Signed-off-by: hlts2 * feat: add mirror service test Signed-off-by: hlts2 * fix: add mock definition code Signed-off-by: hlts2 * style: format code with Gofumpt and Prettier This commit fixes the style issues introduced in d6580ec according to the output from Gofumpt and Prettier. Details: https://github.com/vdaas/vald/pull/2237 * fix: use internal method Signed-off-by: hlts2 * fix: delete Exist method because it is not needed Signed-off-by: hlts2 * fix: use address cache insted of connectedAddr method Signed-off-by: hlts2 * fix: make format Signed-off-by: hlts2 * feat: improve connection management and add new test Signed-off-by: hlts2 * fix: make format Signed-off-by: hlts2 * fix: lint warnning Signed-off-by: hlts2 * fix: refactor error handling Signed-off-by: hlts2 * feat: add test for syncronizee based on address and small refactor Signed-off-by: hlts2 * fix: improve error handling and example image tag Signed-off-by: hlts2 * fix: schema update and format Signed-off-by: hlts2 * Update charts/vald/values/multi-vald/dev-vald-with-mirror.yaml * fix: lint warnning Signed-off-by: hlts2 * style: format code with Gofumpt and Prettier This commit fixes the style issues introduced in 4c11568 according to the output from Gofumpt and Prettier. Details: https://github.com/vdaas/vald/pull/2262 * fix: reviewdog warning and deepsource warning Signed-off-by: hlts2 * feat: use new command to docker build Signed-off-by: hlts2 * fix: make format Signed-off-by: hlts2 * fix: update schema and format Signed-off-by: hlts2 * fix: deleted unnecessary RPCs due to failure of previous rebasing Signed-off-by: hlts2 * fix: proto and execute make proto/all format Signed-off-by: hlts2 * fix: revert unnecessary changes Signed-off-by: hlts2 * fix: make proto/all format Signed-off-by: hlts2 * fix: deepsource warning Signed-off-by: hlts2 * fix: deleted unnecessary code Signed-off-by: hlts2 * fix: deepsource warning Signed-off-by: hlts2 * fix: deepsource warning Signed-off-by: hlts2 * fix: make proto/all format Signed-off-by: hlts2 * fix: apply feedback for comment Signed-off-by: hlts2 * feat: add internal hash package to generate hash value Signed-off-by: hlts2 * fix: ignore deepsource warning Signed-off-by: hlts2 * feat: add function and method comment Signed-off-by: hlts2 * Update pkg/gateway/mirror/handler/grpc/handler.go * fix: schema and proto update and format Signed-off-by: hlts2 * feat: add ingress rule for lb and filter Signed-off-by: hlts2 * fix: deleted wildcard path Signed-off-by: hlts2 * fix: ingress unified into one manifest Signed-off-by: hlts2 * fix: make format Signed-off-by: hlts2 * fix: lb ingress port settings and small refactor Signed-off-by: hlts2 * feat: add cluster wide ingress resource name Signed-off-by: hlts2 * fix: add deploy ingress resource using make command Signed-off-by: hlts2 --------- Signed-off-by: hlts2 Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com> Co-authored-by: Kiichiro YUKAWA Co-authored-by: Kevin Diu Co-authored-by: Yusuke Kadowaki --- .../detect-docker-image-tags/action.yaml | 1 + .../e2e-deploy-vald-helm-operator/action.yaml | 4 +- .../e2e-deploy-vald-readreplica/action.yaml | 128 + .github/actions/e2e-deploy-vald/action.yaml | 11 + .github/actions/setup-e2e/action.yaml | 14 + .github/helm/values/vald-mirror-target.yaml | 24 + .github/helm/values/values-mirror-01.yaml | 81 + .github/helm/values/values-mirror-02.yaml | 85 + .github/helm/values/values-readreplica.yaml | 82 + .../dockers-gateway-mirror-image.yaml | 82 + .github/workflows/e2e.yml | 100 +- Makefile | 3 +- Makefile.d/build.mk | 28 + Makefile.d/docker.mk | 11 + Makefile.d/helm.mk | 11 + Makefile.d/k8s.mk | 48 +- apis/docs/v1/docs.md | 62 + apis/grpc/v1/agent/core/agent.pb.go | 2 +- apis/grpc/v1/agent/sidecar/sidecar.pb.go | 2 +- apis/grpc/v1/discoverer/discoverer.pb.go | 2 +- .../grpc/v1/filter/egress/egress_filter.pb.go | 2 +- .../v1/filter/ingress/ingress_filter.pb.go | 2 +- .../grpc/v1/manager/index/index_manager.pb.go | 2 +- apis/grpc/v1/mirror/mirror.pb.go | 100 + apis/grpc/v1/mirror/mirror_vtproto.pb.go | 127 + apis/grpc/v1/payload/payload.pb.go | 954 +-- apis/grpc/v1/payload/payload_vtproto.pb.go | 533 ++ .../v1/rpc/errdetails/error_details.pb.go | 2 +- apis/grpc/v1/vald/filter.pb.go | 2 +- apis/grpc/v1/vald/insert.pb.go | 2 +- apis/grpc/v1/vald/object.pb.go | 2 +- apis/grpc/v1/vald/remove.pb.go | 2 +- apis/grpc/v1/vald/search.pb.go | 2 +- apis/grpc/v1/vald/update.pb.go | 2 +- apis/grpc/v1/vald/upsert.pb.go | 2 +- apis/grpc/v1/vald/vald.go | 36 + apis/proto/v1/mirror/mirror.proto | 37 + apis/proto/v1/payload/payload.proto | 17 + .../v1/discoverer/discoverer.swagger.json | 92 +- .../apis/proto/v1/mirror/mirror.swagger.json | 108 + apis/swagger/v1/mirror/mirror.swagger.json | 113 + apis/swagger/v1/vald/filter.swagger.json | 40 +- apis/swagger/v1/vald/insert.swagger.json | 32 +- apis/swagger/v1/vald/object.swagger.json | 32 +- apis/swagger/v1/vald/search.swagger.json | 32 +- apis/swagger/v1/vald/update.swagger.json | 32 +- apis/swagger/v1/vald/upsert.swagger.json | 32 +- .../mirror-gateway/full-mesh-connection.png | Bin 0 -> 26793 bytes .../mirror-gateway/mirror-gateway.png | Bin 0 -> 46215 bytes .../mirror-gateway/request-forwarding.png | Bin 0 -> 55962 bytes .../tutorial/vald-multicluster-on-k8s.png | Bin 0 -> 25971 bytes .../vald-helm-operator/crds/valdrelease.yaml | 1061 ++++ .../templates/clusterrole.yaml | 12 + .../templates/deployment.yaml | 9 +- charts/vald/crds/valdmirrortarget.yaml | 100 + charts/vald/schemas/mirror-target-values.yaml | 28 + charts/vald/templates/gateway/filter/ing.yaml | 53 - charts/vald/templates/gateway/ing.yaml | 96 + .../vald/templates/gateway/lb/configmap.yaml | 19 + charts/vald/templates/gateway/lb/ing.yaml | 53 - .../templates/gateway/lb/networkpolicy.yaml | 7 + .../templates/gateway/mirror/clusterrole.yaml | 58 + .../gateway/mirror/clusterrolebinding.yaml | 37 + .../templates/gateway/mirror/configmap.yaml | 84 + .../templates/gateway/mirror/daemonset.yaml | 135 + .../templates/gateway/mirror/deployment.yaml | 139 + charts/vald/templates/gateway/mirror/hpa.yaml | 38 + .../gateway/mirror/networkpolicy.yaml | 53 + charts/vald/templates/gateway/mirror/pdb.yaml | 38 + .../gateway/mirror/priorityclass.yaml | 32 + .../gateway/mirror/serviceaccount.yaml | 29 + charts/vald/templates/gateway/mirror/svc.yaml | 52 + charts/vald/values.schema.json | 1789 ++++++ charts/vald/values.yaml | 349 ++ .../vald/values/multi-vald/dev-vald-01.yaml | 32 + .../vald/values/multi-vald/dev-vald-02.yaml | 36 + .../vald/values/multi-vald/dev-vald-03.yaml | 36 + .../multi-vald/dev-vald-with-mirror.yaml | 100 + .../vald/values/multi-vald/mirror-target.yaml | 35 + cmd/gateway/mirror/main.go | 58 + cmd/gateway/mirror/sample.yaml | 148 + dockers/gateway/mirror/Dockerfile | 92 + docs/api/mirror-gateway.md | 85 + docs/overview/component/mirror-gateway.md | 81 + docs/troubleshooting/mirror-gateway.md | 75 + docs/tutorial/vald-multicluster-on-k8s.md | 303 + docs/user-guides/cluster-role-binding.md | 99 + docs/user-guides/mirroring-configuration.md | 89 + example/client/mirror/main.go | 246 + .../client/v1/client/discoverer/discover.go | 43 + .../v1/client/discoverer/discover_test.go | 127 + .../client/v1/client/discoverer/option.go | 14 + internal/client/v1/client/mirror/mirror.go | 90 + internal/client/v1/client/mirror/option.go | 45 + internal/config/lb.go | 29 + internal/config/mirror.go | 72 + internal/hash/hash.go | 25 + internal/hash/hash_test.go | 106 + internal/k8s/reconciler.go | 6 +- .../k8s/vald/mirror/api/v1/target_types.go | 175 + internal/k8s/vald/mirror/target/option.go | 93 + internal/k8s/vald/mirror/target/target.go | 144 + .../k8s/vald/mirror/target/target_template.go | 37 + .../mirror/target/target_template_option.go | 90 + .../grpc/interceptor/server/metric/metric.go | 2 +- internal/net/grpc/metadata.go | 34 + .../metrics/gateway/mirror/mirror.go | 77 + .../test/mock/client/mirror_client_mock.go | 52 + internal/test/mock/grpc/grpc_client_mock.go | 25 + internal/test/mock/k8s/controller_runtime.go | 100 + internal/test/mock/k8s/reconciler.go | 33 + pkg/gateway/lb/handler/grpc/aggregation.go | 3 +- pkg/gateway/lb/handler/grpc/handler.go | 12 +- pkg/gateway/lb/service/gateway.go | 22 +- pkg/gateway/lb/usecase/vald.go | 45 +- pkg/gateway/lb/usecase/vald_test.go | 91 + pkg/gateway/mirror/README.md | 1 + pkg/gateway/mirror/config/config.go | 76 + pkg/gateway/mirror/handler/doc.go | 14 + pkg/gateway/mirror/handler/grpc/handler.go | 3344 ++++++++++ .../mirror/handler/grpc/handler_test.go | 5574 +++++++++++++++++ pkg/gateway/mirror/handler/grpc/mock_test.go | 54 + pkg/gateway/mirror/handler/grpc/option.go | 106 + pkg/gateway/mirror/handler/rest/handler.go | 273 + pkg/gateway/mirror/handler/rest/option.go | 28 + pkg/gateway/mirror/router/option.go | 36 + pkg/gateway/mirror/router/router.go | 179 + pkg/gateway/mirror/service/discovery.go | 359 ++ .../mirror/service/discovery_option.go | 132 + pkg/gateway/mirror/service/discovery_test.go | 579 ++ pkg/gateway/mirror/service/doc.go | 14 + pkg/gateway/mirror/service/gateway.go | 177 + .../mirror/service/gateway_mock_test.go | 71 + pkg/gateway/mirror/service/mirror.go | 404 ++ .../mirror/service/mirror_mock_test.go | 49 + pkg/gateway/mirror/service/mirror_option.go | 89 + pkg/gateway/mirror/service/mirror_test.go | 1139 ++++ pkg/gateway/mirror/service/option.go | 58 + pkg/gateway/mirror/usecase/vald.go | 267 + .../job/correction/service/corrector_test.go | 4 + .../job/readreplica/rotate/service/rotator.go | 1 + 141 files changed, 22838 insertions(+), 688 deletions(-) create mode 100644 .github/actions/e2e-deploy-vald-readreplica/action.yaml create mode 100644 .github/helm/values/vald-mirror-target.yaml create mode 100644 .github/helm/values/values-mirror-01.yaml create mode 100644 .github/helm/values/values-mirror-02.yaml create mode 100644 .github/helm/values/values-readreplica.yaml create mode 100644 .github/workflows/dockers-gateway-mirror-image.yaml create mode 100644 apis/grpc/v1/mirror/mirror.pb.go create mode 100644 apis/grpc/v1/mirror/mirror_vtproto.pb.go create mode 100644 apis/proto/v1/mirror/mirror.proto create mode 100644 apis/swagger/v1/mirror/apis/proto/v1/mirror/mirror.swagger.json create mode 100644 apis/swagger/v1/mirror/mirror.swagger.json create mode 100644 assets/docs/overview/component/mirror-gateway/full-mesh-connection.png create mode 100644 assets/docs/overview/component/mirror-gateway/mirror-gateway.png create mode 100644 assets/docs/overview/component/mirror-gateway/request-forwarding.png create mode 100644 assets/docs/tutorial/vald-multicluster-on-k8s.png create mode 100644 charts/vald/crds/valdmirrortarget.yaml create mode 100644 charts/vald/schemas/mirror-target-values.yaml delete mode 100644 charts/vald/templates/gateway/filter/ing.yaml create mode 100644 charts/vald/templates/gateway/ing.yaml delete mode 100644 charts/vald/templates/gateway/lb/ing.yaml create mode 100644 charts/vald/templates/gateway/mirror/clusterrole.yaml create mode 100644 charts/vald/templates/gateway/mirror/clusterrolebinding.yaml create mode 100644 charts/vald/templates/gateway/mirror/configmap.yaml create mode 100644 charts/vald/templates/gateway/mirror/daemonset.yaml create mode 100644 charts/vald/templates/gateway/mirror/deployment.yaml create mode 100644 charts/vald/templates/gateway/mirror/hpa.yaml create mode 100644 charts/vald/templates/gateway/mirror/networkpolicy.yaml create mode 100644 charts/vald/templates/gateway/mirror/pdb.yaml create mode 100644 charts/vald/templates/gateway/mirror/priorityclass.yaml create mode 100644 charts/vald/templates/gateway/mirror/serviceaccount.yaml create mode 100644 charts/vald/templates/gateway/mirror/svc.yaml create mode 100644 charts/vald/values/multi-vald/dev-vald-01.yaml create mode 100644 charts/vald/values/multi-vald/dev-vald-02.yaml create mode 100644 charts/vald/values/multi-vald/dev-vald-03.yaml create mode 100644 charts/vald/values/multi-vald/dev-vald-with-mirror.yaml create mode 100644 charts/vald/values/multi-vald/mirror-target.yaml create mode 100644 cmd/gateway/mirror/main.go create mode 100644 cmd/gateway/mirror/sample.yaml create mode 100644 dockers/gateway/mirror/Dockerfile create mode 100644 docs/api/mirror-gateway.md create mode 100644 docs/overview/component/mirror-gateway.md create mode 100644 docs/troubleshooting/mirror-gateway.md create mode 100644 docs/tutorial/vald-multicluster-on-k8s.md create mode 100644 docs/user-guides/mirroring-configuration.md create mode 100644 example/client/mirror/main.go create mode 100644 internal/client/v1/client/mirror/mirror.go create mode 100644 internal/client/v1/client/mirror/option.go create mode 100644 internal/config/mirror.go create mode 100644 internal/hash/hash.go create mode 100644 internal/hash/hash_test.go create mode 100644 internal/k8s/vald/mirror/api/v1/target_types.go create mode 100644 internal/k8s/vald/mirror/target/option.go create mode 100644 internal/k8s/vald/mirror/target/target.go create mode 100644 internal/k8s/vald/mirror/target/target_template.go create mode 100644 internal/k8s/vald/mirror/target/target_template_option.go create mode 100644 internal/net/grpc/metadata.go create mode 100644 internal/observability/metrics/gateway/mirror/mirror.go create mode 100644 internal/test/mock/client/mirror_client_mock.go create mode 100644 internal/test/mock/k8s/controller_runtime.go create mode 100644 internal/test/mock/k8s/reconciler.go create mode 100755 pkg/gateway/mirror/README.md create mode 100644 pkg/gateway/mirror/config/config.go create mode 100644 pkg/gateway/mirror/handler/doc.go create mode 100644 pkg/gateway/mirror/handler/grpc/handler.go create mode 100644 pkg/gateway/mirror/handler/grpc/handler_test.go create mode 100644 pkg/gateway/mirror/handler/grpc/mock_test.go create mode 100644 pkg/gateway/mirror/handler/grpc/option.go create mode 100644 pkg/gateway/mirror/handler/rest/handler.go create mode 100644 pkg/gateway/mirror/handler/rest/option.go create mode 100644 pkg/gateway/mirror/router/option.go create mode 100644 pkg/gateway/mirror/router/router.go create mode 100644 pkg/gateway/mirror/service/discovery.go create mode 100644 pkg/gateway/mirror/service/discovery_option.go create mode 100644 pkg/gateway/mirror/service/discovery_test.go create mode 100644 pkg/gateway/mirror/service/doc.go create mode 100644 pkg/gateway/mirror/service/gateway.go create mode 100644 pkg/gateway/mirror/service/gateway_mock_test.go create mode 100644 pkg/gateway/mirror/service/mirror.go create mode 100644 pkg/gateway/mirror/service/mirror_mock_test.go create mode 100644 pkg/gateway/mirror/service/mirror_option.go create mode 100644 pkg/gateway/mirror/service/mirror_test.go create mode 100644 pkg/gateway/mirror/service/option.go create mode 100644 pkg/gateway/mirror/usecase/vald.go diff --git a/.github/actions/detect-docker-image-tags/action.yaml b/.github/actions/detect-docker-image-tags/action.yaml index 9ffe91135d..c9f8c5c819 100644 --- a/.github/actions/detect-docker-image-tags/action.yaml +++ b/.github/actions/detect-docker-image-tags/action.yaml @@ -48,6 +48,7 @@ runs: ["vdaas/vald-agent-sidecar"]="agent.sidecar.image.tag" ["vdaas/vald-discoverer-k8s"]="discoverer.image.tag" ["vdaas/vald-lb-gateway"]="gateway.lb.image.tag" + ["vdaas/vald-mirror-gateway"]="gateway.mirror.image.tag" ["vdaas/vald-manager-index"]="manager.index.image.tag" ["vdaas/vald-index-creation"]="manager.index.creator.image.tag" ["vdaas/vald-index-save"]="manager.index.saver.image.tag" diff --git a/.github/actions/e2e-deploy-vald-helm-operator/action.yaml b/.github/actions/e2e-deploy-vald-helm-operator/action.yaml index 30bc2d0feb..8b49d45082 100644 --- a/.github/actions/e2e-deploy-vald-helm-operator/action.yaml +++ b/.github/actions/e2e-deploy-vald-helm-operator/action.yaml @@ -75,7 +75,7 @@ runs: ${HELM_EXTRA_OPTIONS} \ charts/vald-helm-operator/. - sleep 3 + sleep 6 env: DEFAULT_IMAGE_TAG: ${{ inputs.default_image_tag }} HELM_EXTRA_OPTIONS: ${{ inputs.helm_extra_options }} @@ -97,7 +97,7 @@ runs: run: | kubectl apply -f ${VALDRELEASE} - sleep 3 + sleep 6 kubectl wait --for=condition=ready pod -l ${WAIT_FOR_SELECTOR} --timeout=${WAIT_FOR_TIMEOUT} diff --git a/.github/actions/e2e-deploy-vald-readreplica/action.yaml b/.github/actions/e2e-deploy-vald-readreplica/action.yaml new file mode 100644 index 0000000000..4bbe1316c5 --- /dev/null +++ b/.github/actions/e2e-deploy-vald-readreplica/action.yaml @@ -0,0 +1,128 @@ +# +# Copyright (C) 2019-2024 vdaas.org vald team +# +# 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 +# +# https://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. +# +name: "Deploy Vald Read Replica for E2E test" +description: "A action to deploy vald read replica for E2E test" + +inputs: + require_minio: + description: "If Minio is required, set this to true." + required: false + default: "false" + helm_extra_options: + description: "Extra options that passed to Helm command." + required: false + default: "" + values: + description: "Path to the values.yaml that passed to Helm command." + required: false + default: "false" + wait_for_selector: + description: "Label selector used for specifying a pod waited for" + required: false + default: "app=vald-lb-gateway" + wait_for_timeout: + description: "Timeout used for waiting for pods" + required: false + default: "600s" + use_local_charts: + description: "If you want to use local charts, set this to true." + required: false + default: "true" + default_image_tag: + description: "Default image tag. e.g) nightly, vx.x, vx.x.x" + required: true + default: "nightly" +outputs: + POD_NAME: + description: "A pod name that waited for" + value: ${{ steps.get_real_pod_name.outputs.POD_NAME }} + +runs: + using: "composite" + steps: + - name: Deploy Minio + id: deploy_minio + shell: bash + if: ${{ inputs.require_minio == 'true' }} + run: | + make K8S_SLEEP_DURATION_FOR_WAIT_COMMAND=10 k8s/external/minio/deploy + + - name: Dump Helm values + shell: bash + run: | + cat ${{ inputs.values }} + + - name: Deploy vald read replica from remote charts + shell: bash + id: deploy_vald_readreplica_remote + if: ${{ inputs.use_local_charts == 'false' }} + run: | + helm install \ + --values ${VALUES} \ + --set defaults.image.tag=${DEFAULT_IMAGE_TAG} \ + ${HELM_EXTRA_OPTIONS} \ + --generate-name charts/vald-readreplica + + sleep 3 + + kubectl wait --for=condition=ready pod -l ${WAIT_FOR_SELECTOR} --timeout=${WAIT_FOR_TIMEOUT} + + kubectl get pods + + podname=`kubectl get pods --selector=${WAIT_FOR_SELECTOR} | tail -1 | awk '{print $1}'` + echo "POD_NAME=${podname}" >> $GITHUB_OUTPUT + env: + DEFAULT_IMAGE_TAG: ${{ inputs.default_image_tag }} + VALUES: ${{ inputs.values }} + HELM_EXTRA_OPTIONS: ${{ inputs.helm_extra_options }} + WAIT_FOR_SELECTOR: ${{ inputs.wait_for_selector }} + WAIT_FOR_TIMEOUT: ${{ inputs.wait_for_timeout }} + + - name: Deploy vald read replica from local charts + shell: bash + id: deploy_vald_readreplica_local + if: ${{ inputs.use_local_charts == 'true' }} + run: | + make k8s/vald-readreplica/deploy VERSION=${DEFAULT_IMAGE_TAG} HELM_VALUES=${VALUES} HELM_EXTRA_OPTIONS="${HELM_EXTRA_OPTIONS}" + + sleep 3 + + kubectl wait --for=condition=ready pod -l ${WAIT_FOR_SELECTOR} --timeout=${WAIT_FOR_TIMEOUT} + + kubectl get pods + + podname=`kubectl get pods --selector=${WAIT_FOR_SELECTOR} | tail -1 | awk '{print $1}'` + echo "POD_NAME=${podname}" >> $GITHUB_OUTPUT + env: + DEFAULT_IMAGE_TAG: ${{ inputs.default_image_tag }} + VALUES: ${{ inputs.values }} + HELM_EXTRA_OPTIONS: ${{ inputs.helm_extra_options }} + WAIT_FOR_SELECTOR: ${{ inputs.wait_for_selector }} + WAIT_FOR_TIMEOUT: ${{ inputs.wait_for_timeout }} + + - name: Get real pod name + shell: bash + id: get_real_pod_name + env: + PODNAME_LOCAL_DEPLOY: ${{ steps.deploy_vald_readreplica_local.outputs.POD_NAME }} + PODNAME_REMOTE_DEPLOY: ${{ steps.deploy_vald_readreplica_remote.outputs.POD_NAME }} + # Set GITHUB_OUTPUT to the not empty one, PODNAME_LOCAL_DEPLOY or PODNAME_REMOTE_DEPLOY + run: | + if [[ -n "${PODNAME_LOCAL_DEPLOY}" ]]; then + echo "POD_NAME=${PODNAME_LOCAL_DEPLOY}" >> $GITHUB_OUTPUT + else + echo "POD_NAME=${PODNAME_REMOTE_DEPLOY}" >> $GITHUB_OUTPUT + fi diff --git a/.github/actions/e2e-deploy-vald/action.yaml b/.github/actions/e2e-deploy-vald/action.yaml index 6ba3b275e6..e442119c4c 100644 --- a/.github/actions/e2e-deploy-vald/action.yaml +++ b/.github/actions/e2e-deploy-vald/action.yaml @@ -29,6 +29,9 @@ inputs: description: "Path to the values.yaml that passed to Helm command." required: false default: "false" + namespace: + description: "Namespace to deploy." + required: false wait_for_selector: description: "Label selector used for specifying a pod waited for" required: false @@ -65,6 +68,14 @@ runs: run: | cat ${{ inputs.values }} + - name: Change namespace + if: ${{ inputs.namespace != '' }} + shell: bash + run: | + kubectl create ns ${NAMESPACE} ; kubectl config set-context --current --namespace=${NAMESPACE} + env: + NAMESPACE: ${{ inputs.namespace }} + - name: Deploy vald from remote charts shell: bash id: deploy_vald_remote diff --git a/.github/actions/setup-e2e/action.yaml b/.github/actions/setup-e2e/action.yaml index a2a17bbcef..e851cb3a13 100644 --- a/.github/actions/setup-e2e/action.yaml +++ b/.github/actions/setup-e2e/action.yaml @@ -33,6 +33,10 @@ inputs: description: "If k3d is not required, set this to false" required: false default: "true" + require_minikube: + description: "If minikube is not required, set this to true and set require_k3d to false" + required: false + default: "false" ingress_port: description: 'If it is not "0", ingress will be exposed to the specified port' required: false @@ -94,6 +98,16 @@ runs: agents: 3 ingress_port: ${{ inputs.ingress_port }} + # TODO: minikubeでもagentsやingress_portのようなオプションは必要なのか + # TODO: PVCはオプショナルなのでそれを追加する必要がある + - name: Setup Minikube environment + if: ${{ inputs.require_minikube == 'true' }} + # uses: medyagh/setup-minikube@master + shell: bash + run: | + make minikube/install + make minikube/start + - name: Check Kubernetes cluster shell: bash run: | diff --git a/.github/helm/values/vald-mirror-target.yaml b/.github/helm/values/vald-mirror-target.yaml new file mode 100644 index 0000000000..48f24eaaac --- /dev/null +++ b/.github/helm/values/vald-mirror-target.yaml @@ -0,0 +1,24 @@ +# +# Copyright (C) 2019-2024 vdaas.org vald team +# +# 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 +# +# https://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. +# +apiVersion: vald.vdaas.org/v1 +kind: ValdMirrorTarget +metadata: + name: mirror-target-02 +spec: + colocation: dc1 + target: + host: vald-mirror-gateway.vald-02.svc.cluster.local + port: 8081 diff --git a/.github/helm/values/values-mirror-01.yaml b/.github/helm/values/values-mirror-01.yaml new file mode 100644 index 0000000000..69a336cd58 --- /dev/null +++ b/.github/helm/values/values-mirror-01.yaml @@ -0,0 +1,81 @@ +# +# Copyright (C) 2019-2024 vdaas.org vald team +# +# 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 +# +# https://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. +# + +defaults: + logging: + level: info + networkPolicy: + enabled: false + +gateway: + mirror: + enabled: true + clusterRoleBinding: + name: vald-mirror-01 + serviceAccount: + name: vald-mirror-01 + lb: + enabled: true + minReplicas: 1 + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + gateway_config: + index_replica: 3 + +agent: + minReplicas: 3 + maxReplicas: 10 + podManagementPolicy: Parallel + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + ngt: + auto_index_duration_limit: 2m + auto_index_check_duration: 30s + auto_index_length: 1000 + dimension: 784 + +discoverer: + minReplicas: 1 + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + clusterRoleBinding: + name: vald-01 + serviceAccount: + name: vald-01 + +manager: + index: + replicas: 1 + resources: + requests: + cpu: 100m + memory: 30Mi + indexer: + auto_index_duration_limit: 2m + auto_index_check_duration: 30s + auto_index_length: 1000 diff --git a/.github/helm/values/values-mirror-02.yaml b/.github/helm/values/values-mirror-02.yaml new file mode 100644 index 0000000000..29b0990b09 --- /dev/null +++ b/.github/helm/values/values-mirror-02.yaml @@ -0,0 +1,85 @@ +# +# Copyright (C) 2019-2024 vdaas.org vald team +# +# 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 +# +# https://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. +# + +defaults: + logging: + level: info + networkPolicy: + enabled: false + +gateway: + mirror: + enabled: true + clusterRole: + enabled: false + clusterRoleBinding: + name: vald-mirror-02 + serviceAccount: + name: vald-mirror-02 + lb: + enabled: true + minReplicas: 1 + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + gateway_config: + index_replica: 3 + +agent: + minReplicas: 3 + maxReplicas: 10 + podManagementPolicy: Parallel + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + ngt: + auto_index_duration_limit: 2m + auto_index_check_duration: 30s + auto_index_length: 1000 + dimension: 784 + +discoverer: + minReplicas: 1 + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + clusterRole: + enabled: false + clusterRoleBinding: + name: vald-02 + serviceAccount: + name: vald-02 + +manager: + index: + replicas: 1 + resources: + requests: + cpu: 100m + memory: 30Mi + indexer: + auto_index_duration_limit: 2m + auto_index_check_duration: 30s + auto_index_length: 1000 diff --git a/.github/helm/values/values-readreplica.yaml b/.github/helm/values/values-readreplica.yaml new file mode 100644 index 0000000000..2b85368cff --- /dev/null +++ b/.github/helm/values/values-readreplica.yaml @@ -0,0 +1,82 @@ +# +# Copyright (C) 2019-2024 vdaas.org vald team +# +# 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 +# +# https://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. +# + +defaults: + logging: + level: info + networkPolicy: + enabled: true + +gateway: + lb: + enabled: true + minReplicas: 1 + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + gateway_config: + index_replica: 3 + +agent: + minReplicas: 3 + maxReplicas: 10 + podManagementPolicy: Parallel + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + ngt: + auto_index_duration_limit: 2m + auto_index_check_duration: 30s + auto_index_length: 1000 + dimension: 784 + persistentVolume: + enabled: true + # For local-path-provisioner, we cannot use ReadWriteOncePod because it is not supported. + accessMode: ReadWriteOnce + storageClass: csi-hostpath-sc + size: 1Gi + readreplica: + enabled: true + snapshot_classname: "csi-hostpath-snapclass" + replica: 1 + + +discoverer: + minReplicas: 1 + hpa: + enabled: false + resources: + requests: + cpu: 100m + memory: 50Mi + +manager: + index: + replicas: 1 + resources: + requests: + cpu: 100m + memory: 30Mi + indexer: + auto_index_duration_limit: 2m + auto_index_check_duration: 30s + auto_index_length: 1000 diff --git a/.github/workflows/dockers-gateway-mirror-image.yaml b/.github/workflows/dockers-gateway-mirror-image.yaml new file mode 100644 index 0000000000..e3e137e3e8 --- /dev/null +++ b/.github/workflows/dockers-gateway-mirror-image.yaml @@ -0,0 +1,82 @@ +# +# Copyright (C) 2019-2024 vdaas.org vald team +# +# 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 +# +# https://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. +# +name: "Build docker image: gateway-mirror" +on: + push: + branches: + - main + tags: + - "*.*.*" + - "v*.*.*" + - "*.*.*-*" + - "v*.*.*-*" + paths: + - ".github/actions/docker-build/actions.yaml" + - ".github/workflows/dockers-gateway-mirror-image.yml" + - "go.mod" + - "go.sum" + - "internal/**" + - "!internal/**/*_test.go" + - "!internal/**/*_mock.go" + - "!internal/db/**" + - "!internal/k8s/**" + - "apis/grpc/**" + - "pkg/gateway/mirror/**" + - "cmd/gateway/mirror/**" + - "pkg/gateway/internal/**" + - "dockers/gateway/mirror/Dockerfile" + - "versions/GO_VERSION" + pull_request: + paths: + - ".github/actions/docker-build/actions.yaml" + - ".github/workflows/dockers-gateway-mirror-image.yml" + - "go.mod" + - "go.sum" + - "internal/**" + - "!internal/**/*_test.go" + - "!internal/**/*_mock.go" + - "!internal/db/**" + - "!internal/k8s/**" + - "apis/grpc/**" + - "pkg/gateway/mirror/**" + - "cmd/gateway/mirror/**" + - "pkg/gateway/internal/**" + - "dockers/gateway/mirror/Dockerfile" + - "versions/GO_VERSION" + pull_request_target: + paths: + - ".github/actions/docker-build/actions.yaml" + - ".github/workflows/dockers-gateway-mirror-image.yml" + - "go.mod" + - "go.sum" + - "internal/**" + - "!internal/**/*_test.go" + - "!internal/**/*_mock.go" + - "!internal/db/**" + - "!internal/k8s/**" + - "apis/grpc/**" + - "pkg/gateway/mirror/**" + - "cmd/gateway/nirror/**" + - "pkg/gateway/internal/**" + - "dockers/gateway/mirror/Dockerfile" + - "versions/GO_VERSION" + +jobs: + build: + uses: ./.github/workflows/_docker-image.yaml + with: + target: gateway-mirror + secrets: inherit diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 28f0722a11..7da676e622 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -319,8 +319,9 @@ jobs: env: POD_NAME: ${{ steps.deploy_vald.outputs.POD_NAME }} - e2e-agent-and-sidecar: - name: "E2E Agent & Sidecar test" + # TODO: readreplicaの再起動ロジック等をどこかに入れる + e2e-stream-crud-with-readreplica: + name: "E2E test (Stream CRUD with read replica)" needs: [dump-contexts-to-log] runs-on: ubuntu-latest timeout-minutes: 60 @@ -335,44 +336,117 @@ jobs: id: setup_e2e uses: ./.github/actions/setup-e2e with: - target_images: vdaas/vald-agent-ngt vdaas/vald-agent-sidecar + require_k3d: "false" + require_minikube: "true" - name: Deploy Vald id: deploy_vald uses: ./.github/actions/e2e-deploy-vald with: - default_image_tag: ${{ steps.setup_e2e.outputs.DEFAULT_IMAGE_TAG }} - require_minio: "true" helm_extra_options: ${{ steps.setup_e2e.outputs.HELM_EXTRA_OPTIONS }} - values: .github/helm/values/values-agent-sidecar.yaml + values: .github/helm/values/values-readreplica.yaml wait_for_selector: app=vald-agent-ngt - wait_for_timeout: 29m - - name: Run E2E Agent & Sidecar + - name: Deploy Vald Read Replica + id: deploy_vald_readreplica + uses: ./.github/actions/e2e-deploy-vald-readreplica + with: + default_image_tag: ${{ steps.setup_e2e.outputs.DEFAULT_IMAGE_TAG }} + helm_extra_options: ${{ steps.setup_e2e.outputs.HELM_EXTRA_OPTIONS }} + values: .github/helm/values/values-readreplica.yaml + wait_for_selector: app=vald-lb-gateway + + - name: Run E2E CRUD run: | make hack/benchmark/assets/dataset/${{ env.DATASET }} make E2E_BIND_PORT=8081 \ E2E_DATASET_NAME=${{ env.DATASET }} \ - E2E_INSERT_COUNT=10000 \ - E2E_SEARCH_COUNT=4000 \ - E2E_WAIT_FOR_CREATE_INDEX_DURATION=8m \ + E2E_INSERT_COUNT=10000\ + E2E_SEARCH_COUNT=10000 \ + E2E_SEARCH_BY_ID_COUNT=10000 \ + E2E_GET_OBJECT_COUNT=100 \ + E2E_UPDATE_COUNT=100 \ + E2E_UPSERT_COUNT=100 \ + E2E_REMOVE_COUNT=100 \ + E2E_WAIT_FOR_CREATE_INDEX_DURATION=3m \ E2E_TARGET_POD_NAME=${POD_NAME} \ E2E_TARGET_NAMESPACE=default \ - e2e/sidecar + e2e env: POD_NAME: ${{ steps.deploy_vald.outputs.POD_NAME }} + e2e-stream-crud-with-mirror: + name: "E2E test (Stream CRUD) with mirror" + needs: [dump-contexts-to-log] + runs-on: ubuntu-latest + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + + - name: Set Git config + run: | + git config --global --add safe.directory ${GITHUB_WORKSPACE} + + - name: Setup E2E environment + id: setup_e2e + uses: ./.github/actions/setup-e2e + with: + target_images: "vdaas/vald-agent-ngt vdaas/vald-discoverer-k8s vdaas/vald-lb-gateway vdaas/vald-manager-index vdaas/vald-mirror-gateway" + + - name: Deploy Vald-01 + id: deploy_vald_01 + uses: ./.github/actions/e2e-deploy-vald + with: + namespace: vald-01 + helm_extra_options: ${{ steps.setup_e2e.outputs.HELM_EXTRA_OPTIONS }} + values: .github/helm/values/values-mirror-01.yaml + wait_for_selector: app=vald-mirror-gateway + + - name: Deploy Vald-02 + id: deploy_vald_02 + uses: ./.github/actions/e2e-deploy-vald + with: + namespace: vald-02 + helm_extra_options: ${{ steps.setup_e2e.outputs.HELM_EXTRA_OPTIONS }} + values: .github/helm/values/values-mirror-02.yaml + wait_for_selector: app=vald-mirror-gateway + + - name: Deploy Mirror Target + run: | + kubectl apply -f .github/helm/values/vald-mirror-target.yaml -n vald-01 + sleep 5s + kubectl get pods -A && kubectl get vmt -o wide -A + + - name: Run E2E CRUD + run: | + make hack/benchmark/assets/dataset/${{ env.DATASET }} + make E2E_BIND_PORT=8081 \ + E2E_DATASET_NAME=${{ env.DATASET }} \ + E2E_INSERT_COUNT=10000\ + E2E_SEARCH_COUNT=10000 \ + E2E_SEARCH_BY_ID_COUNT=10000 \ + E2E_GET_OBJECT_COUNT=100 \ + E2E_UPDATE_COUNT=100 \ + E2E_UPSERT_COUNT=100 \ + E2E_REMOVE_COUNT=100 \ + E2E_WAIT_FOR_CREATE_INDEX_DURATION=3m \ + E2E_TARGET_POD_NAME=${POD_NAME} \ + E2E_TARGET_NAMESPACE=vald-01 \ + e2e + env: + POD_NAME: ${{ steps.deploy_vald_01.outputs.POD_NAME }} + slack-notification: name: "Slack notification" if: startsWith( github.ref, 'refs/tags/') needs: - - e2e-agent-and-sidecar - e2e-jobs - e2e-multiapis-crud - e2e-stream-crud - e2e-stream-crud-for-operator - e2e-stream-crud-skip-exist-check - e2e-stream-crud-under-index-management-jobs + - e2e-stream-crud-with-mirror runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/Makefile b/Makefile index b072ea28a7..7d6227297c 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ CI_CONTAINER_IMAGE = $(NAME)-ci-container DEV_CONTAINER_IMAGE = $(NAME)-dev-container DISCOVERER_IMAGE = $(NAME)-discoverer-k8s FILTER_GATEWAY_IMAGE = $(NAME)-filter-gateway +MIRROR_GATEWAY_IMAGE = $(NAME)-mirror-gateway HELM_OPERATOR_IMAGE = $(NAME)-helm-operator LB_GATEWAY_IMAGE = $(NAME)-lb-gateway LOADTEST_IMAGE = $(NAME)-loadtest @@ -305,7 +306,7 @@ E2E_UPSERT_COUNT ?= 10 E2E_REMOVE_COUNT ?= 3 E2E_WAIT_FOR_CREATE_INDEX_DURATION ?= 8m E2E_TARGET_NAME ?= vald-lb-gateway -E2E_TARGET_POD_NAME ?= $(eval E2E_TARGET_POD_NAME := $(shell kubectl get pods --selector=app=$(E2E_TARGET_NAME) | tail -1 | cut -f1 -d " "))$(E2E_TARGET_POD_NAME) +E2E_TARGET_POD_NAME ?= $(eval E2E_TARGET_POD_NAME := $(shell kubectl get pods --selector=app=$(E2E_TARGET_NAME) -n $(E2E_TARGET_NAMESPACE) | tail -1 | cut -f1 -d " "))$(E2E_TARGET_POD_NAME) E2E_TARGET_NAMESPACE ?= default E2E_TARGET_PORT ?= 8081 E2E_PORTFORWARD_ENABLED ?= true diff --git a/Makefile.d/build.mk b/Makefile.d/build.mk index 4cbd8e842b..e12219a943 100644 --- a/Makefile.d/build.mk +++ b/Makefile.d/build.mk @@ -179,6 +179,34 @@ cmd/gateway/filter/filter: \ $(dir $@)main.go $@ -version +cmd/gateway/mirror/mirror: \ + $(GO_SOURCES_INTERNAL) \ + $(PBGOS) \ + $(shell find ./cmd/gateway/mirror -type f -name '*.go' -not -name '*_test.go' -not -name 'doc.go') \ + $(shell find ./pkg/gateway/mirror -type f -name '*.go' -not -name '*_test.go' -not -name 'doc.go') + CGO_ENABLED=0 \ + GO111MODULE=on \ + GOPRIVATE=$(GOPRIVATE) \ + go build \ + --ldflags "-w -extldflags=-static \ + -X '$(GOPKG)/internal/info.Version=$(VERSION)' \ + -X '$(GOPKG)/internal/info.GitCommit=$(GIT_COMMIT)' \ + -X '$(GOPKG)/internal/info.BuildTime=$(DATETIME)' \ + -X '$(GOPKG)/internal/info.GoVersion=$(GO_VERSION)' \ + -X '$(GOPKG)/internal/info.GoOS=$(GOOS)' \ + -X '$(GOPKG)/internal/info.GoArch=$(GOARCH)' \ + -X '$(GOPKG)/internal/info.CGOEnabled=$${CGO_ENABLED}' \ + -X '$(GOPKG)/internal/info.BuildCPUInfoFlags=$(CPU_INFO_FLAGS)' \ + -buildid=" \ + -mod=readonly \ + -modcacherw \ + -a \ + -tags "osusergo netgo static_build" \ + -trimpath \ + -o $@ \ + $(dir $@)main.go + $@ -version + cmd/manager/index/index: \ $(GO_SOURCES_INTERNAL) \ $(PBGOS) \ diff --git a/Makefile.d/docker.mk b/Makefile.d/docker.mk index cc45bfbd6b..922275438f 100644 --- a/Makefile.d/docker.mk +++ b/Makefile.d/docker.mk @@ -129,6 +129,17 @@ docker/build/gateway-filter: IMAGE=$(FILTER_GATEWAY_IMAGE) \ docker/build/image +.PHONY: docker/name/gateway-mirror +docker/name/gateway-mirror: + @echo "$(ORG)/$(MIRROR_GATEWAY_IMAGE)" + +.PHONY: docker/build/gateway-mirror +## build gateway-mirror image +docker/build/gateway-mirror: + @make DOCKERFILE="$(ROOTDIR)/dockers/gateway/mirror/Dockerfile" \ + IMAGE=$(MIRROR_GATEWAY_IMAGE) \ + docker/build/image + .PHONY: docker/name/manager-index docker/name/manager-index: @echo "$(ORG)/$(MANAGER_INDEX_IMAGE)" diff --git a/Makefile.d/helm.mk b/Makefile.d/helm.mk index 4f781debb9..29159bcdc9 100644 --- a/Makefile.d/helm.mk +++ b/Makefile.d/helm.mk @@ -163,6 +163,17 @@ helm/schema/crd/vald-helm-operator: \ $(BINDIR)/yq eval-all 'select(fileIndex==0).spec.versions[0].schema.openAPIV3Schema.properties.spec = select(fileIndex==1).spec | select(fileIndex==0)' \ $(TEMP_DIR)/valdhelmoperatorrelease.yaml $(TEMP_DIR)/valdhelmoperatorrelease-spec.yaml > charts/vald-helm-operator/crds/valdhelmoperatorrelease.yaml +.PHONY: helm/schema/crd/vald/mirror-target +## generate OpenAPI v3 schema for ValdMirrorTarget +helm/schema/crd/vald/mirror-target: \ + yq/install + mv charts/vald/crds/valdmirrortarget.yaml $(TEMP_DIR)/valdmirrortarget.yaml + GOPRIVATE=$(GOPRIVATE) \ + go run -mod=readonly hack/helm/schema/crd/main.go \ + charts/vald/schemas/mirror-target-values.yaml > $(TEMP_DIR)/valdmirrortarget-spec.yaml + $(BINDIR)/yq eval-all 'select(fileIndex==0).spec.versions[0].schema.openAPIV3Schema.properties.spec = select(fileIndex==1).spec | select(fileIndex==0)' \ + $(TEMP_DIR)/valdmirrortarget.yaml $(TEMP_DIR)/valdmirrortarget-spec.yaml > charts/vald/crds/valdmirrortarget.yaml + .PHONY: helm/schema/crd/vald-benchmark-job ## generate OpenAPI v3 schema for ValdBenchmarkJobRelease helm/schema/crd/vald-benchmark-job: \ diff --git a/Makefile.d/k8s.mk b/Makefile.d/k8s.mk index 2a1b419c2d..f7ca5d4a6d 100644 --- a/Makefile.d/k8s.mk +++ b/Makefile.d/k8s.mk @@ -15,6 +15,10 @@ # JAEGER_OPERATOR_WAIT_DURATION := 0 +MIRROR01_NAMESPACE = vald-01 +MIRROR02_NAMESPACE = vald-02 +MIRROR03_NAMESPACE = vald-03 +MIRROR_APP_NAME = vald-mirror-gateway .PHONY: k8s/manifest/clean ## clean k8s manifests @@ -41,7 +45,7 @@ k8s/manifest/update: \ mkdir -p k8s/index/job/readreplica mv $(TEMP_DIR)/vald/templates/agent k8s/agent mv $(TEMP_DIR)/vald/templates/discoverer k8s/discoverer - mv $(TEMP_DIR)/vald/templates/gateway/lb k8s/gateway/lb + mv $(TEMP_DIR)/vald/templates/gateway k8s/gateway mv $(TEMP_DIR)/vald/templates/manager/index k8s/manager/index mv $(TEMP_DIR)/vald/templates/index/job/correction k8s/index/job/correction mv $(TEMP_DIR)/vald/templates/index/job/creation k8s/index/job/creation @@ -96,10 +100,12 @@ k8s/vald/deploy: --set discoverer.image.repository=$(CRORG)/$(DISCOVERER_IMAGE) \ --set gateway.filter.image.repository=$(CRORG)/$(FILTER_GATEWAY_IMAGE) \ --set gateway.lb.image.repository=$(CRORG)/$(LB_GATEWAY_IMAGE) \ + --set gateway.mirror.image.repository=$(CRORG)/$(MIRROR_GATEWAY_IMAGE) \ --set manager.index.image.repository=$(CRORG)/$(MANAGER_INDEX_IMAGE) \ --set manager.index.creator.image.repository=$(CRORG)/$(INDEX_CREATION_IMAGE) \ --set manager.index.saver.image.repository=$(CRORG)/$(INDEX_SAVE_IMAGE) \ $(HELM_EXTRA_OPTIONS) \ + --include-crds \ --output-dir $(TEMP_DIR) \ charts/vald @echo "Permitting error because there's some cases nothing to apply" @@ -107,7 +113,10 @@ k8s/vald/deploy: kubectl apply -f $(TEMP_DIR)/vald/templates/agent || true kubectl apply -f $(TEMP_DIR)/vald/templates/agent/readreplica || true kubectl apply -f $(TEMP_DIR)/vald/templates/discoverer || true + kubectl apply -f $(TEMP_DIR)/vald/templates/gateway || true kubectl apply -f $(TEMP_DIR)/vald/templates/gateway/lb || true + kubectl apply -f $(TEMP_DIR)/vald/crds || true + kubectl apply -f $(TEMP_DIR)/vald/templates/gateway/mirror || true kubectl apply -f $(TEMP_DIR)/vald/templates/index/job/correction || true kubectl apply -f $(TEMP_DIR)/vald/templates/index/job/creation || true kubectl apply -f $(TEMP_DIR)/vald/templates/index/job/save || true @@ -126,22 +135,59 @@ k8s/vald/delete: --set discoverer.image.repository=$(CRORG)/$(DISCOVERER_IMAGE) \ --set gateway.filter.image.repository=$(CRORG)/$(FILTER_GATEWAY_IMAGE) \ --set gateway.lb.image.repository=$(CRORG)/$(LB_GATEWAY_IMAGE) \ + --set gateway.mirror.image.repository=$(CRORG)/$(MIRROR_GATEWAY_IMAGE) \ --set manager.index.image.repository=$(CRORG)/$(MANAGER_INDEX_IMAGE) \ + --include-crds \ --output-dir $(TEMP_DIR) \ charts/vald + kubectl delete -f $(TEMP_DIR)/vald/templates/gateway/mirror kubectl delete -f $(TEMP_DIR)/vald/templates/index/job/readreplica/rotate kubectl delete -f $(TEMP_DIR)/vald/templates/index/job/save kubectl delete -f $(TEMP_DIR)/vald/templates/index/job/creation kubectl delete -f $(TEMP_DIR)/vald/templates/index/job/correction kubectl delete -f $(TEMP_DIR)/vald/templates/index/job/creation kubectl delete -f $(TEMP_DIR)/vald/templates/index/job/save + kubectl delete -f $(TEMP_DIR)/vald/templates/gateway kubectl delete -f $(TEMP_DIR)/vald/templates/gateway/lb kubectl delete -f $(TEMP_DIR)/vald/templates/manager/index kubectl delete -f $(TEMP_DIR)/vald/templates/discoverer kubectl delete -f $(TEMP_DIR)/vald/templates/agent/readreplica || true kubectl delete -f $(TEMP_DIR)/vald/templates/agent + kubectl delete -f $(TEMP_DIR)/vald/crds rm -rf $(TEMP_DIR) +.PHONY: k8s/multi/vald/deploy +## deploy multiple vald sample clusters to k8s +k8s/multi/vald/deploy: + -@kubectl create ns $(MIRROR01_NAMESPACE) + -@kubectl create ns $(MIRROR02_NAMESPACE) + -@kubectl create ns $(MIRROR03_NAMESPACE) + helm install vald-cluster-01 charts/vald \ + -f ./charts/vald/values/multi-vald/dev-vald-with-mirror.yaml \ + -f ./charts/vald/values/multi-vald/dev-vald-01.yaml \ + -n $(MIRROR01_NAMESPACE) + helm install vald-cluster-02 charts/vald \ + -f ./charts/vald/values/multi-vald/dev-vald-with-mirror.yaml \ + -f ./charts/vald/values/multi-vald/dev-vald-02.yaml \ + -n $(MIRROR02_NAMESPACE) + helm install vald-cluster-03 charts/vald \ + -f ./charts/vald/values/multi-vald/dev-vald-with-mirror.yaml \ + -f ./charts/vald/values/multi-vald/dev-vald-03.yaml \ + -n $(MIRROR03_NAMESPACE) + kubectl wait --for=condition=ready pod -l app=$(MIRROR_APP_NAME) --timeout=120s -n $(MIRROR01_NAMESPACE) + kubectl wait --for=condition=ready pod -l app=$(MIRROR_APP_NAME) --timeout=120s -n $(MIRROR02_NAMESPACE) + kubectl wait --for=condition=ready pod -l app=$(MIRROR_APP_NAME) --timeout=120s -n $(MIRROR03_NAMESPACE) + kubectl apply -f ./charts/vald/values/multi-vald/mirror-target.yaml \ + -n $(MIRROR03_NAMESPACE) + +.PHONY: k8s/multi/vald/delete +## delete multiple vald sample clusters to k8s +k8s/multi/vald/delete: + helm uninstall vald-cluster-01 -n vald-01 + helm uninstall vald-cluster-02 -n vald-02 + helm uninstall vald-cluster-03 -n vald-03 + -@kubectl delete ns vald-01 vald-02 vald-03 + .PHONY: k8s/vald-helm-operator/deploy ## deploy vald-helm-operator to k8s k8s/vald-helm-operator/deploy: diff --git a/apis/docs/v1/docs.md b/apis/docs/v1/docs.md index 80245dd00c..3cdd7ab520 100644 --- a/apis/docs/v1/docs.md +++ b/apis/docs/v1/docs.md @@ -40,6 +40,9 @@ - [Insert.MultiRequest](#payload-v1-Insert-MultiRequest) - [Insert.ObjectRequest](#payload-v1-Insert-ObjectRequest) - [Insert.Request](#payload-v1-Insert-Request) + - [Mirror](#payload-v1-Mirror) + - [Mirror.Target](#payload-v1-Mirror-Target) + - [Mirror.Targets](#payload-v1-Mirror-Targets) - [Object](#payload-v1-Object) - [Object.Blob](#payload-v1-Object-Blob) - [Object.Distance](#payload-v1-Object-Distance) @@ -104,6 +107,8 @@ - [Filter](#filter-ingress-v1-Filter) - [v1/manager/index/index_manager.proto](#v1_manager_index_index_manager-proto) - [Index](#manager-index-v1-Index) +- [v1/mirror/mirror.proto](#v1_mirror_mirror-proto) + - [Mirror](#mirror-v1-Mirror) - [v1/rpc/errdetails/error_details.proto](#v1_rpc_errdetails_error_details-proto) - [BadRequest](#rpc-v1-BadRequest) - [BadRequest.FieldViolation](#rpc-v1-BadRequest-FieldViolation) @@ -480,6 +485,33 @@ Represent the insert request. | vector | [Object.Vector](#payload-v1-Object-Vector) | | The vector to be inserted. | | config | [Insert.Config](#payload-v1-Insert-Config) | | The configuration of the insert request. | + + +### Mirror + +Mirror related messages. + + + +### Mirror.Target + +Represent server information. + +| Field | Type | Label | Description | +| ----- | ----------------- | ----- | -------------------- | +| host | [string](#string) | | The target hostname. | +| port | [uint32](#uint32) | | The target port. | + + + +### Mirror.Targets + +Represent the multiple Target message. + +| Field | Type | Label | Description | +| ------- | ------------------------------------------ | -------- | -------------------------------- | +| targets | [Mirror.Target](#payload-v1-Mirror-Target) | repeated | The multiple target information. | + ### Object @@ -1113,6 +1145,36 @@ Represent the index manager service. | ----------- | -------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------- | | IndexInfo | [.payload.v1.Empty](#payload-v1-Empty) | [.payload.v1.Info.Index.Count](#payload-v1-Info-Index-Count) | Represent the RPC to get the index information. | + + +

Top

+ +## v1/mirror/mirror.proto + +Copyright (C) 2019-2024 vdaas.org vald team <vald@vdaas.org> + +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 + +https://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. + + + +### Mirror + +Represent the mirror service. + +| Method Name | Request Type | Response Type | Description | +| ----------- | -------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------- | +| Register | [.payload.v1.Mirror.Targets](#payload-v1-Mirror-Targets) | [.payload.v1.Mirror.Targets](#payload-v1-Mirror-Targets) | Register is the RPC to register other mirror servers. | +

Top

diff --git a/apis/grpc/v1/agent/core/agent.pb.go b/apis/grpc/v1/agent/core/agent.pb.go index ce90f86ffa..3541c8b8f0 100644 --- a/apis/grpc/v1/agent/core/agent.pb.go +++ b/apis/grpc/v1/agent/core/agent.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/agent/core/agent.proto diff --git a/apis/grpc/v1/agent/sidecar/sidecar.pb.go b/apis/grpc/v1/agent/sidecar/sidecar.pb.go index 421f6a8a55..b6b3ad1053 100644 --- a/apis/grpc/v1/agent/sidecar/sidecar.pb.go +++ b/apis/grpc/v1/agent/sidecar/sidecar.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/agent/sidecar/sidecar.proto diff --git a/apis/grpc/v1/discoverer/discoverer.pb.go b/apis/grpc/v1/discoverer/discoverer.pb.go index 851f665368..fe6cc80593 100644 --- a/apis/grpc/v1/discoverer/discoverer.pb.go +++ b/apis/grpc/v1/discoverer/discoverer.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/discoverer/discoverer.proto diff --git a/apis/grpc/v1/filter/egress/egress_filter.pb.go b/apis/grpc/v1/filter/egress/egress_filter.pb.go index 607517e3e1..fa0e9725a4 100644 --- a/apis/grpc/v1/filter/egress/egress_filter.pb.go +++ b/apis/grpc/v1/filter/egress/egress_filter.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/filter/egress/egress_filter.proto diff --git a/apis/grpc/v1/filter/ingress/ingress_filter.pb.go b/apis/grpc/v1/filter/ingress/ingress_filter.pb.go index d223b6de6c..ee4a3a302b 100644 --- a/apis/grpc/v1/filter/ingress/ingress_filter.pb.go +++ b/apis/grpc/v1/filter/ingress/ingress_filter.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/filter/ingress/ingress_filter.proto diff --git a/apis/grpc/v1/manager/index/index_manager.pb.go b/apis/grpc/v1/manager/index/index_manager.pb.go index 5c239f8a28..2ddc40a16b 100644 --- a/apis/grpc/v1/manager/index/index_manager.pb.go +++ b/apis/grpc/v1/manager/index/index_manager.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/manager/index/index_manager.proto diff --git a/apis/grpc/v1/mirror/mirror.pb.go b/apis/grpc/v1/mirror/mirror.pb.go new file mode 100644 index 0000000000..69f1516db7 --- /dev/null +++ b/apis/grpc/v1/mirror/mirror.pb.go @@ -0,0 +1,100 @@ +// +// Copyright (C) 2019-2024 vdaas.org vald team +// +// 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 +// +// https://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.32.0 +// protoc (unknown) +// source: v1/mirror/mirror.proto + +package mirror + +import ( + reflect "reflect" + + payload "github.com/vdaas/vald/apis/grpc/v1/payload" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +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) +) + +var File_v1_mirror_mirror_proto protoreflect.FileDescriptor + +var file_v1_mirror_mirror_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x2f, 0x6d, 0x69, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x18, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2f, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x69, 0x0a, 0x06, 0x4d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x5f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x1a, 0x2e, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x1a, 0x1a, 0x2e, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x69, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x2f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x42, 0x57, 0x0a, 0x1c, 0x6f, 0x72, 0x67, 0x2e, 0x76, 0x64, + 0x61, 0x61, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0a, 0x56, 0x61, 0x6c, 0x64, 0x4d, 0x69, 0x72, 0x72, + 0x6f, 0x72, 0x50, 0x01, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x76, 0x64, 0x61, 0x61, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x73, + 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_v1_mirror_mirror_proto_goTypes = []interface{}{ + (*payload.Mirror_Targets)(nil), // 0: payload.v1.Mirror.Targets +} +var file_v1_mirror_mirror_proto_depIdxs = []int32{ + 0, // 0: mirror.v1.Mirror.Register:input_type -> payload.v1.Mirror.Targets + 0, // 1: mirror.v1.Mirror.Register:output_type -> payload.v1.Mirror.Targets + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_v1_mirror_mirror_proto_init() } +func file_v1_mirror_mirror_proto_init() { + if File_v1_mirror_mirror_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_v1_mirror_mirror_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_v1_mirror_mirror_proto_goTypes, + DependencyIndexes: file_v1_mirror_mirror_proto_depIdxs, + }.Build() + File_v1_mirror_mirror_proto = out.File + file_v1_mirror_mirror_proto_rawDesc = nil + file_v1_mirror_mirror_proto_goTypes = nil + file_v1_mirror_mirror_proto_depIdxs = nil +} diff --git a/apis/grpc/v1/mirror/mirror_vtproto.pb.go b/apis/grpc/v1/mirror/mirror_vtproto.pb.go new file mode 100644 index 0000000000..399c385d4b --- /dev/null +++ b/apis/grpc/v1/mirror/mirror_vtproto.pb.go @@ -0,0 +1,127 @@ +// +// Copyright (C) 2019-2024 vdaas.org vald team +// +// 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 +// +// https://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 mirror + +import ( + context "context" + + payload "github.com/vdaas/vald/apis/grpc/v1/payload" + codes "github.com/vdaas/vald/internal/net/grpc/codes" + status "github.com/vdaas/vald/internal/net/grpc/status" + grpc "google.golang.org/grpc" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +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) +) + +// 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 + +// MirrorClient is the client API for Mirror 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 MirrorClient interface { + // Register is the RPC to register other mirror servers. + Register(ctx context.Context, in *payload.Mirror_Targets, opts ...grpc.CallOption) (*payload.Mirror_Targets, error) +} + +type mirrorClient struct { + cc grpc.ClientConnInterface +} + +func NewMirrorClient(cc grpc.ClientConnInterface) MirrorClient { + return &mirrorClient{cc} +} + +func (c *mirrorClient) Register(ctx context.Context, in *payload.Mirror_Targets, opts ...grpc.CallOption) (*payload.Mirror_Targets, error) { + out := new(payload.Mirror_Targets) + err := c.cc.Invoke(ctx, "/mirror.v1.Mirror/Register", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MirrorServer is the server API for Mirror service. +// All implementations must embed UnimplementedMirrorServer +// for forward compatibility +type MirrorServer interface { + // Register is the RPC to register other mirror servers. + Register(context.Context, *payload.Mirror_Targets) (*payload.Mirror_Targets, error) + mustEmbedUnimplementedMirrorServer() +} + +// UnimplementedMirrorServer must be embedded to have forward compatible implementations. +type UnimplementedMirrorServer struct { +} + +func (UnimplementedMirrorServer) Register(context.Context, *payload.Mirror_Targets) (*payload.Mirror_Targets, error) { + return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") +} +func (UnimplementedMirrorServer) mustEmbedUnimplementedMirrorServer() {} + +// UnsafeMirrorServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MirrorServer will +// result in compilation errors. +type UnsafeMirrorServer interface { + mustEmbedUnimplementedMirrorServer() +} + +func RegisterMirrorServer(s grpc.ServiceRegistrar, srv MirrorServer) { + s.RegisterService(&Mirror_ServiceDesc, srv) +} + +func _Mirror_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(payload.Mirror_Targets) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MirrorServer).Register(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mirror.v1.Mirror/Register", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MirrorServer).Register(ctx, req.(*payload.Mirror_Targets)) + } + return interceptor(ctx, in, info, handler) +} + +// Mirror_ServiceDesc is the grpc.ServiceDesc for Mirror service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Mirror_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "mirror.v1.Mirror", + HandlerType: (*MirrorServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Register", + Handler: _Mirror_Register_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "v1/mirror/mirror.proto", +} diff --git a/apis/grpc/v1/payload/payload.pb.go b/apis/grpc/v1/payload/payload.pb.go index db70fd3d64..5e94a4f000 100644 --- a/apis/grpc/v1/payload/payload.pb.go +++ b/apis/grpc/v1/payload/payload.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/payload/payload.proto @@ -550,6 +550,45 @@ func (*Info) Descriptor() ([]byte, []int) { return file_v1_payload_payload_proto_rawDescGZIP(), []int{9} } +// Mirror related messages. +type Mirror struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Mirror) Reset() { + *x = Mirror{} + if protoimpl.UnsafeEnabled { + mi := &file_v1_payload_payload_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Mirror) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Mirror) ProtoMessage() {} + +func (x *Mirror) ProtoReflect() protoreflect.Message { + mi := &file_v1_payload_payload_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 Mirror.ProtoReflect.Descriptor instead. +func (*Mirror) Descriptor() ([]byte, []int) { + return file_v1_payload_payload_proto_rawDescGZIP(), []int{10} +} + // Represent an empty message. type Empty struct { state protoimpl.MessageState @@ -560,7 +599,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[10] + mi := &file_v1_payload_payload_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -573,7 +612,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[10] + mi := &file_v1_payload_payload_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -586,7 +625,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_v1_payload_payload_proto_rawDescGZIP(), []int{10} + return file_v1_payload_payload_proto_rawDescGZIP(), []int{11} } // Represent a search request. @@ -604,7 +643,7 @@ type Search_Request struct { func (x *Search_Request) Reset() { *x = Search_Request{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[11] + mi := &file_v1_payload_payload_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -617,7 +656,7 @@ func (x *Search_Request) String() string { func (*Search_Request) ProtoMessage() {} func (x *Search_Request) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[11] + mi := &file_v1_payload_payload_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -660,7 +699,7 @@ type Search_MultiRequest struct { func (x *Search_MultiRequest) Reset() { *x = Search_MultiRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[12] + mi := &file_v1_payload_payload_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -673,7 +712,7 @@ func (x *Search_MultiRequest) String() string { func (*Search_MultiRequest) ProtoMessage() {} func (x *Search_MultiRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[12] + mi := &file_v1_payload_payload_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -711,7 +750,7 @@ type Search_IDRequest struct { func (x *Search_IDRequest) Reset() { *x = Search_IDRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[13] + mi := &file_v1_payload_payload_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -724,7 +763,7 @@ func (x *Search_IDRequest) String() string { func (*Search_IDRequest) ProtoMessage() {} func (x *Search_IDRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[13] + mi := &file_v1_payload_payload_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -767,7 +806,7 @@ type Search_MultiIDRequest struct { func (x *Search_MultiIDRequest) Reset() { *x = Search_MultiIDRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[14] + mi := &file_v1_payload_payload_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -780,7 +819,7 @@ func (x *Search_MultiIDRequest) String() string { func (*Search_MultiIDRequest) ProtoMessage() {} func (x *Search_MultiIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[14] + mi := &file_v1_payload_payload_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -820,7 +859,7 @@ type Search_ObjectRequest struct { func (x *Search_ObjectRequest) Reset() { *x = Search_ObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[15] + mi := &file_v1_payload_payload_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -833,7 +872,7 @@ func (x *Search_ObjectRequest) String() string { func (*Search_ObjectRequest) ProtoMessage() {} func (x *Search_ObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[15] + mi := &file_v1_payload_payload_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -883,7 +922,7 @@ type Search_MultiObjectRequest struct { func (x *Search_MultiObjectRequest) Reset() { *x = Search_MultiObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[16] + mi := &file_v1_payload_payload_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -896,7 +935,7 @@ func (x *Search_MultiObjectRequest) String() string { func (*Search_MultiObjectRequest) ProtoMessage() {} func (x *Search_MultiObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[16] + mi := &file_v1_payload_payload_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -948,7 +987,7 @@ type Search_Config struct { func (x *Search_Config) Reset() { *x = Search_Config{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[17] + mi := &file_v1_payload_payload_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -961,7 +1000,7 @@ func (x *Search_Config) String() string { func (*Search_Config) ProtoMessage() {} func (x *Search_Config) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[17] + mi := &file_v1_payload_payload_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1055,7 +1094,7 @@ type Search_Response struct { func (x *Search_Response) Reset() { *x = Search_Response{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[18] + mi := &file_v1_payload_payload_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1068,7 +1107,7 @@ func (x *Search_Response) String() string { func (*Search_Response) ProtoMessage() {} func (x *Search_Response) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[18] + mi := &file_v1_payload_payload_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1111,7 +1150,7 @@ type Search_Responses struct { func (x *Search_Responses) Reset() { *x = Search_Responses{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[19] + mi := &file_v1_payload_payload_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1124,7 +1163,7 @@ func (x *Search_Responses) String() string { func (*Search_Responses) ProtoMessage() {} func (x *Search_Responses) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[19] + mi := &file_v1_payload_payload_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1163,7 +1202,7 @@ type Search_StreamResponse struct { func (x *Search_StreamResponse) Reset() { *x = Search_StreamResponse{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[20] + mi := &file_v1_payload_payload_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1176,7 +1215,7 @@ func (x *Search_StreamResponse) String() string { func (*Search_StreamResponse) ProtoMessage() {} func (x *Search_StreamResponse) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[20] + mi := &file_v1_payload_payload_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1246,7 +1285,7 @@ type Filter_Target struct { func (x *Filter_Target) Reset() { *x = Filter_Target{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[21] + mi := &file_v1_payload_payload_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1259,7 +1298,7 @@ func (x *Filter_Target) String() string { func (*Filter_Target) ProtoMessage() {} func (x *Filter_Target) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[21] + mi := &file_v1_payload_payload_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1302,7 +1341,7 @@ type Filter_Config struct { func (x *Filter_Config) Reset() { *x = Filter_Config{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[22] + mi := &file_v1_payload_payload_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1315,7 +1354,7 @@ func (x *Filter_Config) String() string { func (*Filter_Config) ProtoMessage() {} func (x *Filter_Config) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[22] + mi := &file_v1_payload_payload_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1353,7 +1392,7 @@ type Insert_Request struct { func (x *Insert_Request) Reset() { *x = Insert_Request{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[23] + mi := &file_v1_payload_payload_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1366,7 +1405,7 @@ func (x *Insert_Request) String() string { func (*Insert_Request) ProtoMessage() {} func (x *Insert_Request) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[23] + mi := &file_v1_payload_payload_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1409,7 +1448,7 @@ type Insert_MultiRequest struct { func (x *Insert_MultiRequest) Reset() { *x = Insert_MultiRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[24] + mi := &file_v1_payload_payload_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1422,7 +1461,7 @@ func (x *Insert_MultiRequest) String() string { func (*Insert_MultiRequest) ProtoMessage() {} func (x *Insert_MultiRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[24] + mi := &file_v1_payload_payload_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1462,7 +1501,7 @@ type Insert_ObjectRequest struct { func (x *Insert_ObjectRequest) Reset() { *x = Insert_ObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[25] + mi := &file_v1_payload_payload_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1475,7 +1514,7 @@ func (x *Insert_ObjectRequest) String() string { func (*Insert_ObjectRequest) ProtoMessage() {} func (x *Insert_ObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[25] + mi := &file_v1_payload_payload_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1525,7 +1564,7 @@ type Insert_MultiObjectRequest struct { func (x *Insert_MultiObjectRequest) Reset() { *x = Insert_MultiObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[26] + mi := &file_v1_payload_payload_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1538,7 +1577,7 @@ func (x *Insert_MultiObjectRequest) String() string { func (*Insert_MultiObjectRequest) ProtoMessage() {} func (x *Insert_MultiObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[26] + mi := &file_v1_payload_payload_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1578,7 +1617,7 @@ type Insert_Config struct { func (x *Insert_Config) Reset() { *x = Insert_Config{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[27] + mi := &file_v1_payload_payload_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1591,7 +1630,7 @@ func (x *Insert_Config) String() string { func (*Insert_Config) ProtoMessage() {} func (x *Insert_Config) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[27] + mi := &file_v1_payload_payload_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1643,7 +1682,7 @@ type Update_Request struct { func (x *Update_Request) Reset() { *x = Update_Request{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[28] + mi := &file_v1_payload_payload_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1656,7 +1695,7 @@ func (x *Update_Request) String() string { func (*Update_Request) ProtoMessage() {} func (x *Update_Request) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[28] + mi := &file_v1_payload_payload_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1699,7 +1738,7 @@ type Update_MultiRequest struct { func (x *Update_MultiRequest) Reset() { *x = Update_MultiRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[29] + mi := &file_v1_payload_payload_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1712,7 +1751,7 @@ func (x *Update_MultiRequest) String() string { func (*Update_MultiRequest) ProtoMessage() {} func (x *Update_MultiRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[29] + mi := &file_v1_payload_payload_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1752,7 +1791,7 @@ type Update_ObjectRequest struct { func (x *Update_ObjectRequest) Reset() { *x = Update_ObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[30] + mi := &file_v1_payload_payload_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1765,7 +1804,7 @@ func (x *Update_ObjectRequest) String() string { func (*Update_ObjectRequest) ProtoMessage() {} func (x *Update_ObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[30] + mi := &file_v1_payload_payload_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1815,7 +1854,7 @@ type Update_MultiObjectRequest struct { func (x *Update_MultiObjectRequest) Reset() { *x = Update_MultiObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[31] + mi := &file_v1_payload_payload_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1828,7 +1867,7 @@ func (x *Update_MultiObjectRequest) String() string { func (*Update_MultiObjectRequest) ProtoMessage() {} func (x *Update_MultiObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[31] + mi := &file_v1_payload_payload_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1871,7 +1910,7 @@ type Update_Config struct { func (x *Update_Config) Reset() { *x = Update_Config{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[32] + mi := &file_v1_payload_payload_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1884,7 +1923,7 @@ func (x *Update_Config) String() string { func (*Update_Config) ProtoMessage() {} func (x *Update_Config) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[32] + mi := &file_v1_payload_payload_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1943,7 +1982,7 @@ type Upsert_Request struct { func (x *Upsert_Request) Reset() { *x = Upsert_Request{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[33] + mi := &file_v1_payload_payload_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1956,7 +1995,7 @@ func (x *Upsert_Request) String() string { func (*Upsert_Request) ProtoMessage() {} func (x *Upsert_Request) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[33] + mi := &file_v1_payload_payload_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1999,7 +2038,7 @@ type Upsert_MultiRequest struct { func (x *Upsert_MultiRequest) Reset() { *x = Upsert_MultiRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[34] + mi := &file_v1_payload_payload_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2012,7 +2051,7 @@ func (x *Upsert_MultiRequest) String() string { func (*Upsert_MultiRequest) ProtoMessage() {} func (x *Upsert_MultiRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[34] + mi := &file_v1_payload_payload_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2052,7 +2091,7 @@ type Upsert_ObjectRequest struct { func (x *Upsert_ObjectRequest) Reset() { *x = Upsert_ObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[35] + mi := &file_v1_payload_payload_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2065,7 +2104,7 @@ func (x *Upsert_ObjectRequest) String() string { func (*Upsert_ObjectRequest) ProtoMessage() {} func (x *Upsert_ObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[35] + mi := &file_v1_payload_payload_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2115,7 +2154,7 @@ type Upsert_MultiObjectRequest struct { func (x *Upsert_MultiObjectRequest) Reset() { *x = Upsert_MultiObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[36] + mi := &file_v1_payload_payload_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2128,7 +2167,7 @@ func (x *Upsert_MultiObjectRequest) String() string { func (*Upsert_MultiObjectRequest) ProtoMessage() {} func (x *Upsert_MultiObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[36] + mi := &file_v1_payload_payload_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2171,7 +2210,7 @@ type Upsert_Config struct { func (x *Upsert_Config) Reset() { *x = Upsert_Config{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[37] + mi := &file_v1_payload_payload_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2184,7 +2223,7 @@ func (x *Upsert_Config) String() string { func (*Upsert_Config) ProtoMessage() {} func (x *Upsert_Config) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[37] + mi := &file_v1_payload_payload_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2243,7 +2282,7 @@ type Remove_Request struct { func (x *Remove_Request) Reset() { *x = Remove_Request{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[38] + mi := &file_v1_payload_payload_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2256,7 +2295,7 @@ func (x *Remove_Request) String() string { func (*Remove_Request) ProtoMessage() {} func (x *Remove_Request) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[38] + mi := &file_v1_payload_payload_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2299,7 +2338,7 @@ type Remove_MultiRequest struct { func (x *Remove_MultiRequest) Reset() { *x = Remove_MultiRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[39] + mi := &file_v1_payload_payload_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2312,7 +2351,7 @@ func (x *Remove_MultiRequest) String() string { func (*Remove_MultiRequest) ProtoMessage() {} func (x *Remove_MultiRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[39] + mi := &file_v1_payload_payload_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2348,7 +2387,7 @@ type Remove_TimestampRequest struct { func (x *Remove_TimestampRequest) Reset() { *x = Remove_TimestampRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[40] + mi := &file_v1_payload_payload_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2361,7 +2400,7 @@ func (x *Remove_TimestampRequest) String() string { func (*Remove_TimestampRequest) ProtoMessage() {} func (x *Remove_TimestampRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[40] + mi := &file_v1_payload_payload_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2399,7 +2438,7 @@ type Remove_Timestamp struct { func (x *Remove_Timestamp) Reset() { *x = Remove_Timestamp{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[41] + mi := &file_v1_payload_payload_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2412,7 +2451,7 @@ func (x *Remove_Timestamp) String() string { func (*Remove_Timestamp) ProtoMessage() {} func (x *Remove_Timestamp) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[41] + mi := &file_v1_payload_payload_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2457,7 +2496,7 @@ type Remove_Config struct { func (x *Remove_Config) Reset() { *x = Remove_Config{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[42] + mi := &file_v1_payload_payload_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2470,7 +2509,7 @@ func (x *Remove_Config) String() string { func (*Remove_Config) ProtoMessage() {} func (x *Remove_Config) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[42] + mi := &file_v1_payload_payload_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2515,7 +2554,7 @@ type Object_VectorRequest struct { func (x *Object_VectorRequest) Reset() { *x = Object_VectorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[43] + mi := &file_v1_payload_payload_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2528,7 +2567,7 @@ func (x *Object_VectorRequest) String() string { func (*Object_VectorRequest) ProtoMessage() {} func (x *Object_VectorRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[43] + mi := &file_v1_payload_payload_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2573,7 +2612,7 @@ type Object_Distance struct { func (x *Object_Distance) Reset() { *x = Object_Distance{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[44] + mi := &file_v1_payload_payload_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2586,7 +2625,7 @@ func (x *Object_Distance) String() string { func (*Object_Distance) ProtoMessage() {} func (x *Object_Distance) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[44] + mi := &file_v1_payload_payload_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2632,7 +2671,7 @@ type Object_StreamDistance struct { func (x *Object_StreamDistance) Reset() { *x = Object_StreamDistance{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[45] + mi := &file_v1_payload_payload_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2645,7 +2684,7 @@ func (x *Object_StreamDistance) String() string { func (*Object_StreamDistance) ProtoMessage() {} func (x *Object_StreamDistance) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[45] + mi := &file_v1_payload_payload_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2712,7 +2751,7 @@ type Object_ID struct { func (x *Object_ID) Reset() { *x = Object_ID{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[46] + mi := &file_v1_payload_payload_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2725,7 +2764,7 @@ func (x *Object_ID) String() string { func (*Object_ID) ProtoMessage() {} func (x *Object_ID) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[46] + mi := &file_v1_payload_payload_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2760,7 +2799,7 @@ type Object_IDs struct { func (x *Object_IDs) Reset() { *x = Object_IDs{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[47] + mi := &file_v1_payload_payload_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2773,7 +2812,7 @@ func (x *Object_IDs) String() string { func (*Object_IDs) ProtoMessage() {} func (x *Object_IDs) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[47] + mi := &file_v1_payload_payload_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2813,7 +2852,7 @@ type Object_Vector struct { func (x *Object_Vector) Reset() { *x = Object_Vector{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[48] + mi := &file_v1_payload_payload_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2826,7 +2865,7 @@ func (x *Object_Vector) String() string { func (*Object_Vector) ProtoMessage() {} func (x *Object_Vector) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[48] + mi := &file_v1_payload_payload_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2876,7 +2915,7 @@ type Object_GetTimestampRequest struct { func (x *Object_GetTimestampRequest) Reset() { *x = Object_GetTimestampRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[49] + mi := &file_v1_payload_payload_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2889,7 +2928,7 @@ func (x *Object_GetTimestampRequest) String() string { func (*Object_GetTimestampRequest) ProtoMessage() {} func (x *Object_GetTimestampRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[49] + mi := &file_v1_payload_payload_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2927,7 +2966,7 @@ type Object_Timestamp struct { func (x *Object_Timestamp) Reset() { *x = Object_Timestamp{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[50] + mi := &file_v1_payload_payload_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2940,7 +2979,7 @@ func (x *Object_Timestamp) String() string { func (*Object_Timestamp) ProtoMessage() {} func (x *Object_Timestamp) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[50] + mi := &file_v1_payload_payload_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2982,7 +3021,7 @@ type Object_Vectors struct { func (x *Object_Vectors) Reset() { *x = Object_Vectors{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[51] + mi := &file_v1_payload_payload_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2995,7 +3034,7 @@ func (x *Object_Vectors) String() string { func (*Object_Vectors) ProtoMessage() {} func (x *Object_Vectors) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[51] + mi := &file_v1_payload_payload_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3034,7 +3073,7 @@ type Object_StreamVector struct { func (x *Object_StreamVector) Reset() { *x = Object_StreamVector{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[52] + mi := &file_v1_payload_payload_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3047,7 +3086,7 @@ func (x *Object_StreamVector) String() string { func (*Object_StreamVector) ProtoMessage() {} func (x *Object_StreamVector) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[52] + mi := &file_v1_payload_payload_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3117,7 +3156,7 @@ type Object_ReshapeVector struct { func (x *Object_ReshapeVector) Reset() { *x = Object_ReshapeVector{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[53] + mi := &file_v1_payload_payload_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3130,7 +3169,7 @@ func (x *Object_ReshapeVector) String() string { func (*Object_ReshapeVector) ProtoMessage() {} func (x *Object_ReshapeVector) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[53] + mi := &file_v1_payload_payload_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3175,7 +3214,7 @@ type Object_Blob struct { func (x *Object_Blob) Reset() { *x = Object_Blob{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[54] + mi := &file_v1_payload_payload_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3188,7 +3227,7 @@ func (x *Object_Blob) String() string { func (*Object_Blob) ProtoMessage() {} func (x *Object_Blob) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[54] + mi := &file_v1_payload_payload_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3234,7 +3273,7 @@ type Object_StreamBlob struct { func (x *Object_StreamBlob) Reset() { *x = Object_StreamBlob{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[55] + mi := &file_v1_payload_payload_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3247,7 +3286,7 @@ func (x *Object_StreamBlob) String() string { func (*Object_StreamBlob) ProtoMessage() {} func (x *Object_StreamBlob) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[55] + mi := &file_v1_payload_payload_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3319,7 +3358,7 @@ type Object_Location struct { func (x *Object_Location) Reset() { *x = Object_Location{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[56] + mi := &file_v1_payload_payload_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3332,7 +3371,7 @@ func (x *Object_Location) String() string { func (*Object_Location) ProtoMessage() {} func (x *Object_Location) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[56] + mi := &file_v1_payload_payload_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3385,7 +3424,7 @@ type Object_StreamLocation struct { func (x *Object_StreamLocation) Reset() { *x = Object_StreamLocation{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[57] + mi := &file_v1_payload_payload_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3398,7 +3437,7 @@ func (x *Object_StreamLocation) String() string { func (*Object_StreamLocation) ProtoMessage() {} func (x *Object_StreamLocation) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[57] + mi := &file_v1_payload_payload_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3465,7 +3504,7 @@ type Object_Locations struct { func (x *Object_Locations) Reset() { *x = Object_Locations{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[58] + mi := &file_v1_payload_payload_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3478,7 +3517,7 @@ func (x *Object_Locations) String() string { func (*Object_Locations) ProtoMessage() {} func (x *Object_Locations) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[58] + mi := &file_v1_payload_payload_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3511,7 +3550,7 @@ type Object_List struct { func (x *Object_List) Reset() { *x = Object_List{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[59] + mi := &file_v1_payload_payload_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3524,7 +3563,7 @@ func (x *Object_List) String() string { func (*Object_List) ProtoMessage() {} func (x *Object_List) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[59] + mi := &file_v1_payload_payload_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3549,7 +3588,7 @@ type Object_List_Request struct { func (x *Object_List_Request) Reset() { *x = Object_List_Request{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[60] + mi := &file_v1_payload_payload_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3562,7 +3601,7 @@ func (x *Object_List_Request) String() string { func (*Object_List_Request) ProtoMessage() {} func (x *Object_List_Request) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[60] + mi := &file_v1_payload_payload_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3593,7 +3632,7 @@ type Object_List_Response struct { func (x *Object_List_Response) Reset() { *x = Object_List_Response{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[61] + mi := &file_v1_payload_payload_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3606,7 +3645,7 @@ func (x *Object_List_Response) String() string { func (*Object_List_Response) ProtoMessage() {} func (x *Object_List_Response) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[61] + mi := &file_v1_payload_payload_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3674,7 +3713,7 @@ type Control_CreateIndexRequest struct { func (x *Control_CreateIndexRequest) Reset() { *x = Control_CreateIndexRequest{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[62] + mi := &file_v1_payload_payload_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3687,7 +3726,7 @@ func (x *Control_CreateIndexRequest) String() string { func (*Control_CreateIndexRequest) ProtoMessage() {} func (x *Control_CreateIndexRequest) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[62] + mi := &file_v1_payload_payload_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3727,7 +3766,7 @@ type Discoverer_Request struct { func (x *Discoverer_Request) Reset() { *x = Discoverer_Request{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[63] + mi := &file_v1_payload_payload_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3740,7 +3779,7 @@ func (x *Discoverer_Request) String() string { func (*Discoverer_Request) ProtoMessage() {} func (x *Discoverer_Request) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[63] + mi := &file_v1_payload_payload_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3787,7 +3826,7 @@ type Info_Index struct { func (x *Info_Index) Reset() { *x = Info_Index{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[64] + mi := &file_v1_payload_payload_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3800,7 +3839,7 @@ func (x *Info_Index) String() string { func (*Info_Index) ProtoMessage() {} func (x *Info_Index) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[64] + mi := &file_v1_payload_payload_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3841,7 +3880,7 @@ type Info_Pod struct { func (x *Info_Pod) Reset() { *x = Info_Pod{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[65] + mi := &file_v1_payload_payload_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3854,7 +3893,7 @@ func (x *Info_Pod) String() string { func (*Info_Pod) ProtoMessage() {} func (x *Info_Pod) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[65] + mi := &file_v1_payload_payload_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3942,7 +3981,7 @@ type Info_Node struct { func (x *Info_Node) Reset() { *x = Info_Node{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[66] + mi := &file_v1_payload_payload_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3955,7 +3994,7 @@ func (x *Info_Node) String() string { func (*Info_Node) ProtoMessage() {} func (x *Info_Node) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[66] + mi := &file_v1_payload_payload_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4036,7 +4075,7 @@ type Info_Service struct { func (x *Info_Service) Reset() { *x = Info_Service{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[67] + mi := &file_v1_payload_payload_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4049,7 +4088,7 @@ func (x *Info_Service) String() string { func (*Info_Service) ProtoMessage() {} func (x *Info_Service) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[67] + mi := &file_v1_payload_payload_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4122,7 +4161,7 @@ type Info_ServicePort struct { func (x *Info_ServicePort) Reset() { *x = Info_ServicePort{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[68] + mi := &file_v1_payload_payload_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4135,7 +4174,7 @@ func (x *Info_ServicePort) String() string { func (*Info_ServicePort) ProtoMessage() {} func (x *Info_ServicePort) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[68] + mi := &file_v1_payload_payload_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4177,7 +4216,7 @@ type Info_Labels struct { func (x *Info_Labels) Reset() { *x = Info_Labels{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[69] + mi := &file_v1_payload_payload_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4190,7 +4229,7 @@ func (x *Info_Labels) String() string { func (*Info_Labels) ProtoMessage() {} func (x *Info_Labels) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[69] + mi := &file_v1_payload_payload_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4225,7 +4264,7 @@ type Info_Annotations struct { func (x *Info_Annotations) Reset() { *x = Info_Annotations{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[70] + mi := &file_v1_payload_payload_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4238,7 +4277,7 @@ func (x *Info_Annotations) String() string { func (*Info_Annotations) ProtoMessage() {} func (x *Info_Annotations) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[70] + mi := &file_v1_payload_payload_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4278,7 +4317,7 @@ type Info_CPU struct { func (x *Info_CPU) Reset() { *x = Info_CPU{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[71] + mi := &file_v1_payload_payload_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4291,7 +4330,7 @@ func (x *Info_CPU) String() string { func (*Info_CPU) ProtoMessage() {} func (x *Info_CPU) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[71] + mi := &file_v1_payload_payload_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4345,7 +4384,7 @@ type Info_Memory struct { func (x *Info_Memory) Reset() { *x = Info_Memory{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[72] + mi := &file_v1_payload_payload_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4358,7 +4397,7 @@ func (x *Info_Memory) String() string { func (*Info_Memory) ProtoMessage() {} func (x *Info_Memory) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[72] + mi := &file_v1_payload_payload_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4408,7 +4447,7 @@ type Info_Pods struct { func (x *Info_Pods) Reset() { *x = Info_Pods{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[73] + mi := &file_v1_payload_payload_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4421,7 +4460,7 @@ func (x *Info_Pods) String() string { func (*Info_Pods) ProtoMessage() {} func (x *Info_Pods) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[73] + mi := &file_v1_payload_payload_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4457,7 +4496,7 @@ type Info_Nodes struct { func (x *Info_Nodes) Reset() { *x = Info_Nodes{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[74] + mi := &file_v1_payload_payload_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4470,7 +4509,7 @@ func (x *Info_Nodes) String() string { func (*Info_Nodes) ProtoMessage() {} func (x *Info_Nodes) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[74] + mi := &file_v1_payload_payload_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4506,7 +4545,7 @@ type Info_Services struct { func (x *Info_Services) Reset() { *x = Info_Services{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[75] + mi := &file_v1_payload_payload_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4519,7 +4558,7 @@ func (x *Info_Services) String() string { func (*Info_Services) ProtoMessage() {} func (x *Info_Services) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[75] + mi := &file_v1_payload_payload_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4554,7 +4593,7 @@ type Info_IPs struct { func (x *Info_IPs) Reset() { *x = Info_IPs{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[76] + mi := &file_v1_payload_payload_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4567,7 +4606,7 @@ func (x *Info_IPs) String() string { func (*Info_IPs) ProtoMessage() {} func (x *Info_IPs) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[76] + mi := &file_v1_payload_payload_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4609,7 +4648,7 @@ type Info_Index_Count struct { func (x *Info_Index_Count) Reset() { *x = Info_Index_Count{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[77] + mi := &file_v1_payload_payload_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4622,7 +4661,7 @@ func (x *Info_Index_Count) String() string { func (*Info_Index_Count) ProtoMessage() {} func (x *Info_Index_Count) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[77] + mi := &file_v1_payload_payload_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4676,7 +4715,7 @@ type Info_Index_UUID struct { func (x *Info_Index_UUID) Reset() { *x = Info_Index_UUID{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[78] + mi := &file_v1_payload_payload_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4689,7 +4728,7 @@ func (x *Info_Index_UUID) String() string { func (*Info_Index_UUID) ProtoMessage() {} func (x *Info_Index_UUID) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[78] + mi := &file_v1_payload_payload_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4717,7 +4756,7 @@ type Info_Index_UUID_Committed struct { func (x *Info_Index_UUID_Committed) Reset() { *x = Info_Index_UUID_Committed{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[79] + mi := &file_v1_payload_payload_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4730,7 +4769,7 @@ func (x *Info_Index_UUID_Committed) String() string { func (*Info_Index_UUID_Committed) ProtoMessage() {} func (x *Info_Index_UUID_Committed) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[79] + mi := &file_v1_payload_payload_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4765,7 +4804,7 @@ type Info_Index_UUID_Uncommitted struct { func (x *Info_Index_UUID_Uncommitted) Reset() { *x = Info_Index_UUID_Uncommitted{} if protoimpl.UnsafeEnabled { - mi := &file_v1_payload_payload_proto_msgTypes[80] + mi := &file_v1_payload_payload_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4778,7 +4817,7 @@ func (x *Info_Index_UUID_Uncommitted) String() string { func (*Info_Index_UUID_Uncommitted) ProtoMessage() {} func (x *Info_Index_UUID_Uncommitted) ProtoReflect() protoreflect.Message { - mi := &file_v1_payload_payload_proto_msgTypes[80] + mi := &file_v1_payload_payload_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4801,6 +4840,113 @@ func (x *Info_Index_UUID_Uncommitted) GetUuid() string { return "" } +// Represent server information. +type Mirror_Target struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The target hostname. + Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` + // The target port. + Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` +} + +func (x *Mirror_Target) Reset() { + *x = Mirror_Target{} + if protoimpl.UnsafeEnabled { + mi := &file_v1_payload_payload_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Mirror_Target) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Mirror_Target) ProtoMessage() {} + +func (x *Mirror_Target) ProtoReflect() protoreflect.Message { + mi := &file_v1_payload_payload_proto_msgTypes[84] + 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 Mirror_Target.ProtoReflect.Descriptor instead. +func (*Mirror_Target) Descriptor() ([]byte, []int) { + return file_v1_payload_payload_proto_rawDescGZIP(), []int{10, 0} +} + +func (x *Mirror_Target) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + +func (x *Mirror_Target) GetPort() uint32 { + if x != nil { + return x.Port + } + return 0 +} + +// Represent the multiple Target message. +type Mirror_Targets struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The multiple target information. + Targets []*Mirror_Target `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *Mirror_Targets) Reset() { + *x = Mirror_Targets{} + if protoimpl.UnsafeEnabled { + mi := &file_v1_payload_payload_proto_msgTypes[85] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Mirror_Targets) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Mirror_Targets) ProtoMessage() {} + +func (x *Mirror_Targets) ProtoReflect() protoreflect.Message { + mi := &file_v1_payload_payload_proto_msgTypes[85] + 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 Mirror_Targets.ProtoReflect.Descriptor instead. +func (*Mirror_Targets) Descriptor() ([]byte, []int) { + return file_v1_payload_payload_proto_rawDescGZIP(), []int{10, 1} +} + +func (x *Mirror_Targets) GetTargets() []*Mirror_Target { + if x != nil { + return x.Targets + } + return nil +} + var File_v1_payload_payload_proto protoreflect.FileDescriptor var file_v1_payload_payload_proto_rawDesc = []byte{ @@ -5267,14 +5413,22 @@ var file_v1_payload_payload_proto_rawDesc = []byte{ 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x15, 0x0a, 0x03, 0x49, 0x50, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x42, 0x64, 0x0a, 0x1d, 0x6f, 0x72, 0x67, 0x2e, 0x76, 0x64, 0x61, 0x61, 0x73, 0x2e, 0x76, - 0x61, 0x6c, 0x64, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x42, 0x0b, 0x56, 0x61, 0x6c, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x01, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x64, - 0x61, 0x61, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, 0x72, - 0x70, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0xa2, 0x02, 0x07, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x7a, 0x0a, 0x06, 0x4d, 0x69, 0x72, 0x72, + 0x6f, 0x72, 0x1a, 0x30, 0x0a, 0x06, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x3e, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x33, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x69, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x64, 0x0a, + 0x1d, 0x6f, 0x72, 0x67, 0x2e, 0x76, 0x64, 0x61, 0x61, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x64, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x0b, + 0x56, 0x61, 0x6c, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x01, 0x5a, 0x2a, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x64, 0x61, 0x61, 0x73, 0x2f, + 0x76, 0x61, 0x6c, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x76, + 0x31, 0x2f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0xa2, 0x02, 0x07, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5290,7 +5444,7 @@ func file_v1_payload_payload_proto_rawDescGZIP() []byte { } var file_v1_payload_payload_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_v1_payload_payload_proto_msgTypes = make([]protoimpl.MessageInfo, 83) +var file_v1_payload_payload_proto_msgTypes = make([]protoimpl.MessageInfo, 86) var file_v1_payload_payload_proto_goTypes = []interface{}{ (Search_AggregationAlgorithm)(0), // 0: payload.v1.Search.AggregationAlgorithm (Remove_Timestamp_Operator)(0), // 1: payload.v1.Remove.Timestamp.Operator @@ -5304,160 +5458,164 @@ var file_v1_payload_payload_proto_goTypes = []interface{}{ (*Control)(nil), // 9: payload.v1.Control (*Discoverer)(nil), // 10: payload.v1.Discoverer (*Info)(nil), // 11: payload.v1.Info - (*Empty)(nil), // 12: payload.v1.Empty - (*Search_Request)(nil), // 13: payload.v1.Search.Request - (*Search_MultiRequest)(nil), // 14: payload.v1.Search.MultiRequest - (*Search_IDRequest)(nil), // 15: payload.v1.Search.IDRequest - (*Search_MultiIDRequest)(nil), // 16: payload.v1.Search.MultiIDRequest - (*Search_ObjectRequest)(nil), // 17: payload.v1.Search.ObjectRequest - (*Search_MultiObjectRequest)(nil), // 18: payload.v1.Search.MultiObjectRequest - (*Search_Config)(nil), // 19: payload.v1.Search.Config - (*Search_Response)(nil), // 20: payload.v1.Search.Response - (*Search_Responses)(nil), // 21: payload.v1.Search.Responses - (*Search_StreamResponse)(nil), // 22: payload.v1.Search.StreamResponse - (*Filter_Target)(nil), // 23: payload.v1.Filter.Target - (*Filter_Config)(nil), // 24: payload.v1.Filter.Config - (*Insert_Request)(nil), // 25: payload.v1.Insert.Request - (*Insert_MultiRequest)(nil), // 26: payload.v1.Insert.MultiRequest - (*Insert_ObjectRequest)(nil), // 27: payload.v1.Insert.ObjectRequest - (*Insert_MultiObjectRequest)(nil), // 28: payload.v1.Insert.MultiObjectRequest - (*Insert_Config)(nil), // 29: payload.v1.Insert.Config - (*Update_Request)(nil), // 30: payload.v1.Update.Request - (*Update_MultiRequest)(nil), // 31: payload.v1.Update.MultiRequest - (*Update_ObjectRequest)(nil), // 32: payload.v1.Update.ObjectRequest - (*Update_MultiObjectRequest)(nil), // 33: payload.v1.Update.MultiObjectRequest - (*Update_Config)(nil), // 34: payload.v1.Update.Config - (*Upsert_Request)(nil), // 35: payload.v1.Upsert.Request - (*Upsert_MultiRequest)(nil), // 36: payload.v1.Upsert.MultiRequest - (*Upsert_ObjectRequest)(nil), // 37: payload.v1.Upsert.ObjectRequest - (*Upsert_MultiObjectRequest)(nil), // 38: payload.v1.Upsert.MultiObjectRequest - (*Upsert_Config)(nil), // 39: payload.v1.Upsert.Config - (*Remove_Request)(nil), // 40: payload.v1.Remove.Request - (*Remove_MultiRequest)(nil), // 41: payload.v1.Remove.MultiRequest - (*Remove_TimestampRequest)(nil), // 42: payload.v1.Remove.TimestampRequest - (*Remove_Timestamp)(nil), // 43: payload.v1.Remove.Timestamp - (*Remove_Config)(nil), // 44: payload.v1.Remove.Config - (*Object_VectorRequest)(nil), // 45: payload.v1.Object.VectorRequest - (*Object_Distance)(nil), // 46: payload.v1.Object.Distance - (*Object_StreamDistance)(nil), // 47: payload.v1.Object.StreamDistance - (*Object_ID)(nil), // 48: payload.v1.Object.ID - (*Object_IDs)(nil), // 49: payload.v1.Object.IDs - (*Object_Vector)(nil), // 50: payload.v1.Object.Vector - (*Object_GetTimestampRequest)(nil), // 51: payload.v1.Object.GetTimestampRequest - (*Object_Timestamp)(nil), // 52: payload.v1.Object.Timestamp - (*Object_Vectors)(nil), // 53: payload.v1.Object.Vectors - (*Object_StreamVector)(nil), // 54: payload.v1.Object.StreamVector - (*Object_ReshapeVector)(nil), // 55: payload.v1.Object.ReshapeVector - (*Object_Blob)(nil), // 56: payload.v1.Object.Blob - (*Object_StreamBlob)(nil), // 57: payload.v1.Object.StreamBlob - (*Object_Location)(nil), // 58: payload.v1.Object.Location - (*Object_StreamLocation)(nil), // 59: payload.v1.Object.StreamLocation - (*Object_Locations)(nil), // 60: payload.v1.Object.Locations - (*Object_List)(nil), // 61: payload.v1.Object.List - (*Object_List_Request)(nil), // 62: payload.v1.Object.List.Request - (*Object_List_Response)(nil), // 63: payload.v1.Object.List.Response - (*Control_CreateIndexRequest)(nil), // 64: payload.v1.Control.CreateIndexRequest - (*Discoverer_Request)(nil), // 65: payload.v1.Discoverer.Request - (*Info_Index)(nil), // 66: payload.v1.Info.Index - (*Info_Pod)(nil), // 67: payload.v1.Info.Pod - (*Info_Node)(nil), // 68: payload.v1.Info.Node - (*Info_Service)(nil), // 69: payload.v1.Info.Service - (*Info_ServicePort)(nil), // 70: payload.v1.Info.ServicePort - (*Info_Labels)(nil), // 71: payload.v1.Info.Labels - (*Info_Annotations)(nil), // 72: payload.v1.Info.Annotations - (*Info_CPU)(nil), // 73: payload.v1.Info.CPU - (*Info_Memory)(nil), // 74: payload.v1.Info.Memory - (*Info_Pods)(nil), // 75: payload.v1.Info.Pods - (*Info_Nodes)(nil), // 76: payload.v1.Info.Nodes - (*Info_Services)(nil), // 77: payload.v1.Info.Services - (*Info_IPs)(nil), // 78: payload.v1.Info.IPs - (*Info_Index_Count)(nil), // 79: payload.v1.Info.Index.Count - (*Info_Index_UUID)(nil), // 80: payload.v1.Info.Index.UUID - (*Info_Index_UUID_Committed)(nil), // 81: payload.v1.Info.Index.UUID.Committed - (*Info_Index_UUID_Uncommitted)(nil), // 82: payload.v1.Info.Index.UUID.Uncommitted - nil, // 83: payload.v1.Info.Labels.LabelsEntry - nil, // 84: payload.v1.Info.Annotations.AnnotationsEntry - (*status.Status)(nil), // 85: google.rpc.Status + (*Mirror)(nil), // 12: payload.v1.Mirror + (*Empty)(nil), // 13: payload.v1.Empty + (*Search_Request)(nil), // 14: payload.v1.Search.Request + (*Search_MultiRequest)(nil), // 15: payload.v1.Search.MultiRequest + (*Search_IDRequest)(nil), // 16: payload.v1.Search.IDRequest + (*Search_MultiIDRequest)(nil), // 17: payload.v1.Search.MultiIDRequest + (*Search_ObjectRequest)(nil), // 18: payload.v1.Search.ObjectRequest + (*Search_MultiObjectRequest)(nil), // 19: payload.v1.Search.MultiObjectRequest + (*Search_Config)(nil), // 20: payload.v1.Search.Config + (*Search_Response)(nil), // 21: payload.v1.Search.Response + (*Search_Responses)(nil), // 22: payload.v1.Search.Responses + (*Search_StreamResponse)(nil), // 23: payload.v1.Search.StreamResponse + (*Filter_Target)(nil), // 24: payload.v1.Filter.Target + (*Filter_Config)(nil), // 25: payload.v1.Filter.Config + (*Insert_Request)(nil), // 26: payload.v1.Insert.Request + (*Insert_MultiRequest)(nil), // 27: payload.v1.Insert.MultiRequest + (*Insert_ObjectRequest)(nil), // 28: payload.v1.Insert.ObjectRequest + (*Insert_MultiObjectRequest)(nil), // 29: payload.v1.Insert.MultiObjectRequest + (*Insert_Config)(nil), // 30: payload.v1.Insert.Config + (*Update_Request)(nil), // 31: payload.v1.Update.Request + (*Update_MultiRequest)(nil), // 32: payload.v1.Update.MultiRequest + (*Update_ObjectRequest)(nil), // 33: payload.v1.Update.ObjectRequest + (*Update_MultiObjectRequest)(nil), // 34: payload.v1.Update.MultiObjectRequest + (*Update_Config)(nil), // 35: payload.v1.Update.Config + (*Upsert_Request)(nil), // 36: payload.v1.Upsert.Request + (*Upsert_MultiRequest)(nil), // 37: payload.v1.Upsert.MultiRequest + (*Upsert_ObjectRequest)(nil), // 38: payload.v1.Upsert.ObjectRequest + (*Upsert_MultiObjectRequest)(nil), // 39: payload.v1.Upsert.MultiObjectRequest + (*Upsert_Config)(nil), // 40: payload.v1.Upsert.Config + (*Remove_Request)(nil), // 41: payload.v1.Remove.Request + (*Remove_MultiRequest)(nil), // 42: payload.v1.Remove.MultiRequest + (*Remove_TimestampRequest)(nil), // 43: payload.v1.Remove.TimestampRequest + (*Remove_Timestamp)(nil), // 44: payload.v1.Remove.Timestamp + (*Remove_Config)(nil), // 45: payload.v1.Remove.Config + (*Object_VectorRequest)(nil), // 46: payload.v1.Object.VectorRequest + (*Object_Distance)(nil), // 47: payload.v1.Object.Distance + (*Object_StreamDistance)(nil), // 48: payload.v1.Object.StreamDistance + (*Object_ID)(nil), // 49: payload.v1.Object.ID + (*Object_IDs)(nil), // 50: payload.v1.Object.IDs + (*Object_Vector)(nil), // 51: payload.v1.Object.Vector + (*Object_GetTimestampRequest)(nil), // 52: payload.v1.Object.GetTimestampRequest + (*Object_Timestamp)(nil), // 53: payload.v1.Object.Timestamp + (*Object_Vectors)(nil), // 54: payload.v1.Object.Vectors + (*Object_StreamVector)(nil), // 55: payload.v1.Object.StreamVector + (*Object_ReshapeVector)(nil), // 56: payload.v1.Object.ReshapeVector + (*Object_Blob)(nil), // 57: payload.v1.Object.Blob + (*Object_StreamBlob)(nil), // 58: payload.v1.Object.StreamBlob + (*Object_Location)(nil), // 59: payload.v1.Object.Location + (*Object_StreamLocation)(nil), // 60: payload.v1.Object.StreamLocation + (*Object_Locations)(nil), // 61: payload.v1.Object.Locations + (*Object_List)(nil), // 62: payload.v1.Object.List + (*Object_List_Request)(nil), // 63: payload.v1.Object.List.Request + (*Object_List_Response)(nil), // 64: payload.v1.Object.List.Response + (*Control_CreateIndexRequest)(nil), // 65: payload.v1.Control.CreateIndexRequest + (*Discoverer_Request)(nil), // 66: payload.v1.Discoverer.Request + (*Info_Index)(nil), // 67: payload.v1.Info.Index + (*Info_Pod)(nil), // 68: payload.v1.Info.Pod + (*Info_Node)(nil), // 69: payload.v1.Info.Node + (*Info_Service)(nil), // 70: payload.v1.Info.Service + (*Info_ServicePort)(nil), // 71: payload.v1.Info.ServicePort + (*Info_Labels)(nil), // 72: payload.v1.Info.Labels + (*Info_Annotations)(nil), // 73: payload.v1.Info.Annotations + (*Info_CPU)(nil), // 74: payload.v1.Info.CPU + (*Info_Memory)(nil), // 75: payload.v1.Info.Memory + (*Info_Pods)(nil), // 76: payload.v1.Info.Pods + (*Info_Nodes)(nil), // 77: payload.v1.Info.Nodes + (*Info_Services)(nil), // 78: payload.v1.Info.Services + (*Info_IPs)(nil), // 79: payload.v1.Info.IPs + (*Info_Index_Count)(nil), // 80: payload.v1.Info.Index.Count + (*Info_Index_UUID)(nil), // 81: payload.v1.Info.Index.UUID + (*Info_Index_UUID_Committed)(nil), // 82: payload.v1.Info.Index.UUID.Committed + (*Info_Index_UUID_Uncommitted)(nil), // 83: payload.v1.Info.Index.UUID.Uncommitted + nil, // 84: payload.v1.Info.Labels.LabelsEntry + nil, // 85: payload.v1.Info.Annotations.AnnotationsEntry + (*Mirror_Target)(nil), // 86: payload.v1.Mirror.Target + (*Mirror_Targets)(nil), // 87: payload.v1.Mirror.Targets + (*status.Status)(nil), // 88: google.rpc.Status } var file_v1_payload_payload_proto_depIdxs = []int32{ - 19, // 0: payload.v1.Search.Request.config:type_name -> payload.v1.Search.Config - 13, // 1: payload.v1.Search.MultiRequest.requests:type_name -> payload.v1.Search.Request - 19, // 2: payload.v1.Search.IDRequest.config:type_name -> payload.v1.Search.Config - 15, // 3: payload.v1.Search.MultiIDRequest.requests:type_name -> payload.v1.Search.IDRequest - 19, // 4: payload.v1.Search.ObjectRequest.config:type_name -> payload.v1.Search.Config - 23, // 5: payload.v1.Search.ObjectRequest.vectorizer:type_name -> payload.v1.Filter.Target - 17, // 6: payload.v1.Search.MultiObjectRequest.requests:type_name -> payload.v1.Search.ObjectRequest - 24, // 7: payload.v1.Search.Config.ingress_filters:type_name -> payload.v1.Filter.Config - 24, // 8: payload.v1.Search.Config.egress_filters:type_name -> payload.v1.Filter.Config + 20, // 0: payload.v1.Search.Request.config:type_name -> payload.v1.Search.Config + 14, // 1: payload.v1.Search.MultiRequest.requests:type_name -> payload.v1.Search.Request + 20, // 2: payload.v1.Search.IDRequest.config:type_name -> payload.v1.Search.Config + 16, // 3: payload.v1.Search.MultiIDRequest.requests:type_name -> payload.v1.Search.IDRequest + 20, // 4: payload.v1.Search.ObjectRequest.config:type_name -> payload.v1.Search.Config + 24, // 5: payload.v1.Search.ObjectRequest.vectorizer:type_name -> payload.v1.Filter.Target + 18, // 6: payload.v1.Search.MultiObjectRequest.requests:type_name -> payload.v1.Search.ObjectRequest + 25, // 7: payload.v1.Search.Config.ingress_filters:type_name -> payload.v1.Filter.Config + 25, // 8: payload.v1.Search.Config.egress_filters:type_name -> payload.v1.Filter.Config 0, // 9: payload.v1.Search.Config.aggregation_algorithm:type_name -> payload.v1.Search.AggregationAlgorithm - 46, // 10: payload.v1.Search.Response.results:type_name -> payload.v1.Object.Distance - 20, // 11: payload.v1.Search.Responses.responses:type_name -> payload.v1.Search.Response - 20, // 12: payload.v1.Search.StreamResponse.response:type_name -> payload.v1.Search.Response - 85, // 13: payload.v1.Search.StreamResponse.status:type_name -> google.rpc.Status - 23, // 14: payload.v1.Filter.Config.targets:type_name -> payload.v1.Filter.Target - 50, // 15: payload.v1.Insert.Request.vector:type_name -> payload.v1.Object.Vector - 29, // 16: payload.v1.Insert.Request.config:type_name -> payload.v1.Insert.Config - 25, // 17: payload.v1.Insert.MultiRequest.requests:type_name -> payload.v1.Insert.Request - 56, // 18: payload.v1.Insert.ObjectRequest.object:type_name -> payload.v1.Object.Blob - 29, // 19: payload.v1.Insert.ObjectRequest.config:type_name -> payload.v1.Insert.Config - 23, // 20: payload.v1.Insert.ObjectRequest.vectorizer:type_name -> payload.v1.Filter.Target - 27, // 21: payload.v1.Insert.MultiObjectRequest.requests:type_name -> payload.v1.Insert.ObjectRequest - 24, // 22: payload.v1.Insert.Config.filters:type_name -> payload.v1.Filter.Config - 50, // 23: payload.v1.Update.Request.vector:type_name -> payload.v1.Object.Vector - 34, // 24: payload.v1.Update.Request.config:type_name -> payload.v1.Update.Config - 30, // 25: payload.v1.Update.MultiRequest.requests:type_name -> payload.v1.Update.Request - 56, // 26: payload.v1.Update.ObjectRequest.object:type_name -> payload.v1.Object.Blob - 34, // 27: payload.v1.Update.ObjectRequest.config:type_name -> payload.v1.Update.Config - 23, // 28: payload.v1.Update.ObjectRequest.vectorizer:type_name -> payload.v1.Filter.Target - 32, // 29: payload.v1.Update.MultiObjectRequest.requests:type_name -> payload.v1.Update.ObjectRequest - 24, // 30: payload.v1.Update.Config.filters:type_name -> payload.v1.Filter.Config - 50, // 31: payload.v1.Upsert.Request.vector:type_name -> payload.v1.Object.Vector - 39, // 32: payload.v1.Upsert.Request.config:type_name -> payload.v1.Upsert.Config - 35, // 33: payload.v1.Upsert.MultiRequest.requests:type_name -> payload.v1.Upsert.Request - 56, // 34: payload.v1.Upsert.ObjectRequest.object:type_name -> payload.v1.Object.Blob - 39, // 35: payload.v1.Upsert.ObjectRequest.config:type_name -> payload.v1.Upsert.Config - 23, // 36: payload.v1.Upsert.ObjectRequest.vectorizer:type_name -> payload.v1.Filter.Target - 37, // 37: payload.v1.Upsert.MultiObjectRequest.requests:type_name -> payload.v1.Upsert.ObjectRequest - 24, // 38: payload.v1.Upsert.Config.filters:type_name -> payload.v1.Filter.Config - 48, // 39: payload.v1.Remove.Request.id:type_name -> payload.v1.Object.ID - 44, // 40: payload.v1.Remove.Request.config:type_name -> payload.v1.Remove.Config - 40, // 41: payload.v1.Remove.MultiRequest.requests:type_name -> payload.v1.Remove.Request - 43, // 42: payload.v1.Remove.TimestampRequest.timestamps:type_name -> payload.v1.Remove.Timestamp + 47, // 10: payload.v1.Search.Response.results:type_name -> payload.v1.Object.Distance + 21, // 11: payload.v1.Search.Responses.responses:type_name -> payload.v1.Search.Response + 21, // 12: payload.v1.Search.StreamResponse.response:type_name -> payload.v1.Search.Response + 88, // 13: payload.v1.Search.StreamResponse.status:type_name -> google.rpc.Status + 24, // 14: payload.v1.Filter.Config.targets:type_name -> payload.v1.Filter.Target + 51, // 15: payload.v1.Insert.Request.vector:type_name -> payload.v1.Object.Vector + 30, // 16: payload.v1.Insert.Request.config:type_name -> payload.v1.Insert.Config + 26, // 17: payload.v1.Insert.MultiRequest.requests:type_name -> payload.v1.Insert.Request + 57, // 18: payload.v1.Insert.ObjectRequest.object:type_name -> payload.v1.Object.Blob + 30, // 19: payload.v1.Insert.ObjectRequest.config:type_name -> payload.v1.Insert.Config + 24, // 20: payload.v1.Insert.ObjectRequest.vectorizer:type_name -> payload.v1.Filter.Target + 28, // 21: payload.v1.Insert.MultiObjectRequest.requests:type_name -> payload.v1.Insert.ObjectRequest + 25, // 22: payload.v1.Insert.Config.filters:type_name -> payload.v1.Filter.Config + 51, // 23: payload.v1.Update.Request.vector:type_name -> payload.v1.Object.Vector + 35, // 24: payload.v1.Update.Request.config:type_name -> payload.v1.Update.Config + 31, // 25: payload.v1.Update.MultiRequest.requests:type_name -> payload.v1.Update.Request + 57, // 26: payload.v1.Update.ObjectRequest.object:type_name -> payload.v1.Object.Blob + 35, // 27: payload.v1.Update.ObjectRequest.config:type_name -> payload.v1.Update.Config + 24, // 28: payload.v1.Update.ObjectRequest.vectorizer:type_name -> payload.v1.Filter.Target + 33, // 29: payload.v1.Update.MultiObjectRequest.requests:type_name -> payload.v1.Update.ObjectRequest + 25, // 30: payload.v1.Update.Config.filters:type_name -> payload.v1.Filter.Config + 51, // 31: payload.v1.Upsert.Request.vector:type_name -> payload.v1.Object.Vector + 40, // 32: payload.v1.Upsert.Request.config:type_name -> payload.v1.Upsert.Config + 36, // 33: payload.v1.Upsert.MultiRequest.requests:type_name -> payload.v1.Upsert.Request + 57, // 34: payload.v1.Upsert.ObjectRequest.object:type_name -> payload.v1.Object.Blob + 40, // 35: payload.v1.Upsert.ObjectRequest.config:type_name -> payload.v1.Upsert.Config + 24, // 36: payload.v1.Upsert.ObjectRequest.vectorizer:type_name -> payload.v1.Filter.Target + 38, // 37: payload.v1.Upsert.MultiObjectRequest.requests:type_name -> payload.v1.Upsert.ObjectRequest + 25, // 38: payload.v1.Upsert.Config.filters:type_name -> payload.v1.Filter.Config + 49, // 39: payload.v1.Remove.Request.id:type_name -> payload.v1.Object.ID + 45, // 40: payload.v1.Remove.Request.config:type_name -> payload.v1.Remove.Config + 41, // 41: payload.v1.Remove.MultiRequest.requests:type_name -> payload.v1.Remove.Request + 44, // 42: payload.v1.Remove.TimestampRequest.timestamps:type_name -> payload.v1.Remove.Timestamp 1, // 43: payload.v1.Remove.Timestamp.operator:type_name -> payload.v1.Remove.Timestamp.Operator - 48, // 44: payload.v1.Object.VectorRequest.id:type_name -> payload.v1.Object.ID - 24, // 45: payload.v1.Object.VectorRequest.filters:type_name -> payload.v1.Filter.Config - 46, // 46: payload.v1.Object.StreamDistance.distance:type_name -> payload.v1.Object.Distance - 85, // 47: payload.v1.Object.StreamDistance.status:type_name -> google.rpc.Status - 48, // 48: payload.v1.Object.GetTimestampRequest.id:type_name -> payload.v1.Object.ID - 50, // 49: payload.v1.Object.Vectors.vectors:type_name -> payload.v1.Object.Vector - 50, // 50: payload.v1.Object.StreamVector.vector:type_name -> payload.v1.Object.Vector - 85, // 51: payload.v1.Object.StreamVector.status:type_name -> google.rpc.Status - 56, // 52: payload.v1.Object.StreamBlob.blob:type_name -> payload.v1.Object.Blob - 85, // 53: payload.v1.Object.StreamBlob.status:type_name -> google.rpc.Status - 58, // 54: payload.v1.Object.StreamLocation.location:type_name -> payload.v1.Object.Location - 85, // 55: payload.v1.Object.StreamLocation.status:type_name -> google.rpc.Status - 58, // 56: payload.v1.Object.Locations.locations:type_name -> payload.v1.Object.Location - 50, // 57: payload.v1.Object.List.Response.vector:type_name -> payload.v1.Object.Vector - 85, // 58: payload.v1.Object.List.Response.status:type_name -> google.rpc.Status - 73, // 59: payload.v1.Info.Pod.cpu:type_name -> payload.v1.Info.CPU - 74, // 60: payload.v1.Info.Pod.memory:type_name -> payload.v1.Info.Memory - 68, // 61: payload.v1.Info.Pod.node:type_name -> payload.v1.Info.Node - 73, // 62: payload.v1.Info.Node.cpu:type_name -> payload.v1.Info.CPU - 74, // 63: payload.v1.Info.Node.memory:type_name -> payload.v1.Info.Memory - 75, // 64: payload.v1.Info.Node.Pods:type_name -> payload.v1.Info.Pods - 70, // 65: payload.v1.Info.Service.ports:type_name -> payload.v1.Info.ServicePort - 71, // 66: payload.v1.Info.Service.labels:type_name -> payload.v1.Info.Labels - 72, // 67: payload.v1.Info.Service.annotations:type_name -> payload.v1.Info.Annotations - 83, // 68: payload.v1.Info.Labels.labels:type_name -> payload.v1.Info.Labels.LabelsEntry - 84, // 69: payload.v1.Info.Annotations.annotations:type_name -> payload.v1.Info.Annotations.AnnotationsEntry - 67, // 70: payload.v1.Info.Pods.pods:type_name -> payload.v1.Info.Pod - 68, // 71: payload.v1.Info.Nodes.nodes:type_name -> payload.v1.Info.Node - 69, // 72: payload.v1.Info.Services.services:type_name -> payload.v1.Info.Service - 73, // [73:73] is the sub-list for method output_type - 73, // [73:73] is the sub-list for method input_type - 73, // [73:73] is the sub-list for extension type_name - 73, // [73:73] is the sub-list for extension extendee - 0, // [0:73] is the sub-list for field type_name + 49, // 44: payload.v1.Object.VectorRequest.id:type_name -> payload.v1.Object.ID + 25, // 45: payload.v1.Object.VectorRequest.filters:type_name -> payload.v1.Filter.Config + 47, // 46: payload.v1.Object.StreamDistance.distance:type_name -> payload.v1.Object.Distance + 88, // 47: payload.v1.Object.StreamDistance.status:type_name -> google.rpc.Status + 49, // 48: payload.v1.Object.GetTimestampRequest.id:type_name -> payload.v1.Object.ID + 51, // 49: payload.v1.Object.Vectors.vectors:type_name -> payload.v1.Object.Vector + 51, // 50: payload.v1.Object.StreamVector.vector:type_name -> payload.v1.Object.Vector + 88, // 51: payload.v1.Object.StreamVector.status:type_name -> google.rpc.Status + 57, // 52: payload.v1.Object.StreamBlob.blob:type_name -> payload.v1.Object.Blob + 88, // 53: payload.v1.Object.StreamBlob.status:type_name -> google.rpc.Status + 59, // 54: payload.v1.Object.StreamLocation.location:type_name -> payload.v1.Object.Location + 88, // 55: payload.v1.Object.StreamLocation.status:type_name -> google.rpc.Status + 59, // 56: payload.v1.Object.Locations.locations:type_name -> payload.v1.Object.Location + 51, // 57: payload.v1.Object.List.Response.vector:type_name -> payload.v1.Object.Vector + 88, // 58: payload.v1.Object.List.Response.status:type_name -> google.rpc.Status + 74, // 59: payload.v1.Info.Pod.cpu:type_name -> payload.v1.Info.CPU + 75, // 60: payload.v1.Info.Pod.memory:type_name -> payload.v1.Info.Memory + 69, // 61: payload.v1.Info.Pod.node:type_name -> payload.v1.Info.Node + 74, // 62: payload.v1.Info.Node.cpu:type_name -> payload.v1.Info.CPU + 75, // 63: payload.v1.Info.Node.memory:type_name -> payload.v1.Info.Memory + 76, // 64: payload.v1.Info.Node.Pods:type_name -> payload.v1.Info.Pods + 71, // 65: payload.v1.Info.Service.ports:type_name -> payload.v1.Info.ServicePort + 72, // 66: payload.v1.Info.Service.labels:type_name -> payload.v1.Info.Labels + 73, // 67: payload.v1.Info.Service.annotations:type_name -> payload.v1.Info.Annotations + 84, // 68: payload.v1.Info.Labels.labels:type_name -> payload.v1.Info.Labels.LabelsEntry + 85, // 69: payload.v1.Info.Annotations.annotations:type_name -> payload.v1.Info.Annotations.AnnotationsEntry + 68, // 70: payload.v1.Info.Pods.pods:type_name -> payload.v1.Info.Pod + 69, // 71: payload.v1.Info.Nodes.nodes:type_name -> payload.v1.Info.Node + 70, // 72: payload.v1.Info.Services.services:type_name -> payload.v1.Info.Service + 86, // 73: payload.v1.Mirror.Targets.targets:type_name -> payload.v1.Mirror.Target + 74, // [74:74] is the sub-list for method output_type + 74, // [74:74] is the sub-list for method input_type + 74, // [74:74] is the sub-list for extension type_name + 74, // [74:74] is the sub-list for extension extendee + 0, // [0:74] is the sub-list for field type_name } func init() { file_v1_payload_payload_proto_init() } @@ -5587,7 +5745,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { + switch v := v.(*Mirror); i { case 0: return &v.state case 1: @@ -5599,7 +5757,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_Request); i { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -5611,7 +5769,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_MultiRequest); i { + switch v := v.(*Search_Request); i { case 0: return &v.state case 1: @@ -5623,7 +5781,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_IDRequest); i { + switch v := v.(*Search_MultiRequest); i { case 0: return &v.state case 1: @@ -5635,7 +5793,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_MultiIDRequest); i { + switch v := v.(*Search_IDRequest); i { case 0: return &v.state case 1: @@ -5647,7 +5805,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_ObjectRequest); i { + switch v := v.(*Search_MultiIDRequest); i { case 0: return &v.state case 1: @@ -5659,7 +5817,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_MultiObjectRequest); i { + switch v := v.(*Search_ObjectRequest); i { case 0: return &v.state case 1: @@ -5671,7 +5829,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_Config); i { + switch v := v.(*Search_MultiObjectRequest); i { case 0: return &v.state case 1: @@ -5683,7 +5841,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_Response); i { + switch v := v.(*Search_Config); i { case 0: return &v.state case 1: @@ -5695,7 +5853,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_Responses); i { + switch v := v.(*Search_Response); i { case 0: return &v.state case 1: @@ -5707,7 +5865,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Search_StreamResponse); i { + switch v := v.(*Search_Responses); i { case 0: return &v.state case 1: @@ -5719,7 +5877,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Filter_Target); i { + switch v := v.(*Search_StreamResponse); i { case 0: return &v.state case 1: @@ -5731,7 +5889,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Filter_Config); i { + switch v := v.(*Filter_Target); i { case 0: return &v.state case 1: @@ -5743,7 +5901,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Insert_Request); i { + switch v := v.(*Filter_Config); i { case 0: return &v.state case 1: @@ -5755,7 +5913,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Insert_MultiRequest); i { + switch v := v.(*Insert_Request); i { case 0: return &v.state case 1: @@ -5767,7 +5925,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Insert_ObjectRequest); i { + switch v := v.(*Insert_MultiRequest); i { case 0: return &v.state case 1: @@ -5779,7 +5937,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Insert_MultiObjectRequest); i { + switch v := v.(*Insert_ObjectRequest); i { case 0: return &v.state case 1: @@ -5791,7 +5949,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Insert_Config); i { + switch v := v.(*Insert_MultiObjectRequest); i { case 0: return &v.state case 1: @@ -5803,7 +5961,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Update_Request); i { + switch v := v.(*Insert_Config); i { case 0: return &v.state case 1: @@ -5815,7 +5973,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Update_MultiRequest); i { + switch v := v.(*Update_Request); i { case 0: return &v.state case 1: @@ -5827,7 +5985,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Update_ObjectRequest); i { + switch v := v.(*Update_MultiRequest); i { case 0: return &v.state case 1: @@ -5839,7 +5997,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Update_MultiObjectRequest); i { + switch v := v.(*Update_ObjectRequest); i { case 0: return &v.state case 1: @@ -5851,7 +6009,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Update_Config); i { + switch v := v.(*Update_MultiObjectRequest); i { case 0: return &v.state case 1: @@ -5863,7 +6021,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Upsert_Request); i { + switch v := v.(*Update_Config); i { case 0: return &v.state case 1: @@ -5875,7 +6033,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Upsert_MultiRequest); i { + switch v := v.(*Upsert_Request); i { case 0: return &v.state case 1: @@ -5887,7 +6045,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Upsert_ObjectRequest); i { + switch v := v.(*Upsert_MultiRequest); i { case 0: return &v.state case 1: @@ -5899,7 +6057,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Upsert_MultiObjectRequest); i { + switch v := v.(*Upsert_ObjectRequest); i { case 0: return &v.state case 1: @@ -5911,7 +6069,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Upsert_Config); i { + switch v := v.(*Upsert_MultiObjectRequest); i { case 0: return &v.state case 1: @@ -5923,7 +6081,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Remove_Request); i { + switch v := v.(*Upsert_Config); i { case 0: return &v.state case 1: @@ -5935,7 +6093,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Remove_MultiRequest); i { + switch v := v.(*Remove_Request); i { case 0: return &v.state case 1: @@ -5947,7 +6105,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Remove_TimestampRequest); i { + switch v := v.(*Remove_MultiRequest); i { case 0: return &v.state case 1: @@ -5959,7 +6117,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Remove_Timestamp); i { + switch v := v.(*Remove_TimestampRequest); i { case 0: return &v.state case 1: @@ -5971,7 +6129,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Remove_Config); i { + switch v := v.(*Remove_Timestamp); i { case 0: return &v.state case 1: @@ -5983,7 +6141,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_VectorRequest); i { + switch v := v.(*Remove_Config); i { case 0: return &v.state case 1: @@ -5995,7 +6153,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_Distance); i { + switch v := v.(*Object_VectorRequest); i { case 0: return &v.state case 1: @@ -6007,7 +6165,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_StreamDistance); i { + switch v := v.(*Object_Distance); i { case 0: return &v.state case 1: @@ -6019,7 +6177,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_ID); i { + switch v := v.(*Object_StreamDistance); i { case 0: return &v.state case 1: @@ -6031,7 +6189,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_IDs); i { + switch v := v.(*Object_ID); i { case 0: return &v.state case 1: @@ -6043,7 +6201,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_Vector); i { + switch v := v.(*Object_IDs); i { case 0: return &v.state case 1: @@ -6055,7 +6213,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_GetTimestampRequest); i { + switch v := v.(*Object_Vector); i { case 0: return &v.state case 1: @@ -6067,7 +6225,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_Timestamp); i { + switch v := v.(*Object_GetTimestampRequest); i { case 0: return &v.state case 1: @@ -6079,7 +6237,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_Vectors); i { + switch v := v.(*Object_Timestamp); i { case 0: return &v.state case 1: @@ -6091,7 +6249,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_StreamVector); i { + switch v := v.(*Object_Vectors); i { case 0: return &v.state case 1: @@ -6103,7 +6261,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_ReshapeVector); i { + switch v := v.(*Object_StreamVector); i { case 0: return &v.state case 1: @@ -6115,7 +6273,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_Blob); i { + switch v := v.(*Object_ReshapeVector); i { case 0: return &v.state case 1: @@ -6127,7 +6285,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_StreamBlob); i { + switch v := v.(*Object_Blob); i { case 0: return &v.state case 1: @@ -6139,7 +6297,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_Location); i { + switch v := v.(*Object_StreamBlob); i { case 0: return &v.state case 1: @@ -6151,7 +6309,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_StreamLocation); i { + switch v := v.(*Object_Location); i { case 0: return &v.state case 1: @@ -6163,7 +6321,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_Locations); i { + switch v := v.(*Object_StreamLocation); i { case 0: return &v.state case 1: @@ -6175,7 +6333,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_List); i { + switch v := v.(*Object_Locations); i { case 0: return &v.state case 1: @@ -6187,7 +6345,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_List_Request); i { + switch v := v.(*Object_List); i { case 0: return &v.state case 1: @@ -6199,7 +6357,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Object_List_Response); i { + switch v := v.(*Object_List_Request); i { case 0: return &v.state case 1: @@ -6211,7 +6369,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Control_CreateIndexRequest); i { + switch v := v.(*Object_List_Response); i { case 0: return &v.state case 1: @@ -6223,7 +6381,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Discoverer_Request); i { + switch v := v.(*Control_CreateIndexRequest); i { case 0: return &v.state case 1: @@ -6235,7 +6393,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Index); i { + switch v := v.(*Discoverer_Request); i { case 0: return &v.state case 1: @@ -6247,7 +6405,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Pod); i { + switch v := v.(*Info_Index); i { case 0: return &v.state case 1: @@ -6259,7 +6417,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Node); i { + switch v := v.(*Info_Pod); i { case 0: return &v.state case 1: @@ -6271,7 +6429,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Service); i { + switch v := v.(*Info_Node); i { case 0: return &v.state case 1: @@ -6283,7 +6441,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_ServicePort); i { + switch v := v.(*Info_Service); i { case 0: return &v.state case 1: @@ -6295,7 +6453,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Labels); i { + switch v := v.(*Info_ServicePort); i { case 0: return &v.state case 1: @@ -6307,7 +6465,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Annotations); i { + switch v := v.(*Info_Labels); i { case 0: return &v.state case 1: @@ -6319,7 +6477,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_CPU); i { + switch v := v.(*Info_Annotations); i { case 0: return &v.state case 1: @@ -6331,7 +6489,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Memory); i { + switch v := v.(*Info_CPU); i { case 0: return &v.state case 1: @@ -6343,7 +6501,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Pods); i { + switch v := v.(*Info_Memory); i { case 0: return &v.state case 1: @@ -6355,7 +6513,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Nodes); i { + switch v := v.(*Info_Pods); i { case 0: return &v.state case 1: @@ -6367,7 +6525,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Services); i { + switch v := v.(*Info_Nodes); i { case 0: return &v.state case 1: @@ -6379,7 +6537,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_IPs); i { + switch v := v.(*Info_Services); i { case 0: return &v.state case 1: @@ -6391,7 +6549,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Index_Count); i { + switch v := v.(*Info_IPs); i { case 0: return &v.state case 1: @@ -6403,7 +6561,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Index_UUID); i { + switch v := v.(*Info_Index_Count); i { case 0: return &v.state case 1: @@ -6415,7 +6573,7 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Info_Index_UUID_Committed); i { + switch v := v.(*Info_Index_UUID); i { case 0: return &v.state case 1: @@ -6427,6 +6585,18 @@ func file_v1_payload_payload_proto_init() { } } file_v1_payload_payload_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Info_Index_UUID_Committed); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_v1_payload_payload_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Info_Index_UUID_Uncommitted); i { case 0: return &v.state @@ -6438,28 +6608,52 @@ func file_v1_payload_payload_proto_init() { return nil } } + file_v1_payload_payload_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Mirror_Target); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_v1_payload_payload_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Mirror_Targets); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } - file_v1_payload_payload_proto_msgTypes[20].OneofWrappers = []interface{}{ + file_v1_payload_payload_proto_msgTypes[21].OneofWrappers = []interface{}{ (*Search_StreamResponse_Response)(nil), (*Search_StreamResponse_Status)(nil), } - file_v1_payload_payload_proto_msgTypes[45].OneofWrappers = []interface{}{ + file_v1_payload_payload_proto_msgTypes[46].OneofWrappers = []interface{}{ (*Object_StreamDistance_Distance)(nil), (*Object_StreamDistance_Status)(nil), } - file_v1_payload_payload_proto_msgTypes[52].OneofWrappers = []interface{}{ + file_v1_payload_payload_proto_msgTypes[53].OneofWrappers = []interface{}{ (*Object_StreamVector_Vector)(nil), (*Object_StreamVector_Status)(nil), } - file_v1_payload_payload_proto_msgTypes[55].OneofWrappers = []interface{}{ + file_v1_payload_payload_proto_msgTypes[56].OneofWrappers = []interface{}{ (*Object_StreamBlob_Blob)(nil), (*Object_StreamBlob_Status)(nil), } - file_v1_payload_payload_proto_msgTypes[57].OneofWrappers = []interface{}{ + file_v1_payload_payload_proto_msgTypes[58].OneofWrappers = []interface{}{ (*Object_StreamLocation_Location)(nil), (*Object_StreamLocation_Status)(nil), } - file_v1_payload_payload_proto_msgTypes[61].OneofWrappers = []interface{}{ + file_v1_payload_payload_proto_msgTypes[62].OneofWrappers = []interface{}{ (*Object_List_Response_Vector)(nil), (*Object_List_Response_Status)(nil), } @@ -6469,7 +6663,7 @@ func file_v1_payload_payload_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_v1_payload_payload_proto_rawDesc, NumEnums: 2, - NumMessages: 83, + NumMessages: 86, NumExtensions: 0, NumServices: 0, }, diff --git a/apis/grpc/v1/payload/payload_vtproto.pb.go b/apis/grpc/v1/payload/payload_vtproto.pb.go index 861c080ffa..97c00f6a48 100644 --- a/apis/grpc/v1/payload/payload_vtproto.pb.go +++ b/apis/grpc/v1/payload/payload_vtproto.pb.go @@ -1833,6 +1833,64 @@ func (m *Info) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *Mirror_Target) CloneVT() *Mirror_Target { + if m == nil { + return (*Mirror_Target)(nil) + } + r := &Mirror_Target{ + Host: m.Host, + Port: m.Port, + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *Mirror_Target) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *Mirror_Targets) CloneVT() *Mirror_Targets { + if m == nil { + return (*Mirror_Targets)(nil) + } + r := &Mirror_Targets{} + if rhs := m.Targets; rhs != nil { + tmpContainer := make([]*Mirror_Target, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Targets = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *Mirror_Targets) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *Mirror) CloneVT() *Mirror { + if m == nil { + return (*Mirror)(nil) + } + r := &Mirror{} + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *Mirror) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *Empty) CloneVT() *Empty { if m == nil { return (*Empty)(nil) @@ -4252,6 +4310,77 @@ func (this *Info) EqualMessageVT(thatMsg proto.Message) bool { } return this.EqualVT(that) } +func (this *Mirror_Target) EqualVT(that *Mirror_Target) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if this.Host != that.Host { + return false + } + if this.Port != that.Port { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *Mirror_Target) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*Mirror_Target) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *Mirror_Targets) EqualVT(that *Mirror_Targets) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + if len(this.Targets) != len(that.Targets) { + return false + } + for i, vx := range this.Targets { + vy := that.Targets[i] + if p, q := vx, vy; p != q { + if p == nil { + p = &Mirror_Target{} + } + if q == nil { + q = &Mirror_Target{} + } + if !p.EqualVT(q) { + return false + } + } + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *Mirror_Targets) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*Mirror_Targets) + if !ok { + return false + } + return this.EqualVT(that) +} +func (this *Mirror) EqualVT(that *Mirror) bool { + if this == that { + return true + } else if this == nil || that == nil { + return false + } + return string(this.unknownFields) == string(that.unknownFields) +} + +func (this *Mirror) EqualMessageVT(thatMsg proto.Message) bool { + that, ok := thatMsg.(*Mirror) + if !ok { + return false + } + return this.EqualVT(that) +} func (this *Empty) EqualVT(that *Empty) bool { if this == that { return true @@ -8409,6 +8538,129 @@ func (m *Info) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Mirror_Target) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Mirror_Target) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Mirror_Target) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Port != 0 { + i = encodeVarint(dAtA, i, uint64(m.Port)) + i-- + dAtA[i] = 0x10 + } + if len(m.Host) > 0 { + i -= len(m.Host) + copy(dAtA[i:], m.Host) + i = encodeVarint(dAtA, i, uint64(len(m.Host))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Mirror_Targets) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Mirror_Targets) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Mirror_Targets) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Targets) > 0 { + for iNdEx := len(m.Targets) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Targets[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Mirror) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Mirror) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Mirror) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *Empty) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -9990,6 +10242,49 @@ func (m *Info) SizeVT() (n int) { return n } +func (m *Mirror_Target) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Host) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + if m.Port != 0 { + n += 1 + sov(uint64(m.Port)) + } + n += len(m.unknownFields) + return n +} + +func (m *Mirror_Targets) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Targets) > 0 { + for _, e := range m.Targets { + l = e.SizeVT() + n += 1 + l + sov(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *Mirror) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + func (m *Empty) SizeVT() (n int) { if m == nil { return 0 @@ -18768,6 +19063,244 @@ func (m *Info) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *Mirror_Target) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Mirror_Target: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Mirror_Target: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Host", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Host = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Mirror_Targets) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Mirror_Targets: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Mirror_Targets: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Targets", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Targets = append(m.Targets, &Mirror_Target{}) + if err := m.Targets[len(m.Targets)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Mirror) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Mirror: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Mirror: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Empty) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/apis/grpc/v1/rpc/errdetails/error_details.pb.go b/apis/grpc/v1/rpc/errdetails/error_details.pb.go index 2d91f3a121..c1b22e2cbc 100644 --- a/apis/grpc/v1/rpc/errdetails/error_details.pb.go +++ b/apis/grpc/v1/rpc/errdetails/error_details.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/rpc/errdetails/error_details.proto diff --git a/apis/grpc/v1/vald/filter.pb.go b/apis/grpc/v1/vald/filter.pb.go index 21e3f2a553..51baa71dbd 100644 --- a/apis/grpc/v1/vald/filter.pb.go +++ b/apis/grpc/v1/vald/filter.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/vald/filter.proto diff --git a/apis/grpc/v1/vald/insert.pb.go b/apis/grpc/v1/vald/insert.pb.go index c650fcb0bb..1523003a54 100644 --- a/apis/grpc/v1/vald/insert.pb.go +++ b/apis/grpc/v1/vald/insert.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/vald/insert.proto diff --git a/apis/grpc/v1/vald/object.pb.go b/apis/grpc/v1/vald/object.pb.go index 3479429db1..16ed2f94cf 100644 --- a/apis/grpc/v1/vald/object.pb.go +++ b/apis/grpc/v1/vald/object.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/vald/object.proto diff --git a/apis/grpc/v1/vald/remove.pb.go b/apis/grpc/v1/vald/remove.pb.go index d09508c71f..21a057dc8a 100644 --- a/apis/grpc/v1/vald/remove.pb.go +++ b/apis/grpc/v1/vald/remove.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/vald/remove.proto diff --git a/apis/grpc/v1/vald/search.pb.go b/apis/grpc/v1/vald/search.pb.go index a26a97b8bb..9ffb9435ce 100644 --- a/apis/grpc/v1/vald/search.pb.go +++ b/apis/grpc/v1/vald/search.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/vald/search.proto diff --git a/apis/grpc/v1/vald/update.pb.go b/apis/grpc/v1/vald/update.pb.go index a2346cff03..673a078d24 100644 --- a/apis/grpc/v1/vald/update.pb.go +++ b/apis/grpc/v1/vald/update.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/vald/update.proto diff --git a/apis/grpc/v1/vald/upsert.pb.go b/apis/grpc/v1/vald/upsert.pb.go index 7eaf492f15..8ad5eb4345 100644 --- a/apis/grpc/v1/vald/upsert.pb.go +++ b/apis/grpc/v1/vald/upsert.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: v1/vald/upsert.proto diff --git a/apis/grpc/v1/vald/vald.go b/apis/grpc/v1/vald/vald.go index e3d2a8c46d..14477c37b6 100644 --- a/apis/grpc/v1/vald/vald.go +++ b/apis/grpc/v1/vald/vald.go @@ -18,6 +18,7 @@ package vald import ( + "github.com/vdaas/vald/apis/grpc/v1/mirror" grpc "google.golang.org/grpc" ) @@ -35,6 +36,11 @@ type ServerWithFilter interface { FilterServer } +type ServerWithMirror interface { + Server + mirror.MirrorServer +} + type UnimplementedValdServer struct { UnimplementedInsertServer UnimplementedUpdateServer @@ -49,6 +55,11 @@ type UnimplementedValdServerWithFilter struct { UnimplementedFilterServer } +type UnimplementedValdServerWithMirror struct { + UnimplementedValdServer + mirror.UnimplementedMirrorServer +} + type Client interface { InsertClient UpdateClient @@ -63,6 +74,11 @@ type ClientWithFilter interface { FilterClient } +type ClientWithMirror interface { + Client + mirror.MirrorClient +} + const PackageName = "vald.v1" const ( @@ -73,6 +89,7 @@ const ( RemoveRPCServiceName = "Remove" ObjectRPCServiceName = "Object" FilterRPCServiceName = "Filter" + MirrorRPCServiceName = "Mirror" ) const ( @@ -126,6 +143,8 @@ const ( GetTimestampRPCName = "GetTimestamp" StreamGetObjectRPCName = "StreamGetObject" StreamListObjectRPCName = "StreamListObject" + + RegisterRPCName = "Register" ) type client struct { @@ -137,6 +156,11 @@ type client struct { ObjectClient } +type clientWithMirror struct { + Client + mirror.MirrorClient +} + func RegisterValdServer(s *grpc.Server, srv Server) { RegisterInsertServer(s, srv) RegisterUpdateServer(s, srv) @@ -151,6 +175,11 @@ func RegisterValdServerWithFilter(s *grpc.Server, srv ServerWithFilter) { RegisterFilterServer(s, srv) } +func RegisterValdServerWithMirror(s *grpc.Server, srv ServerWithMirror) { + RegisterValdServer(s, srv) + mirror.RegisterMirrorServer(s, srv) +} + func NewValdClient(conn *grpc.ClientConn) Client { return &client{ NewInsertClient(conn), @@ -161,3 +190,10 @@ func NewValdClient(conn *grpc.ClientConn) Client { NewObjectClient(conn), } } + +func NewValdClientWithMirror(conn *grpc.ClientConn) ClientWithMirror { + return &clientWithMirror{ + Client: NewValdClient(conn), + MirrorClient: mirror.NewMirrorClient(conn), + } +} diff --git a/apis/proto/v1/mirror/mirror.proto b/apis/proto/v1/mirror/mirror.proto new file mode 100644 index 0000000000..5275ceb2eb --- /dev/null +++ b/apis/proto/v1/mirror/mirror.proto @@ -0,0 +1,37 @@ +// +// Copyright (C) 2019-2024 vdaas.org vald team +// +// 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 +// +// https://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. +// +syntax = "proto3"; + +package mirror.v1; + +import "google/api/annotations.proto"; +import "v1/payload/payload.proto"; + +option go_package = "github.com/vdaas/vald/apis/grpc/v1/mirror"; +option java_multiple_files = true; +option java_outer_classname = "ValdMirror"; +option java_package = "org.vdaas.vald.api.v1.mirror"; + +// Represent the mirror service. +service Mirror { + // Register is the RPC to register other mirror servers. + rpc Register(payload.v1.Mirror.Targets) returns (payload.v1.Mirror.Targets) { + option (google.api.http) = { + post: "/mirror/register" + body: "*" + }; + } +} diff --git a/apis/proto/v1/payload/payload.proto b/apis/proto/v1/payload/payload.proto index 38bec33d1e..1a21234d6f 100644 --- a/apis/proto/v1/payload/payload.proto +++ b/apis/proto/v1/payload/payload.proto @@ -641,5 +641,22 @@ message Info { } } +// Mirror related messages. +message Mirror { + // Represent server information. + message Target { + // The target hostname. + string host = 1; + // The target port. + uint32 port = 2; + } + + // Represent the multiple Target message. + message Targets { + // The multiple target information. + repeated Target targets = 1; + } +} + // Represent an empty message. message Empty {} diff --git a/apis/swagger/v1/discoverer/discoverer.swagger.json b/apis/swagger/v1/discoverer/discoverer.swagger.json index b6df1227c3..915d82ab71 100644 --- a/apis/swagger/v1/discoverer/discoverer.swagger.json +++ b/apis/swagger/v1/discoverer/discoverer.swagger.json @@ -20,7 +20,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/InfoNodes" + "$ref": "#/definitions/v1InfoNodes" } }, "default": { @@ -52,7 +52,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/InfoPods" + "$ref": "#/definitions/v1InfoPods" } }, "default": { @@ -84,7 +84,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/InfoServices" + "$ref": "#/definitions/v1InfoServices" } }, "default": { @@ -200,26 +200,12 @@ "description": "The memory information of the node." }, "Pods": { - "$ref": "#/definitions/InfoPods", + "$ref": "#/definitions/v1InfoPods", "description": "The pod information of the node." } }, "description": "Represent the node information message." }, - "InfoNodes": { - "type": "object", - "properties": { - "nodes": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/InfoNode" - }, - "description": "The multiple node information." - } - }, - "description": "Represent the multiple node information message." - }, "InfoPod": { "type": "object", "properties": { @@ -254,20 +240,6 @@ }, "description": "Represent the pod information message." }, - "InfoPods": { - "type": "object", - "properties": { - "pods": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/InfoPod" - }, - "description": "The multiple pod information." - } - }, - "description": "Represent the multiple pod information message." - }, "InfoService": { "type": "object", "properties": { @@ -320,20 +292,6 @@ }, "description": "Represets the service port information message." }, - "InfoServices": { - "type": "object", - "properties": { - "services": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/InfoService" - }, - "description": "The multiple service information." - } - }, - "description": "Represent the multiple service information message." - }, "protobufAny": { "type": "object", "properties": { @@ -385,6 +343,48 @@ } }, "description": "Represent the dicoverer request." + }, + "v1InfoNodes": { + "type": "object", + "properties": { + "nodes": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/InfoNode" + }, + "description": "The multiple node information." + } + }, + "description": "Represent the multiple node information message." + }, + "v1InfoPods": { + "type": "object", + "properties": { + "pods": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/InfoPod" + }, + "description": "The multiple pod information." + } + }, + "description": "Represent the multiple pod information message." + }, + "v1InfoServices": { + "type": "object", + "properties": { + "services": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/InfoService" + }, + "description": "The multiple service information." + } + }, + "description": "Represent the multiple service information message." } } } diff --git a/apis/swagger/v1/mirror/apis/proto/v1/mirror/mirror.swagger.json b/apis/swagger/v1/mirror/apis/proto/v1/mirror/mirror.swagger.json new file mode 100644 index 0000000000..ea66b1c572 --- /dev/null +++ b/apis/swagger/v1/mirror/apis/proto/v1/mirror/mirror.swagger.json @@ -0,0 +1,108 @@ +{ + "swagger": "2.0", + "info": { + "title": "apis/proto/v1/mirror/mirror.proto", + "version": "version not set" + }, + "consumes": ["application/json"], + "produces": ["application/json"], + "paths": { + "/mirror/register": { + "post": { + "summary": "Register is the RPC to register other mirror servers.", + "operationId": "Mirror_Register", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/MirrorTargets" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/MirrorTargets" + } + } + ], + "tags": ["Mirror"] + } + } + }, + "definitions": { + "MirrorTargets": { + "type": "object", + "properties": { + "targets": { + "type": "array", + "items": { + "$ref": "#/definitions/v1MirrorTarget" + }, + "description": "The multiple target information." + } + }, + "description": "Represent the multiple Target message." + }, + "protobufAny": { + "type": "object", + "properties": { + "typeUrl": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n // or ...\n if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n foo = any.unpack(Foo.getDefaultInstance());\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, + "v1MirrorTarget": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The target hostname." + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The target port." + } + }, + "description": "Represent server information." + } + } +} diff --git a/apis/swagger/v1/mirror/mirror.swagger.json b/apis/swagger/v1/mirror/mirror.swagger.json new file mode 100644 index 0000000000..8c2fea2bb4 --- /dev/null +++ b/apis/swagger/v1/mirror/mirror.swagger.json @@ -0,0 +1,113 @@ +{ + "swagger": "2.0", + "info": { + "title": "v1/mirror/mirror.proto", + "version": "version not set" + }, + "tags": [ + { + "name": "Mirror" + } + ], + "consumes": ["application/json"], + "produces": ["application/json"], + "paths": { + "/mirror/register": { + "post": { + "summary": "Register is the RPC to register other mirror servers.", + "operationId": "Mirror_Register", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/MirrorTargets" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "description": "Represent the multiple Target message.", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/MirrorTargets" + } + } + ], + "tags": ["Mirror"] + } + } + }, + "definitions": { + "MirrorTargets": { + "type": "object", + "properties": { + "targets": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/v1MirrorTarget" + }, + "description": "The multiple target information." + } + }, + "description": "Represent the multiple Target message." + }, + "protobufAny": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + } + }, + "additionalProperties": {}, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n // or ...\n if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n foo = any.unpack(Foo.getDefaultInstance());\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "rpcStatus": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32", + "description": "The status code, which should be an enum value of\n[google.rpc.Code][google.rpc.Code]." + }, + "message": { + "type": "string", + "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\n[google.rpc.Status.details][google.rpc.Status.details] field, or localized\nby the client." + }, + "details": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/protobufAny" + }, + "description": "A list of messages that carry the error details. There is a common set of\nmessage types for APIs to use." + } + }, + "description": "The `Status` type defines a logical error model that is suitable for\ndifferent programming environments, including REST APIs and RPC APIs. It is\nused by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details.\n\nYou can find out more about this error model and how to work with it in the\n[API Design Guide](https://cloud.google.com/apis/design/errors)." + }, + "v1MirrorTarget": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The target hostname." + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The target port." + } + }, + "description": "Represent server information." + } + } +} diff --git a/apis/swagger/v1/vald/filter.swagger.json b/apis/swagger/v1/vald/filter.swagger.json index d4993d784e..0e060ee5d3 100644 --- a/apis/swagger/v1/vald/filter.swagger.json +++ b/apis/swagger/v1/vald/filter.swagger.json @@ -270,21 +270,6 @@ } }, "definitions": { - "FilterTarget": { - "type": "object", - "properties": { - "host": { - "type": "string", - "description": "The target hostname." - }, - "port": { - "type": "integer", - "format": "int64", - "description": "The target port." - } - }, - "description": "Represent the target filter server." - }, "ObjectBlob": { "type": "object", "properties": { @@ -423,13 +408,28 @@ "type": "array", "items": { "type": "object", - "$ref": "#/definitions/FilterTarget" + "$ref": "#/definitions/v1FilterTarget" }, "description": "Represent the filter target configuration." } }, "description": "Represent filter configuration." }, + "v1FilterTarget": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The target hostname." + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The target port." + } + }, + "description": "Represent the target filter server." + }, "v1InsertConfig": { "type": "object", "properties": { @@ -475,7 +475,7 @@ "description": "The configuration of the insert request." }, "vectorizer": { - "$ref": "#/definitions/FilterTarget", + "$ref": "#/definitions/v1FilterTarget", "description": "Filter configurations." } }, @@ -576,7 +576,7 @@ "description": "The configuration of the search request." }, "vectorizer": { - "$ref": "#/definitions/FilterTarget", + "$ref": "#/definitions/v1FilterTarget", "description": "Filter configuration." } }, @@ -649,7 +649,7 @@ "description": "The configuration of the update request." }, "vectorizer": { - "$ref": "#/definitions/FilterTarget", + "$ref": "#/definitions/v1FilterTarget", "description": "Filter target." } }, @@ -704,7 +704,7 @@ "description": "The configuration of the upsert request." }, "vectorizer": { - "$ref": "#/definitions/FilterTarget", + "$ref": "#/definitions/v1FilterTarget", "description": "Filter target." } }, diff --git a/apis/swagger/v1/vald/insert.swagger.json b/apis/swagger/v1/vald/insert.swagger.json index 8b47bbcdde..6b76719382 100644 --- a/apis/swagger/v1/vald/insert.swagger.json +++ b/apis/swagger/v1/vald/insert.swagger.json @@ -78,21 +78,6 @@ } }, "definitions": { - "FilterTarget": { - "type": "object", - "properties": { - "host": { - "type": "string", - "description": "The target hostname." - }, - "port": { - "type": "integer", - "format": "int64", - "description": "The target port." - } - }, - "description": "Represent the target filter server." - }, "ObjectLocations": { "type": "object", "properties": { @@ -184,13 +169,28 @@ "type": "array", "items": { "type": "object", - "$ref": "#/definitions/FilterTarget" + "$ref": "#/definitions/v1FilterTarget" }, "description": "Represent the filter target configuration." } }, "description": "Represent filter configuration." }, + "v1FilterTarget": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The target hostname." + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The target port." + } + }, + "description": "Represent the target filter server." + }, "v1InsertConfig": { "type": "object", "properties": { diff --git a/apis/swagger/v1/vald/object.swagger.json b/apis/swagger/v1/vald/object.swagger.json index b0ca410f12..de87f3948e 100644 --- a/apis/swagger/v1/vald/object.swagger.json +++ b/apis/swagger/v1/vald/object.swagger.json @@ -102,21 +102,6 @@ } }, "definitions": { - "FilterTarget": { - "type": "object", - "properties": { - "host": { - "type": "string", - "description": "The target hostname." - }, - "port": { - "type": "integer", - "format": "int64", - "description": "The target port." - } - }, - "description": "Represent the target filter server." - }, "ObjectID": { "type": "object", "properties": { @@ -217,12 +202,27 @@ "type": "array", "items": { "type": "object", - "$ref": "#/definitions/FilterTarget" + "$ref": "#/definitions/v1FilterTarget" }, "description": "Represent the filter target configuration." } }, "description": "Represent filter configuration." + }, + "v1FilterTarget": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The target hostname." + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The target port." + } + }, + "description": "Represent the target filter server." } } } diff --git a/apis/swagger/v1/vald/search.swagger.json b/apis/swagger/v1/vald/search.swagger.json index 3a0dafd252..b131377f51 100644 --- a/apis/swagger/v1/vald/search.swagger.json +++ b/apis/swagger/v1/vald/search.swagger.json @@ -270,21 +270,6 @@ } }, "definitions": { - "FilterTarget": { - "type": "object", - "properties": { - "host": { - "type": "string", - "description": "The target hostname." - }, - "port": { - "type": "integer", - "format": "int64", - "description": "The target port." - } - }, - "description": "Represent the target filter server." - }, "ObjectDistance": { "type": "object", "properties": { @@ -409,13 +394,28 @@ "type": "array", "items": { "type": "object", - "$ref": "#/definitions/FilterTarget" + "$ref": "#/definitions/v1FilterTarget" }, "description": "Represent the filter target configuration." } }, "description": "Represent filter configuration." }, + "v1FilterTarget": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The target hostname." + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The target port." + } + }, + "description": "Represent the target filter server." + }, "v1SearchConfig": { "type": "object", "properties": { diff --git a/apis/swagger/v1/vald/update.swagger.json b/apis/swagger/v1/vald/update.swagger.json index 1b256710d6..d295febc19 100644 --- a/apis/swagger/v1/vald/update.swagger.json +++ b/apis/swagger/v1/vald/update.swagger.json @@ -78,21 +78,6 @@ } }, "definitions": { - "FilterTarget": { - "type": "object", - "properties": { - "host": { - "type": "string", - "description": "The target hostname." - }, - "port": { - "type": "integer", - "format": "int64", - "description": "The target port." - } - }, - "description": "Represent the target filter server." - }, "ObjectLocations": { "type": "object", "properties": { @@ -184,13 +169,28 @@ "type": "array", "items": { "type": "object", - "$ref": "#/definitions/FilterTarget" + "$ref": "#/definitions/v1FilterTarget" }, "description": "Represent the filter target configuration." } }, "description": "Represent filter configuration." }, + "v1FilterTarget": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The target hostname." + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The target port." + } + }, + "description": "Represent the target filter server." + }, "v1ObjectLocation": { "type": "object", "properties": { diff --git a/apis/swagger/v1/vald/upsert.swagger.json b/apis/swagger/v1/vald/upsert.swagger.json index d4f429b6f3..b36801bc74 100644 --- a/apis/swagger/v1/vald/upsert.swagger.json +++ b/apis/swagger/v1/vald/upsert.swagger.json @@ -78,21 +78,6 @@ } }, "definitions": { - "FilterTarget": { - "type": "object", - "properties": { - "host": { - "type": "string", - "description": "The target hostname." - }, - "port": { - "type": "integer", - "format": "int64", - "description": "The target port." - } - }, - "description": "Represent the target filter server." - }, "ObjectLocations": { "type": "object", "properties": { @@ -184,13 +169,28 @@ "type": "array", "items": { "type": "object", - "$ref": "#/definitions/FilterTarget" + "$ref": "#/definitions/v1FilterTarget" }, "description": "Represent the filter target configuration." } }, "description": "Represent filter configuration." }, + "v1FilterTarget": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The target hostname." + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The target port." + } + }, + "description": "Represent the target filter server." + }, "v1ObjectLocation": { "type": "object", "properties": { diff --git a/assets/docs/overview/component/mirror-gateway/full-mesh-connection.png b/assets/docs/overview/component/mirror-gateway/full-mesh-connection.png new file mode 100644 index 0000000000000000000000000000000000000000..66ae6b4d40a3f273d34c00326e1325e28ddc729c GIT binary patch literal 26793 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

9*)OEUVt0wjdwdKW7I=GZd>NRp zFTuiIDnSl=1jzw7VQMjddpd) zIVw|QkfIGG5)_#({8jQ%3sJz@hKt9{_7<>5#IZdOUD(Vt0qfEBo}Pr&55ryZprdE6 z)++(&7!oGUu=%k)-!;&mr7AoeH^ICi2zS5p{7g`QgRo$(NcD$9F#L z4)FZpHPUrwENrmqarWLlv-4H%kx z6@Z~Bl4Ak3*|EbIk?qE$;3@xB!C@cfsxeXf#V5cs3%%rsCax|=vysfNk5$V4yagT` z>%-Tcewu5wG0u+=6ZKjz1OjFL56n*52CUB~M)jifR-WXVI*i|rX11r+SzMJ^=pD0Y z$RT!92f#@ii%yr^`1oppg4FWx6(NANIs?3~U^+fP9nWAeyg2#!0yu93S&UpCJ^;}O za4vsP!d->@5!pSQ*a!_$(Q4-!uxMP!qO<@ybR(h5l{x>5|Hvd`+4vGd_Agj6O?jd6 z)s$2_ER8%<;eq!_`6ow>=>tKQn+5rIRT{rzO z#i3~DULCC!(Zu#}dma1Jux^9yu4-RLUzasPFq77Cm=b)zl5qo^bQ+n>gvSv}A=31# zS14iS23nif>c$~Q9{|Z><9VIF>u9WBvUq9iYq$2RbsQ6A+xpFzO#yMzr-(QoVa;mYu)5oy5^WG--pc{1#CM;|mslENLg=V6o zu?r0~J7wjQX2X79iqSeo)B3rjSOvOkezu{MhuLaMri=d)v{3Xe0C3~93$n+9FP0;? z;Tqg*^*0a>$xj`6^~2=kE~WUY@aALtRzLO_Rft?FJe~xc=Cuwb5M6k6#1%0D$->qB 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