You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ha...@apache.org on 2021/10/18 23:17:11 UTC

[skywalking-banyandb] branch main updated: Feat: metadata registry with embedded etcd (#55)

This is an automated email from the ASF dual-hosted git repository.

hanahmily pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git


The following commit(s) were added to refs/heads/main by this push:
     new be066f1  Feat: metadata registry with embedded etcd (#55)
be066f1 is described below

commit be066f14672fc1f0e8533aeaefe6d44efc01b30a
Author: Jiajing LU <lu...@gmail.com>
AuthorDate: Tue Oct 19 07:17:05 2021 +0800

    Feat: metadata registry with embedded etcd (#55)
    
    * add etcd schema registry
    
    * add metadata relevant entities RPC
    
    * remove protoc installation
    
    * move preload to test files
    
    Co-authored-by: Gao Hongtao <ha...@gmail.com>
---
 Makefile                                           |    1 +
 api/Makefile                                       |    2 +-
 api/proto/banyandb/common/v1/common.pb.go          |  136 +-
 api/proto/banyandb/common/v1/common.proto          |   10 +
 api/proto/banyandb/database/v1/database.pb.go      |    2 +-
 api/proto/banyandb/database/v1/event.pb.go         |    2 +-
 api/proto/banyandb/database/v1/rpc.pb.go           | 3423 ++++++++++++++++++++
 api/proto/banyandb/database/v1/rpc.proto           |  248 ++
 api/proto/banyandb/database/v1/rpc_grpc.pb.go      | 1133 +++++++
 api/proto/banyandb/database/v1/schema.pb.go        |    2 +-
 api/proto/banyandb/model/v1/common.pb.go           |    2 +-
 api/proto/banyandb/model/v1/query.pb.go            |    2 +-
 api/proto/banyandb/stream/v1/query.pb.go           |    2 +-
 api/proto/banyandb/stream/v1/rpc.pb.go             |    2 +-
 api/proto/banyandb/stream/v1/write.pb.go           |    2 +-
 banyand/internal/cmd/standalone.go                 |    4 +-
 banyand/liaison/grpc/registry.go                   |  294 ++
 banyand/liaison/grpc/registry_test.go              |  187 ++
 banyand/liaison/grpc/server.go                     |   37 +-
 banyand/liaison/grpc/stream_test.go                |   32 +-
 banyand/liaison/liaison.go                         |    5 +-
 banyand/metadata/metadata.go                       |   93 +-
 banyand/metadata/metadata_test.go                  |   38 +-
 banyand/metadata/schema/etcd.go                    |  502 +++
 banyand/metadata/schema/etcd_test.go               |  375 +++
 banyand/metadata/schema/schema.go                  |   49 +-
 banyand/metadata/schema/sw.go                      |  139 -
 banyand/metadata/schema/sw_test.go                 |   73 -
 .../{data => testdata}/index_rule_binding.json     |    0
 .../index_rules/db.instance.json                   |    0
 .../{data => testdata}/index_rules/db.type.json    |    0
 .../{data => testdata}/index_rules/duration.json   |    0
 .../index_rules/endpoint_id.json                   |    0
 .../index_rules/http.method.json                   |    0
 .../{data => testdata}/index_rules/mq.broker.json  |    0
 .../{data => testdata}/index_rules/mq.queue.json   |    0
 .../{data => testdata}/index_rules/mq.topic.json   |    0
 .../index_rules/status_code.json                   |    0
 .../{data => testdata}/index_rules/trace_id.json   |    0
 .../metadata/schema/{data => testdata}/stream.json |    0
 banyand/query/processor.go                         |   17 +-
 banyand/query/processor_test.go                    |   21 +-
 banyand/query/query.go                             |    5 +-
 banyand/stream/service.go                          |    2 +-
 banyand/stream/stream_query_test.go                |   11 +-
 banyand/stream/stream_write_test.go                |   22 +-
 go.mod                                             |    3 +
 go.sum                                             |  214 +-
 pkg/query/logical/analyzer.go                      |   19 +-
 pkg/query/logical/analyzer_test.go                 |  116 +-
 pkg/query/logical/common_test.go                   |   21 +-
 pkg/query/logical/plan_execution_test.go           |  141 +-
 pkg/test/etcd.go                                   |  100 +
 .../test/testdata}/index_rule_binding.json         |    0
 .../test/testdata}/index_rules/db.instance.json    |    0
 .../test/testdata}/index_rules/db.type.json        |    0
 .../test/testdata}/index_rules/duration.json       |    0
 .../test/testdata}/index_rules/endpoint_id.json    |    0
 .../test/testdata}/index_rules/http.method.json    |    0
 .../test/testdata}/index_rules/mq.broker.json      |    0
 .../test/testdata}/index_rules/mq.queue.json       |    0
 .../test/testdata}/index_rules/mq.topic.json       |    0
 .../test/testdata}/index_rules/status_code.json    |    0
 .../test/testdata}/index_rules/trace_id.json       |    0
 .../schema/data => pkg/test/testdata}/stream.json  |    0
 scripts/build/base.mk                              |   35 +-
 66 files changed, 7070 insertions(+), 454 deletions(-)

diff --git a/Makefile b/Makefile
index e0e13fc..0146f5c 100644
--- a/Makefile
+++ b/Makefile
@@ -92,6 +92,7 @@ check: clean
 	@if [ ! -z "`git status -s`" ]; then \
 		echo "Following files are not consistent with CI:"; \
 		git status -s; \
+		cat /tmp/artifacts/check.diff; \
 		exit 1; \
 	fi
 	
diff --git a/api/Makefile b/api/Makefile
index 303d7f1..ca1fd60 100644
--- a/api/Makefile
+++ b/api/Makefile
@@ -23,7 +23,7 @@ proto_dir := $(root_dir)/api/proto
 include ../scripts/build/base.mk
 include ../scripts/build/help.mk
 
-generate: $(PROTOC)
+generate: $(BUF)
 	@PATH=$(PATH):$(tool_bin):$(proto_dir) buf generate
 
 lint: $(PROTOC)
diff --git a/api/proto/banyandb/common/v1/common.pb.go b/api/proto/banyandb/common/v1/common.pb.go
index 8ff5f46..f973f23 100644
--- a/api/proto/banyandb/common/v1/common.pb.go
+++ b/api/proto/banyandb/common/v1/common.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/common/v1/common.proto
 
 package v1
@@ -29,6 +29,7 @@ import (
 
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
 )
 
 const (
@@ -153,29 +154,95 @@ func (x *Metadata) GetId() uint32 {
 	return 0
 }
 
+// Group is an internal object for Group management
+type Group struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// name of the group
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// updated_at_nanoseconds indicates when resources of the group are updated
+	UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
+}
+
+func (x *Group) Reset() {
+	*x = Group{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_common_v1_common_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Group) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Group) ProtoMessage() {}
+
+func (x *Group) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_common_v1_common_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Group.ProtoReflect.Descriptor instead.
+func (*Group) Descriptor() ([]byte, []int) {
+	return file_banyandb_common_v1_common_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Group) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Group) GetUpdatedAt() *timestamppb.Timestamp {
+	if x != nil {
+		return x.UpdatedAt
+	}
+	return nil
+}
+
 var File_banyandb_common_v1_common_proto protoreflect.FileDescriptor
 
 var file_banyandb_common_v1_common_proto_rawDesc = []byte{
 	0x0a, 0x1f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
 	0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
 	0x6f, 0x12, 0x12, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
-	0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x22, 0x44, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
-	0x61, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,
-	0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x2a, 0x4b, 0x0a, 0x07, 0x43,
-	0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f,
-	0x47, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
-	0x12, 0x0a, 0x0e, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41,
-	0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x4d,
-	0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x10, 0x02, 0x42, 0x6e, 0x0a, 0x28, 0x6f, 0x72, 0x67, 0x2e,
-	0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e,
-	0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
-	0x6e, 0x2e, 0x76, 0x31, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69,
-	0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63,
-	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x44, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02,
+	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x05,
+	0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x64, 0x41, 0x74, 0x2a, 0x4b, 0x0a, 0x07, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12,
+	0x17, 0x0a, 0x13, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41, 0x54, 0x41,
+	0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f,
+	0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x4d, 0x45, 0x41, 0x53, 0x55, 0x52, 0x45, 0x10,
+	0x02, 0x42, 0x6e, 0x0a, 0x28, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e,
+	0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x5a, 0x42, 0x67,
+	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65,
+	0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76,
+	0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -191,17 +258,20 @@ func file_banyandb_common_v1_common_proto_rawDescGZIP() []byte {
 }
 
 var file_banyandb_common_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_banyandb_common_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_banyandb_common_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
 var file_banyandb_common_v1_common_proto_goTypes = []interface{}{
-	(Catalog)(0),     // 0: banyandb.common.v1.Catalog
-	(*Metadata)(nil), // 1: banyandb.common.v1.Metadata
+	(Catalog)(0),                  // 0: banyandb.common.v1.Catalog
+	(*Metadata)(nil),              // 1: banyandb.common.v1.Metadata
+	(*Group)(nil),                 // 2: banyandb.common.v1.Group
+	(*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp
 }
 var file_banyandb_common_v1_common_proto_depIdxs = []int32{
-	0, // [0:0] is the sub-list for method output_type
-	0, // [0:0] 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
+	3, // 0: banyandb.common.v1.Group.updated_at:type_name -> google.protobuf.Timestamp
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
 }
 
 func init() { file_banyandb_common_v1_common_proto_init() }
@@ -222,6 +292,18 @@ func file_banyandb_common_v1_common_proto_init() {
 				return nil
 			}
 		}
+		file_banyandb_common_v1_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Group); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -229,7 +311,7 @@ func file_banyandb_common_v1_common_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_banyandb_common_v1_common_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   1,
+			NumMessages:   2,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/api/proto/banyandb/common/v1/common.proto b/api/proto/banyandb/common/v1/common.proto
index cbf1bd1..c175122 100644
--- a/api/proto/banyandb/common/v1/common.proto
+++ b/api/proto/banyandb/common/v1/common.proto
@@ -22,6 +22,8 @@ option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/co
 
 package banyandb.common.v1;
 
+import "google/protobuf/timestamp.proto";
+
 enum Catalog {
     CATALOG_UNSPECIFIED = 0;
     CATALOG_STREAM = 1;
@@ -36,3 +38,11 @@ message Metadata {
     string name = 2;
     uint32 id = 3;
 }
+
+// Group is an internal object for Group management
+message Group {
+    // name of the group
+    string name = 1;
+    // updated_at_nanoseconds indicates when resources of the group are updated
+    google.protobuf.Timestamp updated_at = 2;
+}
diff --git a/api/proto/banyandb/database/v1/database.pb.go b/api/proto/banyandb/database/v1/database.pb.go
index f24efd4..bd2a3e6 100644
--- a/api/proto/banyandb/database/v1/database.pb.go
+++ b/api/proto/banyandb/database/v1/database.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/database/v1/database.proto
 
 package v1
diff --git a/api/proto/banyandb/database/v1/event.pb.go b/api/proto/banyandb/database/v1/event.pb.go
index e3f2836..87bddf1 100644
--- a/api/proto/banyandb/database/v1/event.pb.go
+++ b/api/proto/banyandb/database/v1/event.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/database/v1/event.proto
 
 package v1
diff --git a/api/proto/banyandb/database/v1/rpc.pb.go b/api/proto/banyandb/database/v1/rpc.pb.go
new file mode 100644
index 0000000..acd4a03
--- /dev/null
+++ b/api/proto/banyandb/database/v1/rpc.pb.go
@@ -0,0 +1,3423 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.18.1
+// source: banyandb/database/v1/rpc.proto
+
+package v1
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+
+	v1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type StreamRegistryServiceCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"`
+}
+
+func (x *StreamRegistryServiceCreateRequest) Reset() {
+	*x = StreamRegistryServiceCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceCreateRequest) ProtoMessage() {}
+
+func (x *StreamRegistryServiceCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceCreateRequest.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceCreateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *StreamRegistryServiceCreateRequest) GetStream() *Stream {
+	if x != nil {
+		return x.Stream
+	}
+	return nil
+}
+
+type StreamRegistryServiceCreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *StreamRegistryServiceCreateResponse) Reset() {
+	*x = StreamRegistryServiceCreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceCreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceCreateResponse) ProtoMessage() {}
+
+func (x *StreamRegistryServiceCreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceCreateResponse.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceCreateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{1}
+}
+
+type StreamRegistryServiceUpdateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"`
+}
+
+func (x *StreamRegistryServiceUpdateRequest) Reset() {
+	*x = StreamRegistryServiceUpdateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceUpdateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceUpdateRequest) ProtoMessage() {}
+
+func (x *StreamRegistryServiceUpdateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceUpdateRequest.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceUpdateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *StreamRegistryServiceUpdateRequest) GetStream() *Stream {
+	if x != nil {
+		return x.Stream
+	}
+	return nil
+}
+
+type StreamRegistryServiceUpdateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *StreamRegistryServiceUpdateResponse) Reset() {
+	*x = StreamRegistryServiceUpdateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceUpdateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceUpdateResponse) ProtoMessage() {}
+
+func (x *StreamRegistryServiceUpdateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceUpdateResponse.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceUpdateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{3}
+}
+
+type StreamRegistryServiceDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+}
+
+func (x *StreamRegistryServiceDeleteRequest) Reset() {
+	*x = StreamRegistryServiceDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceDeleteRequest) ProtoMessage() {}
+
+func (x *StreamRegistryServiceDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceDeleteRequest.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *StreamRegistryServiceDeleteRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type StreamRegistryServiceDeleteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Deleted bool `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"`
+}
+
+func (x *StreamRegistryServiceDeleteResponse) Reset() {
+	*x = StreamRegistryServiceDeleteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceDeleteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceDeleteResponse) ProtoMessage() {}
+
+func (x *StreamRegistryServiceDeleteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceDeleteResponse.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceDeleteResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *StreamRegistryServiceDeleteResponse) GetDeleted() bool {
+	if x != nil {
+		return x.Deleted
+	}
+	return false
+}
+
+type StreamRegistryServiceGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+}
+
+func (x *StreamRegistryServiceGetRequest) Reset() {
+	*x = StreamRegistryServiceGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceGetRequest) ProtoMessage() {}
+
+func (x *StreamRegistryServiceGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceGetRequest.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceGetRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *StreamRegistryServiceGetRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type StreamRegistryServiceGetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Stream *Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"`
+}
+
+func (x *StreamRegistryServiceGetResponse) Reset() {
+	*x = StreamRegistryServiceGetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceGetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceGetResponse) ProtoMessage() {}
+
+func (x *StreamRegistryServiceGetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceGetResponse.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceGetResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *StreamRegistryServiceGetResponse) GetStream() *Stream {
+	if x != nil {
+		return x.Stream
+	}
+	return nil
+}
+
+type StreamRegistryServiceListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *StreamRegistryServiceListRequest) Reset() {
+	*x = StreamRegistryServiceListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceListRequest) ProtoMessage() {}
+
+func (x *StreamRegistryServiceListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceListRequest.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceListRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *StreamRegistryServiceListRequest) GetGroup() string {
+	if x != nil {
+		return x.Group
+	}
+	return ""
+}
+
+type StreamRegistryServiceListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Stream []*Stream `protobuf:"bytes,1,rep,name=stream,proto3" json:"stream,omitempty"`
+}
+
+func (x *StreamRegistryServiceListResponse) Reset() {
+	*x = StreamRegistryServiceListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamRegistryServiceListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamRegistryServiceListResponse) ProtoMessage() {}
+
+func (x *StreamRegistryServiceListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StreamRegistryServiceListResponse.ProtoReflect.Descriptor instead.
+func (*StreamRegistryServiceListResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *StreamRegistryServiceListResponse) GetStream() []*Stream {
+	if x != nil {
+		return x.Stream
+	}
+	return nil
+}
+
+type IndexRuleBindingRegistryServiceCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IndexRuleBinding *IndexRuleBinding `protobuf:"bytes,1,opt,name=index_rule_binding,json=indexRuleBinding,proto3" json:"index_rule_binding,omitempty"`
+}
+
+func (x *IndexRuleBindingRegistryServiceCreateRequest) Reset() {
+	*x = IndexRuleBindingRegistryServiceCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceCreateRequest) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_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 IndexRuleBindingRegistryServiceCreateRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceCreateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *IndexRuleBindingRegistryServiceCreateRequest) GetIndexRuleBinding() *IndexRuleBinding {
+	if x != nil {
+		return x.IndexRuleBinding
+	}
+	return nil
+}
+
+type IndexRuleBindingRegistryServiceCreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *IndexRuleBindingRegistryServiceCreateResponse) Reset() {
+	*x = IndexRuleBindingRegistryServiceCreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceCreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceCreateResponse) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceCreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceCreateResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceCreateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{11}
+}
+
+type IndexRuleBindingRegistryServiceUpdateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IndexRuleBinding *IndexRuleBinding `protobuf:"bytes,1,opt,name=index_rule_binding,json=indexRuleBinding,proto3" json:"index_rule_binding,omitempty"`
+}
+
+func (x *IndexRuleBindingRegistryServiceUpdateRequest) Reset() {
+	*x = IndexRuleBindingRegistryServiceUpdateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceUpdateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceUpdateRequest) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceUpdateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceUpdateRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceUpdateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *IndexRuleBindingRegistryServiceUpdateRequest) GetIndexRuleBinding() *IndexRuleBinding {
+	if x != nil {
+		return x.IndexRuleBinding
+	}
+	return nil
+}
+
+type IndexRuleBindingRegistryServiceUpdateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *IndexRuleBindingRegistryServiceUpdateResponse) Reset() {
+	*x = IndexRuleBindingRegistryServiceUpdateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceUpdateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceUpdateResponse) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceUpdateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceUpdateResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceUpdateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{13}
+}
+
+type IndexRuleBindingRegistryServiceDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+}
+
+func (x *IndexRuleBindingRegistryServiceDeleteRequest) Reset() {
+	*x = IndexRuleBindingRegistryServiceDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceDeleteRequest) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceDeleteRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *IndexRuleBindingRegistryServiceDeleteRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type IndexRuleBindingRegistryServiceDeleteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Deleted bool `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"`
+}
+
+func (x *IndexRuleBindingRegistryServiceDeleteResponse) Reset() {
+	*x = IndexRuleBindingRegistryServiceDeleteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceDeleteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceDeleteResponse) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceDeleteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceDeleteResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceDeleteResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *IndexRuleBindingRegistryServiceDeleteResponse) GetDeleted() bool {
+	if x != nil {
+		return x.Deleted
+	}
+	return false
+}
+
+type IndexRuleBindingRegistryServiceGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+}
+
+func (x *IndexRuleBindingRegistryServiceGetRequest) Reset() {
+	*x = IndexRuleBindingRegistryServiceGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceGetRequest) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceGetRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceGetRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *IndexRuleBindingRegistryServiceGetRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type IndexRuleBindingRegistryServiceGetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IndexRuleBinding *IndexRuleBinding `protobuf:"bytes,1,opt,name=index_rule_binding,json=indexRuleBinding,proto3" json:"index_rule_binding,omitempty"`
+}
+
+func (x *IndexRuleBindingRegistryServiceGetResponse) Reset() {
+	*x = IndexRuleBindingRegistryServiceGetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceGetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceGetResponse) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceGetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceGetResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceGetResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *IndexRuleBindingRegistryServiceGetResponse) GetIndexRuleBinding() *IndexRuleBinding {
+	if x != nil {
+		return x.IndexRuleBinding
+	}
+	return nil
+}
+
+type IndexRuleBindingRegistryServiceListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *IndexRuleBindingRegistryServiceListRequest) Reset() {
+	*x = IndexRuleBindingRegistryServiceListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceListRequest) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceListRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceListRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *IndexRuleBindingRegistryServiceListRequest) GetGroup() string {
+	if x != nil {
+		return x.Group
+	}
+	return ""
+}
+
+type IndexRuleBindingRegistryServiceListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IndexRuleBinding []*IndexRuleBinding `protobuf:"bytes,1,rep,name=index_rule_binding,json=indexRuleBinding,proto3" json:"index_rule_binding,omitempty"`
+}
+
+func (x *IndexRuleBindingRegistryServiceListResponse) Reset() {
+	*x = IndexRuleBindingRegistryServiceListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleBindingRegistryServiceListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleBindingRegistryServiceListResponse) ProtoMessage() {}
+
+func (x *IndexRuleBindingRegistryServiceListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleBindingRegistryServiceListResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleBindingRegistryServiceListResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *IndexRuleBindingRegistryServiceListResponse) GetIndexRuleBinding() []*IndexRuleBinding {
+	if x != nil {
+		return x.IndexRuleBinding
+	}
+	return nil
+}
+
+type IndexRuleRegistryServiceCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IndexRule *IndexRule `protobuf:"bytes,1,opt,name=index_rule,json=indexRule,proto3" json:"index_rule,omitempty"`
+}
+
+func (x *IndexRuleRegistryServiceCreateRequest) Reset() {
+	*x = IndexRuleRegistryServiceCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceCreateRequest) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceCreateRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceCreateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *IndexRuleRegistryServiceCreateRequest) GetIndexRule() *IndexRule {
+	if x != nil {
+		return x.IndexRule
+	}
+	return nil
+}
+
+type IndexRuleRegistryServiceCreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *IndexRuleRegistryServiceCreateResponse) Reset() {
+	*x = IndexRuleRegistryServiceCreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceCreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceCreateResponse) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceCreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceCreateResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceCreateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{21}
+}
+
+type IndexRuleRegistryServiceUpdateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IndexRule *IndexRule `protobuf:"bytes,1,opt,name=index_rule,json=indexRule,proto3" json:"index_rule,omitempty"`
+}
+
+func (x *IndexRuleRegistryServiceUpdateRequest) Reset() {
+	*x = IndexRuleRegistryServiceUpdateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceUpdateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceUpdateRequest) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceUpdateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceUpdateRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceUpdateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *IndexRuleRegistryServiceUpdateRequest) GetIndexRule() *IndexRule {
+	if x != nil {
+		return x.IndexRule
+	}
+	return nil
+}
+
+type IndexRuleRegistryServiceUpdateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *IndexRuleRegistryServiceUpdateResponse) Reset() {
+	*x = IndexRuleRegistryServiceUpdateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceUpdateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceUpdateResponse) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceUpdateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceUpdateResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceUpdateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{23}
+}
+
+type IndexRuleRegistryServiceDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+}
+
+func (x *IndexRuleRegistryServiceDeleteRequest) Reset() {
+	*x = IndexRuleRegistryServiceDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceDeleteRequest) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceDeleteRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *IndexRuleRegistryServiceDeleteRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type IndexRuleRegistryServiceDeleteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Deleted bool `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"`
+}
+
+func (x *IndexRuleRegistryServiceDeleteResponse) Reset() {
+	*x = IndexRuleRegistryServiceDeleteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceDeleteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceDeleteResponse) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceDeleteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceDeleteResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceDeleteResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *IndexRuleRegistryServiceDeleteResponse) GetDeleted() bool {
+	if x != nil {
+		return x.Deleted
+	}
+	return false
+}
+
+type IndexRuleRegistryServiceGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+}
+
+func (x *IndexRuleRegistryServiceGetRequest) Reset() {
+	*x = IndexRuleRegistryServiceGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceGetRequest) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceGetRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceGetRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *IndexRuleRegistryServiceGetRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type IndexRuleRegistryServiceGetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IndexRule *IndexRule `protobuf:"bytes,1,opt,name=index_rule,json=indexRule,proto3" json:"index_rule,omitempty"`
+}
+
+func (x *IndexRuleRegistryServiceGetResponse) Reset() {
+	*x = IndexRuleRegistryServiceGetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceGetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceGetResponse) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceGetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceGetResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceGetResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *IndexRuleRegistryServiceGetResponse) GetIndexRule() *IndexRule {
+	if x != nil {
+		return x.IndexRule
+	}
+	return nil
+}
+
+type IndexRuleRegistryServiceListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *IndexRuleRegistryServiceListRequest) Reset() {
+	*x = IndexRuleRegistryServiceListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceListRequest) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceListRequest.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceListRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *IndexRuleRegistryServiceListRequest) GetGroup() string {
+	if x != nil {
+		return x.Group
+	}
+	return ""
+}
+
+type IndexRuleRegistryServiceListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IndexRule []*IndexRule `protobuf:"bytes,1,rep,name=index_rule,json=indexRule,proto3" json:"index_rule,omitempty"`
+}
+
+func (x *IndexRuleRegistryServiceListResponse) Reset() {
+	*x = IndexRuleRegistryServiceListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IndexRuleRegistryServiceListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IndexRuleRegistryServiceListResponse) ProtoMessage() {}
+
+func (x *IndexRuleRegistryServiceListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IndexRuleRegistryServiceListResponse.ProtoReflect.Descriptor instead.
+func (*IndexRuleRegistryServiceListResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *IndexRuleRegistryServiceListResponse) GetIndexRule() []*IndexRule {
+	if x != nil {
+		return x.IndexRule
+	}
+	return nil
+}
+
+type MeasureRegistryServiceCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Measure *Measure `protobuf:"bytes,1,opt,name=measure,proto3" json:"measure,omitempty"`
+}
+
+func (x *MeasureRegistryServiceCreateRequest) Reset() {
+	*x = MeasureRegistryServiceCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceCreateRequest) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceCreateRequest.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceCreateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *MeasureRegistryServiceCreateRequest) GetMeasure() *Measure {
+	if x != nil {
+		return x.Measure
+	}
+	return nil
+}
+
+type MeasureRegistryServiceCreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *MeasureRegistryServiceCreateResponse) Reset() {
+	*x = MeasureRegistryServiceCreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceCreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceCreateResponse) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceCreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceCreateResponse.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceCreateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{31}
+}
+
+type MeasureRegistryServiceUpdateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Measure *Measure `protobuf:"bytes,1,opt,name=measure,proto3" json:"measure,omitempty"`
+}
+
+func (x *MeasureRegistryServiceUpdateRequest) Reset() {
+	*x = MeasureRegistryServiceUpdateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceUpdateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceUpdateRequest) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceUpdateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceUpdateRequest.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceUpdateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *MeasureRegistryServiceUpdateRequest) GetMeasure() *Measure {
+	if x != nil {
+		return x.Measure
+	}
+	return nil
+}
+
+type MeasureRegistryServiceUpdateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *MeasureRegistryServiceUpdateResponse) Reset() {
+	*x = MeasureRegistryServiceUpdateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceUpdateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceUpdateResponse) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceUpdateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceUpdateResponse.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceUpdateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{33}
+}
+
+type MeasureRegistryServiceDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+}
+
+func (x *MeasureRegistryServiceDeleteRequest) Reset() {
+	*x = MeasureRegistryServiceDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceDeleteRequest) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceDeleteRequest.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *MeasureRegistryServiceDeleteRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type MeasureRegistryServiceDeleteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Deleted bool `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"`
+}
+
+func (x *MeasureRegistryServiceDeleteResponse) Reset() {
+	*x = MeasureRegistryServiceDeleteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceDeleteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceDeleteResponse) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceDeleteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceDeleteResponse.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceDeleteResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *MeasureRegistryServiceDeleteResponse) GetDeleted() bool {
+	if x != nil {
+		return x.Deleted
+	}
+	return false
+}
+
+type MeasureRegistryServiceGetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
+}
+
+func (x *MeasureRegistryServiceGetRequest) Reset() {
+	*x = MeasureRegistryServiceGetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[36]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceGetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceGetRequest) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceGetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceGetRequest.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceGetRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{36}
+}
+
+func (x *MeasureRegistryServiceGetRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+type MeasureRegistryServiceGetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Measure *Measure `protobuf:"bytes,1,opt,name=measure,proto3" json:"measure,omitempty"`
+}
+
+func (x *MeasureRegistryServiceGetResponse) Reset() {
+	*x = MeasureRegistryServiceGetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[37]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceGetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceGetResponse) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceGetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceGetResponse.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceGetResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *MeasureRegistryServiceGetResponse) GetMeasure() *Measure {
+	if x != nil {
+		return x.Measure
+	}
+	return nil
+}
+
+type MeasureRegistryServiceListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *MeasureRegistryServiceListRequest) Reset() {
+	*x = MeasureRegistryServiceListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[38]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceListRequest) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceListRequest.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceListRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{38}
+}
+
+func (x *MeasureRegistryServiceListRequest) GetGroup() string {
+	if x != nil {
+		return x.Group
+	}
+	return ""
+}
+
+type MeasureRegistryServiceListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Measure []*Measure `protobuf:"bytes,1,rep,name=measure,proto3" json:"measure,omitempty"`
+}
+
+func (x *MeasureRegistryServiceListResponse) Reset() {
+	*x = MeasureRegistryServiceListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[39]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MeasureRegistryServiceListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeasureRegistryServiceListResponse) ProtoMessage() {}
+
+func (x *MeasureRegistryServiceListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MeasureRegistryServiceListResponse.ProtoReflect.Descriptor instead.
+func (*MeasureRegistryServiceListResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{39}
+}
+
+func (x *MeasureRegistryServiceListResponse) GetMeasure() []*Measure {
+	if x != nil {
+		return x.Measure
+	}
+	return nil
+}
+
+type GroupRegistryServiceCreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *GroupRegistryServiceCreateRequest) Reset() {
+	*x = GroupRegistryServiceCreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[40]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GroupRegistryServiceCreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupRegistryServiceCreateRequest) ProtoMessage() {}
+
+func (x *GroupRegistryServiceCreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GroupRegistryServiceCreateRequest.ProtoReflect.Descriptor instead.
+func (*GroupRegistryServiceCreateRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{40}
+}
+
+func (x *GroupRegistryServiceCreateRequest) GetGroup() string {
+	if x != nil {
+		return x.Group
+	}
+	return ""
+}
+
+type GroupRegistryServiceCreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GroupRegistryServiceCreateResponse) Reset() {
+	*x = GroupRegistryServiceCreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[41]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GroupRegistryServiceCreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupRegistryServiceCreateResponse) ProtoMessage() {}
+
+func (x *GroupRegistryServiceCreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GroupRegistryServiceCreateResponse.ProtoReflect.Descriptor instead.
+func (*GroupRegistryServiceCreateResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{41}
+}
+
+type GroupRegistryServiceDeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *GroupRegistryServiceDeleteRequest) Reset() {
+	*x = GroupRegistryServiceDeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[42]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GroupRegistryServiceDeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupRegistryServiceDeleteRequest) ProtoMessage() {}
+
+func (x *GroupRegistryServiceDeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[42]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GroupRegistryServiceDeleteRequest.ProtoReflect.Descriptor instead.
+func (*GroupRegistryServiceDeleteRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *GroupRegistryServiceDeleteRequest) GetGroup() string {
+	if x != nil {
+		return x.Group
+	}
+	return ""
+}
+
+type GroupRegistryServiceDeleteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Deleted bool `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"`
+}
+
+func (x *GroupRegistryServiceDeleteResponse) Reset() {
+	*x = GroupRegistryServiceDeleteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[43]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GroupRegistryServiceDeleteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupRegistryServiceDeleteResponse) ProtoMessage() {}
+
+func (x *GroupRegistryServiceDeleteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[43]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GroupRegistryServiceDeleteResponse.ProtoReflect.Descriptor instead.
+func (*GroupRegistryServiceDeleteResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *GroupRegistryServiceDeleteResponse) GetDeleted() bool {
+	if x != nil {
+		return x.Deleted
+	}
+	return false
+}
+
+type GroupRegistryServiceExistRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *GroupRegistryServiceExistRequest) Reset() {
+	*x = GroupRegistryServiceExistRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[44]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GroupRegistryServiceExistRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupRegistryServiceExistRequest) ProtoMessage() {}
+
+func (x *GroupRegistryServiceExistRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[44]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GroupRegistryServiceExistRequest.ProtoReflect.Descriptor instead.
+func (*GroupRegistryServiceExistRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{44}
+}
+
+func (x *GroupRegistryServiceExistRequest) GetGroup() string {
+	if x != nil {
+		return x.Group
+	}
+	return ""
+}
+
+type GroupRegistryServiceExistResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group *v1.Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *GroupRegistryServiceExistResponse) Reset() {
+	*x = GroupRegistryServiceExistResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[45]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GroupRegistryServiceExistResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupRegistryServiceExistResponse) ProtoMessage() {}
+
+func (x *GroupRegistryServiceExistResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[45]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GroupRegistryServiceExistResponse.ProtoReflect.Descriptor instead.
+func (*GroupRegistryServiceExistResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{45}
+}
+
+func (x *GroupRegistryServiceExistResponse) GetGroup() *v1.Group {
+	if x != nil {
+		return x.Group
+	}
+	return nil
+}
+
+type GroupRegistryServiceListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GroupRegistryServiceListRequest) Reset() {
+	*x = GroupRegistryServiceListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[46]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GroupRegistryServiceListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupRegistryServiceListRequest) ProtoMessage() {}
+
+func (x *GroupRegistryServiceListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[46]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GroupRegistryServiceListRequest.ProtoReflect.Descriptor instead.
+func (*GroupRegistryServiceListRequest) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{46}
+}
+
+type GroupRegistryServiceListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Group []string `protobuf:"bytes,1,rep,name=group,proto3" json:"group,omitempty"`
+}
+
+func (x *GroupRegistryServiceListResponse) Reset() {
+	*x = GroupRegistryServiceListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_banyandb_database_v1_rpc_proto_msgTypes[47]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GroupRegistryServiceListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupRegistryServiceListResponse) ProtoMessage() {}
+
+func (x *GroupRegistryServiceListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_banyandb_database_v1_rpc_proto_msgTypes[47]
+	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 GroupRegistryServiceListResponse.ProtoReflect.Descriptor instead.
+func (*GroupRegistryServiceListResponse) Descriptor() ([]byte, []int) {
+	return file_banyandb_database_v1_rpc_proto_rawDescGZIP(), []int{47}
+}
+
+func (x *GroupRegistryServiceListResponse) GetGroup() []string {
+	if x != nil {
+		return x.Group
+	}
+	return nil
+}
+
+var File_banyandb_database_v1_rpc_proto protoreflect.FileDescriptor
+
+var file_banyandb_database_v1_rpc_proto_rawDesc = []byte{
+	0x0a, 0x1e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x14, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x21, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x63, 0x68,
+	0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5a, 0x0a, 0x22, 0x53, 0x74,
+	0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x06,
+	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x25, 0x0a, 0x23, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x0a,
+	0x22, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x25, 0x0a, 0x23, 0x53, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x5e, 0x0a, 0x22, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
+	0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x22, 0x3f, 0x0a, 0x23, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
+	0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x64, 0x22, 0x5b, 0x0a, 0x1f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73,
+	0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x58,
+	0x0a, 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x38, 0x0a, 0x20, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05,
+	0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f,
+	0x75, 0x70, 0x22, 0x59, 0x0a, 0x21, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53,
+	0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x84, 0x01,
+	0x0a, 0x2c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69,
+	0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54,
+	0x0a, 0x12, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e,
+	0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76,
+	0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69,
+	0x6e, 0x67, 0x52, 0x10, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e,
+	0x64, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x0a, 0x2d, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x2c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52,
+	0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
+	0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x12, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f,
+	0x72, 0x75, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52,
+	0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x69, 0x6e, 0x64, 0x65,
+	0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x0a, 0x2d,
+	0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67,
+	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x68, 0x0a,
+	0x2c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e,
+	0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a,
+	0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x49, 0x0a, 0x2d, 0x49, 0x6e, 0x64, 0x65, 0x78,
+	0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73,
+	0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x64, 0x22, 0x65, 0x0a, 0x29, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42,
+	0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52,
+	0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x82, 0x01, 0x0a, 0x2a, 0x49, 0x6e,
+	0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x12, 0x69, 0x6e, 0x64, 0x65,
+	0x78, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65,
+	0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x69, 0x6e,
+	0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x42,
+	0x0a, 0x2a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69,
+	0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05,
+	0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f,
+	0x75, 0x70, 0x22, 0x83, 0x01, 0x0a, 0x2b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65,
+	0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x54, 0x0a, 0x12, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x72, 0x75, 0x6c, 0x65,
+	0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42,
+	0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x67, 0x0a, 0x25, 0x49, 0x6e, 0x64, 0x65,
+	0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x12, 0x3e, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64,
+	0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x22, 0x28, 0x0a, 0x26, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, 0x25, 0x49,
+	0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x72, 0x75,
+	0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78,
+	0x52, 0x75, 0x6c, 0x65, 0x22, 0x28, 0x0a, 0x26, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x61,
+	0x0a, 0x25, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73,
+	0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
+	0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x22, 0x42, 0x0a, 0x26, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x5e, 0x0a, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75,
+	0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x23, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75,
+	0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0a,
+	0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x3b, 0x0a, 0x23,
+	0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+	0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x66, 0x0a, 0x24, 0x49, 0x6e, 0x64,
+	0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64,
+	0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x22, 0x5e, 0x0a, 0x23, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x07, 0x6d, 0x65, 0x61, 0x73,
+	0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72,
+	0x65, 0x22, 0x26, 0x0a, 0x24, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x0a, 0x23, 0x4d, 0x65, 0x61,
+	0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x37, 0x0a, 0x07, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65,
+	0x52, 0x07, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x22, 0x26, 0x0a, 0x24, 0x4d, 0x65, 0x61,
+	0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x5f, 0x0a, 0x23, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
+	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x22, 0x40, 0x0a, 0x24, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67,
+	0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x20, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52,
+	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
+	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x22, 0x5c, 0x0a, 0x21, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67,
+	0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6d, 0x65, 0x61, 0x73, 0x75,
+	0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65,
+	0x22, 0x39, 0x0a, 0x21, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73,
+	0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x5d, 0x0a, 0x22, 0x4d,
+	0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x37, 0x0a, 0x07, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72,
+	0x65, 0x52, 0x07, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x22, 0x39, 0x0a, 0x21, 0x47, 0x72,
+	0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x24, 0x0a, 0x22, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x0a, 0x21, 0x47,
+	0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3e, 0x0a, 0x22, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52,
+	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07,
+	0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x38, 0x0a, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52,
+	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72,
+	0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70,
+	0x22, 0x54, 0x0a, 0x21, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+	0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52,
+	0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x21, 0x0a, 0x1f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52,
+	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x38, 0x0a, 0x20, 0x47, 0x72, 0x6f,
+	0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a,
+	0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72,
+	0x6f, 0x75, 0x70, 0x32, 0x83, 0x05, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7d, 0x0a,
+	0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x38, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53,
+	0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x39, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52,
+	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x06,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x38, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74,
+	0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x39, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x06, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x38, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x39, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67,
+	0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x03, 0x47, 0x65,
+	0x74, 0x12, 0x35, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52,
+	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x77, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x36, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x37, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xf6, 0x05, 0x0a, 0x1f, 0x49, 0x6e,
+	0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01,
+	0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x42, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67,
+	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e,
+	0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x91, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x42, 0x2e, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e,
+	0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x43, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x12, 0x42, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65,
+	0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x03, 0x47, 0x65,
+	0x74, 0x12, 0x3f, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75,
+	0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+	0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x40, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52,
+	0x75, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
+	0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x2e,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73,
+	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x69,
+	0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x41, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65,
+	0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x32, 0xa7, 0x05, 0x0a, 0x18, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65,
+	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
+	0x83, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x2e, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76,
+	0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73,
+	0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e,
+	0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49,
+	0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x12, 0x3b, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73,
+	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x06,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x3b, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e,
+	0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78,
+	0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x7a, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x38, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+	0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x39, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52,
+	0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a,
+	0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x39, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64,
+	0x65, 0x78, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x3a, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x75, 0x6c,
+	0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x8e, 0x05, 0x0a,
+	0x16, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7f, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x12, 0x39, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65,
+	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x62,
+	0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73,
+	0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x12, 0x39, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72,
+	0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73,
+	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69,
+	0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x06, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x12, 0x39, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75,
+	0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a,
+	0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67,
+	0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x03, 0x47, 0x65,
+	0x74, 0x12, 0x36, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65,
+	0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47,
+	0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x79, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x37, 0x2e, 0x62, 0x61, 0x6e,
+	0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76,
+	0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+	0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75,
+	0x72, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x81, 0x04,
+	0x0a, 0x14, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7b, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x12, 0x37, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x67,
+	0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x37, 0x2e,
+	0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73,
+	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74,
+	0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64,
+	0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72,
+	0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x78, 0x0a, 0x05, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x36, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x37, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65,
+	0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x04, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x35, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52,
+	0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x62, 0x61, 0x6e, 0x79,
+	0x61, 0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x42, 0x72, 0x0a, 0x2a, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e,
+	0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x61, 0x6e, 0x79, 0x61,
+	0x6e, 0x64, 0x62, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x5a,
+	0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63,
+	0x68, 0x65, 0x2f, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x61,
+	0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2f, 0x62, 0x61, 0x6e, 0x79, 0x61, 0x6e, 0x64, 0x62, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61,
+	0x73, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_banyandb_database_v1_rpc_proto_rawDescOnce sync.Once
+	file_banyandb_database_v1_rpc_proto_rawDescData = file_banyandb_database_v1_rpc_proto_rawDesc
+)
+
+func file_banyandb_database_v1_rpc_proto_rawDescGZIP() []byte {
+	file_banyandb_database_v1_rpc_proto_rawDescOnce.Do(func() {
+		file_banyandb_database_v1_rpc_proto_rawDescData = protoimpl.X.CompressGZIP(file_banyandb_database_v1_rpc_proto_rawDescData)
+	})
+	return file_banyandb_database_v1_rpc_proto_rawDescData
+}
+
+var file_banyandb_database_v1_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 48)
+var file_banyandb_database_v1_rpc_proto_goTypes = []interface{}{
+	(*StreamRegistryServiceCreateRequest)(nil),            // 0: banyandb.database.v1.StreamRegistryServiceCreateRequest
+	(*StreamRegistryServiceCreateResponse)(nil),           // 1: banyandb.database.v1.StreamRegistryServiceCreateResponse
+	(*StreamRegistryServiceUpdateRequest)(nil),            // 2: banyandb.database.v1.StreamRegistryServiceUpdateRequest
+	(*StreamRegistryServiceUpdateResponse)(nil),           // 3: banyandb.database.v1.StreamRegistryServiceUpdateResponse
+	(*StreamRegistryServiceDeleteRequest)(nil),            // 4: banyandb.database.v1.StreamRegistryServiceDeleteRequest
+	(*StreamRegistryServiceDeleteResponse)(nil),           // 5: banyandb.database.v1.StreamRegistryServiceDeleteResponse
+	(*StreamRegistryServiceGetRequest)(nil),               // 6: banyandb.database.v1.StreamRegistryServiceGetRequest
+	(*StreamRegistryServiceGetResponse)(nil),              // 7: banyandb.database.v1.StreamRegistryServiceGetResponse
+	(*StreamRegistryServiceListRequest)(nil),              // 8: banyandb.database.v1.StreamRegistryServiceListRequest
+	(*StreamRegistryServiceListResponse)(nil),             // 9: banyandb.database.v1.StreamRegistryServiceListResponse
+	(*IndexRuleBindingRegistryServiceCreateRequest)(nil),  // 10: banyandb.database.v1.IndexRuleBindingRegistryServiceCreateRequest
+	(*IndexRuleBindingRegistryServiceCreateResponse)(nil), // 11: banyandb.database.v1.IndexRuleBindingRegistryServiceCreateResponse
+	(*IndexRuleBindingRegistryServiceUpdateRequest)(nil),  // 12: banyandb.database.v1.IndexRuleBindingRegistryServiceUpdateRequest
+	(*IndexRuleBindingRegistryServiceUpdateResponse)(nil), // 13: banyandb.database.v1.IndexRuleBindingRegistryServiceUpdateResponse
+	(*IndexRuleBindingRegistryServiceDeleteRequest)(nil),  // 14: banyandb.database.v1.IndexRuleBindingRegistryServiceDeleteRequest
+	(*IndexRuleBindingRegistryServiceDeleteResponse)(nil), // 15: banyandb.database.v1.IndexRuleBindingRegistryServiceDeleteResponse
+	(*IndexRuleBindingRegistryServiceGetRequest)(nil),     // 16: banyandb.database.v1.IndexRuleBindingRegistryServiceGetRequest
+	(*IndexRuleBindingRegistryServiceGetResponse)(nil),    // 17: banyandb.database.v1.IndexRuleBindingRegistryServiceGetResponse
+	(*IndexRuleBindingRegistryServiceListRequest)(nil),    // 18: banyandb.database.v1.IndexRuleBindingRegistryServiceListRequest
+	(*IndexRuleBindingRegistryServiceListResponse)(nil),   // 19: banyandb.database.v1.IndexRuleBindingRegistryServiceListResponse
+	(*IndexRuleRegistryServiceCreateRequest)(nil),         // 20: banyandb.database.v1.IndexRuleRegistryServiceCreateRequest
+	(*IndexRuleRegistryServiceCreateResponse)(nil),        // 21: banyandb.database.v1.IndexRuleRegistryServiceCreateResponse
+	(*IndexRuleRegistryServiceUpdateRequest)(nil),         // 22: banyandb.database.v1.IndexRuleRegistryServiceUpdateRequest
+	(*IndexRuleRegistryServiceUpdateResponse)(nil),        // 23: banyandb.database.v1.IndexRuleRegistryServiceUpdateResponse
+	(*IndexRuleRegistryServiceDeleteRequest)(nil),         // 24: banyandb.database.v1.IndexRuleRegistryServiceDeleteRequest
+	(*IndexRuleRegistryServiceDeleteResponse)(nil),        // 25: banyandb.database.v1.IndexRuleRegistryServiceDeleteResponse
+	(*IndexRuleRegistryServiceGetRequest)(nil),            // 26: banyandb.database.v1.IndexRuleRegistryServiceGetRequest
+	(*IndexRuleRegistryServiceGetResponse)(nil),           // 27: banyandb.database.v1.IndexRuleRegistryServiceGetResponse
+	(*IndexRuleRegistryServiceListRequest)(nil),           // 28: banyandb.database.v1.IndexRuleRegistryServiceListRequest
+	(*IndexRuleRegistryServiceListResponse)(nil),          // 29: banyandb.database.v1.IndexRuleRegistryServiceListResponse
+	(*MeasureRegistryServiceCreateRequest)(nil),           // 30: banyandb.database.v1.MeasureRegistryServiceCreateRequest
+	(*MeasureRegistryServiceCreateResponse)(nil),          // 31: banyandb.database.v1.MeasureRegistryServiceCreateResponse
+	(*MeasureRegistryServiceUpdateRequest)(nil),           // 32: banyandb.database.v1.MeasureRegistryServiceUpdateRequest
+	(*MeasureRegistryServiceUpdateResponse)(nil),          // 33: banyandb.database.v1.MeasureRegistryServiceUpdateResponse
+	(*MeasureRegistryServiceDeleteRequest)(nil),           // 34: banyandb.database.v1.MeasureRegistryServiceDeleteRequest
+	(*MeasureRegistryServiceDeleteResponse)(nil),          // 35: banyandb.database.v1.MeasureRegistryServiceDeleteResponse
+	(*MeasureRegistryServiceGetRequest)(nil),              // 36: banyandb.database.v1.MeasureRegistryServiceGetRequest
+	(*MeasureRegistryServiceGetResponse)(nil),             // 37: banyandb.database.v1.MeasureRegistryServiceGetResponse
+	(*MeasureRegistryServiceListRequest)(nil),             // 38: banyandb.database.v1.MeasureRegistryServiceListRequest
+	(*MeasureRegistryServiceListResponse)(nil),            // 39: banyandb.database.v1.MeasureRegistryServiceListResponse
+	(*GroupRegistryServiceCreateRequest)(nil),             // 40: banyandb.database.v1.GroupRegistryServiceCreateRequest
+	(*GroupRegistryServiceCreateResponse)(nil),            // 41: banyandb.database.v1.GroupRegistryServiceCreateResponse
+	(*GroupRegistryServiceDeleteRequest)(nil),             // 42: banyandb.database.v1.GroupRegistryServiceDeleteRequest
+	(*GroupRegistryServiceDeleteResponse)(nil),            // 43: banyandb.database.v1.GroupRegistryServiceDeleteResponse
+	(*GroupRegistryServiceExistRequest)(nil),              // 44: banyandb.database.v1.GroupRegistryServiceExistRequest
+	(*GroupRegistryServiceExistResponse)(nil),             // 45: banyandb.database.v1.GroupRegistryServiceExistResponse
+	(*GroupRegistryServiceListRequest)(nil),               // 46: banyandb.database.v1.GroupRegistryServiceListRequest
+	(*GroupRegistryServiceListResponse)(nil),              // 47: banyandb.database.v1.GroupRegistryServiceListResponse
+	(*Stream)(nil),                                        // 48: banyandb.database.v1.Stream
+	(*v1.Metadata)(nil),                                   // 49: banyandb.common.v1.Metadata
+	(*IndexRuleBinding)(nil),                              // 50: banyandb.database.v1.IndexRuleBinding
+	(*IndexRule)(nil),                                     // 51: banyandb.database.v1.IndexRule
+	(*Measure)(nil),                                       // 52: banyandb.database.v1.Measure
+	(*v1.Group)(nil),                                      // 53: banyandb.common.v1.Group
+}
+var file_banyandb_database_v1_rpc_proto_depIdxs = []int32{
+	48, // 0: banyandb.database.v1.StreamRegistryServiceCreateRequest.stream:type_name -> banyandb.database.v1.Stream
+	48, // 1: banyandb.database.v1.StreamRegistryServiceUpdateRequest.stream:type_name -> banyandb.database.v1.Stream
+	49, // 2: banyandb.database.v1.StreamRegistryServiceDeleteRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	49, // 3: banyandb.database.v1.StreamRegistryServiceGetRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	48, // 4: banyandb.database.v1.StreamRegistryServiceGetResponse.stream:type_name -> banyandb.database.v1.Stream
+	48, // 5: banyandb.database.v1.StreamRegistryServiceListResponse.stream:type_name -> banyandb.database.v1.Stream
+	50, // 6: banyandb.database.v1.IndexRuleBindingRegistryServiceCreateRequest.index_rule_binding:type_name -> banyandb.database.v1.IndexRuleBinding
+	50, // 7: banyandb.database.v1.IndexRuleBindingRegistryServiceUpdateRequest.index_rule_binding:type_name -> banyandb.database.v1.IndexRuleBinding
+	49, // 8: banyandb.database.v1.IndexRuleBindingRegistryServiceDeleteRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	49, // 9: banyandb.database.v1.IndexRuleBindingRegistryServiceGetRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	50, // 10: banyandb.database.v1.IndexRuleBindingRegistryServiceGetResponse.index_rule_binding:type_name -> banyandb.database.v1.IndexRuleBinding
+	50, // 11: banyandb.database.v1.IndexRuleBindingRegistryServiceListResponse.index_rule_binding:type_name -> banyandb.database.v1.IndexRuleBinding
+	51, // 12: banyandb.database.v1.IndexRuleRegistryServiceCreateRequest.index_rule:type_name -> banyandb.database.v1.IndexRule
+	51, // 13: banyandb.database.v1.IndexRuleRegistryServiceUpdateRequest.index_rule:type_name -> banyandb.database.v1.IndexRule
+	49, // 14: banyandb.database.v1.IndexRuleRegistryServiceDeleteRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	49, // 15: banyandb.database.v1.IndexRuleRegistryServiceGetRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	51, // 16: banyandb.database.v1.IndexRuleRegistryServiceGetResponse.index_rule:type_name -> banyandb.database.v1.IndexRule
+	51, // 17: banyandb.database.v1.IndexRuleRegistryServiceListResponse.index_rule:type_name -> banyandb.database.v1.IndexRule
+	52, // 18: banyandb.database.v1.MeasureRegistryServiceCreateRequest.measure:type_name -> banyandb.database.v1.Measure
+	52, // 19: banyandb.database.v1.MeasureRegistryServiceUpdateRequest.measure:type_name -> banyandb.database.v1.Measure
+	49, // 20: banyandb.database.v1.MeasureRegistryServiceDeleteRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	49, // 21: banyandb.database.v1.MeasureRegistryServiceGetRequest.metadata:type_name -> banyandb.common.v1.Metadata
+	52, // 22: banyandb.database.v1.MeasureRegistryServiceGetResponse.measure:type_name -> banyandb.database.v1.Measure
+	52, // 23: banyandb.database.v1.MeasureRegistryServiceListResponse.measure:type_name -> banyandb.database.v1.Measure
+	53, // 24: banyandb.database.v1.GroupRegistryServiceExistResponse.group:type_name -> banyandb.common.v1.Group
+	0,  // 25: banyandb.database.v1.StreamRegistryService.Create:input_type -> banyandb.database.v1.StreamRegistryServiceCreateRequest
+	2,  // 26: banyandb.database.v1.StreamRegistryService.Update:input_type -> banyandb.database.v1.StreamRegistryServiceUpdateRequest
+	4,  // 27: banyandb.database.v1.StreamRegistryService.Delete:input_type -> banyandb.database.v1.StreamRegistryServiceDeleteRequest
+	6,  // 28: banyandb.database.v1.StreamRegistryService.Get:input_type -> banyandb.database.v1.StreamRegistryServiceGetRequest
+	8,  // 29: banyandb.database.v1.StreamRegistryService.List:input_type -> banyandb.database.v1.StreamRegistryServiceListRequest
+	10, // 30: banyandb.database.v1.IndexRuleBindingRegistryService.Create:input_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceCreateRequest
+	12, // 31: banyandb.database.v1.IndexRuleBindingRegistryService.Update:input_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceUpdateRequest
+	14, // 32: banyandb.database.v1.IndexRuleBindingRegistryService.Delete:input_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceDeleteRequest
+	16, // 33: banyandb.database.v1.IndexRuleBindingRegistryService.Get:input_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceGetRequest
+	18, // 34: banyandb.database.v1.IndexRuleBindingRegistryService.List:input_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceListRequest
+	20, // 35: banyandb.database.v1.IndexRuleRegistryService.Create:input_type -> banyandb.database.v1.IndexRuleRegistryServiceCreateRequest
+	22, // 36: banyandb.database.v1.IndexRuleRegistryService.Update:input_type -> banyandb.database.v1.IndexRuleRegistryServiceUpdateRequest
+	24, // 37: banyandb.database.v1.IndexRuleRegistryService.Delete:input_type -> banyandb.database.v1.IndexRuleRegistryServiceDeleteRequest
+	26, // 38: banyandb.database.v1.IndexRuleRegistryService.Get:input_type -> banyandb.database.v1.IndexRuleRegistryServiceGetRequest
+	28, // 39: banyandb.database.v1.IndexRuleRegistryService.List:input_type -> banyandb.database.v1.IndexRuleRegistryServiceListRequest
+	30, // 40: banyandb.database.v1.MeasureRegistryService.Create:input_type -> banyandb.database.v1.MeasureRegistryServiceCreateRequest
+	32, // 41: banyandb.database.v1.MeasureRegistryService.Update:input_type -> banyandb.database.v1.MeasureRegistryServiceUpdateRequest
+	34, // 42: banyandb.database.v1.MeasureRegistryService.Delete:input_type -> banyandb.database.v1.MeasureRegistryServiceDeleteRequest
+	36, // 43: banyandb.database.v1.MeasureRegistryService.Get:input_type -> banyandb.database.v1.MeasureRegistryServiceGetRequest
+	38, // 44: banyandb.database.v1.MeasureRegistryService.List:input_type -> banyandb.database.v1.MeasureRegistryServiceListRequest
+	40, // 45: banyandb.database.v1.GroupRegistryService.Create:input_type -> banyandb.database.v1.GroupRegistryServiceCreateRequest
+	42, // 46: banyandb.database.v1.GroupRegistryService.Delete:input_type -> banyandb.database.v1.GroupRegistryServiceDeleteRequest
+	44, // 47: banyandb.database.v1.GroupRegistryService.Exist:input_type -> banyandb.database.v1.GroupRegistryServiceExistRequest
+	46, // 48: banyandb.database.v1.GroupRegistryService.List:input_type -> banyandb.database.v1.GroupRegistryServiceListRequest
+	1,  // 49: banyandb.database.v1.StreamRegistryService.Create:output_type -> banyandb.database.v1.StreamRegistryServiceCreateResponse
+	3,  // 50: banyandb.database.v1.StreamRegistryService.Update:output_type -> banyandb.database.v1.StreamRegistryServiceUpdateResponse
+	5,  // 51: banyandb.database.v1.StreamRegistryService.Delete:output_type -> banyandb.database.v1.StreamRegistryServiceDeleteResponse
+	7,  // 52: banyandb.database.v1.StreamRegistryService.Get:output_type -> banyandb.database.v1.StreamRegistryServiceGetResponse
+	9,  // 53: banyandb.database.v1.StreamRegistryService.List:output_type -> banyandb.database.v1.StreamRegistryServiceListResponse
+	11, // 54: banyandb.database.v1.IndexRuleBindingRegistryService.Create:output_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceCreateResponse
+	13, // 55: banyandb.database.v1.IndexRuleBindingRegistryService.Update:output_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceUpdateResponse
+	15, // 56: banyandb.database.v1.IndexRuleBindingRegistryService.Delete:output_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceDeleteResponse
+	17, // 57: banyandb.database.v1.IndexRuleBindingRegistryService.Get:output_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceGetResponse
+	19, // 58: banyandb.database.v1.IndexRuleBindingRegistryService.List:output_type -> banyandb.database.v1.IndexRuleBindingRegistryServiceListResponse
+	21, // 59: banyandb.database.v1.IndexRuleRegistryService.Create:output_type -> banyandb.database.v1.IndexRuleRegistryServiceCreateResponse
+	23, // 60: banyandb.database.v1.IndexRuleRegistryService.Update:output_type -> banyandb.database.v1.IndexRuleRegistryServiceUpdateResponse
+	25, // 61: banyandb.database.v1.IndexRuleRegistryService.Delete:output_type -> banyandb.database.v1.IndexRuleRegistryServiceDeleteResponse
+	27, // 62: banyandb.database.v1.IndexRuleRegistryService.Get:output_type -> banyandb.database.v1.IndexRuleRegistryServiceGetResponse
+	29, // 63: banyandb.database.v1.IndexRuleRegistryService.List:output_type -> banyandb.database.v1.IndexRuleRegistryServiceListResponse
+	31, // 64: banyandb.database.v1.MeasureRegistryService.Create:output_type -> banyandb.database.v1.MeasureRegistryServiceCreateResponse
+	33, // 65: banyandb.database.v1.MeasureRegistryService.Update:output_type -> banyandb.database.v1.MeasureRegistryServiceUpdateResponse
+	35, // 66: banyandb.database.v1.MeasureRegistryService.Delete:output_type -> banyandb.database.v1.MeasureRegistryServiceDeleteResponse
+	37, // 67: banyandb.database.v1.MeasureRegistryService.Get:output_type -> banyandb.database.v1.MeasureRegistryServiceGetResponse
+	39, // 68: banyandb.database.v1.MeasureRegistryService.List:output_type -> banyandb.database.v1.MeasureRegistryServiceListResponse
+	41, // 69: banyandb.database.v1.GroupRegistryService.Create:output_type -> banyandb.database.v1.GroupRegistryServiceCreateResponse
+	43, // 70: banyandb.database.v1.GroupRegistryService.Delete:output_type -> banyandb.database.v1.GroupRegistryServiceDeleteResponse
+	45, // 71: banyandb.database.v1.GroupRegistryService.Exist:output_type -> banyandb.database.v1.GroupRegistryServiceExistResponse
+	47, // 72: banyandb.database.v1.GroupRegistryService.List:output_type -> banyandb.database.v1.GroupRegistryServiceListResponse
+	49, // [49:73] is the sub-list for method output_type
+	25, // [25:49] is the sub-list for method input_type
+	25, // [25:25] is the sub-list for extension type_name
+	25, // [25:25] is the sub-list for extension extendee
+	0,  // [0:25] is the sub-list for field type_name
+}
+
+func init() { file_banyandb_database_v1_rpc_proto_init() }
+func file_banyandb_database_v1_rpc_proto_init() {
+	if File_banyandb_database_v1_rpc_proto != nil {
+		return
+	}
+	file_banyandb_database_v1_schema_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_banyandb_database_v1_rpc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceCreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceUpdateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceUpdateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceDeleteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceGetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamRegistryServiceListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceCreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceUpdateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceUpdateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceDeleteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceGetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleBindingRegistryServiceListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceCreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceUpdateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceUpdateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceDeleteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceGetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndexRuleRegistryServiceListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceCreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceUpdateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceUpdateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceDeleteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceGetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceGetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MeasureRegistryServiceListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GroupRegistryServiceCreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GroupRegistryServiceCreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GroupRegistryServiceDeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GroupRegistryServiceDeleteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GroupRegistryServiceExistRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GroupRegistryServiceExistResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GroupRegistryServiceListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_banyandb_database_v1_rpc_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GroupRegistryServiceListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_banyandb_database_v1_rpc_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   48,
+			NumExtensions: 0,
+			NumServices:   5,
+		},
+		GoTypes:           file_banyandb_database_v1_rpc_proto_goTypes,
+		DependencyIndexes: file_banyandb_database_v1_rpc_proto_depIdxs,
+		MessageInfos:      file_banyandb_database_v1_rpc_proto_msgTypes,
+	}.Build()
+	File_banyandb_database_v1_rpc_proto = out.File
+	file_banyandb_database_v1_rpc_proto_rawDesc = nil
+	file_banyandb_database_v1_rpc_proto_goTypes = nil
+	file_banyandb_database_v1_rpc_proto_depIdxs = nil
+}
diff --git a/api/proto/banyandb/database/v1/rpc.proto b/api/proto/banyandb/database/v1/rpc.proto
new file mode 100644
index 0000000..3bee1d6
--- /dev/null
+++ b/api/proto/banyandb/database/v1/rpc.proto
@@ -0,0 +1,248 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+syntax = "proto3";
+
+option java_package = "org.apache.skywalking.banyandb.database.v1";
+option go_package = "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1";
+
+package banyandb.database.v1;
+
+import "banyandb/database/v1/schema.proto";
+import "banyandb/common/v1/common.proto";
+
+message StreamRegistryServiceCreateRequest {
+  banyandb.database.v1.Stream stream = 1;
+}
+
+message StreamRegistryServiceCreateResponse {
+}
+
+message StreamRegistryServiceUpdateRequest {
+  banyandb.database.v1.Stream stream = 1;
+}
+
+message StreamRegistryServiceUpdateResponse {
+}
+
+message StreamRegistryServiceDeleteRequest {
+  banyandb.common.v1.Metadata metadata = 1;
+}
+
+message StreamRegistryServiceDeleteResponse {
+  bool deleted = 1;
+}
+
+message StreamRegistryServiceGetRequest {
+  banyandb.common.v1.Metadata metadata = 1;
+}
+
+message StreamRegistryServiceGetResponse {
+  banyandb.database.v1.Stream stream = 1;
+}
+
+message StreamRegistryServiceListRequest {
+  string group = 1;
+}
+
+message StreamRegistryServiceListResponse {
+  repeated banyandb.database.v1.Stream stream = 1;
+}
+
+service StreamRegistryService {
+  rpc Create(StreamRegistryServiceCreateRequest) returns (StreamRegistryServiceCreateResponse);
+  rpc Update(StreamRegistryServiceUpdateRequest) returns (StreamRegistryServiceUpdateResponse);
+  rpc Delete(StreamRegistryServiceDeleteRequest) returns (StreamRegistryServiceDeleteResponse);
+  rpc Get(StreamRegistryServiceGetRequest) returns (StreamRegistryServiceGetResponse);
+  rpc List(StreamRegistryServiceListRequest) returns (StreamRegistryServiceListResponse);
+}
+
+message IndexRuleBindingRegistryServiceCreateRequest {
+  banyandb.database.v1.IndexRuleBinding index_rule_binding = 1;
+}
+
+message IndexRuleBindingRegistryServiceCreateResponse {
+}
+
+message IndexRuleBindingRegistryServiceUpdateRequest {
+  banyandb.database.v1.IndexRuleBinding index_rule_binding = 1;
+}
+
+message IndexRuleBindingRegistryServiceUpdateResponse {
+}
+
+message IndexRuleBindingRegistryServiceDeleteRequest {
+  banyandb.common.v1.Metadata metadata = 1;
+}
+
+message IndexRuleBindingRegistryServiceDeleteResponse {
+  bool deleted = 1;
+}
+
+message IndexRuleBindingRegistryServiceGetRequest {
+  banyandb.common.v1.Metadata metadata = 1;
+}
+
+message IndexRuleBindingRegistryServiceGetResponse {
+  banyandb.database.v1.IndexRuleBinding index_rule_binding = 1;
+}
+
+message IndexRuleBindingRegistryServiceListRequest {
+  string group = 1;
+}
+
+message IndexRuleBindingRegistryServiceListResponse {
+  repeated banyandb.database.v1.IndexRuleBinding index_rule_binding = 1;
+}
+
+service IndexRuleBindingRegistryService {
+  rpc Create(IndexRuleBindingRegistryServiceCreateRequest) returns (IndexRuleBindingRegistryServiceCreateResponse);
+  rpc Update(IndexRuleBindingRegistryServiceUpdateRequest) returns (IndexRuleBindingRegistryServiceUpdateResponse);
+  rpc Delete(IndexRuleBindingRegistryServiceDeleteRequest) returns (IndexRuleBindingRegistryServiceDeleteResponse);
+  rpc Get(IndexRuleBindingRegistryServiceGetRequest) returns (IndexRuleBindingRegistryServiceGetResponse);
+  rpc List(IndexRuleBindingRegistryServiceListRequest) returns (IndexRuleBindingRegistryServiceListResponse);
+}
+
+message IndexRuleRegistryServiceCreateRequest {
+  banyandb.database.v1.IndexRule index_rule = 1;
+}
+
+message IndexRuleRegistryServiceCreateResponse {
+}
+
+message IndexRuleRegistryServiceUpdateRequest {
+  banyandb.database.v1.IndexRule index_rule = 1;
+}
+
+message IndexRuleRegistryServiceUpdateResponse {
+}
+
+message IndexRuleRegistryServiceDeleteRequest {
+  banyandb.common.v1.Metadata metadata = 1;
+}
+
+message IndexRuleRegistryServiceDeleteResponse {
+  bool deleted = 1;
+}
+
+message IndexRuleRegistryServiceGetRequest {
+  banyandb.common.v1.Metadata metadata = 1;
+}
+
+message IndexRuleRegistryServiceGetResponse {
+  banyandb.database.v1.IndexRule index_rule = 1;
+}
+
+message IndexRuleRegistryServiceListRequest {
+  string group = 1;
+}
+
+message IndexRuleRegistryServiceListResponse {
+  repeated banyandb.database.v1.IndexRule index_rule = 1;
+}
+
+service IndexRuleRegistryService {
+  rpc Create(IndexRuleRegistryServiceCreateRequest) returns (IndexRuleRegistryServiceCreateResponse);
+  rpc Update(IndexRuleRegistryServiceUpdateRequest) returns (IndexRuleRegistryServiceUpdateResponse);
+  rpc Delete(IndexRuleRegistryServiceDeleteRequest) returns (IndexRuleRegistryServiceDeleteResponse);
+  rpc Get(IndexRuleRegistryServiceGetRequest) returns (IndexRuleRegistryServiceGetResponse);
+  rpc List(IndexRuleRegistryServiceListRequest) returns (IndexRuleRegistryServiceListResponse);
+}
+
+message MeasureRegistryServiceCreateRequest {
+  banyandb.database.v1.Measure measure = 1;
+}
+
+message MeasureRegistryServiceCreateResponse {
+}
+
+message MeasureRegistryServiceUpdateRequest {
+  banyandb.database.v1.Measure measure = 1;
+}
+
+message MeasureRegistryServiceUpdateResponse {
+}
+
+message MeasureRegistryServiceDeleteRequest {
+  banyandb.common.v1.Metadata metadata = 1;
+}
+
+message MeasureRegistryServiceDeleteResponse {
+  bool deleted = 1;
+}
+
+message MeasureRegistryServiceGetRequest {
+  banyandb.common.v1.Metadata metadata = 1;
+}
+
+message MeasureRegistryServiceGetResponse {
+  banyandb.database.v1.Measure measure = 1;
+}
+
+message MeasureRegistryServiceListRequest {
+  string group = 1;
+}
+
+message MeasureRegistryServiceListResponse {
+  repeated banyandb.database.v1.Measure measure = 1;
+}
+
+service MeasureRegistryService {
+  rpc Create(MeasureRegistryServiceCreateRequest) returns (MeasureRegistryServiceCreateResponse);
+  rpc Update(MeasureRegistryServiceUpdateRequest) returns (MeasureRegistryServiceUpdateResponse);
+  rpc Delete(MeasureRegistryServiceDeleteRequest) returns (MeasureRegistryServiceDeleteResponse);
+  rpc Get(MeasureRegistryServiceGetRequest) returns (MeasureRegistryServiceGetResponse);
+  rpc List(MeasureRegistryServiceListRequest) returns (MeasureRegistryServiceListResponse);
+}
+
+message GroupRegistryServiceCreateRequest {
+  string group = 1;
+}
+
+message GroupRegistryServiceCreateResponse {
+
+}
+
+message GroupRegistryServiceDeleteRequest {
+  string group = 1;
+}
+
+message GroupRegistryServiceDeleteResponse {
+  bool deleted = 1;
+}
+
+message GroupRegistryServiceExistRequest {
+  string group = 1;
+}
+
+message GroupRegistryServiceExistResponse {
+  banyandb.common.v1.Group group = 1;
+}
+
+message GroupRegistryServiceListRequest {
+}
+
+message GroupRegistryServiceListResponse {
+  repeated string group = 1;
+}
+
+service GroupRegistryService {
+  rpc Create(GroupRegistryServiceCreateRequest) returns (GroupRegistryServiceCreateResponse);
+  rpc Delete(GroupRegistryServiceDeleteRequest) returns (GroupRegistryServiceDeleteResponse);
+  rpc Exist(GroupRegistryServiceExistRequest) returns (GroupRegistryServiceExistResponse);
+  rpc List(GroupRegistryServiceListRequest) returns (GroupRegistryServiceListResponse);
+}
\ No newline at end of file
diff --git a/api/proto/banyandb/database/v1/rpc_grpc.pb.go b/api/proto/banyandb/database/v1/rpc_grpc.pb.go
new file mode 100644
index 0000000..f3bf229
--- /dev/null
+++ b/api/proto/banyandb/database/v1/rpc_grpc.pb.go
@@ -0,0 +1,1133 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+
+package v1
+
+import (
+	context "context"
+
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// 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
+
+// StreamRegistryServiceClient is the client API for StreamRegistryService 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 StreamRegistryServiceClient interface {
+	Create(ctx context.Context, in *StreamRegistryServiceCreateRequest, opts ...grpc.CallOption) (*StreamRegistryServiceCreateResponse, error)
+	Update(ctx context.Context, in *StreamRegistryServiceUpdateRequest, opts ...grpc.CallOption) (*StreamRegistryServiceUpdateResponse, error)
+	Delete(ctx context.Context, in *StreamRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*StreamRegistryServiceDeleteResponse, error)
+	Get(ctx context.Context, in *StreamRegistryServiceGetRequest, opts ...grpc.CallOption) (*StreamRegistryServiceGetResponse, error)
+	List(ctx context.Context, in *StreamRegistryServiceListRequest, opts ...grpc.CallOption) (*StreamRegistryServiceListResponse, error)
+}
+
+type streamRegistryServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewStreamRegistryServiceClient(cc grpc.ClientConnInterface) StreamRegistryServiceClient {
+	return &streamRegistryServiceClient{cc}
+}
+
+func (c *streamRegistryServiceClient) Create(ctx context.Context, in *StreamRegistryServiceCreateRequest, opts ...grpc.CallOption) (*StreamRegistryServiceCreateResponse, error) {
+	out := new(StreamRegistryServiceCreateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.StreamRegistryService/Create", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *streamRegistryServiceClient) Update(ctx context.Context, in *StreamRegistryServiceUpdateRequest, opts ...grpc.CallOption) (*StreamRegistryServiceUpdateResponse, error) {
+	out := new(StreamRegistryServiceUpdateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.StreamRegistryService/Update", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *streamRegistryServiceClient) Delete(ctx context.Context, in *StreamRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*StreamRegistryServiceDeleteResponse, error) {
+	out := new(StreamRegistryServiceDeleteResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.StreamRegistryService/Delete", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *streamRegistryServiceClient) Get(ctx context.Context, in *StreamRegistryServiceGetRequest, opts ...grpc.CallOption) (*StreamRegistryServiceGetResponse, error) {
+	out := new(StreamRegistryServiceGetResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.StreamRegistryService/Get", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *streamRegistryServiceClient) List(ctx context.Context, in *StreamRegistryServiceListRequest, opts ...grpc.CallOption) (*StreamRegistryServiceListResponse, error) {
+	out := new(StreamRegistryServiceListResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.StreamRegistryService/List", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// StreamRegistryServiceServer is the server API for StreamRegistryService service.
+// All implementations must embed UnimplementedStreamRegistryServiceServer
+// for forward compatibility
+type StreamRegistryServiceServer interface {
+	Create(context.Context, *StreamRegistryServiceCreateRequest) (*StreamRegistryServiceCreateResponse, error)
+	Update(context.Context, *StreamRegistryServiceUpdateRequest) (*StreamRegistryServiceUpdateResponse, error)
+	Delete(context.Context, *StreamRegistryServiceDeleteRequest) (*StreamRegistryServiceDeleteResponse, error)
+	Get(context.Context, *StreamRegistryServiceGetRequest) (*StreamRegistryServiceGetResponse, error)
+	List(context.Context, *StreamRegistryServiceListRequest) (*StreamRegistryServiceListResponse, error)
+	mustEmbedUnimplementedStreamRegistryServiceServer()
+}
+
+// UnimplementedStreamRegistryServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedStreamRegistryServiceServer struct {
+}
+
+func (UnimplementedStreamRegistryServiceServer) Create(context.Context, *StreamRegistryServiceCreateRequest) (*StreamRegistryServiceCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
+}
+func (UnimplementedStreamRegistryServiceServer) Update(context.Context, *StreamRegistryServiceUpdateRequest) (*StreamRegistryServiceUpdateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Update not implemented")
+}
+func (UnimplementedStreamRegistryServiceServer) Delete(context.Context, *StreamRegistryServiceDeleteRequest) (*StreamRegistryServiceDeleteResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
+}
+func (UnimplementedStreamRegistryServiceServer) Get(context.Context, *StreamRegistryServiceGetRequest) (*StreamRegistryServiceGetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
+}
+func (UnimplementedStreamRegistryServiceServer) List(context.Context, *StreamRegistryServiceListRequest) (*StreamRegistryServiceListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
+}
+func (UnimplementedStreamRegistryServiceServer) mustEmbedUnimplementedStreamRegistryServiceServer() {}
+
+// UnsafeStreamRegistryServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to StreamRegistryServiceServer will
+// result in compilation errors.
+type UnsafeStreamRegistryServiceServer interface {
+	mustEmbedUnimplementedStreamRegistryServiceServer()
+}
+
+func RegisterStreamRegistryServiceServer(s grpc.ServiceRegistrar, srv StreamRegistryServiceServer) {
+	s.RegisterService(&StreamRegistryService_ServiceDesc, srv)
+}
+
+func _StreamRegistryService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(StreamRegistryServiceCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(StreamRegistryServiceServer).Create(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.StreamRegistryService/Create",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(StreamRegistryServiceServer).Create(ctx, req.(*StreamRegistryServiceCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _StreamRegistryService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(StreamRegistryServiceUpdateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(StreamRegistryServiceServer).Update(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.StreamRegistryService/Update",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(StreamRegistryServiceServer).Update(ctx, req.(*StreamRegistryServiceUpdateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _StreamRegistryService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(StreamRegistryServiceDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(StreamRegistryServiceServer).Delete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.StreamRegistryService/Delete",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(StreamRegistryServiceServer).Delete(ctx, req.(*StreamRegistryServiceDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _StreamRegistryService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(StreamRegistryServiceGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(StreamRegistryServiceServer).Get(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.StreamRegistryService/Get",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(StreamRegistryServiceServer).Get(ctx, req.(*StreamRegistryServiceGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _StreamRegistryService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(StreamRegistryServiceListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(StreamRegistryServiceServer).List(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.StreamRegistryService/List",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(StreamRegistryServiceServer).List(ctx, req.(*StreamRegistryServiceListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// StreamRegistryService_ServiceDesc is the grpc.ServiceDesc for StreamRegistryService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var StreamRegistryService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "banyandb.database.v1.StreamRegistryService",
+	HandlerType: (*StreamRegistryServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Create",
+			Handler:    _StreamRegistryService_Create_Handler,
+		},
+		{
+			MethodName: "Update",
+			Handler:    _StreamRegistryService_Update_Handler,
+		},
+		{
+			MethodName: "Delete",
+			Handler:    _StreamRegistryService_Delete_Handler,
+		},
+		{
+			MethodName: "Get",
+			Handler:    _StreamRegistryService_Get_Handler,
+		},
+		{
+			MethodName: "List",
+			Handler:    _StreamRegistryService_List_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "banyandb/database/v1/rpc.proto",
+}
+
+// IndexRuleBindingRegistryServiceClient is the client API for IndexRuleBindingRegistryService 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 IndexRuleBindingRegistryServiceClient interface {
+	Create(ctx context.Context, in *IndexRuleBindingRegistryServiceCreateRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceCreateResponse, error)
+	Update(ctx context.Context, in *IndexRuleBindingRegistryServiceUpdateRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceUpdateResponse, error)
+	Delete(ctx context.Context, in *IndexRuleBindingRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceDeleteResponse, error)
+	Get(ctx context.Context, in *IndexRuleBindingRegistryServiceGetRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceGetResponse, error)
+	List(ctx context.Context, in *IndexRuleBindingRegistryServiceListRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceListResponse, error)
+}
+
+type indexRuleBindingRegistryServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewIndexRuleBindingRegistryServiceClient(cc grpc.ClientConnInterface) IndexRuleBindingRegistryServiceClient {
+	return &indexRuleBindingRegistryServiceClient{cc}
+}
+
+func (c *indexRuleBindingRegistryServiceClient) Create(ctx context.Context, in *IndexRuleBindingRegistryServiceCreateRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceCreateResponse, error) {
+	out := new(IndexRuleBindingRegistryServiceCreateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleBindingRegistryService/Create", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *indexRuleBindingRegistryServiceClient) Update(ctx context.Context, in *IndexRuleBindingRegistryServiceUpdateRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceUpdateResponse, error) {
+	out := new(IndexRuleBindingRegistryServiceUpdateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleBindingRegistryService/Update", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *indexRuleBindingRegistryServiceClient) Delete(ctx context.Context, in *IndexRuleBindingRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceDeleteResponse, error) {
+	out := new(IndexRuleBindingRegistryServiceDeleteResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleBindingRegistryService/Delete", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *indexRuleBindingRegistryServiceClient) Get(ctx context.Context, in *IndexRuleBindingRegistryServiceGetRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceGetResponse, error) {
+	out := new(IndexRuleBindingRegistryServiceGetResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleBindingRegistryService/Get", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *indexRuleBindingRegistryServiceClient) List(ctx context.Context, in *IndexRuleBindingRegistryServiceListRequest, opts ...grpc.CallOption) (*IndexRuleBindingRegistryServiceListResponse, error) {
+	out := new(IndexRuleBindingRegistryServiceListResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleBindingRegistryService/List", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// IndexRuleBindingRegistryServiceServer is the server API for IndexRuleBindingRegistryService service.
+// All implementations must embed UnimplementedIndexRuleBindingRegistryServiceServer
+// for forward compatibility
+type IndexRuleBindingRegistryServiceServer interface {
+	Create(context.Context, *IndexRuleBindingRegistryServiceCreateRequest) (*IndexRuleBindingRegistryServiceCreateResponse, error)
+	Update(context.Context, *IndexRuleBindingRegistryServiceUpdateRequest) (*IndexRuleBindingRegistryServiceUpdateResponse, error)
+	Delete(context.Context, *IndexRuleBindingRegistryServiceDeleteRequest) (*IndexRuleBindingRegistryServiceDeleteResponse, error)
+	Get(context.Context, *IndexRuleBindingRegistryServiceGetRequest) (*IndexRuleBindingRegistryServiceGetResponse, error)
+	List(context.Context, *IndexRuleBindingRegistryServiceListRequest) (*IndexRuleBindingRegistryServiceListResponse, error)
+	mustEmbedUnimplementedIndexRuleBindingRegistryServiceServer()
+}
+
+// UnimplementedIndexRuleBindingRegistryServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedIndexRuleBindingRegistryServiceServer struct {
+}
+
+func (UnimplementedIndexRuleBindingRegistryServiceServer) Create(context.Context, *IndexRuleBindingRegistryServiceCreateRequest) (*IndexRuleBindingRegistryServiceCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
+}
+func (UnimplementedIndexRuleBindingRegistryServiceServer) Update(context.Context, *IndexRuleBindingRegistryServiceUpdateRequest) (*IndexRuleBindingRegistryServiceUpdateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Update not implemented")
+}
+func (UnimplementedIndexRuleBindingRegistryServiceServer) Delete(context.Context, *IndexRuleBindingRegistryServiceDeleteRequest) (*IndexRuleBindingRegistryServiceDeleteResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
+}
+func (UnimplementedIndexRuleBindingRegistryServiceServer) Get(context.Context, *IndexRuleBindingRegistryServiceGetRequest) (*IndexRuleBindingRegistryServiceGetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
+}
+func (UnimplementedIndexRuleBindingRegistryServiceServer) List(context.Context, *IndexRuleBindingRegistryServiceListRequest) (*IndexRuleBindingRegistryServiceListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
+}
+func (UnimplementedIndexRuleBindingRegistryServiceServer) mustEmbedUnimplementedIndexRuleBindingRegistryServiceServer() {
+}
+
+// UnsafeIndexRuleBindingRegistryServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to IndexRuleBindingRegistryServiceServer will
+// result in compilation errors.
+type UnsafeIndexRuleBindingRegistryServiceServer interface {
+	mustEmbedUnimplementedIndexRuleBindingRegistryServiceServer()
+}
+
+func RegisterIndexRuleBindingRegistryServiceServer(s grpc.ServiceRegistrar, srv IndexRuleBindingRegistryServiceServer) {
+	s.RegisterService(&IndexRuleBindingRegistryService_ServiceDesc, srv)
+}
+
+func _IndexRuleBindingRegistryService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleBindingRegistryServiceCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleBindingRegistryServiceServer).Create(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleBindingRegistryService/Create",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleBindingRegistryServiceServer).Create(ctx, req.(*IndexRuleBindingRegistryServiceCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _IndexRuleBindingRegistryService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleBindingRegistryServiceUpdateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleBindingRegistryServiceServer).Update(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleBindingRegistryService/Update",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleBindingRegistryServiceServer).Update(ctx, req.(*IndexRuleBindingRegistryServiceUpdateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _IndexRuleBindingRegistryService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleBindingRegistryServiceDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleBindingRegistryServiceServer).Delete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleBindingRegistryService/Delete",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleBindingRegistryServiceServer).Delete(ctx, req.(*IndexRuleBindingRegistryServiceDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _IndexRuleBindingRegistryService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleBindingRegistryServiceGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleBindingRegistryServiceServer).Get(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleBindingRegistryService/Get",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleBindingRegistryServiceServer).Get(ctx, req.(*IndexRuleBindingRegistryServiceGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _IndexRuleBindingRegistryService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleBindingRegistryServiceListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleBindingRegistryServiceServer).List(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleBindingRegistryService/List",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleBindingRegistryServiceServer).List(ctx, req.(*IndexRuleBindingRegistryServiceListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// IndexRuleBindingRegistryService_ServiceDesc is the grpc.ServiceDesc for IndexRuleBindingRegistryService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var IndexRuleBindingRegistryService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "banyandb.database.v1.IndexRuleBindingRegistryService",
+	HandlerType: (*IndexRuleBindingRegistryServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Create",
+			Handler:    _IndexRuleBindingRegistryService_Create_Handler,
+		},
+		{
+			MethodName: "Update",
+			Handler:    _IndexRuleBindingRegistryService_Update_Handler,
+		},
+		{
+			MethodName: "Delete",
+			Handler:    _IndexRuleBindingRegistryService_Delete_Handler,
+		},
+		{
+			MethodName: "Get",
+			Handler:    _IndexRuleBindingRegistryService_Get_Handler,
+		},
+		{
+			MethodName: "List",
+			Handler:    _IndexRuleBindingRegistryService_List_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "banyandb/database/v1/rpc.proto",
+}
+
+// IndexRuleRegistryServiceClient is the client API for IndexRuleRegistryService 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 IndexRuleRegistryServiceClient interface {
+	Create(ctx context.Context, in *IndexRuleRegistryServiceCreateRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceCreateResponse, error)
+	Update(ctx context.Context, in *IndexRuleRegistryServiceUpdateRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceUpdateResponse, error)
+	Delete(ctx context.Context, in *IndexRuleRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceDeleteResponse, error)
+	Get(ctx context.Context, in *IndexRuleRegistryServiceGetRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceGetResponse, error)
+	List(ctx context.Context, in *IndexRuleRegistryServiceListRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceListResponse, error)
+}
+
+type indexRuleRegistryServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewIndexRuleRegistryServiceClient(cc grpc.ClientConnInterface) IndexRuleRegistryServiceClient {
+	return &indexRuleRegistryServiceClient{cc}
+}
+
+func (c *indexRuleRegistryServiceClient) Create(ctx context.Context, in *IndexRuleRegistryServiceCreateRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceCreateResponse, error) {
+	out := new(IndexRuleRegistryServiceCreateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleRegistryService/Create", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *indexRuleRegistryServiceClient) Update(ctx context.Context, in *IndexRuleRegistryServiceUpdateRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceUpdateResponse, error) {
+	out := new(IndexRuleRegistryServiceUpdateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleRegistryService/Update", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *indexRuleRegistryServiceClient) Delete(ctx context.Context, in *IndexRuleRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceDeleteResponse, error) {
+	out := new(IndexRuleRegistryServiceDeleteResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleRegistryService/Delete", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *indexRuleRegistryServiceClient) Get(ctx context.Context, in *IndexRuleRegistryServiceGetRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceGetResponse, error) {
+	out := new(IndexRuleRegistryServiceGetResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleRegistryService/Get", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *indexRuleRegistryServiceClient) List(ctx context.Context, in *IndexRuleRegistryServiceListRequest, opts ...grpc.CallOption) (*IndexRuleRegistryServiceListResponse, error) {
+	out := new(IndexRuleRegistryServiceListResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.IndexRuleRegistryService/List", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// IndexRuleRegistryServiceServer is the server API for IndexRuleRegistryService service.
+// All implementations must embed UnimplementedIndexRuleRegistryServiceServer
+// for forward compatibility
+type IndexRuleRegistryServiceServer interface {
+	Create(context.Context, *IndexRuleRegistryServiceCreateRequest) (*IndexRuleRegistryServiceCreateResponse, error)
+	Update(context.Context, *IndexRuleRegistryServiceUpdateRequest) (*IndexRuleRegistryServiceUpdateResponse, error)
+	Delete(context.Context, *IndexRuleRegistryServiceDeleteRequest) (*IndexRuleRegistryServiceDeleteResponse, error)
+	Get(context.Context, *IndexRuleRegistryServiceGetRequest) (*IndexRuleRegistryServiceGetResponse, error)
+	List(context.Context, *IndexRuleRegistryServiceListRequest) (*IndexRuleRegistryServiceListResponse, error)
+	mustEmbedUnimplementedIndexRuleRegistryServiceServer()
+}
+
+// UnimplementedIndexRuleRegistryServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedIndexRuleRegistryServiceServer struct {
+}
+
+func (UnimplementedIndexRuleRegistryServiceServer) Create(context.Context, *IndexRuleRegistryServiceCreateRequest) (*IndexRuleRegistryServiceCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
+}
+func (UnimplementedIndexRuleRegistryServiceServer) Update(context.Context, *IndexRuleRegistryServiceUpdateRequest) (*IndexRuleRegistryServiceUpdateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Update not implemented")
+}
+func (UnimplementedIndexRuleRegistryServiceServer) Delete(context.Context, *IndexRuleRegistryServiceDeleteRequest) (*IndexRuleRegistryServiceDeleteResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
+}
+func (UnimplementedIndexRuleRegistryServiceServer) Get(context.Context, *IndexRuleRegistryServiceGetRequest) (*IndexRuleRegistryServiceGetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
+}
+func (UnimplementedIndexRuleRegistryServiceServer) List(context.Context, *IndexRuleRegistryServiceListRequest) (*IndexRuleRegistryServiceListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
+}
+func (UnimplementedIndexRuleRegistryServiceServer) mustEmbedUnimplementedIndexRuleRegistryServiceServer() {
+}
+
+// UnsafeIndexRuleRegistryServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to IndexRuleRegistryServiceServer will
+// result in compilation errors.
+type UnsafeIndexRuleRegistryServiceServer interface {
+	mustEmbedUnimplementedIndexRuleRegistryServiceServer()
+}
+
+func RegisterIndexRuleRegistryServiceServer(s grpc.ServiceRegistrar, srv IndexRuleRegistryServiceServer) {
+	s.RegisterService(&IndexRuleRegistryService_ServiceDesc, srv)
+}
+
+func _IndexRuleRegistryService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleRegistryServiceCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleRegistryServiceServer).Create(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleRegistryService/Create",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleRegistryServiceServer).Create(ctx, req.(*IndexRuleRegistryServiceCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _IndexRuleRegistryService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleRegistryServiceUpdateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleRegistryServiceServer).Update(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleRegistryService/Update",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleRegistryServiceServer).Update(ctx, req.(*IndexRuleRegistryServiceUpdateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _IndexRuleRegistryService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleRegistryServiceDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleRegistryServiceServer).Delete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleRegistryService/Delete",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleRegistryServiceServer).Delete(ctx, req.(*IndexRuleRegistryServiceDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _IndexRuleRegistryService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleRegistryServiceGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleRegistryServiceServer).Get(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleRegistryService/Get",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleRegistryServiceServer).Get(ctx, req.(*IndexRuleRegistryServiceGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _IndexRuleRegistryService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(IndexRuleRegistryServiceListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(IndexRuleRegistryServiceServer).List(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.IndexRuleRegistryService/List",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(IndexRuleRegistryServiceServer).List(ctx, req.(*IndexRuleRegistryServiceListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// IndexRuleRegistryService_ServiceDesc is the grpc.ServiceDesc for IndexRuleRegistryService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var IndexRuleRegistryService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "banyandb.database.v1.IndexRuleRegistryService",
+	HandlerType: (*IndexRuleRegistryServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Create",
+			Handler:    _IndexRuleRegistryService_Create_Handler,
+		},
+		{
+			MethodName: "Update",
+			Handler:    _IndexRuleRegistryService_Update_Handler,
+		},
+		{
+			MethodName: "Delete",
+			Handler:    _IndexRuleRegistryService_Delete_Handler,
+		},
+		{
+			MethodName: "Get",
+			Handler:    _IndexRuleRegistryService_Get_Handler,
+		},
+		{
+			MethodName: "List",
+			Handler:    _IndexRuleRegistryService_List_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "banyandb/database/v1/rpc.proto",
+}
+
+// MeasureRegistryServiceClient is the client API for MeasureRegistryService 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 MeasureRegistryServiceClient interface {
+	Create(ctx context.Context, in *MeasureRegistryServiceCreateRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceCreateResponse, error)
+	Update(ctx context.Context, in *MeasureRegistryServiceUpdateRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceUpdateResponse, error)
+	Delete(ctx context.Context, in *MeasureRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceDeleteResponse, error)
+	Get(ctx context.Context, in *MeasureRegistryServiceGetRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceGetResponse, error)
+	List(ctx context.Context, in *MeasureRegistryServiceListRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceListResponse, error)
+}
+
+type measureRegistryServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewMeasureRegistryServiceClient(cc grpc.ClientConnInterface) MeasureRegistryServiceClient {
+	return &measureRegistryServiceClient{cc}
+}
+
+func (c *measureRegistryServiceClient) Create(ctx context.Context, in *MeasureRegistryServiceCreateRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceCreateResponse, error) {
+	out := new(MeasureRegistryServiceCreateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.MeasureRegistryService/Create", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *measureRegistryServiceClient) Update(ctx context.Context, in *MeasureRegistryServiceUpdateRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceUpdateResponse, error) {
+	out := new(MeasureRegistryServiceUpdateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.MeasureRegistryService/Update", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *measureRegistryServiceClient) Delete(ctx context.Context, in *MeasureRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceDeleteResponse, error) {
+	out := new(MeasureRegistryServiceDeleteResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.MeasureRegistryService/Delete", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *measureRegistryServiceClient) Get(ctx context.Context, in *MeasureRegistryServiceGetRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceGetResponse, error) {
+	out := new(MeasureRegistryServiceGetResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.MeasureRegistryService/Get", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *measureRegistryServiceClient) List(ctx context.Context, in *MeasureRegistryServiceListRequest, opts ...grpc.CallOption) (*MeasureRegistryServiceListResponse, error) {
+	out := new(MeasureRegistryServiceListResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.MeasureRegistryService/List", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// MeasureRegistryServiceServer is the server API for MeasureRegistryService service.
+// All implementations must embed UnimplementedMeasureRegistryServiceServer
+// for forward compatibility
+type MeasureRegistryServiceServer interface {
+	Create(context.Context, *MeasureRegistryServiceCreateRequest) (*MeasureRegistryServiceCreateResponse, error)
+	Update(context.Context, *MeasureRegistryServiceUpdateRequest) (*MeasureRegistryServiceUpdateResponse, error)
+	Delete(context.Context, *MeasureRegistryServiceDeleteRequest) (*MeasureRegistryServiceDeleteResponse, error)
+	Get(context.Context, *MeasureRegistryServiceGetRequest) (*MeasureRegistryServiceGetResponse, error)
+	List(context.Context, *MeasureRegistryServiceListRequest) (*MeasureRegistryServiceListResponse, error)
+	mustEmbedUnimplementedMeasureRegistryServiceServer()
+}
+
+// UnimplementedMeasureRegistryServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedMeasureRegistryServiceServer struct {
+}
+
+func (UnimplementedMeasureRegistryServiceServer) Create(context.Context, *MeasureRegistryServiceCreateRequest) (*MeasureRegistryServiceCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
+}
+func (UnimplementedMeasureRegistryServiceServer) Update(context.Context, *MeasureRegistryServiceUpdateRequest) (*MeasureRegistryServiceUpdateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Update not implemented")
+}
+func (UnimplementedMeasureRegistryServiceServer) Delete(context.Context, *MeasureRegistryServiceDeleteRequest) (*MeasureRegistryServiceDeleteResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
+}
+func (UnimplementedMeasureRegistryServiceServer) Get(context.Context, *MeasureRegistryServiceGetRequest) (*MeasureRegistryServiceGetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
+}
+func (UnimplementedMeasureRegistryServiceServer) List(context.Context, *MeasureRegistryServiceListRequest) (*MeasureRegistryServiceListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
+}
+func (UnimplementedMeasureRegistryServiceServer) mustEmbedUnimplementedMeasureRegistryServiceServer() {
+}
+
+// UnsafeMeasureRegistryServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to MeasureRegistryServiceServer will
+// result in compilation errors.
+type UnsafeMeasureRegistryServiceServer interface {
+	mustEmbedUnimplementedMeasureRegistryServiceServer()
+}
+
+func RegisterMeasureRegistryServiceServer(s grpc.ServiceRegistrar, srv MeasureRegistryServiceServer) {
+	s.RegisterService(&MeasureRegistryService_ServiceDesc, srv)
+}
+
+func _MeasureRegistryService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MeasureRegistryServiceCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MeasureRegistryServiceServer).Create(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.MeasureRegistryService/Create",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MeasureRegistryServiceServer).Create(ctx, req.(*MeasureRegistryServiceCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MeasureRegistryService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MeasureRegistryServiceUpdateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MeasureRegistryServiceServer).Update(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.MeasureRegistryService/Update",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MeasureRegistryServiceServer).Update(ctx, req.(*MeasureRegistryServiceUpdateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MeasureRegistryService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MeasureRegistryServiceDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MeasureRegistryServiceServer).Delete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.MeasureRegistryService/Delete",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MeasureRegistryServiceServer).Delete(ctx, req.(*MeasureRegistryServiceDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MeasureRegistryService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MeasureRegistryServiceGetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MeasureRegistryServiceServer).Get(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.MeasureRegistryService/Get",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MeasureRegistryServiceServer).Get(ctx, req.(*MeasureRegistryServiceGetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _MeasureRegistryService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MeasureRegistryServiceListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MeasureRegistryServiceServer).List(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.MeasureRegistryService/List",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MeasureRegistryServiceServer).List(ctx, req.(*MeasureRegistryServiceListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// MeasureRegistryService_ServiceDesc is the grpc.ServiceDesc for MeasureRegistryService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var MeasureRegistryService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "banyandb.database.v1.MeasureRegistryService",
+	HandlerType: (*MeasureRegistryServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Create",
+			Handler:    _MeasureRegistryService_Create_Handler,
+		},
+		{
+			MethodName: "Update",
+			Handler:    _MeasureRegistryService_Update_Handler,
+		},
+		{
+			MethodName: "Delete",
+			Handler:    _MeasureRegistryService_Delete_Handler,
+		},
+		{
+			MethodName: "Get",
+			Handler:    _MeasureRegistryService_Get_Handler,
+		},
+		{
+			MethodName: "List",
+			Handler:    _MeasureRegistryService_List_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "banyandb/database/v1/rpc.proto",
+}
+
+// GroupRegistryServiceClient is the client API for GroupRegistryService 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 GroupRegistryServiceClient interface {
+	Create(ctx context.Context, in *GroupRegistryServiceCreateRequest, opts ...grpc.CallOption) (*GroupRegistryServiceCreateResponse, error)
+	Delete(ctx context.Context, in *GroupRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*GroupRegistryServiceDeleteResponse, error)
+	Exist(ctx context.Context, in *GroupRegistryServiceExistRequest, opts ...grpc.CallOption) (*GroupRegistryServiceExistResponse, error)
+	List(ctx context.Context, in *GroupRegistryServiceListRequest, opts ...grpc.CallOption) (*GroupRegistryServiceListResponse, error)
+}
+
+type groupRegistryServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewGroupRegistryServiceClient(cc grpc.ClientConnInterface) GroupRegistryServiceClient {
+	return &groupRegistryServiceClient{cc}
+}
+
+func (c *groupRegistryServiceClient) Create(ctx context.Context, in *GroupRegistryServiceCreateRequest, opts ...grpc.CallOption) (*GroupRegistryServiceCreateResponse, error) {
+	out := new(GroupRegistryServiceCreateResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.GroupRegistryService/Create", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *groupRegistryServiceClient) Delete(ctx context.Context, in *GroupRegistryServiceDeleteRequest, opts ...grpc.CallOption) (*GroupRegistryServiceDeleteResponse, error) {
+	out := new(GroupRegistryServiceDeleteResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.GroupRegistryService/Delete", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *groupRegistryServiceClient) Exist(ctx context.Context, in *GroupRegistryServiceExistRequest, opts ...grpc.CallOption) (*GroupRegistryServiceExistResponse, error) {
+	out := new(GroupRegistryServiceExistResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.GroupRegistryService/Exist", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *groupRegistryServiceClient) List(ctx context.Context, in *GroupRegistryServiceListRequest, opts ...grpc.CallOption) (*GroupRegistryServiceListResponse, error) {
+	out := new(GroupRegistryServiceListResponse)
+	err := c.cc.Invoke(ctx, "/banyandb.database.v1.GroupRegistryService/List", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// GroupRegistryServiceServer is the server API for GroupRegistryService service.
+// All implementations must embed UnimplementedGroupRegistryServiceServer
+// for forward compatibility
+type GroupRegistryServiceServer interface {
+	Create(context.Context, *GroupRegistryServiceCreateRequest) (*GroupRegistryServiceCreateResponse, error)
+	Delete(context.Context, *GroupRegistryServiceDeleteRequest) (*GroupRegistryServiceDeleteResponse, error)
+	Exist(context.Context, *GroupRegistryServiceExistRequest) (*GroupRegistryServiceExistResponse, error)
+	List(context.Context, *GroupRegistryServiceListRequest) (*GroupRegistryServiceListResponse, error)
+	mustEmbedUnimplementedGroupRegistryServiceServer()
+}
+
+// UnimplementedGroupRegistryServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedGroupRegistryServiceServer struct {
+}
+
+func (UnimplementedGroupRegistryServiceServer) Create(context.Context, *GroupRegistryServiceCreateRequest) (*GroupRegistryServiceCreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
+}
+func (UnimplementedGroupRegistryServiceServer) Delete(context.Context, *GroupRegistryServiceDeleteRequest) (*GroupRegistryServiceDeleteResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
+}
+func (UnimplementedGroupRegistryServiceServer) Exist(context.Context, *GroupRegistryServiceExistRequest) (*GroupRegistryServiceExistResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Exist not implemented")
+}
+func (UnimplementedGroupRegistryServiceServer) List(context.Context, *GroupRegistryServiceListRequest) (*GroupRegistryServiceListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
+}
+func (UnimplementedGroupRegistryServiceServer) mustEmbedUnimplementedGroupRegistryServiceServer() {}
+
+// UnsafeGroupRegistryServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to GroupRegistryServiceServer will
+// result in compilation errors.
+type UnsafeGroupRegistryServiceServer interface {
+	mustEmbedUnimplementedGroupRegistryServiceServer()
+}
+
+func RegisterGroupRegistryServiceServer(s grpc.ServiceRegistrar, srv GroupRegistryServiceServer) {
+	s.RegisterService(&GroupRegistryService_ServiceDesc, srv)
+}
+
+func _GroupRegistryService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GroupRegistryServiceCreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GroupRegistryServiceServer).Create(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.GroupRegistryService/Create",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GroupRegistryServiceServer).Create(ctx, req.(*GroupRegistryServiceCreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _GroupRegistryService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GroupRegistryServiceDeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GroupRegistryServiceServer).Delete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.GroupRegistryService/Delete",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GroupRegistryServiceServer).Delete(ctx, req.(*GroupRegistryServiceDeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _GroupRegistryService_Exist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GroupRegistryServiceExistRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GroupRegistryServiceServer).Exist(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.GroupRegistryService/Exist",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GroupRegistryServiceServer).Exist(ctx, req.(*GroupRegistryServiceExistRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _GroupRegistryService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GroupRegistryServiceListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(GroupRegistryServiceServer).List(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/banyandb.database.v1.GroupRegistryService/List",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(GroupRegistryServiceServer).List(ctx, req.(*GroupRegistryServiceListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// GroupRegistryService_ServiceDesc is the grpc.ServiceDesc for GroupRegistryService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var GroupRegistryService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "banyandb.database.v1.GroupRegistryService",
+	HandlerType: (*GroupRegistryServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Create",
+			Handler:    _GroupRegistryService_Create_Handler,
+		},
+		{
+			MethodName: "Delete",
+			Handler:    _GroupRegistryService_Delete_Handler,
+		},
+		{
+			MethodName: "Exist",
+			Handler:    _GroupRegistryService_Exist_Handler,
+		},
+		{
+			MethodName: "List",
+			Handler:    _GroupRegistryService_List_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "banyandb/database/v1/rpc.proto",
+}
diff --git a/api/proto/banyandb/database/v1/schema.pb.go b/api/proto/banyandb/database/v1/schema.pb.go
index a2ac31d..245fb52 100644
--- a/api/proto/banyandb/database/v1/schema.pb.go
+++ b/api/proto/banyandb/database/v1/schema.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/database/v1/schema.proto
 
 package v1
diff --git a/api/proto/banyandb/model/v1/common.pb.go b/api/proto/banyandb/model/v1/common.pb.go
index 31cb054..22e60c4 100644
--- a/api/proto/banyandb/model/v1/common.pb.go
+++ b/api/proto/banyandb/model/v1/common.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/model/v1/common.proto
 
 package v1
diff --git a/api/proto/banyandb/model/v1/query.pb.go b/api/proto/banyandb/model/v1/query.pb.go
index 5c7c225..226845f 100644
--- a/api/proto/banyandb/model/v1/query.pb.go
+++ b/api/proto/banyandb/model/v1/query.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/model/v1/query.proto
 
 package v1
diff --git a/api/proto/banyandb/stream/v1/query.pb.go b/api/proto/banyandb/stream/v1/query.pb.go
index 4175baa..883638a 100644
--- a/api/proto/banyandb/stream/v1/query.pb.go
+++ b/api/proto/banyandb/stream/v1/query.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/stream/v1/query.proto
 
 package v1
diff --git a/api/proto/banyandb/stream/v1/rpc.pb.go b/api/proto/banyandb/stream/v1/rpc.pb.go
index 32d87f4..199c536 100644
--- a/api/proto/banyandb/stream/v1/rpc.pb.go
+++ b/api/proto/banyandb/stream/v1/rpc.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/stream/v1/rpc.proto
 
 package v1
diff --git a/api/proto/banyandb/stream/v1/write.pb.go b/api/proto/banyandb/stream/v1/write.pb.go
index 8d268c8..9d63ba5 100644
--- a/api/proto/banyandb/stream/v1/write.pb.go
+++ b/api/proto/banyandb/stream/v1/write.pb.go
@@ -18,7 +18,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc        v3.18.1
 // source: banyandb/stream/v1/write.proto
 
 package v1
diff --git a/banyand/internal/cmd/standalone.go b/banyand/internal/cmd/standalone.go
index 513a7bc..5bf1058 100644
--- a/banyand/internal/cmd/standalone.go
+++ b/banyand/internal/cmd/standalone.go
@@ -60,11 +60,11 @@ func newStandaloneCmd() *cobra.Command {
 	if err != nil {
 		l.Fatal().Err(err).Msg("failed to initiate metadata service")
 	}
-	q, err := query.NewExecutor(ctx, streamSvc, repo, pipeline)
+	q, err := query.NewExecutor(ctx, streamSvc, metaSvc, repo, pipeline)
 	if err != nil {
 		l.Fatal().Err(err).Msg("failed to initiate trace series")
 	}
-	tcp, err := liaison.NewEndpoint(ctx, pipeline, repo)
+	tcp, err := liaison.NewEndpoint(ctx, pipeline, repo, metaSvc)
 	if err != nil {
 		l.Fatal().Err(err).Msg("failed to initiate Endpoint transport layer")
 	}
diff --git a/banyand/liaison/grpc/registry.go b/banyand/liaison/grpc/registry.go
new file mode 100644
index 0000000..9d27e58
--- /dev/null
+++ b/banyand/liaison/grpc/registry.go
@@ -0,0 +1,294 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package grpc
+
+import (
+	"context"
+
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
+	"github.com/apache/skywalking-banyandb/banyand/metadata"
+	"github.com/apache/skywalking-banyandb/banyand/metadata/schema"
+)
+
+type streamRegistryServer struct {
+	schemaRegistry metadata.Service
+	databasev1.UnimplementedStreamRegistryServiceServer
+}
+
+func (rs *streamRegistryServer) Create(ctx context.Context,
+	req *databasev1.StreamRegistryServiceCreateRequest) (*databasev1.StreamRegistryServiceCreateResponse, error) {
+	if err := rs.schemaRegistry.StreamRegistry().UpdateStream(ctx, req.GetStream()); err != nil {
+		return nil, err
+	}
+	return &databasev1.StreamRegistryServiceCreateResponse{}, nil
+}
+
+func (rs *streamRegistryServer) Update(ctx context.Context,
+	req *databasev1.StreamRegistryServiceUpdateRequest) (*databasev1.StreamRegistryServiceUpdateResponse, error) {
+	if err := rs.schemaRegistry.StreamRegistry().UpdateStream(ctx, req.GetStream()); err != nil {
+		return nil, err
+	}
+	return &databasev1.StreamRegistryServiceUpdateResponse{}, nil
+}
+
+func (rs *streamRegistryServer) Delete(ctx context.Context,
+	req *databasev1.StreamRegistryServiceDeleteRequest) (*databasev1.StreamRegistryServiceDeleteResponse, error) {
+	ok, err := rs.schemaRegistry.StreamRegistry().DeleteStream(ctx, req.GetMetadata())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.StreamRegistryServiceDeleteResponse{
+		Deleted: ok,
+	}, nil
+}
+
+func (rs *streamRegistryServer) Get(ctx context.Context,
+	req *databasev1.StreamRegistryServiceGetRequest) (*databasev1.StreamRegistryServiceGetResponse, error) {
+	entity, err := rs.schemaRegistry.StreamRegistry().GetStream(ctx, req.GetMetadata())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.StreamRegistryServiceGetResponse{
+		Stream: entity,
+	}, nil
+}
+
+func (rs *streamRegistryServer) List(ctx context.Context,
+	req *databasev1.StreamRegistryServiceListRequest) (*databasev1.StreamRegistryServiceListResponse, error) {
+	entities, err := rs.schemaRegistry.StreamRegistry().ListStream(ctx, schema.ListOpt{Group: req.GetGroup()})
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.StreamRegistryServiceListResponse{
+		Stream: entities,
+	}, nil
+}
+
+type indexRuleBindingRegistryServer struct {
+	schemaRegistry metadata.Service
+	databasev1.UnimplementedIndexRuleBindingRegistryServiceServer
+}
+
+func (rs *indexRuleBindingRegistryServer) Create(ctx context.Context,
+	req *databasev1.IndexRuleBindingRegistryServiceCreateRequest) (
+	*databasev1.IndexRuleBindingRegistryServiceCreateResponse, error) {
+	if err := rs.schemaRegistry.IndexRuleBindingRegistry().UpdateIndexRuleBinding(ctx, req.GetIndexRuleBinding()); err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleBindingRegistryServiceCreateResponse{}, nil
+}
+
+func (rs *indexRuleBindingRegistryServer) Update(ctx context.Context,
+	req *databasev1.IndexRuleBindingRegistryServiceUpdateRequest) (
+	*databasev1.IndexRuleBindingRegistryServiceUpdateResponse, error) {
+	if err := rs.schemaRegistry.IndexRuleBindingRegistry().UpdateIndexRuleBinding(ctx, req.GetIndexRuleBinding()); err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleBindingRegistryServiceUpdateResponse{}, nil
+}
+
+func (rs *indexRuleBindingRegistryServer) Delete(ctx context.Context,
+	req *databasev1.IndexRuleBindingRegistryServiceDeleteRequest) (
+	*databasev1.IndexRuleBindingRegistryServiceDeleteResponse, error) {
+	ok, err := rs.schemaRegistry.IndexRuleBindingRegistry().DeleteIndexRuleBinding(ctx, req.GetMetadata())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleBindingRegistryServiceDeleteResponse{
+		Deleted: ok,
+	}, nil
+}
+
+func (rs *indexRuleBindingRegistryServer) Get(ctx context.Context,
+	req *databasev1.IndexRuleBindingRegistryServiceGetRequest) (
+	*databasev1.IndexRuleBindingRegistryServiceGetResponse, error) {
+	entity, err := rs.schemaRegistry.IndexRuleBindingRegistry().GetIndexRuleBinding(ctx, req.GetMetadata())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleBindingRegistryServiceGetResponse{
+		IndexRuleBinding: entity,
+	}, nil
+}
+
+func (rs *indexRuleBindingRegistryServer) List(ctx context.Context,
+	req *databasev1.IndexRuleBindingRegistryServiceListRequest) (
+	*databasev1.IndexRuleBindingRegistryServiceListResponse, error) {
+	entities, err := rs.schemaRegistry.IndexRuleBindingRegistry().
+		ListIndexRuleBinding(ctx, schema.ListOpt{Group: req.GetGroup()})
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleBindingRegistryServiceListResponse{
+		IndexRuleBinding: entities,
+	}, nil
+}
+
+type indexRuleRegistryServer struct {
+	schemaRegistry metadata.Service
+	databasev1.UnimplementedIndexRuleRegistryServiceServer
+}
+
+func (rs *indexRuleRegistryServer) Create(ctx context.Context, req *databasev1.IndexRuleRegistryServiceCreateRequest) (
+	*databasev1.IndexRuleRegistryServiceCreateResponse, error) {
+	if err := rs.schemaRegistry.IndexRuleRegistry().UpdateIndexRule(ctx, req.GetIndexRule()); err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleRegistryServiceCreateResponse{}, nil
+}
+
+func (rs *indexRuleRegistryServer) Update(ctx context.Context, req *databasev1.IndexRuleRegistryServiceUpdateRequest) (
+	*databasev1.IndexRuleRegistryServiceUpdateResponse, error) {
+	if err := rs.schemaRegistry.IndexRuleRegistry().UpdateIndexRule(ctx, req.GetIndexRule()); err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleRegistryServiceUpdateResponse{}, nil
+}
+
+func (rs *indexRuleRegistryServer) Delete(ctx context.Context, req *databasev1.IndexRuleRegistryServiceDeleteRequest) (
+	*databasev1.IndexRuleRegistryServiceDeleteResponse, error) {
+	ok, err := rs.schemaRegistry.IndexRuleRegistry().DeleteIndexRule(ctx, req.GetMetadata())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleRegistryServiceDeleteResponse{
+		Deleted: ok,
+	}, nil
+}
+
+func (rs *indexRuleRegistryServer) Get(ctx context.Context, req *databasev1.IndexRuleRegistryServiceGetRequest) (
+	*databasev1.IndexRuleRegistryServiceGetResponse, error) {
+	entity, err := rs.schemaRegistry.IndexRuleRegistry().GetIndexRule(ctx, req.GetMetadata())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleRegistryServiceGetResponse{
+		IndexRule: entity,
+	}, nil
+}
+
+func (rs *indexRuleRegistryServer) List(ctx context.Context, req *databasev1.IndexRuleRegistryServiceListRequest) (
+	*databasev1.IndexRuleRegistryServiceListResponse, error) {
+	entities, err := rs.schemaRegistry.IndexRuleRegistry().ListIndexRule(ctx, schema.ListOpt{Group: req.GetGroup()})
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.IndexRuleRegistryServiceListResponse{
+		IndexRule: entities,
+	}, nil
+}
+
+type measureRegistryServer struct {
+	schemaRegistry metadata.Service
+	databasev1.UnimplementedMeasureRegistryServiceServer
+}
+
+func (rs *measureRegistryServer) Create(ctx context.Context, req *databasev1.MeasureRegistryServiceCreateRequest) (
+	*databasev1.MeasureRegistryServiceCreateResponse, error) {
+	if err := rs.schemaRegistry.MeasureRegistry().UpdateMeasure(ctx, req.GetMeasure()); err != nil {
+		return nil, err
+	}
+	return &databasev1.MeasureRegistryServiceCreateResponse{}, nil
+}
+
+func (rs *measureRegistryServer) Update(ctx context.Context, req *databasev1.MeasureRegistryServiceUpdateRequest) (
+	*databasev1.MeasureRegistryServiceUpdateResponse, error) {
+	if err := rs.schemaRegistry.MeasureRegistry().UpdateMeasure(ctx, req.GetMeasure()); err != nil {
+		return nil, err
+	}
+	return &databasev1.MeasureRegistryServiceUpdateResponse{}, nil
+}
+
+func (rs *measureRegistryServer) Delete(ctx context.Context, req *databasev1.MeasureRegistryServiceDeleteRequest) (
+	*databasev1.MeasureRegistryServiceDeleteResponse, error) {
+	ok, err := rs.schemaRegistry.MeasureRegistry().DeleteMeasure(ctx, req.GetMetadata())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.MeasureRegistryServiceDeleteResponse{
+		Deleted: ok,
+	}, nil
+}
+
+func (rs *measureRegistryServer) Get(ctx context.Context, req *databasev1.MeasureRegistryServiceGetRequest) (
+	*databasev1.MeasureRegistryServiceGetResponse, error) {
+	entity, err := rs.schemaRegistry.MeasureRegistry().GetMeasure(ctx, req.GetMetadata())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.MeasureRegistryServiceGetResponse{
+		Measure: entity,
+	}, nil
+}
+
+func (rs *measureRegistryServer) List(ctx context.Context, req *databasev1.MeasureRegistryServiceListRequest) (
+	*databasev1.MeasureRegistryServiceListResponse, error) {
+	entities, err := rs.schemaRegistry.MeasureRegistry().ListMeasure(ctx, schema.ListOpt{Group: req.GetGroup()})
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.MeasureRegistryServiceListResponse{
+		Measure: entities,
+	}, nil
+}
+
+type groupRegistryServer struct {
+	schemaRegistry metadata.Service
+	databasev1.UnimplementedGroupRegistryServiceServer
+}
+
+func (rs *groupRegistryServer) Create(ctx context.Context, req *databasev1.GroupRegistryServiceCreateRequest) (
+	*databasev1.GroupRegistryServiceCreateResponse, error) {
+	if err := rs.schemaRegistry.GroupRegistry().CreateGroup(ctx, req.GetGroup()); err != nil {
+		return nil, err
+	}
+	return &databasev1.GroupRegistryServiceCreateResponse{}, nil
+}
+
+func (rs *groupRegistryServer) Delete(ctx context.Context, req *databasev1.GroupRegistryServiceDeleteRequest) (
+	*databasev1.GroupRegistryServiceDeleteResponse, error) {
+	deleted, err := rs.schemaRegistry.GroupRegistry().DeleteGroup(ctx, req.GetGroup())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.GroupRegistryServiceDeleteResponse{
+		Deleted: deleted,
+	}, nil
+}
+
+func (rs *groupRegistryServer) Get(ctx context.Context, req *databasev1.GroupRegistryServiceExistRequest) (
+	*databasev1.GroupRegistryServiceExistResponse, error) {
+	g, err := rs.schemaRegistry.GroupRegistry().GetGroup(ctx, req.GetGroup())
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.GroupRegistryServiceExistResponse{
+		Group: g,
+	}, nil
+}
+
+func (rs *groupRegistryServer) List(ctx context.Context, req *databasev1.GroupRegistryServiceListRequest) (
+	*databasev1.GroupRegistryServiceListResponse, error) {
+	groups, err := rs.schemaRegistry.GroupRegistry().ListGroup(ctx)
+	if err != nil {
+		return nil, err
+	}
+	return &databasev1.GroupRegistryServiceListResponse{
+		Group: groups,
+	}, nil
+}
diff --git a/banyand/liaison/grpc/registry_test.go b/banyand/liaison/grpc/registry_test.go
new file mode 100644
index 0000000..1c21f8a
--- /dev/null
+++ b/banyand/liaison/grpc/registry_test.go
@@ -0,0 +1,187 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package grpc
+
+import (
+	"context"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/status"
+
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
+	"github.com/apache/skywalking-banyandb/banyand/metadata/schema"
+)
+
+func TestStreamRegistry(t *testing.T) {
+	req := require.New(t)
+	gracefulStop := setup(req, testData{
+		TLS:  false,
+		addr: "localhost:17912",
+	})
+	defer gracefulStop()
+
+	conn, err := grpc.Dial("localhost:17912", grpc.WithInsecure())
+	req.NoError(err)
+	req.NotNil(conn)
+
+	client := databasev1.NewStreamRegistryServiceClient(conn)
+	req.NotNil(client)
+
+	meta := &commonv1.Metadata{
+		Group: "default",
+		Name:  "sw",
+	}
+
+	getResp, err := client.Get(context.TODO(), &databasev1.StreamRegistryServiceGetRequest{Metadata: meta})
+
+	req.NoError(err)
+	req.NotNil(getResp)
+
+	// 2 - DELETE
+	deleteResp, err := client.Delete(context.TODO(), &databasev1.StreamRegistryServiceDeleteRequest{
+		Metadata: meta,
+	})
+	req.NoError(err)
+	req.NotNil(deleteResp)
+	req.True(deleteResp.GetDeleted())
+
+	// 3 - GET -> Nil
+	_, err = client.Get(context.TODO(), &databasev1.StreamRegistryServiceGetRequest{
+		Metadata: meta,
+	})
+	errStatus, _ := status.FromError(err)
+	req.Equal(errStatus.Message(), schema.ErrEntityNotFound.Error())
+
+	// 4 - CREATE
+	_, err = client.Create(context.TODO(), &databasev1.StreamRegistryServiceCreateRequest{Stream: getResp.GetStream()})
+	req.NoError(err)
+
+	// 5 - GET - > Not Nil
+	getResp, err = client.Get(context.TODO(), &databasev1.StreamRegistryServiceGetRequest{
+		Metadata: meta,
+	})
+	req.NoError(err)
+	req.NotNil(getResp)
+}
+
+func TestIndexRuleBindingRegistry(t *testing.T) {
+	req := require.New(t)
+	gracefulStop := setup(req, testData{
+		TLS:  false,
+		addr: "localhost:17912",
+	})
+	defer gracefulStop()
+
+	conn, err := grpc.Dial("localhost:17912", grpc.WithInsecure())
+	req.NoError(err)
+	req.NotNil(conn)
+
+	client := databasev1.NewIndexRuleBindingRegistryServiceClient(conn)
+	req.NotNil(client)
+
+	meta := &commonv1.Metadata{
+		Group: "default",
+		Name:  "sw-index-rule-binding",
+	}
+
+	getResp, err := client.Get(context.TODO(), &databasev1.IndexRuleBindingRegistryServiceGetRequest{Metadata: meta})
+
+	req.NoError(err)
+	req.NotNil(getResp)
+
+	// 2 - DELETE
+	deleteResp, err := client.Delete(context.TODO(), &databasev1.IndexRuleBindingRegistryServiceDeleteRequest{
+		Metadata: meta,
+	})
+	req.NoError(err)
+	req.NotNil(deleteResp)
+	req.True(deleteResp.GetDeleted())
+
+	// 3 - GET -> Nil
+	_, err = client.Get(context.TODO(), &databasev1.IndexRuleBindingRegistryServiceGetRequest{
+		Metadata: meta,
+	})
+	errStatus, _ := status.FromError(err)
+	req.Equal(errStatus.Message(), schema.ErrEntityNotFound.Error())
+
+	// 4 - CREATE
+	_, err = client.Create(context.TODO(), &databasev1.IndexRuleBindingRegistryServiceCreateRequest{IndexRuleBinding: getResp.GetIndexRuleBinding()})
+	req.NoError(err)
+
+	// 5 - GET - > Not Nil
+	getResp, err = client.Get(context.TODO(), &databasev1.IndexRuleBindingRegistryServiceGetRequest{
+		Metadata: meta,
+	})
+	req.NoError(err)
+	req.NotNil(getResp)
+}
+
+func TestIndexRuleRegistry(t *testing.T) {
+	req := require.New(t)
+	gracefulStop := setup(req, testData{
+		TLS:  false,
+		addr: "localhost:17912",
+	})
+	defer gracefulStop()
+
+	conn, err := grpc.Dial("localhost:17912", grpc.WithInsecure())
+	req.NoError(err)
+	req.NotNil(conn)
+
+	client := databasev1.NewIndexRuleRegistryServiceClient(conn)
+	req.NotNil(client)
+
+	meta := &commonv1.Metadata{
+		Group: "default",
+		Name:  "db.instance",
+	}
+
+	getResp, err := client.Get(context.TODO(), &databasev1.IndexRuleRegistryServiceGetRequest{Metadata: meta})
+
+	req.NoError(err)
+	req.NotNil(getResp)
+
+	// 2 - DELETE
+	deleteResp, err := client.Delete(context.TODO(), &databasev1.IndexRuleRegistryServiceDeleteRequest{
+		Metadata: meta,
+	})
+	req.NoError(err)
+	req.NotNil(deleteResp)
+	req.True(deleteResp.GetDeleted())
+
+	// 3 - GET -> Nil
+	_, err = client.Get(context.TODO(), &databasev1.IndexRuleRegistryServiceGetRequest{
+		Metadata: meta,
+	})
+	errStatus, _ := status.FromError(err)
+	req.Equal(errStatus.Message(), schema.ErrEntityNotFound.Error())
+
+	// 4 - CREATE
+	_, err = client.Create(context.TODO(), &databasev1.IndexRuleRegistryServiceCreateRequest{IndexRule: getResp.GetIndexRule()})
+	req.NoError(err)
+
+	// 5 - GET - > Not Nil
+	getResp, err = client.Get(context.TODO(), &databasev1.IndexRuleRegistryServiceGetRequest{
+		Metadata: meta,
+	})
+	req.NoError(err)
+	req.NotNil(getResp)
+}
diff --git a/banyand/liaison/grpc/server.go b/banyand/liaison/grpc/server.go
index 8f2eb3c..6e4c3ec 100644
--- a/banyand/liaison/grpc/server.go
+++ b/banyand/liaison/grpc/server.go
@@ -26,8 +26,10 @@ import (
 	"google.golang.org/grpc/credentials"
 
 	"github.com/apache/skywalking-banyandb/api/event"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
 	streamv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v1"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
+	"github.com/apache/skywalking-banyandb/banyand/metadata"
 	"github.com/apache/skywalking-banyandb/banyand/queue"
 	"github.com/apache/skywalking-banyandb/pkg/logger"
 	"github.com/apache/skywalking-banyandb/pkg/partition"
@@ -53,18 +55,38 @@ type Server struct {
 	ser            *grpclib.Server
 	pipeline       queue.Queue
 	repo           discovery.ServiceRepo
+	creds          credentials.TransportCredentials
+	shardRepo      *shardRepo
+	entityRepo     *entityRepo
+	*streamRegistryServer
+	*indexRuleBindingRegistryServer
+	*indexRuleRegistryServer
+	*measureRegistryServer
+	*groupRegistryServer
 	streamv1.UnimplementedStreamServiceServer
-	creds      credentials.TransportCredentials
-	shardRepo  *shardRepo
-	entityRepo *entityRepo
 }
 
-func NewServer(_ context.Context, pipeline queue.Queue, repo discovery.ServiceRepo) *Server {
+func NewServer(_ context.Context, pipeline queue.Queue, repo discovery.ServiceRepo, schemaRegistry metadata.Service) *Server {
 	return &Server{
 		pipeline:   pipeline,
 		repo:       repo,
 		shardRepo:  &shardRepo{shardEventsMap: make(map[identity]uint32)},
 		entityRepo: &entityRepo{entitiesMap: make(map[identity]partition.EntityLocator)},
+		streamRegistryServer: &streamRegistryServer{
+			schemaRegistry: schemaRegistry,
+		},
+		indexRuleBindingRegistryServer: &indexRuleBindingRegistryServer{
+			schemaRegistry: schemaRegistry,
+		},
+		indexRuleRegistryServer: &indexRuleRegistryServer{
+			schemaRegistry: schemaRegistry,
+		},
+		measureRegistryServer: &measureRegistryServer{
+			schemaRegistry: schemaRegistry,
+		},
+		groupRegistryServer: &groupRegistryServer{
+			schemaRegistry: schemaRegistry,
+		},
 	}
 }
 
@@ -129,6 +151,13 @@ func (s *Server) Serve() error {
 	opts = append(opts, grpclib.MaxRecvMsgSize(s.maxRecvMsgSize))
 	s.ser = grpclib.NewServer(opts...)
 	streamv1.RegisterStreamServiceServer(s.ser, s)
+	// register *Registry
+	databasev1.RegisterGroupRegistryServiceServer(s.ser, s.groupRegistryServer)
+	databasev1.RegisterIndexRuleBindingRegistryServiceServer(s.ser, s.indexRuleBindingRegistryServer)
+	databasev1.RegisterIndexRuleRegistryServiceServer(s.ser, s.indexRuleRegistryServer)
+	databasev1.RegisterStreamRegistryServiceServer(s.ser, s.streamRegistryServer)
+	databasev1.RegisterMeasureRegistryServiceServer(s.ser, s.measureRegistryServer)
+
 	s.log.Info().Str("addr", s.addr).Msg("Listening to")
 	return s.ser.Serve(lis)
 }
diff --git a/banyand/liaison/grpc/stream_test.go b/banyand/liaison/grpc/stream_test.go
index 9a18b21..d2bf5aa 100644
--- a/banyand/liaison/grpc/stream_test.go
+++ b/banyand/liaison/grpc/stream_test.go
@@ -24,6 +24,7 @@ import (
 	"io"
 	"path/filepath"
 	"runtime"
+	"sync"
 	"testing"
 	"time"
 
@@ -44,6 +45,20 @@ import (
 	"github.com/apache/skywalking-banyandb/pkg/test"
 )
 
+var _ run.PreRunner = (*preloadStreamService)(nil)
+
+type preloadStreamService struct {
+	metaSvc metadata.Service
+}
+
+func (p *preloadStreamService) Name() string {
+	return "preload-stream"
+}
+
+func (p *preloadStreamService) PreRun() error {
+	return test.PreloadSchema(p.metaSvc.SchemaRegistry())
+}
+
 type testData struct {
 	certFile           string
 	serverHostOverride string
@@ -67,20 +82,25 @@ func setup(req *require.Assertions, testData testData) func() {
 	// Init `Metadata` module
 	metaSvc, err := metadata.NewService(context.TODO())
 	req.NoError(err)
+	// Init `Stream` module
 	streamSvc, err := stream.NewService(context.TODO(), metaSvc, repo, pipeline)
 	req.NoError(err)
-	q, err := query.NewExecutor(context.TODO(), streamSvc, repo, pipeline)
+	// Init `Query` module
+	q, err := query.NewExecutor(context.TODO(), streamSvc, metaSvc, repo, pipeline)
 	req.NoError(err)
 
-	tcp := NewServer(context.TODO(), pipeline, repo)
+	tcp := NewServer(context.TODO(), pipeline, repo, metaSvc)
 
 	closer := run.NewTester("closer")
 	startListener := run.NewTester("started-listener")
+
+	preloadStreamSvc := &preloadStreamService{metaSvc: metaSvc}
 	g.Register(
 		closer,
 		repo,
 		pipeline,
 		metaSvc,
+		preloadStreamSvc,
 		streamSvc,
 		q,
 		tcp,
@@ -88,7 +108,7 @@ func setup(req *require.Assertions, testData testData) func() {
 	)
 	// Create a random directory
 	rootPath, deferFunc := test.Space(req)
-	flags := []string{"--root-path=" + rootPath}
+	flags := []string{"--root-path=" + rootPath, "--metadata-root-path=" + test.RandomTempDir()}
 	if testData.TLS {
 		flags = append(flags, "--tls=true")
 		certFile := filepath.Join(testData.basePath, "testdata/server_cert.pem")
@@ -100,7 +120,12 @@ func setup(req *require.Assertions, testData testData) func() {
 	err = g.RegisterFlags().Parse(flags)
 	req.NoError(err)
 
+	wg := sync.WaitGroup{}
+
+	wg.Add(1)
 	go func() {
+		// we have to wait for this goroutine to safely shutdown
+		defer wg.Done()
 		errRun := g.Run()
 		if errRun != nil {
 			startListener.GracefulStop()
@@ -111,6 +136,7 @@ func setup(req *require.Assertions, testData testData) func() {
 	req.NoError(startListener.WaitUntilStarted())
 	return func() {
 		closer.GracefulStop()
+		wg.Wait()
 	}
 }
 
diff --git a/banyand/liaison/liaison.go b/banyand/liaison/liaison.go
index 8eb9274..e5a19dc 100644
--- a/banyand/liaison/liaison.go
+++ b/banyand/liaison/liaison.go
@@ -22,6 +22,7 @@ import (
 
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
 	"github.com/apache/skywalking-banyandb/banyand/liaison/grpc"
+	"github.com/apache/skywalking-banyandb/banyand/metadata"
 	"github.com/apache/skywalking-banyandb/banyand/queue"
 	"github.com/apache/skywalking-banyandb/pkg/run"
 )
@@ -32,6 +33,6 @@ type Endpoint interface {
 	run.Service
 }
 
-func NewEndpoint(ctx context.Context, pipeline queue.Queue, repo discovery.ServiceRepo) (Endpoint, error) {
-	return grpc.NewServer(ctx, pipeline, repo), nil
+func NewEndpoint(ctx context.Context, pipeline queue.Queue, repo discovery.ServiceRepo, schemaRegistry metadata.Service) (Endpoint, error) {
+	return grpc.NewServer(ctx, pipeline, repo, schemaRegistry), nil
 }
diff --git a/banyand/metadata/metadata.go b/banyand/metadata/metadata.go
index 1c42f5b..5113d02 100644
--- a/banyand/metadata/metadata.go
+++ b/banyand/metadata/metadata.go
@@ -19,6 +19,7 @@ package metadata
 
 import (
 	"context"
+	"errors"
 	"time"
 
 	"go.uber.org/multierr"
@@ -37,42 +38,86 @@ type IndexFilter interface {
 
 type Repo interface {
 	IndexFilter
-	Stream() schema.Stream
+	StreamRegistry() schema.Stream
+	IndexRuleRegistry() schema.IndexRule
+	IndexRuleBindingRegistry() schema.IndexRuleBinding
+	MeasureRegistry() schema.Measure
+	GroupRegistry() schema.Group
 }
 
 type Service interface {
 	Repo
-	run.Unit
+	run.PreRunner
+	run.Service
+	run.Config
+	SchemaRegistry() schema.Registry
 }
 
 type service struct {
-	stream           schema.Stream
-	indexRule        schema.IndexRule
-	indexRuleBinding schema.IndexRuleBinding
+	schemaRegistry schema.Registry
+	rootDir        string
 }
 
-func NewService(_ context.Context) (Service, error) {
-	stream, err := schema.NewStream()
-	if err != nil {
-		return nil, err
-	}
-	indexRule, err := schema.NewIndexRule()
-	if err != nil {
-		return nil, err
+func (s *service) FlagSet() *run.FlagSet {
+	fs := run.NewFlagSet("metadata")
+	fs.StringVarP(&s.rootDir, "metadata-root-path", "", "/tmp", "the root path of metadata")
+	return fs
+}
+
+func (s *service) Validate() error {
+	if s.rootDir == "" {
+		return errors.New("rootDir is empty")
 	}
-	indexRuleBinding, err := schema.NewIndexRuleBinding()
+	return nil
+}
+
+func (s *service) PreRun() error {
+	var err error
+	s.schemaRegistry, err = schema.NewEtcdSchemaRegistry(schema.UseRandomListener(),
+		schema.RootDir(s.rootDir))
 	if err != nil {
-		return nil, err
+		return err
 	}
-	return &service{
-		stream:           stream,
-		indexRule:        indexRule,
-		indexRuleBinding: indexRuleBinding,
-	}, nil
+	<-s.schemaRegistry.ReadyNotify()
+	return nil
+}
+
+func (s *service) Serve() error {
+	<-s.schemaRegistry.StoppingNotify()
+	return nil
+}
+
+func (s *service) GracefulStop() {
+	_ = s.schemaRegistry.Close()
+	<-s.schemaRegistry.StopNotify()
+}
+
+func NewService(_ context.Context) (Service, error) {
+	return &service{}, nil
+}
+
+func (s *service) SchemaRegistry() schema.Registry {
+	return s.schemaRegistry
+}
+
+func (s *service) StreamRegistry() schema.Stream {
+	return s.schemaRegistry
+}
+
+func (s *service) IndexRuleRegistry() schema.IndexRule {
+	return s.schemaRegistry
+}
+
+func (s *service) IndexRuleBindingRegistry() schema.IndexRuleBinding {
+	return s.schemaRegistry
+}
+
+func (s *service) MeasureRegistry() schema.Measure {
+	return s.schemaRegistry
 }
 
-func (s *service) Stream() schema.Stream {
-	return s.stream
+func (s *service) GroupRegistry() schema.Group {
+	return s.schemaRegistry
 }
 
 func (s *service) Name() string {
@@ -80,7 +125,7 @@ func (s *service) Name() string {
 }
 
 func (s *service) IndexRules(ctx context.Context, subject *commonv1.Metadata) ([]*databasev1.IndexRule, error) {
-	bindings, err := s.indexRuleBinding.List(ctx, schema.ListOpt{Group: subject.Group})
+	bindings, err := s.schemaRegistry.ListIndexRuleBinding(ctx, schema.ListOpt{Group: subject.Group})
 	if err != nil {
 		return nil, err
 	}
@@ -100,7 +145,7 @@ func (s *service) IndexRules(ctx context.Context, subject *commonv1.Metadata) ([
 	result := make([]*databasev1.IndexRule, 0, len(foundRules))
 	var indexRuleErr error
 	for _, rule := range foundRules {
-		r, getErr := s.indexRule.Get(ctx, &commonv1.Metadata{
+		r, getErr := s.schemaRegistry.GetIndexRule(ctx, &commonv1.Metadata{
 			Name:  rule,
 			Group: subject.Group,
 		})
diff --git a/banyand/metadata/metadata_test.go b/banyand/metadata/metadata_test.go
index 528a161..6abc9be 100644
--- a/banyand/metadata/metadata_test.go
+++ b/banyand/metadata/metadata_test.go
@@ -19,13 +19,14 @@ package metadata
 
 import (
 	"context"
+	"os"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
 
 	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
 	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
-	"github.com/apache/skywalking-banyandb/banyand/metadata/schema"
+	"github.com/apache/skywalking-banyandb/pkg/test"
 )
 
 func Test_service_RulesBySubject(t *testing.T) {
@@ -33,10 +34,26 @@ func Test_service_RulesBySubject(t *testing.T) {
 		subject *commonv1.Metadata
 	}
 	is := assert.New(t)
+	ctx := context.TODO()
+	s, _ := NewService(ctx)
+	is.NotNil(s)
+	rootDir := test.RandomTempDir()
+	err := s.FlagSet().Parse([]string{"--metadata-root-path=" + rootDir})
+	is.NoError(err)
+	err = s.PreRun()
+	is.NoError(err)
+	defer func() {
+		s.GracefulStop()
+		_ = os.RemoveAll(rootDir)
+	}()
+
+	err = test.PreloadSchema(s.SchemaRegistry())
+	is.NoError(err)
+
 	tests := []struct {
 		name    string
 		args    args
-		want    []*databasev1.IndexRule
+		want    []string
 		wantErr bool
 	}{
 		{
@@ -44,7 +61,7 @@ func Test_service_RulesBySubject(t *testing.T) {
 			args: args{
 				subject: createSubject("sw", "default"),
 			},
-			want: getIndexRule(
+			want: []string{
 				"trace_id",
 				"duration",
 				"endpoint_id",
@@ -54,20 +71,19 @@ func Test_service_RulesBySubject(t *testing.T) {
 				"db.type",
 				"mq.broker",
 				"mq.queue",
-				"mq.topic"),
+				"mq.topic",
+			},
 		},
 		{
 			name: "got empty idWithShard",
 			args: args{
 				subject: createSubject("invalid", "default"),
 			},
-			want: make([]*databasev1.IndexRule, 0),
+			want: make([]string, 0),
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			ctx := context.TODO()
-			s, err := NewService(ctx)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("NewService() error = %v, wantErr %v", err, tt.wantErr)
 				return
@@ -77,16 +93,16 @@ func Test_service_RulesBySubject(t *testing.T) {
 				t.Errorf("RulesBySubject() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
-			is.Equal(tt.want, got)
+			is.Equal(getIndexRule(s, tt.want...), got)
 		})
 	}
 }
 
-func getIndexRule(names ...string) []*databasev1.IndexRule {
-	ruleRepo, _ := schema.NewIndexRule()
+func getIndexRule(s Service, names ...string) []*databasev1.IndexRule {
+	ruleRepo := s.IndexRuleRegistry()
 	result := make([]*databasev1.IndexRule, 0, len(names))
 	for _, name := range names {
-		indexRule, _ := ruleRepo.Get(context.TODO(), &commonv1.Metadata{
+		indexRule, _ := ruleRepo.GetIndexRule(context.TODO(), &commonv1.Metadata{
 			Group: "default",
 			Name:  name,
 		})
diff --git a/banyand/metadata/schema/etcd.go b/banyand/metadata/schema/etcd.go
new file mode 100644
index 0000000..ccd7794
--- /dev/null
+++ b/banyand/metadata/schema/etcd.go
@@ -0,0 +1,502 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package schema
+
+import (
+	"context"
+	"fmt"
+	"math/rand"
+	"net/url"
+	"os"
+	"path/filepath"
+	"strings"
+
+	"github.com/pkg/errors"
+	clientv3 "go.etcd.io/etcd/client/v3"
+	"go.etcd.io/etcd/server/v3/embed"
+	"google.golang.org/protobuf/proto"
+	"google.golang.org/protobuf/types/known/timestamppb"
+
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
+)
+
+var (
+	_ Stream           = (*etcdSchemaRegistry)(nil)
+	_ IndexRuleBinding = (*etcdSchemaRegistry)(nil)
+	_ IndexRule        = (*etcdSchemaRegistry)(nil)
+	_ Measure          = (*etcdSchemaRegistry)(nil)
+	_ Group            = (*etcdSchemaRegistry)(nil)
+
+	ErrEntityNotFound             = errors.New("entity is not found")
+	ErrUnexpectedNumberOfEntities = errors.New("unexpected number of entities")
+
+	GroupsKeyPrefix           = "/groups/"
+	GroupMetadataKey          = "/__meta_group__"
+	StreamKeyPrefix           = "/streams/"
+	IndexRuleBindingKeyPrefix = "/index-rule-bindings/"
+	IndexRuleKeyPrefix        = "/index-rules/"
+	MeasureKeyPrefix          = "/measures/"
+)
+
+type RegistryOption func(*etcdSchemaRegistryConfig)
+
+func RootDir(rootDir string) RegistryOption {
+	return func(config *etcdSchemaRegistryConfig) {
+		config.rootDir = rootDir
+	}
+}
+
+func randomUnixDomainListener() (string, string) {
+	i := rand.Uint64()
+	return fmt.Sprintf("%s://localhost:%d%06d", "unix", os.Getpid(), i),
+		fmt.Sprintf("%s://localhost:%d%06d", "unix", os.Getpid(), i+1)
+}
+
+func UseRandomListener() RegistryOption {
+	return func(config *etcdSchemaRegistryConfig) {
+		lc, lp := randomUnixDomainListener()
+		config.listenerClientURL = lc
+		config.listenerPeerURL = lp
+	}
+}
+
+type etcdSchemaRegistry struct {
+	server *embed.Etcd
+	kv     clientv3.KV
+}
+
+type etcdSchemaRegistryConfig struct {
+	// rootDir is the root directory for etcd storage
+	rootDir string
+	// listenerClientURL is the listener for client
+	listenerClientURL string
+	// listenerPeerURL is the listener for peer
+	listenerPeerURL string
+}
+
+func (e *etcdSchemaRegistry) GetGroup(ctx context.Context, group string) (*commonv1.Group, error) {
+	var entity commonv1.Group
+	err := e.get(ctx, formatGroupKey(group), &entity)
+	if err != nil {
+		return nil, err
+	}
+	return &entity, nil
+}
+
+func (e *etcdSchemaRegistry) ListGroup(ctx context.Context) ([]string, error) {
+	messages, err := e.kv.Get(ctx, GroupsKeyPrefix, clientv3.WithFromKey(), clientv3.WithRange(incrementLastByte(GroupsKeyPrefix)))
+	if err != nil {
+		return nil, err
+	}
+
+	if messages.Count == 0 {
+		return []string{}, nil
+	}
+
+	var groups []string
+	for _, kv := range messages.Kvs {
+		// kv.Key = "/groups/" + {group} + "/__meta_info__"
+		groupWithSuffix := strings.TrimPrefix(string(kv.Key), GroupsKeyPrefix)
+		if strings.HasSuffix(groupWithSuffix, GroupMetadataKey) {
+			groups = append(groups, strings.TrimSuffix(groupWithSuffix, GroupMetadataKey))
+		}
+	}
+
+	return groups, nil
+}
+
+func (e *etcdSchemaRegistry) DeleteGroup(ctx context.Context, group string) (bool, error) {
+	g, err := e.GetGroup(ctx, group)
+	if err != nil {
+		return false, errors.Wrap(err, group)
+	}
+	keyPrefix := GroupsKeyPrefix + g.GetName() + "/"
+	_, err = e.kv.Delete(ctx, keyPrefix, clientv3.WithRange(incrementLastByte(keyPrefix)))
+	if err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+func (e *etcdSchemaRegistry) CreateGroup(ctx context.Context, group string) error {
+	_, err := e.GetGroup(ctx, group)
+	if err != nil && !errors.Is(err, ErrEntityNotFound) {
+		return errors.Wrap(err, group)
+	}
+	return e.touchGroup(ctx, &commonv1.Group{
+		Name: group,
+	})
+}
+
+func (e *etcdSchemaRegistry) touchGroup(ctx context.Context, g *commonv1.Group) error {
+	groupBytes, err := proto.Marshal(g)
+	if err != nil {
+		return err
+	}
+	g.UpdatedAt = timestamppb.Now()
+	_, err = e.kv.Put(ctx, formatGroupKey(g.GetName()), string(groupBytes))
+	return err
+}
+
+func (e *etcdSchemaRegistry) GetMeasure(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.Measure, error) {
+	var entity databasev1.Measure
+	if err := e.get(ctx, formatMeasureKey(metadata), &entity); err != nil {
+		return nil, err
+	}
+	return &entity, nil
+}
+
+func (e *etcdSchemaRegistry) ListMeasure(ctx context.Context, opt ListOpt) ([]*databasev1.Measure, error) {
+	keyPrefixes, err := e.listPrefixesForEntity(ctx, opt, MeasureKeyPrefix)
+	if err != nil {
+		return nil, err
+	}
+
+	var entities []*databasev1.Measure
+	for _, keyPrefix := range keyPrefixes {
+		messages, err := e.listWithPrefix(ctx, keyPrefix, func() proto.Message {
+			return &databasev1.Measure{}
+		})
+		if err != nil {
+			return nil, err
+		}
+		for _, message := range messages {
+			entities = append(entities, message.(*databasev1.Measure))
+		}
+	}
+	return entities, nil
+}
+
+func (e *etcdSchemaRegistry) UpdateMeasure(ctx context.Context, measure *databasev1.Measure) error {
+	g, err := e.GetGroup(ctx, measure.GetMetadata().GetGroup())
+	if err != nil {
+		return errors.Wrap(err, measure.GetMetadata().GetGroup())
+	}
+	return e.update(ctx, g, formatMeasureKey(measure.GetMetadata()), measure)
+}
+
+func (e *etcdSchemaRegistry) DeleteMeasure(ctx context.Context, metadata *commonv1.Metadata) (bool, error) {
+	g, err := e.GetGroup(ctx, metadata.GetGroup())
+	if err != nil {
+		return false, errors.Wrap(err, metadata.GetGroup())
+	}
+	return e.delete(ctx, g, formatMeasureKey(metadata))
+}
+
+func (e *etcdSchemaRegistry) GetStream(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.Stream, error) {
+	var entity databasev1.Stream
+	if err := e.get(ctx, formatSteamKey(metadata), &entity); err != nil {
+		return nil, err
+	}
+	return &entity, nil
+}
+
+func (e *etcdSchemaRegistry) ListStream(ctx context.Context, opt ListOpt) ([]*databasev1.Stream, error) {
+	keyPrefixes, err := e.listPrefixesForEntity(ctx, opt, StreamKeyPrefix)
+	if err != nil {
+		return nil, err
+	}
+
+	var entities []*databasev1.Stream
+	for _, keyPrefix := range keyPrefixes {
+		messages, err := e.listWithPrefix(ctx, keyPrefix, func() proto.Message {
+			return &databasev1.Stream{}
+		})
+		if err != nil {
+			return nil, err
+		}
+
+		for _, message := range messages {
+			entities = append(entities, message.(*databasev1.Stream))
+		}
+	}
+
+	return entities, nil
+}
+
+func (e *etcdSchemaRegistry) UpdateStream(ctx context.Context, stream *databasev1.Stream) error {
+	g, err := e.GetGroup(ctx, stream.GetMetadata().GetGroup())
+	if err != nil {
+		return errors.Wrap(err, stream.GetMetadata().GetGroup())
+	}
+	return e.update(ctx, g, formatSteamKey(stream.GetMetadata()), stream)
+}
+
+func (e *etcdSchemaRegistry) DeleteStream(ctx context.Context, metadata *commonv1.Metadata) (bool, error) {
+	g, err := e.GetGroup(ctx, metadata.GetGroup())
+	if err != nil {
+		return false, errors.Wrap(err, metadata.GetGroup())
+	}
+	return e.delete(ctx, g, formatSteamKey(metadata))
+}
+
+func (e *etcdSchemaRegistry) GetIndexRuleBinding(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.IndexRuleBinding, error) {
+	var indexRuleBinding databasev1.IndexRuleBinding
+	if err := e.get(ctx, formatIndexRuleBindingKey(metadata), &indexRuleBinding); err != nil {
+		return nil, err
+	}
+	return &indexRuleBinding, nil
+}
+
+func (e *etcdSchemaRegistry) ListIndexRuleBinding(ctx context.Context, opt ListOpt) ([]*databasev1.IndexRuleBinding, error) {
+	keyPrefixes, err := e.listPrefixesForEntity(ctx, opt, IndexRuleBindingKeyPrefix)
+	if err != nil {
+		return nil, err
+	}
+
+	var entities []*databasev1.IndexRuleBinding
+	for _, keyPrefix := range keyPrefixes {
+		messages, err := e.listWithPrefix(ctx, keyPrefix, func() proto.Message {
+			return &databasev1.IndexRuleBinding{}
+		})
+		if err != nil {
+			return nil, err
+		}
+		for _, message := range messages {
+			entities = append(entities, message.(*databasev1.IndexRuleBinding))
+		}
+	}
+	return entities, nil
+}
+
+func (e *etcdSchemaRegistry) UpdateIndexRuleBinding(ctx context.Context, indexRuleBinding *databasev1.IndexRuleBinding) error {
+	g, err := e.GetGroup(ctx, indexRuleBinding.GetMetadata().GetGroup())
+	if err != nil {
+		return errors.Wrap(err, indexRuleBinding.GetMetadata().GetGroup())
+	}
+	return e.update(ctx, g, formatIndexRuleBindingKey(indexRuleBinding.GetMetadata()), indexRuleBinding)
+}
+
+func (e *etcdSchemaRegistry) DeleteIndexRuleBinding(ctx context.Context, metadata *commonv1.Metadata) (bool, error) {
+	g, err := e.GetGroup(ctx, metadata.GetGroup())
+	if err != nil {
+		return false, errors.Wrap(err, metadata.GetGroup())
+	}
+	return e.delete(ctx, g, formatIndexRuleBindingKey(metadata))
+}
+
+func (e *etcdSchemaRegistry) GetIndexRule(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.IndexRule, error) {
+	var entity databasev1.IndexRule
+	if err := e.get(ctx, formatIndexRuleKey(metadata), &entity); err != nil {
+		return nil, err
+	}
+	return &entity, nil
+}
+
+func (e *etcdSchemaRegistry) ListIndexRule(ctx context.Context, opt ListOpt) ([]*databasev1.IndexRule, error) {
+	keyPrefixes, err := e.listPrefixesForEntity(ctx, opt, IndexRuleKeyPrefix)
+	if err != nil {
+		return nil, err
+	}
+
+	var entities []*databasev1.IndexRule
+	for _, keyPrefix := range keyPrefixes {
+		messages, err := e.listWithPrefix(ctx, keyPrefix, func() proto.Message {
+			return &databasev1.IndexRule{}
+		})
+		if err != nil {
+			return nil, err
+		}
+		for _, message := range messages {
+			entities = append(entities, message.(*databasev1.IndexRule))
+		}
+	}
+	return entities, nil
+}
+
+func (e *etcdSchemaRegistry) UpdateIndexRule(ctx context.Context, indexRule *databasev1.IndexRule) error {
+	g, err := e.GetGroup(ctx, indexRule.GetMetadata().GetGroup())
+	if err != nil {
+		return errors.Wrap(err, indexRule.GetMetadata().GetGroup())
+	}
+	return e.update(ctx, g, formatIndexRuleKey(indexRule.GetMetadata()), indexRule)
+}
+
+func (e *etcdSchemaRegistry) DeleteIndexRule(ctx context.Context, metadata *commonv1.Metadata) (bool, error) {
+	g, err := e.GetGroup(ctx, metadata.GetGroup())
+	if err != nil {
+		return false, errors.Wrap(err, metadata.GetGroup())
+	}
+	return e.delete(ctx, g, formatIndexRuleKey(metadata))
+}
+
+func (e *etcdSchemaRegistry) ReadyNotify() <-chan struct{} {
+	return e.server.Server.ReadyNotify()
+}
+
+func (e *etcdSchemaRegistry) StopNotify() <-chan struct{} {
+	return e.server.Server.StopNotify()
+}
+
+func (e *etcdSchemaRegistry) StoppingNotify() <-chan struct{} {
+	return e.server.Server.StoppingNotify()
+}
+
+func (e *etcdSchemaRegistry) Close() error {
+	e.server.Close()
+	return nil
+}
+
+func NewEtcdSchemaRegistry(options ...RegistryOption) (Registry, error) {
+	registryConfig := &etcdSchemaRegistryConfig{
+		rootDir:           os.TempDir(),
+		listenerClientURL: embed.DefaultListenClientURLs,
+		listenerPeerURL:   embed.DefaultListenPeerURLs,
+	}
+	for _, opt := range options {
+		opt(registryConfig)
+	}
+	// TODO: allow use cluster setting
+	embedConfig := newStandaloneEtcdConfig(registryConfig)
+	e, err := embed.StartEtcd(embedConfig)
+	if err != nil {
+		return nil, err
+	}
+	if e != nil {
+		<-e.Server.ReadyNotify() // wait for e.Server to join the cluster
+	}
+	client, err := clientv3.NewFromURL(e.Config().ACUrls[0].String())
+	if err != nil {
+		return nil, err
+	}
+	kvClient := clientv3.NewKV(client)
+	reg := &etcdSchemaRegistry{
+		server: e,
+		kv:     kvClient,
+	}
+	return reg, nil
+}
+
+func (e *etcdSchemaRegistry) get(ctx context.Context, key string, message proto.Message) error {
+	resp, err := e.kv.Get(ctx, key)
+	if err != nil {
+		return err
+	}
+	if resp.Count == 0 {
+		return ErrEntityNotFound
+	}
+	if resp.Count > 1 {
+		return ErrUnexpectedNumberOfEntities
+	}
+	if err := proto.Unmarshal(resp.Kvs[0].Value, message); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (e *etcdSchemaRegistry) update(ctx context.Context, group *commonv1.Group, key string, message proto.Message) error {
+	val, err := proto.Marshal(message)
+	if err != nil {
+		return err
+	}
+	_, err = e.kv.Put(ctx, key, string(val))
+	if err != nil {
+		return err
+	}
+	return e.touchGroup(ctx, group)
+}
+
+func (e *etcdSchemaRegistry) listWithPrefix(ctx context.Context, prefix string, factory func() proto.Message) ([]proto.Message, error) {
+	resp, err := e.kv.Get(ctx, prefix, clientv3.WithFromKey(), clientv3.WithRange(incrementLastByte(prefix)))
+	if err != nil {
+		return nil, err
+	}
+	entities := make([]proto.Message, resp.Count)
+	for i := int64(0); i < resp.Count; i++ {
+		message := factory()
+		if err := proto.Unmarshal(resp.Kvs[0].Value, message); err != nil {
+			return nil, err
+		}
+		entities[i] = message
+	}
+	return entities, nil
+}
+
+func (e *etcdSchemaRegistry) listPrefixesForEntity(ctx context.Context, opt ListOpt, entityPrefix string) ([]string, error) {
+	var keyPrefixes []string
+
+	if opt.Group != "" {
+		keyPrefixes = append(keyPrefixes, GroupsKeyPrefix+opt.Group+entityPrefix)
+	} else {
+		groups, err := e.ListGroup(ctx)
+		if err != nil {
+			return nil, err
+		}
+		for _, g := range groups {
+			keyPrefixes = append(keyPrefixes, GroupsKeyPrefix+g+entityPrefix)
+		}
+	}
+
+	return keyPrefixes, nil
+}
+
+func (e *etcdSchemaRegistry) delete(ctx context.Context, g *commonv1.Group, key string) (bool, error) {
+	resp, err := e.kv.Delete(ctx, key)
+	if err != nil {
+		return false, err
+	}
+	if resp.Deleted > 0 {
+		return true, e.touchGroup(ctx, g)
+	}
+	return false, nil
+}
+
+func formatIndexRuleKey(metadata *commonv1.Metadata) string {
+	return formatKey(IndexRuleKeyPrefix, metadata)
+}
+
+func formatIndexRuleBindingKey(metadata *commonv1.Metadata) string {
+	return formatKey(IndexRuleBindingKeyPrefix, metadata)
+}
+
+func formatSteamKey(metadata *commonv1.Metadata) string {
+	return formatKey(StreamKeyPrefix, metadata)
+}
+
+func formatMeasureKey(metadata *commonv1.Metadata) string {
+	return formatKey(MeasureKeyPrefix, metadata)
+}
+
+func formatKey(entityPrefix string, metadata *commonv1.Metadata) string {
+	return GroupsKeyPrefix + metadata.GetGroup() + entityPrefix + metadata.GetName()
+}
+
+func formatGroupKey(group string) string {
+	return GroupsKeyPrefix + group + GroupMetadataKey
+}
+
+func incrementLastByte(key string) string {
+	bb := []byte(key)
+	bb[len(bb)-1]++
+	return string(bb)
+}
+
+func newStandaloneEtcdConfig(config *etcdSchemaRegistryConfig) *embed.Config {
+	cfg := embed.NewConfig()
+	// TODO: allow user to set path
+	cfg.Dir = filepath.Join(config.rootDir, "metadata")
+	cURL, _ := url.Parse(config.listenerClientURL)
+	pURL, _ := url.Parse(config.listenerPeerURL)
+
+	cfg.ClusterState = "new"
+	cfg.LCUrls, cfg.ACUrls = []url.URL{*cURL}, []url.URL{*cURL}
+	cfg.LPUrls, cfg.APUrls = []url.URL{*pURL}, []url.URL{*pURL}
+	cfg.InitialCluster = ",default=" + pURL.String()
+	return cfg
+}
diff --git a/banyand/metadata/schema/etcd_test.go b/banyand/metadata/schema/etcd_test.go
new file mode 100644
index 0000000..a079155
--- /dev/null
+++ b/banyand/metadata/schema/etcd_test.go
@@ -0,0 +1,375 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package schema
+
+import (
+	"context"
+	"embed"
+	"fmt"
+	"os"
+	"path"
+	"testing"
+
+	"github.com/google/uuid"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+	"google.golang.org/protobuf/encoding/protojson"
+
+	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
+)
+
+const indexRuleDir = "testdata/index_rules"
+
+var (
+	//go:embed testdata/index_rules/*.json
+	indexRuleStore embed.FS
+	//go:embed testdata/index_rule_binding.json
+	indexRuleBindingJSON string
+	//go:embed testdata/stream.json
+	streamJSON string
+)
+
+func PreloadSchema(e Registry) error {
+	if err := e.CreateGroup(context.TODO(), "default"); err != nil {
+		return err
+	}
+
+	s := &databasev1.Stream{}
+	if err := protojson.Unmarshal([]byte(streamJSON), s); err != nil {
+		return err
+	}
+	err := e.UpdateStream(context.Background(), s)
+	if err != nil {
+		return err
+	}
+
+	indexRuleBinding := &databasev1.IndexRuleBinding{}
+	if err = protojson.Unmarshal([]byte(indexRuleBindingJSON), indexRuleBinding); err != nil {
+		return err
+	}
+	err = e.UpdateIndexRuleBinding(context.Background(), indexRuleBinding)
+	if err != nil {
+		return err
+	}
+
+	entries, err := indexRuleStore.ReadDir(indexRuleDir)
+	if err != nil {
+		return err
+	}
+	for _, entry := range entries {
+		data, err := indexRuleStore.ReadFile(indexRuleDir + "/" + entry.Name())
+		if err != nil {
+			return err
+		}
+		var idxRule databasev1.IndexRule
+		err = protojson.Unmarshal(data, &idxRule)
+		if err != nil {
+			return err
+		}
+		err = e.UpdateIndexRule(context.Background(), &idxRule)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+type HasMetadata interface {
+	GetMetadata() *commonv1.Metadata
+}
+
+func randomTempDir() string {
+	return path.Join(os.TempDir(), fmt.Sprintf("banyandb-embed-etcd-%s", uuid.New().String()))
+}
+
+func useRandomTempDir() RegistryOption {
+	return func(config *etcdSchemaRegistryConfig) {
+		config.rootDir = randomTempDir()
+	}
+}
+
+func useUnixDomain() RegistryOption {
+	return func(config *etcdSchemaRegistryConfig) {
+		config.listenerClientURL, config.listenerPeerURL = randomUnixDomainListener()
+	}
+}
+
+func Test_Etcd_Entity_Get(t *testing.T) {
+	tester := assert.New(t)
+	registry, err := NewEtcdSchemaRegistry(useUnixDomain(), useRandomTempDir())
+	tester.NoError(err)
+	tester.NotNil(registry)
+	defer registry.Close()
+
+	err = PreloadSchema(registry)
+	tester.NoError(err)
+
+	tests := []struct {
+		name        string
+		meta        *commonv1.Metadata
+		get         func(Registry, *commonv1.Metadata) (HasMetadata, error)
+		expectedErr bool
+	}{
+		{
+			name: "Get Stream",
+			meta: &commonv1.Metadata{Name: "sw", Group: "default"},
+			get: func(r Registry, meta *commonv1.Metadata) (HasMetadata, error) {
+				stm, innerErr := registry.GetStream(context.TODO(), meta)
+				if innerErr != nil {
+					return nil, innerErr
+				}
+				return HasMetadata(stm), nil
+			},
+		},
+		{
+			name: "Get IndexRuleBinding",
+			meta: &commonv1.Metadata{Name: "sw-index-rule-binding", Group: "default"},
+			get: func(r Registry, meta *commonv1.Metadata) (HasMetadata, error) {
+				e, innerErr := registry.GetIndexRuleBinding(context.TODO(), meta)
+				if innerErr != nil {
+					return nil, innerErr
+				}
+				return HasMetadata(e), nil
+			},
+		},
+		{
+			name: "Get IndexRule",
+			meta: &commonv1.Metadata{Name: "db.instance", Group: "default"},
+			get: func(r Registry, meta *commonv1.Metadata) (HasMetadata, error) {
+				e, innerErr := registry.GetIndexRule(context.TODO(), meta)
+				if innerErr != nil {
+					return nil, innerErr
+				}
+				return HasMetadata(e), nil
+			},
+		},
+		{
+			name: "Get unknown Measure",
+			meta: &commonv1.Metadata{Name: "unknown-measure", Group: "default"},
+			get: func(r Registry, meta *commonv1.Metadata) (HasMetadata, error) {
+				e, innerErr := registry.GetMeasure(context.TODO(), meta)
+				if innerErr != nil {
+					return nil, innerErr
+				}
+				return HasMetadata(e), nil
+			},
+			expectedErr: true,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			req := require.New(t)
+			entity, err := tt.get(registry, tt.meta)
+			if !tt.expectedErr {
+				req.NoError(err)
+				req.NotNil(entity)
+				req.Equal(entity.GetMetadata().GetGroup(), tt.meta.GetGroup())
+				req.Equal(entity.GetMetadata().GetName(), tt.meta.GetName())
+			} else {
+				req.Error(err)
+			}
+		})
+	}
+}
+
+func Test_Etcd_Entity_List(t *testing.T) {
+	tester := assert.New(t)
+	registry, err := NewEtcdSchemaRegistry(useUnixDomain(), useRandomTempDir())
+	tester.NoError(err)
+	tester.NotNil(registry)
+	defer registry.Close()
+
+	err = PreloadSchema(registry)
+	tester.NoError(err)
+
+	tests := []struct {
+		name        string
+		list        func(Registry) (int, error)
+		expectedLen int
+	}{
+		{
+			name: "List Stream without Group",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListStream(context.TODO(), ListOpt{})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			expectedLen: 1,
+		},
+		{
+			name: "List Stream with Group default",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListStream(context.TODO(), ListOpt{Group: "default"})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			expectedLen: 1,
+		},
+		{
+			name: "List IndexRuleBinding without Group",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListIndexRuleBinding(context.TODO(), ListOpt{})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			expectedLen: 1,
+		},
+		{
+			name: "List IndexRuleBinding with Group",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListIndexRuleBinding(context.TODO(), ListOpt{Group: "default"})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			expectedLen: 1,
+		},
+		{
+			name: "List IndexRule without Group",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListIndexRule(context.TODO(), ListOpt{})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			expectedLen: 10,
+		},
+		{
+			name: "List IndexRule with Group",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListIndexRule(context.TODO(), ListOpt{Group: "default"})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			expectedLen: 10,
+		},
+		{
+			name: "List Measure without Group",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListMeasure(context.TODO(), ListOpt{})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			expectedLen: 0,
+		},
+		{
+			name: "List Measure with Group",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListMeasure(context.TODO(), ListOpt{Group: "default"})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			expectedLen: 0,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			req := require.New(t)
+			entitiesLen, listErr := tt.list(registry)
+			req.NoError(listErr)
+			req.Equal(entitiesLen, tt.expectedLen)
+		})
+	}
+}
+
+func Test_Etcd_Delete(t *testing.T) {
+	tester := assert.New(t)
+	registry, err := NewEtcdSchemaRegistry(useUnixDomain(), useRandomTempDir())
+	tester.NoError(err)
+	tester.NotNil(registry)
+	defer registry.Close()
+
+	err = PreloadSchema(registry)
+	tester.NoError(err)
+
+	tests := []struct {
+		name              string
+		list              func(Registry) (int, error)
+		delete            func(Registry) error
+		expectedLenBefore int
+		expectedLenAfter  int
+	}{
+		{
+			name: "Delete IndexRule",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListIndexRule(context.TODO(), ListOpt{Group: "default"})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			delete: func(r Registry) error {
+				_, innerErr := r.DeleteIndexRule(context.TODO(), &commonv1.Metadata{
+					Name:  "db.instance",
+					Group: "default",
+				})
+				return innerErr
+			},
+			expectedLenBefore: 10,
+			expectedLenAfter:  9,
+		},
+		{
+			name: "Delete Group",
+			list: func(r Registry) (int, error) {
+				entities, innerErr := r.ListIndexRule(context.TODO(), ListOpt{Group: "default"})
+				if innerErr != nil {
+					return 0, innerErr
+				}
+				return len(entities), nil
+			},
+			delete: func(r Registry) error {
+				_, innerErr := r.DeleteGroup(context.TODO(), "default")
+				return innerErr
+			},
+			expectedLenBefore: 9,
+			expectedLenAfter:  0,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			ast := assert.New(t)
+			num, err := tt.list(registry)
+			ast.NoError(err)
+			ast.Equal(num, tt.expectedLenBefore)
+			err = tt.delete(registry)
+			ast.NoError(err)
+			num, err = tt.list(registry)
+			ast.NoError(err)
+			ast.Equal(num, tt.expectedLenAfter)
+		})
+	}
+}
diff --git a/banyand/metadata/schema/schema.go b/banyand/metadata/schema/schema.go
index 7d245cb..f5a7121 100644
--- a/banyand/metadata/schema/schema.go
+++ b/banyand/metadata/schema/schema.go
@@ -19,6 +19,7 @@ package schema
 
 import (
 	"context"
+	"io"
 
 	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
 	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
@@ -28,17 +29,53 @@ type ListOpt struct {
 	Group string
 }
 
+type Registry interface {
+	io.Closer
+	ReadyNotify() <-chan struct{}
+	StopNotify() <-chan struct{}
+	StoppingNotify() <-chan struct{}
+	Stream
+	IndexRule
+	IndexRuleBinding
+	Measure
+	Group
+}
+
 type Stream interface {
-	Get(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.Stream, error)
-	List(ctx context.Context, opt ListOpt) ([]*databasev1.Stream, error)
+	GetStream(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.Stream, error)
+	ListStream(ctx context.Context, opt ListOpt) ([]*databasev1.Stream, error)
+	UpdateStream(ctx context.Context, stream *databasev1.Stream) error
+	DeleteStream(ctx context.Context, metadata *commonv1.Metadata) (bool, error)
 }
 
 type IndexRule interface {
-	Get(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.IndexRule, error)
-	List(ctx context.Context, opt ListOpt) ([]*databasev1.IndexRule, error)
+	GetIndexRule(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.IndexRule, error)
+	ListIndexRule(ctx context.Context, opt ListOpt) ([]*databasev1.IndexRule, error)
+	UpdateIndexRule(ctx context.Context, indexRule *databasev1.IndexRule) error
+	DeleteIndexRule(ctx context.Context, metadata *commonv1.Metadata) (bool, error)
 }
 
 type IndexRuleBinding interface {
-	Get(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.IndexRuleBinding, error)
-	List(ctx context.Context, opt ListOpt) ([]*databasev1.IndexRuleBinding, error)
+	GetIndexRuleBinding(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.IndexRuleBinding, error)
+	ListIndexRuleBinding(ctx context.Context, opt ListOpt) ([]*databasev1.IndexRuleBinding, error)
+	UpdateIndexRuleBinding(ctx context.Context, indexRuleBinding *databasev1.IndexRuleBinding) error
+	DeleteIndexRuleBinding(ctx context.Context, metadata *commonv1.Metadata) (bool, error)
+}
+
+type Measure interface {
+	GetMeasure(ctx context.Context, metadata *commonv1.Metadata) (*databasev1.Measure, error)
+	ListMeasure(ctx context.Context, opt ListOpt) ([]*databasev1.Measure, error)
+	UpdateMeasure(ctx context.Context, measure *databasev1.Measure) error
+	DeleteMeasure(ctx context.Context, metadata *commonv1.Metadata) (bool, error)
+}
+
+type Group interface {
+	GetGroup(ctx context.Context, group string) (*commonv1.Group, error)
+	ListGroup(ctx context.Context) ([]string, error)
+	// DeleteGroup delete all items belonging to the group
+	DeleteGroup(ctx context.Context, group string) (bool, error)
+	// CreateGroup works like `touch` in unix systems.
+	// 1. It will create the group if it does not exist.
+	// 2. It will update the updated_at timestamp to the current timestamp.
+	CreateGroup(ctx context.Context, group string) error
 }
diff --git a/banyand/metadata/schema/sw.go b/banyand/metadata/schema/sw.go
deleted file mode 100644
index 2371f94..0000000
--- a/banyand/metadata/schema/sw.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Licensed to Apache Software Foundation (ASF) under one or more contributor
-// license agreements. See the NOTICE file distributed with
-// this work for additional information regarding copyright
-// ownership. Apache Software Foundation (ASF) licenses this file to you under
-// the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package schema
-
-import (
-	"bytes"
-	"context"
-	"embed"
-	"strings"
-
-	"github.com/golang/protobuf/jsonpb"
-
-	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
-	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
-)
-
-const indexRuleDir = "data/index_rules"
-
-var (
-	_ Stream    = (*streamRepo)(nil)
-	_ IndexRule = (*indexRuleRepo)(nil)
-
-	//go:embed data/index_rules/*.json
-	indexRuleStore embed.FS
-	//go:embed data/index_rule_binding.json
-	indexRuleBindingJSON string
-	//go:embed data/stream.json
-	streamJSON string
-)
-
-type streamRepo struct {
-	data *databasev1.Stream
-}
-
-func NewStream() (Stream, error) {
-	stream := &databasev1.Stream{}
-	if err := jsonpb.UnmarshalString(streamJSON, stream); err != nil {
-		return nil, err
-	}
-	return &streamRepo{
-		data: stream,
-	}, nil
-}
-
-func (l *streamRepo) Get(_ context.Context, _ *commonv1.Metadata) (*databasev1.Stream, error) {
-	return l.data, nil
-}
-
-func (l *streamRepo) List(ctx context.Context, opts ListOpt) ([]*databasev1.Stream, error) {
-	s, err := l.Get(ctx, nil)
-	if err != nil {
-		return nil, err
-	}
-	return []*databasev1.Stream{s}, nil
-}
-
-type indexRuleRepo struct {
-	store embed.FS
-}
-
-func NewIndexRule() (IndexRule, error) {
-	return &indexRuleRepo{
-		store: indexRuleStore,
-	}, nil
-}
-
-func (i *indexRuleRepo) Get(_ context.Context, metadata *commonv1.Metadata) (*databasev1.IndexRule, error) {
-	bb, err := i.store.ReadFile(indexRuleDir + "/" + metadata.Name + ".json")
-	if err != nil {
-		return nil, err
-	}
-	indexRule := &databasev1.IndexRule{}
-	err = jsonpb.Unmarshal(bytes.NewReader(bb), indexRule)
-	if err != nil {
-		return nil, err
-	}
-	return indexRule, nil
-}
-
-func (i *indexRuleRepo) List(ctx context.Context, opt ListOpt) ([]*databasev1.IndexRule, error) {
-	entries, err := i.store.ReadDir(indexRuleDir)
-	if err != nil {
-		return nil, err
-	}
-	rules := make([]*databasev1.IndexRule, 0, len(entries))
-	for _, entry := range entries {
-		name := strings.TrimSuffix(entry.Name(), ".json")
-		r, errInternal := i.Get(ctx, &commonv1.Metadata{
-			Name:  name,
-			Group: opt.Group,
-		})
-		if errInternal != nil {
-			return nil, errInternal
-		}
-		rules = append(rules, r)
-	}
-	return rules, nil
-}
-
-type indexRuleBindingRepo struct {
-	data *databasev1.IndexRuleBinding
-}
-
-func NewIndexRuleBinding() (IndexRuleBinding, error) {
-	indexRuleBinding := &databasev1.IndexRuleBinding{}
-	if err := jsonpb.UnmarshalString(indexRuleBindingJSON, indexRuleBinding); err != nil {
-		return nil, err
-	}
-	return &indexRuleBindingRepo{
-		data: indexRuleBinding,
-	}, nil
-}
-
-func (i *indexRuleBindingRepo) Get(_ context.Context, _ *commonv1.Metadata) (*databasev1.IndexRuleBinding, error) {
-	return i.data, nil
-}
-
-func (i *indexRuleBindingRepo) List(ctx context.Context, _ ListOpt) ([]*databasev1.IndexRuleBinding, error) {
-	t, err := i.Get(ctx, nil)
-	if err != nil {
-		return nil, err
-	}
-	return []*databasev1.IndexRuleBinding{t}, nil
-}
diff --git a/banyand/metadata/schema/sw_test.go b/banyand/metadata/schema/sw_test.go
deleted file mode 100644
index 443a0d6..0000000
--- a/banyand/metadata/schema/sw_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Licensed to Apache Software Foundation (ASF) under one or more contributor
-// license agreements. See the NOTICE file distributed with
-// this work for additional information regarding copyright
-// ownership. Apache Software Foundation (ASF) licenses this file to you under
-// the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package schema
-
-import (
-	"context"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
-)
-
-func Test_IndexRule(t *testing.T) {
-	ast := assert.New(t)
-	is := require.New(t)
-	ir, err := NewIndexRule()
-	is.NoError(err)
-	r, err := ir.Get(context.Background(), &commonv1.Metadata{Name: "duration", Group: "default"})
-	is.NoError(err)
-	ast.NotNil(r)
-	ast.Equal("duration", r.Metadata.Name)
-	is.NoError(err)
-	rules, err := ir.List(context.Background(), ListOpt{})
-	is.NoError(err)
-	ast.NotEmpty(rules)
-}
-
-func Test_Stream(t *testing.T) {
-	ast := assert.New(t)
-	is := require.New(t)
-	s, err := NewStream()
-	is.NoError(err)
-	r, err := s.Get(context.Background(), &commonv1.Metadata{Name: "sw", Group: "default"})
-	is.NoError(err)
-	ast.NotNil(r)
-	ast.Equal("sw", r.Metadata.Name)
-	is.NoError(err)
-	rules, err := s.List(context.Background(), ListOpt{})
-	is.NoError(err)
-	ast.NotEmpty(rules)
-}
-
-func Test_IndexRuleBinding(t *testing.T) {
-	ast := assert.New(t)
-	is := require.New(t)
-	irb, err := NewIndexRuleBinding()
-	is.NoError(err)
-	r, err := irb.Get(context.Background(), &commonv1.Metadata{Name: "sw-index-rule-binding", Group: "default"})
-	is.NoError(err)
-	ast.NotNil(r)
-	ast.Equal("sw-index-rule-binding", r.Metadata.Name)
-	is.NoError(err)
-	rules, err := irb.List(context.Background(), ListOpt{})
-	is.NoError(err)
-	ast.NotEmpty(rules)
-}
diff --git a/banyand/metadata/schema/data/index_rule_binding.json b/banyand/metadata/schema/testdata/index_rule_binding.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rule_binding.json
copy to banyand/metadata/schema/testdata/index_rule_binding.json
diff --git a/banyand/metadata/schema/data/index_rules/db.instance.json b/banyand/metadata/schema/testdata/index_rules/db.instance.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/db.instance.json
copy to banyand/metadata/schema/testdata/index_rules/db.instance.json
diff --git a/banyand/metadata/schema/data/index_rules/db.type.json b/banyand/metadata/schema/testdata/index_rules/db.type.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/db.type.json
copy to banyand/metadata/schema/testdata/index_rules/db.type.json
diff --git a/banyand/metadata/schema/data/index_rules/duration.json b/banyand/metadata/schema/testdata/index_rules/duration.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/duration.json
copy to banyand/metadata/schema/testdata/index_rules/duration.json
diff --git a/banyand/metadata/schema/data/index_rules/endpoint_id.json b/banyand/metadata/schema/testdata/index_rules/endpoint_id.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/endpoint_id.json
copy to banyand/metadata/schema/testdata/index_rules/endpoint_id.json
diff --git a/banyand/metadata/schema/data/index_rules/http.method.json b/banyand/metadata/schema/testdata/index_rules/http.method.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/http.method.json
copy to banyand/metadata/schema/testdata/index_rules/http.method.json
diff --git a/banyand/metadata/schema/data/index_rules/mq.broker.json b/banyand/metadata/schema/testdata/index_rules/mq.broker.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/mq.broker.json
copy to banyand/metadata/schema/testdata/index_rules/mq.broker.json
diff --git a/banyand/metadata/schema/data/index_rules/mq.queue.json b/banyand/metadata/schema/testdata/index_rules/mq.queue.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/mq.queue.json
copy to banyand/metadata/schema/testdata/index_rules/mq.queue.json
diff --git a/banyand/metadata/schema/data/index_rules/mq.topic.json b/banyand/metadata/schema/testdata/index_rules/mq.topic.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/mq.topic.json
copy to banyand/metadata/schema/testdata/index_rules/mq.topic.json
diff --git a/banyand/metadata/schema/data/index_rules/status_code.json b/banyand/metadata/schema/testdata/index_rules/status_code.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/status_code.json
copy to banyand/metadata/schema/testdata/index_rules/status_code.json
diff --git a/banyand/metadata/schema/data/index_rules/trace_id.json b/banyand/metadata/schema/testdata/index_rules/trace_id.json
similarity index 100%
copy from banyand/metadata/schema/data/index_rules/trace_id.json
copy to banyand/metadata/schema/testdata/index_rules/trace_id.json
diff --git a/banyand/metadata/schema/data/stream.json b/banyand/metadata/schema/testdata/stream.json
similarity index 100%
copy from banyand/metadata/schema/data/stream.json
copy to banyand/metadata/schema/testdata/stream.json
diff --git a/banyand/query/processor.go b/banyand/query/processor.go
index 3fcb9fb..c6217de 100644
--- a/banyand/query/processor.go
+++ b/banyand/query/processor.go
@@ -24,6 +24,7 @@ import (
 	"github.com/apache/skywalking-banyandb/api/data"
 	streamv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v1"
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
+	"github.com/apache/skywalking-banyandb/banyand/metadata"
 	"github.com/apache/skywalking-banyandb/banyand/queue"
 	"github.com/apache/skywalking-banyandb/banyand/stream"
 	"github.com/apache/skywalking-banyandb/pkg/bus"
@@ -42,6 +43,7 @@ var (
 
 type queryProcessor struct {
 	streamService stream.Service
+	metaService   metadata.Service
 	logger        *logger.Logger
 	log           *logger.Logger
 	serviceRepo   discovery.ServiceRepo
@@ -57,21 +59,26 @@ func (q *queryProcessor) Rev(message bus.Message) (resp bus.Message) {
 	q.log.Info().
 		Msg("received a query event")
 
-	metadata := queryCriteria.GetMetadata()
-	ec, err := q.streamService.Stream(metadata)
+	meta := queryCriteria.GetMetadata()
+	ec, err := q.streamService.Stream(meta)
 	if err != nil {
 		q.logger.Error().Err(err).Msg("fail to get stream execution context")
 		return
 	}
 
-	analyzer := logical.DefaultAnalyzer()
-	s, err := analyzer.BuildStreamSchema(context.TODO(), metadata)
+	analyzer, err := logical.CreateAnalyzerFromMetaService(q.metaService)
+	if err != nil {
+		q.logger.Error().Err(err).Msg("fail to build analyzer")
+		return
+	}
+
+	s, err := analyzer.BuildStreamSchema(context.TODO(), meta)
 	if err != nil {
 		q.logger.Error().Err(err).Msg("fail to build trace schema")
 		return
 	}
 
-	p, err := analyzer.Analyze(context.TODO(), queryCriteria, metadata, s)
+	p, err := analyzer.Analyze(context.TODO(), queryCriteria, meta, s)
 	if err != nil {
 		q.logger.Error().Err(err).Msg("fail to analyze the query request")
 		return
diff --git a/banyand/query/processor_test.go b/banyand/query/processor_test.go
index 5e74d39..9319f83 100644
--- a/banyand/query/processor_test.go
+++ b/banyand/query/processor_test.go
@@ -95,17 +95,28 @@ func setupServices(tester *require.Assertions) (stream.Service, queue.Queue, fun
 	streamSvc, err := stream.NewService(context.TODO(), metadataSvc, repo, pipeline)
 	tester.NoError(err)
 
+	etcdRootDir := test.RandomTempDir()
+	err = metadataSvc.FlagSet().Parse([]string{"--metadata-root-path=" + etcdRootDir})
+	tester.NoError(err)
+
 	err = streamSvc.FlagSet().Parse([]string{"--root-path=" + rootPath})
 	tester.NoError(err)
 
 	// Init `Query` module
-	executor, err := NewExecutor(context.TODO(), streamSvc, repo, pipeline)
+	executor, err := NewExecutor(context.TODO(), streamSvc, metadataSvc, repo, pipeline)
 	tester.NoError(err)
 
 	// :PreRun:
-	// 1) stream
-	// 2) query
-	// 3) liaison
+	// 1) metadata
+	// 2) stream
+	// 3) query
+	// 4) liaison
+	err = metadataSvc.PreRun()
+	tester.NoError(err)
+
+	err = test.PreloadSchema(metadataSvc.SchemaRegistry())
+	tester.NoError(err)
+
 	err = streamSvc.PreRun()
 	tester.NoError(err)
 
@@ -114,7 +125,9 @@ func setupServices(tester *require.Assertions) (stream.Service, queue.Queue, fun
 
 	return streamSvc, pipeline, func() {
 		deferFunc()
+		metadataSvc.GracefulStop()
 		_ = os.RemoveAll(rootPath)
+		_ = os.RemoveAll(etcdRootDir)
 	}
 }
 
diff --git a/banyand/query/query.go b/banyand/query/query.go
index 8a1d98e..c6a42c9 100644
--- a/banyand/query/query.go
+++ b/banyand/query/query.go
@@ -21,6 +21,7 @@ import (
 	"context"
 
 	"github.com/apache/skywalking-banyandb/banyand/discovery"
+	"github.com/apache/skywalking-banyandb/banyand/metadata"
 	"github.com/apache/skywalking-banyandb/banyand/queue"
 	"github.com/apache/skywalking-banyandb/banyand/stream"
 	"github.com/apache/skywalking-banyandb/pkg/run"
@@ -30,8 +31,10 @@ type Executor interface {
 	run.PreRunner
 }
 
-func NewExecutor(_ context.Context, streamService stream.Service, serviceRepo discovery.ServiceRepo, pipeline queue.Queue) (Executor, error) {
+func NewExecutor(_ context.Context, streamService stream.Service, metaService metadata.Service,
+	serviceRepo discovery.ServiceRepo, pipeline queue.Queue) (Executor, error) {
 	return &queryProcessor{
+		metaService:   metaService,
 		streamService: streamService,
 		serviceRepo:   serviceRepo,
 		pipeline:      pipeline,
diff --git a/banyand/stream/service.go b/banyand/stream/service.go
index 90654f4..fef3f6a 100644
--- a/banyand/stream/service.go
+++ b/banyand/stream/service.go
@@ -89,7 +89,7 @@ func (s *service) Name() string {
 }
 
 func (s *service) PreRun() error {
-	schemas, err := s.metadata.Stream().List(context.TODO(), schema.ListOpt{})
+	schemas, err := s.metadata.StreamRegistry().ListStream(context.TODO(), schema.ListOpt{})
 	if err != nil {
 		return err
 	}
diff --git a/banyand/stream/stream_query_test.go b/banyand/stream/stream_query_test.go
index 15234df..07e614c 100644
--- a/banyand/stream/stream_query_test.go
+++ b/banyand/stream/stream_query_test.go
@@ -54,7 +54,6 @@ type shardStruct struct {
 type shardsForTest []shardStruct
 
 func Test_Stream_SelectShard(t *testing.T) {
-	tester := assert.New(t)
 	s, deferFunc := setup(t)
 	defer deferFunc()
 	_ = setupQueryData(t, "multiple_shards.json", s)
@@ -82,13 +81,13 @@ func Test_Stream_SelectShard(t *testing.T) {
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			ast := assert.New(t)
 			shards, err := s.Shards(tt.entity)
 			if tt.wantErr {
-				tester.Error(err)
-				return
+				ast.Error(err)
 			}
-			tester.NoError(err)
-			tester.Equal(tt.wantShardNum, len(shards))
+			ast.NoError(err)
+			ast.Equal(tt.wantShardNum, len(shards))
 		})
 	}
 
@@ -531,7 +530,6 @@ func Test_Stream_Series(t *testing.T) {
 			ast.Equal(tt.want, got)
 		})
 	}
-
 }
 
 func Test_Stream_Global_Index(t *testing.T) {
@@ -627,7 +625,6 @@ func Test_Stream_Global_Index(t *testing.T) {
 			tester.NoError(err)
 		})
 	}
-
 }
 
 type queryOpts struct {
diff --git a/banyand/stream/stream_write_test.go b/banyand/stream/stream_write_test.go
index 42b819b..da484d7 100644
--- a/banyand/stream/stream_write_test.go
+++ b/banyand/stream/stream_write_test.go
@@ -20,6 +20,7 @@ package stream
 import (
 	"context"
 	"encoding/base64"
+	"os"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -30,7 +31,6 @@ import (
 	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
 	streamv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v1"
 	"github.com/apache/skywalking-banyandb/banyand/metadata"
-	"github.com/apache/skywalking-banyandb/banyand/metadata/schema"
 	"github.com/apache/skywalking-banyandb/pkg/logger"
 	"github.com/apache/skywalking-banyandb/pkg/test"
 )
@@ -190,15 +190,25 @@ func setup(t *testing.T) (*stream, func()) {
 		Level: "info",
 	}))
 	tempDir, deferFunc := test.Space(req)
-	streamRepo, err := schema.NewStream()
+
+	mService, err := metadata.NewService(context.TODO())
+	req.NoError(err)
+
+	etcdRootDir := test.RandomTempDir()
+	err = mService.FlagSet().Parse([]string{"--metadata-root-path=" + etcdRootDir})
+	req.NoError(err)
+
+	err = mService.PreRun()
 	req.NoError(err)
-	sa, err := streamRepo.Get(context.TODO(), &commonv1.Metadata{
+
+	err = test.PreloadSchema(mService.SchemaRegistry())
+	req.NoError(err)
+
+	sa, err := mService.StreamRegistry().GetStream(context.TODO(), &commonv1.Metadata{
 		Name:  "sw",
 		Group: "default",
 	})
 	req.NoError(err)
-	mService, err := metadata.NewService(context.TODO())
-	req.NoError(err)
 	iRules, err := mService.IndexRules(context.TODO(), sa.Metadata)
 	req.NoError(err)
 	sSpec := streamSpec{
@@ -209,7 +219,9 @@ func setup(t *testing.T) (*stream, func()) {
 	req.NoError(err)
 	return s, func() {
 		_ = s.Close()
+		mService.GracefulStop()
 		deferFunc()
+		_ = os.RemoveAll(etcdRootDir)
 	}
 }
 
diff --git a/go.mod b/go.mod
index aa12e1a..cd61dcd 100644
--- a/go.mod
+++ b/go.mod
@@ -9,6 +9,7 @@ require (
 	github.com/dgraph-io/ristretto v0.1.0
 	github.com/golang/protobuf v1.5.2
 	github.com/google/go-cmp v0.5.6
+	github.com/google/uuid v1.3.0
 	github.com/klauspost/compress v1.13.1 // indirect
 	github.com/oklog/run v1.1.0
 	github.com/pkg/errors v0.9.1
@@ -17,6 +18,8 @@ require (
 	github.com/spf13/pflag v1.0.5
 	github.com/spf13/viper v1.8.1
 	github.com/stretchr/testify v1.7.0
+	go.etcd.io/etcd/client/v3 v3.5.0
+	go.etcd.io/etcd/server/v3 v3.5.0
 	go.uber.org/multierr v1.7.0
 	golang.org/x/net v0.0.0-20210716203947-853a461950ff // indirect
 	golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
diff --git a/go.sum b/go.sum
index f8c743c..4ed137e 100644
--- a/go.sum
+++ b/go.sum
@@ -17,6 +17,7 @@ cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKP
 cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
 cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
 cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
+cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8=
 cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
@@ -37,6 +38,7 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
 cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
@@ -47,16 +49,31 @@ github.com/RoaringBitmap/roaring v0.9.1 h1:5PRizBmoN/PfV17nPNQou4dHQ7NcJi8FO/bih
 github.com/RoaringBitmap/roaring v0.9.1/go.mod h1:h1B7iIUOmnAeb5ytYMvnHJwxMc6LUrwBnzXWRuqTQUc=
 github.com/SkyAPM/badger/v3 v3.0.0-20210809093509-ff1b2dd81165 h1:csoTNiGUMtp4H1AchgaZWJ4WY4uJQ6s+pz3sXS93jAA=
 github.com/SkyAPM/badger/v3 v3.0.0-20210809093509-ff1b2dd81165/go.mod h1:dULbq6ehJ5K0cGW/1TQ9iSfUk0gbSiToDWmWmTsJ53E=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg=
+github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA=
 github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
+github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
 github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
+github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI=
+github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
@@ -69,20 +86,37 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E=
+github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
+github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs=
+github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
+github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY=
+github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
+github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI=
 github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -94,22 +128,38 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c=
+github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs=
+github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
@@ -140,6 +190,8 @@ github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
+github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
 github.com/google/flatbuffers v1.12.0 h1:/PtAHvnBY4Kqnx/xCQ3OIV9uYcSFGScBsWI3Oogeh6w=
 github.com/google/flatbuffers v1.12.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -172,10 +224,21 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe
 github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
 github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
@@ -202,27 +265,45 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
+github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
 github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ=
 github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
 github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
@@ -235,16 +316,24 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
 github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
 github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
 github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
 github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
 github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -252,7 +341,31 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
@@ -263,10 +376,18 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
 github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=
+github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -277,6 +398,7 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU
 github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
+github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
 github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw=
 github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
@@ -286,9 +408,11 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
+github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44=
 github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -298,16 +422,35 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
+go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
+go.etcd.io/etcd/api/v3 v3.5.0 h1:GsV3S+OfZEOCNXdtNkBSR7kgLobAa/SO6tCxRa0GAYw=
 go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
+go.etcd.io/etcd/client/pkg/v3 v3.5.0 h1:2aQv6F436YnN7I4VbI8PPYrBhu+SmrTaADcf8Mi/6PU=
 go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v2 v2.305.0 h1:ftQ0nOOHMcbMS3KIaDQ0g5Qcd6bhaBrQT6b89DfwLTs=
 go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
+go.etcd.io/etcd/client/v3 v3.5.0 h1:62Eh0XOro+rDwkrypAGDfgmNh5Joq+z+W9HZdlXMzek=
+go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
+go.etcd.io/etcd/pkg/v3 v3.5.0 h1:ntrg6vvKRW26JRmHTE0iNlDgYK6JX3hg/4cD62X0ixk=
+go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
+go.etcd.io/etcd/raft/v3 v3.5.0 h1:kw2TmO3yFTgE+F0mdKkG7xMxkit2duBDa2Hu6D/HMlw=
+go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
+go.etcd.io/etcd/server/v3 v3.5.0 h1:jk8D/lwGEDlQU9kZXUFMSANkE22Sg5+mW27ip8xcF9E=
+go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@@ -316,13 +459,41 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
 go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
 go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
+go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 h1:sO4WKdPAudZGKPcpZT4MJn6JaDmpyLrMPDGGyA1SttE=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
+go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g=
+go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
+go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
+go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
+go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8=
+go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
+go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw=
+go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
+go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8=
+go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
+go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g=
+go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
+go.opentelemetry.io/otel/sdk/metric v0.20.0 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8=
+go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
+go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw=
+go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
+go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
+go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec=
 go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
 go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -331,6 +502,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
+golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -354,6 +527,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu
 golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
@@ -369,7 +543,9 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -377,6 +553,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -397,6 +574,7 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
@@ -415,6 +593,7 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ
 golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc=
 golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -429,11 +608,15 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -441,8 +624,10 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -455,8 +640,11 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -471,6 +659,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -486,7 +675,11 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
+golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -502,6 +695,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -537,6 +731,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -571,6 +766,7 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -593,6 +789,7 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG
 google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
@@ -634,6 +831,7 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5
 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
 google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
 google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI=
 google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
@@ -651,16 +849,26 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
 google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
 gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -676,3 +884,5 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
diff --git a/pkg/query/logical/analyzer.go b/pkg/query/logical/analyzer.go
index 8d14524..7ba4523 100644
--- a/pkg/query/logical/analyzer.go
+++ b/pkg/query/logical/analyzer.go
@@ -26,7 +26,6 @@ import (
 	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
 	streamv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/stream/v1"
 	"github.com/apache/skywalking-banyandb/banyand/metadata"
-	metadataSchema "github.com/apache/skywalking-banyandb/banyand/metadata/schema"
 	"github.com/apache/skywalking-banyandb/banyand/tsdb"
 	"github.com/apache/skywalking-banyandb/pkg/convert"
 )
@@ -77,25 +76,17 @@ func (t *Tag) GetFamilyName() string {
 }
 
 type Analyzer struct {
-	indexRuleRepo        metadataSchema.IndexRule
-	indexRuleBindingRepo metadataSchema.IndexRuleBinding
-	metadataRepoImpl     metadata.Repo
+	metadataRepoImpl metadata.Repo
 }
 
-func DefaultAnalyzer() *Analyzer {
-	indexRule, _ := metadataSchema.NewIndexRule()
-	indexRuleBinding, _ := metadataSchema.NewIndexRuleBinding()
-	metadataService, _ := metadata.NewService(context.TODO())
-
+func CreateAnalyzerFromMetaService(metaSvc metadata.Service) (*Analyzer, error) {
 	return &Analyzer{
-		indexRule,
-		indexRuleBinding,
-		metadataService,
-	}
+		metaSvc,
+	}, nil
 }
 
 func (a *Analyzer) BuildStreamSchema(ctx context.Context, metadata *commonv1.Metadata) (Schema, error) {
-	stream, err := a.metadataRepoImpl.Stream().Get(ctx, metadata)
+	stream, err := a.metadataRepoImpl.StreamRegistry().GetStream(ctx, metadata)
 
 	if err != nil {
 		return nil, err
diff --git a/pkg/query/logical/analyzer_test.go b/pkg/query/logical/analyzer_test.go
index c92d383..e6616af 100644
--- a/pkg/query/logical/analyzer_test.go
+++ b/pkg/query/logical/analyzer_test.go
@@ -19,6 +19,7 @@ package logical_test
 
 import (
 	"context"
+	"os"
 	"testing"
 	"time"
 
@@ -26,15 +27,60 @@ import (
 	"github.com/stretchr/testify/require"
 
 	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
+	"github.com/apache/skywalking-banyandb/banyand/metadata"
 	"github.com/apache/skywalking-banyandb/banyand/tsdb"
 	pb "github.com/apache/skywalking-banyandb/pkg/pb/v1"
-	logical2 "github.com/apache/skywalking-banyandb/pkg/query/logical"
+	"github.com/apache/skywalking-banyandb/pkg/query/logical"
+	"github.com/apache/skywalking-banyandb/pkg/test"
 )
 
+// setUpAnalyzer creates a default analyzer for testing.
+// You have to close the underlying metadata after test
+func setUpAnalyzer() (*logical.Analyzer, func(), error) {
+	metadataService, err := metadata.NewService(context.TODO())
+	if err != nil {
+		return nil, func() {
+		}, err
+	}
+
+	rootDir := test.RandomTempDir()
+	err = metadataService.FlagSet().Parse([]string{"--metadata-root-path=" + rootDir})
+
+	if err != nil {
+		return nil, func() {
+		}, err
+	}
+
+	err = metadataService.PreRun()
+	if err != nil {
+		return nil, func() {
+		}, err
+	}
+
+	err = test.PreloadSchema(metadataService.SchemaRegistry())
+	if err != nil {
+		return nil, func() {
+		}, err
+	}
+
+	ana, err := logical.CreateAnalyzerFromMetaService(metadataService)
+	if err != nil {
+		return nil, func() {
+		}, err
+	}
+	return ana, func() {
+		metadataService.GracefulStop()
+		os.RemoveAll(rootDir)
+	}, nil
+}
+
 func TestAnalyzer_SimpleTimeScan(t *testing.T) {
 	assert := require.New(t)
 
-	ana := logical2.DefaultAnalyzer()
+	ana, stopFunc, err := setUpAnalyzer()
+	assert.NoError(err)
+	assert.NotNil(ana)
+	defer stopFunc()
 
 	sT, eT := time.Now().Add(-3*time.Hour), time.Now()
 
@@ -53,9 +99,9 @@ func TestAnalyzer_SimpleTimeScan(t *testing.T) {
 	plan, err := ana.Analyze(context.TODO(), criteria, metadata, schema)
 	assert.NoError(err)
 	assert.NotNil(plan)
-	correctPlan, err := logical2.Limit(
-		logical2.Offset(
-			logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
+	correctPlan, err := logical.Limit(
+		logical.Offset(
+			logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
 			0),
 		20).
 		Analyze(schema)
@@ -67,7 +113,10 @@ func TestAnalyzer_SimpleTimeScan(t *testing.T) {
 func TestAnalyzer_ComplexQuery(t *testing.T) {
 	assert := require.New(t)
 
-	ana := logical2.DefaultAnalyzer()
+	ana, stopFunc, err := setUpAnalyzer()
+	assert.NoError(err)
+	assert.NotNil(ana)
+	defer stopFunc()
 
 	sT, eT := time.Now().Add(-3*time.Hour), time.Now()
 
@@ -90,15 +139,15 @@ func TestAnalyzer_ComplexQuery(t *testing.T) {
 	assert.NoError(err)
 	assert.NotNil(plan)
 
-	correctPlan, err := logical2.Limit(
-		logical2.Offset(
-			logical2.IndexScan(sT, eT, metadata,
-				[]logical2.Expr{
-					logical2.Eq(logical2.NewSearchableFieldRef("mq.topic"), logical2.Str("event_topic")),
-					logical2.Eq(logical2.NewSearchableFieldRef("http.method"), logical2.Str("GET")),
+	correctPlan, err := logical.Limit(
+		logical.Offset(
+			logical.IndexScan(sT, eT, metadata,
+				[]logical.Expr{
+					logical.Eq(logical.NewSearchableFieldRef("mq.topic"), logical.Str("event_topic")),
+					logical.Eq(logical.NewSearchableFieldRef("http.method"), logical.Str("GET")),
 				}, tsdb.Entity{tsdb.Entry("my_app"), tsdb.AnyEntry, tsdb.AnyEntry},
-				logical2.OrderBy("duration", modelv1.QueryOrder_SORT_DESC),
-				logical2.NewTags("searchable", "http.method", "service_id", "duration")),
+				logical.OrderBy("duration", modelv1.QueryOrder_SORT_DESC),
+				logical.NewTags("searchable", "http.method", "service_id", "duration")),
 			10),
 		5).
 		Analyze(schema)
@@ -110,7 +159,10 @@ func TestAnalyzer_ComplexQuery(t *testing.T) {
 func TestAnalyzer_TraceIDQuery(t *testing.T) {
 	assert := require.New(t)
 
-	ana := logical2.DefaultAnalyzer()
+	ana, stopFunc, err := setUpAnalyzer()
+	assert.NoError(err)
+	assert.NotNil(ana)
+	defer stopFunc()
 
 	criteria := pb.NewQueryRequestBuilder().
 		Limit(100).
@@ -127,9 +179,9 @@ func TestAnalyzer_TraceIDQuery(t *testing.T) {
 	plan, err := ana.Analyze(context.TODO(), criteria, metadata, schema)
 	assert.NoError(err)
 	assert.NotNil(plan)
-	correctPlan, err := logical2.Limit(
-		logical2.Offset(logical2.IndexScan(time.Now(), time.Now(), metadata, []logical2.Expr{
-			logical2.Eq(logical2.NewSearchableFieldRef("trace_id"), logical2.Str("123")),
+	correctPlan, err := logical.Limit(
+		logical.Offset(logical.IndexScan(time.Now(), time.Now(), metadata, []logical.Expr{
+			logical.Eq(logical.NewSearchableFieldRef("trace_id"), logical.Str("123")),
 		}, nil, nil),
 			0),
 		100).Analyze(schema)
@@ -141,7 +193,10 @@ func TestAnalyzer_TraceIDQuery(t *testing.T) {
 func TestAnalyzer_OrderBy_IndexNotDefined(t *testing.T) {
 	assert := require.New(t)
 
-	ana := logical2.DefaultAnalyzer()
+	ana, stopFunc, err := setUpAnalyzer()
+	assert.NoError(err)
+	assert.NotNil(ana)
+	defer stopFunc()
 
 	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
@@ -159,13 +214,16 @@ func TestAnalyzer_OrderBy_IndexNotDefined(t *testing.T) {
 	assert.NoError(err)
 
 	_, err = ana.Analyze(context.TODO(), criteria, metadata, schema)
-	assert.ErrorIs(err, logical2.ErrIndexNotDefined)
+	assert.ErrorIs(err, logical.ErrIndexNotDefined)
 }
 
 func TestAnalyzer_OrderBy_FieldNotDefined(t *testing.T) {
 	assert := require.New(t)
 
-	ana := logical2.DefaultAnalyzer()
+	ana, stopFunc, err := setUpAnalyzer()
+	assert.NoError(err)
+	assert.NotNil(ana)
+	defer stopFunc()
 
 	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
@@ -182,13 +240,16 @@ func TestAnalyzer_OrderBy_FieldNotDefined(t *testing.T) {
 	assert.NoError(err)
 
 	_, err = ana.Analyze(context.TODO(), criteria, metadata, schema)
-	assert.ErrorIs(err, logical2.ErrIndexNotDefined)
+	assert.ErrorIs(err, logical.ErrIndexNotDefined)
 }
 
 func TestAnalyzer_Projection_FieldNotDefined(t *testing.T) {
 	assert := require.New(t)
 
-	ana := logical2.DefaultAnalyzer()
+	ana, stopFunc, err := setUpAnalyzer()
+	assert.NoError(err)
+	assert.NotNil(ana)
+	defer stopFunc()
 
 	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
@@ -205,13 +266,16 @@ func TestAnalyzer_Projection_FieldNotDefined(t *testing.T) {
 	assert.NoError(err)
 
 	_, err = ana.Analyze(context.TODO(), criteria, metadata, schema)
-	assert.ErrorIs(err, logical2.ErrFieldNotDefined)
+	assert.ErrorIs(err, logical.ErrFieldNotDefined)
 }
 
 func TestAnalyzer_Fields_IndexNotDefined(t *testing.T) {
 	assert := require.New(t)
 
-	ana := logical2.DefaultAnalyzer()
+	ana, stopFunc, err := setUpAnalyzer()
+	assert.NoError(err)
+	assert.NotNil(ana)
+	defer stopFunc()
 
 	criteria := pb.NewQueryRequestBuilder().
 		Limit(5).
@@ -228,5 +292,5 @@ func TestAnalyzer_Fields_IndexNotDefined(t *testing.T) {
 	assert.NoError(err)
 
 	_, err = ana.Analyze(context.TODO(), criteria, metadata, schema)
-	assert.ErrorIs(err, logical2.ErrIndexNotDefined)
+	assert.ErrorIs(err, logical.ErrIndexNotDefined)
 }
diff --git a/pkg/query/logical/common_test.go b/pkg/query/logical/common_test.go
index 3df0230..a947207 100644
--- a/pkg/query/logical/common_test.go
+++ b/pkg/query/logical/common_test.go
@@ -22,6 +22,7 @@ import (
 	"embed"
 	"encoding/base64"
 	"encoding/json"
+	"os"
 	"strconv"
 	"testing"
 	"time"
@@ -78,7 +79,7 @@ func setupQueryData(testing *testing.T, dataFile string, stream stream.Stream) (
 	return baseTime
 }
 
-func setup(t *require.Assertions) (stream.Stream, func()) {
+func setup(t *require.Assertions) (stream.Stream, metadata.Service, func()) {
 	t.NoError(logger.Init(logger.Logging{
 		Env:   "dev",
 		Level: "info",
@@ -88,12 +89,25 @@ func setup(t *require.Assertions) (stream.Stream, func()) {
 
 	metadataSvc, err := metadata.NewService(context.TODO())
 	t.NoError(err)
+
+	etcdRootDir := test.RandomTempDir()
+	err = metadataSvc.FlagSet().Parse([]string{"--metadata-root-path=" + etcdRootDir})
+	t.NoError(err)
+
 	streamSvc, err := stream.NewService(context.TODO(), metadataSvc, nil, nil)
 	t.NoError(err)
 
+	// 1 - (MetadataService).PreRun
+	err = metadataSvc.PreRun()
+	t.NoError(err)
+
+	err = test.PreloadSchema(metadataSvc.SchemaRegistry())
+	t.NoError(err)
+
 	err = streamSvc.FlagSet().Parse([]string{"--root-path=" + tempDir})
 	t.NoError(err)
 
+	// 2 - (StreamService).PreRun
 	err = streamSvc.PreRun()
 	t.NoError(err)
 
@@ -102,9 +116,12 @@ func setup(t *require.Assertions) (stream.Stream, func()) {
 		Group: "default",
 	})
 	t.NoError(err)
+	t.NotNil(s)
 
-	return s, func() {
+	return s, metadataSvc, func() {
 		_ = s.Close()
+		metadataSvc.GracefulStop()
 		deferFunc()
+		_ = os.RemoveAll(etcdRootDir)
 	}
 }
diff --git a/pkg/query/logical/plan_execution_test.go b/pkg/query/logical/plan_execution_test.go
index 5961668..71450e5 100644
--- a/pkg/query/logical/plan_execution_test.go
+++ b/pkg/query/logical/plan_execution_test.go
@@ -27,13 +27,14 @@ import (
 	commonv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/common/v1"
 	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
 	"github.com/apache/skywalking-banyandb/banyand/tsdb"
-	logical2 "github.com/apache/skywalking-banyandb/pkg/query/logical"
+	"github.com/apache/skywalking-banyandb/pkg/query/logical"
 )
 
 func TestPlanExecution_TableScan_Limit(t *testing.T) {
-	streamT, deferFunc := setup(require.New(t))
+	tester := require.New(t)
+	streamSvc, metaService, deferFunc := setup(tester)
 	defer deferFunc()
-	baseTs := setupQueryData(t, "multiple_shards.json", streamT)
+	baseTs := setupQueryData(t, "multiple_shards.json", streamSvc)
 
 	metadata := &commonv1.Metadata{
 		Name:  "sw",
@@ -42,24 +43,28 @@ func TestPlanExecution_TableScan_Limit(t *testing.T) {
 
 	sT, eT := baseTs, baseTs.Add(1*time.Hour)
 
+	analyzer, err := logical.CreateAnalyzerFromMetaService(metaService)
+	tester.NoError(err)
+	tester.NotNil(analyzer)
+
 	tests := []struct {
 		name           string
-		unresolvedPlan logical2.UnresolvedPlan
+		unresolvedPlan logical.UnresolvedPlan
 		wantLength     int
 	}{
 		{
 			name:           "Limit 1",
-			unresolvedPlan: logical2.Limit(logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 1),
+			unresolvedPlan: logical.Limit(logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 1),
 			wantLength:     1,
 		},
 		{
 			name:           "Limit 5",
-			unresolvedPlan: logical2.Limit(logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 5),
+			unresolvedPlan: logical.Limit(logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 5),
 			wantLength:     5,
 		},
 		{
 			name:           "Limit 10",
-			unresolvedPlan: logical2.Limit(logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 10),
+			unresolvedPlan: logical.Limit(logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 10),
 			wantLength:     5,
 		},
 	}
@@ -67,25 +72,26 @@ func TestPlanExecution_TableScan_Limit(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			tester := require.New(t)
-			schema, err := logical2.DefaultAnalyzer().BuildStreamSchema(context.TODO(), metadata)
+			schema, err := analyzer.BuildStreamSchema(context.TODO(), metadata)
 			tester.NoError(err)
 
 			plan, err := tt.unresolvedPlan.Analyze(schema)
 			tester.NoError(err)
 			tester.NotNil(plan)
 
-			entities, err := plan.Execute(streamT)
+			entities, err := plan.Execute(streamSvc)
 			tester.NoError(err)
 			tester.Len(entities, tt.wantLength)
-			tester.True(logical2.SortedByTimestamp(entities, modelv1.QueryOrder_SORT_ASC))
+			tester.True(logical.SortedByTimestamp(entities, modelv1.QueryOrder_SORT_ASC))
 		})
 	}
 }
 
 func TestPlanExecution_Offset(t *testing.T) {
-	streamT, deferFunc := setup(require.New(t))
+	tester := require.New(t)
+	streamSvc, metaService, deferFunc := setup(tester)
 	defer deferFunc()
-	baseTs := setupQueryData(t, "multiple_shards.json", streamT)
+	baseTs := setupQueryData(t, "multiple_shards.json", streamSvc)
 
 	metadata := &commonv1.Metadata{
 		Name:  "sw",
@@ -94,24 +100,28 @@ func TestPlanExecution_Offset(t *testing.T) {
 
 	sT, eT := baseTs, baseTs.Add(1*time.Hour)
 
+	analyzer, err := logical.CreateAnalyzerFromMetaService(metaService)
+	tester.NoError(err)
+	tester.NotNil(analyzer)
+
 	tests := []struct {
 		name           string
-		unresolvedPlan logical2.UnresolvedPlan
+		unresolvedPlan logical.UnresolvedPlan
 		wantLength     int
 	}{
 		{
 			name:           "Offset 0",
-			unresolvedPlan: logical2.Offset(logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 0),
+			unresolvedPlan: logical.Offset(logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 0),
 			wantLength:     5,
 		},
 		{
 			name:           "Offset 3",
-			unresolvedPlan: logical2.Offset(logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 3),
+			unresolvedPlan: logical.Offset(logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 3),
 			wantLength:     2,
 		},
 		{
 			name:           "Limit 5",
-			unresolvedPlan: logical2.Offset(logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 5),
+			unresolvedPlan: logical.Offset(logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil), 5),
 			wantLength:     0,
 		},
 	}
@@ -119,14 +129,14 @@ func TestPlanExecution_Offset(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			tester := require.New(t)
-			schema, err := logical2.DefaultAnalyzer().BuildStreamSchema(context.TODO(), metadata)
+			schema, err := analyzer.BuildStreamSchema(context.TODO(), metadata)
 			tester.NoError(err)
 
 			plan, err := tt.unresolvedPlan.Analyze(schema)
 			tester.NoError(err)
 			tester.NotNil(plan)
 
-			entities, err := plan.Execute(streamT)
+			entities, err := plan.Execute(streamSvc)
 			tester.NoError(err)
 			tester.Len(entities, tt.wantLength)
 		})
@@ -134,15 +144,20 @@ func TestPlanExecution_Offset(t *testing.T) {
 }
 
 func TestPlanExecution_TraceIDFetch(t *testing.T) {
-	streamT, deferFunc := setup(require.New(t))
+	tester := require.New(t)
+	streamSvc, metaService, deferFunc := setup(tester)
 	defer deferFunc()
-	_ = setupQueryData(t, "multiple_shards.json", streamT)
+	_ = setupQueryData(t, "multiple_shards.json", streamSvc)
 
 	m := &commonv1.Metadata{
 		Name:  "sw",
 		Group: "default",
 	}
 
+	analyzer, err := logical.CreateAnalyzerFromMetaService(metaService)
+	tester.NoError(err)
+	tester.NotNil(analyzer)
+
 	tests := []struct {
 		name       string
 		traceID    string
@@ -168,15 +183,15 @@ func TestPlanExecution_TraceIDFetch(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			tester := require.New(t)
-			s, err := logical2.DefaultAnalyzer().BuildStreamSchema(context.TODO(), m)
+			s, err := analyzer.BuildStreamSchema(context.TODO(), m)
 			tester.NoError(err)
 
-			p, err := logical2.GlobalIndexScan(m, []logical2.Expr{
-				logical2.Eq(logical2.NewFieldRef("searchable", "trace_id"), logical2.Str(tt.traceID)),
-			}, logical2.NewTags("searchable", "trace_id")).Analyze(s)
+			p, err := logical.GlobalIndexScan(m, []logical.Expr{
+				logical.Eq(logical.NewFieldRef("searchable", "trace_id"), logical.Str(tt.traceID)),
+			}, logical.NewTags("searchable", "trace_id")).Analyze(s)
 			tester.NoError(err)
 			tester.NotNil(p)
-			entities, err := p.Execute(streamT)
+			entities, err := p.Execute(streamSvc)
 			tester.NoError(err)
 			for _, entity := range entities {
 				tester.Len(entity.GetTagFamilies(), 1)
@@ -189,9 +204,10 @@ func TestPlanExecution_TraceIDFetch(t *testing.T) {
 }
 
 func TestPlanExecution_IndexScan(t *testing.T) {
-	streamT, deferFunc := setup(require.New(t))
+	tester := require.New(t)
+	streamSvc, metaService, deferFunc := setup(tester)
 	defer deferFunc()
-	baseTs := setupQueryData(t, "multiple_shards.json", streamT)
+	baseTs := setupQueryData(t, "multiple_shards.json", streamSvc)
 
 	metadata := &commonv1.Metadata{
 		Name:  "sw",
@@ -200,60 +216,64 @@ func TestPlanExecution_IndexScan(t *testing.T) {
 
 	sT, eT := baseTs, baseTs.Add(1*time.Hour)
 
+	analyzer, err := logical.CreateAnalyzerFromMetaService(metaService)
+	tester.NoError(err)
+	tester.NotNil(analyzer)
+
 	tests := []struct {
 		name           string
-		unresolvedPlan logical2.UnresolvedPlan
+		unresolvedPlan logical.UnresolvedPlan
 		wantLength     int
 	}{
 		{
 			name: "Single Index Search using POST without entity returns nothing",
-			unresolvedPlan: logical2.IndexScan(sT, eT, metadata, []logical2.Expr{
-				logical2.Eq(logical2.NewFieldRef("searchable", "http.method"), logical2.Str("POST")),
+			unresolvedPlan: logical.IndexScan(sT, eT, metadata, []logical.Expr{
+				logical.Eq(logical.NewFieldRef("searchable", "http.method"), logical.Str("POST")),
 			}, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
 			wantLength: 0,
 		},
 		{
 			name: "Single Index Search using inverted index",
-			unresolvedPlan: logical2.IndexScan(sT, eT, metadata, []logical2.Expr{
-				logical2.Eq(logical2.NewFieldRef("searchable", "http.method"), logical2.Str("GET")),
+			unresolvedPlan: logical.IndexScan(sT, eT, metadata, []logical.Expr{
+				logical.Eq(logical.NewFieldRef("searchable", "http.method"), logical.Str("GET")),
 			}, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
 			wantLength: 3,
 		},
 		{
 			name: "Single Index Search using LSM tree index",
-			unresolvedPlan: logical2.IndexScan(sT, eT, metadata, []logical2.Expr{
-				logical2.Lt(logical2.NewFieldRef("searchable", "duration"), logical2.Int(100)),
+			unresolvedPlan: logical.IndexScan(sT, eT, metadata, []logical.Expr{
+				logical.Lt(logical.NewFieldRef("searchable", "duration"), logical.Int(100)),
 			}, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
 			wantLength: 2,
 		},
 		{
 			name: "Single Index Search without entity returns results",
-			unresolvedPlan: logical2.IndexScan(sT, eT, metadata, []logical2.Expr{
-				logical2.Eq(logical2.NewFieldRef("searchable", "endpoint_id"), logical2.Str("/home_id")),
+			unresolvedPlan: logical.IndexScan(sT, eT, metadata, []logical.Expr{
+				logical.Eq(logical.NewFieldRef("searchable", "endpoint_id"), logical.Str("/home_id")),
 			}, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
 			wantLength: 2,
 		},
 		{
 			name: "Multiple Index Search",
-			unresolvedPlan: logical2.IndexScan(sT, eT, metadata, []logical2.Expr{
-				logical2.Eq(logical2.NewFieldRef("searchable", "http.method"), logical2.Str("GET")),
-				logical2.Eq(logical2.NewFieldRef("searchable", "endpoint_id"), logical2.Str("/home_id")),
+			unresolvedPlan: logical.IndexScan(sT, eT, metadata, []logical.Expr{
+				logical.Eq(logical.NewFieldRef("searchable", "http.method"), logical.Str("GET")),
+				logical.Eq(logical.NewFieldRef("searchable", "endpoint_id"), logical.Str("/home_id")),
 			}, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
 			wantLength: 1,
 		},
 		{
 			name: "Multiple Index Search with a combination of numerical index and textual index",
-			unresolvedPlan: logical2.IndexScan(sT, eT, metadata, []logical2.Expr{
-				logical2.Eq(logical2.NewFieldRef("searchable", "http.method"), logical2.Str("GET")),
-				logical2.Lt(logical2.NewFieldRef("searchable", "duration"), logical2.Int(100)),
+			unresolvedPlan: logical.IndexScan(sT, eT, metadata, []logical.Expr{
+				logical.Eq(logical.NewFieldRef("searchable", "http.method"), logical.Str("GET")),
+				logical.Lt(logical.NewFieldRef("searchable", "duration"), logical.Int(100)),
 			}, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
 			wantLength: 2,
 		},
 		{
 			name: "Multiple Index With One Empty Result(ChunkID)",
-			unresolvedPlan: logical2.IndexScan(sT, eT, metadata, []logical2.Expr{
-				logical2.Eq(logical2.NewFieldRef("searchable", "http.method"), logical2.Str("GET")),
-				logical2.Eq(logical2.NewFieldRef("searchable", "endpoint_id"), logical2.Str("/unknown")),
+			unresolvedPlan: logical.IndexScan(sT, eT, metadata, []logical.Expr{
+				logical.Eq(logical.NewFieldRef("searchable", "http.method"), logical.Str("GET")),
+				logical.Eq(logical.NewFieldRef("searchable", "endpoint_id"), logical.Str("/unknown")),
 			}, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry}, nil),
 			wantLength: 0,
 		},
@@ -262,14 +282,14 @@ func TestPlanExecution_IndexScan(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			tester := require.New(t)
-			schema, err := logical2.DefaultAnalyzer().BuildStreamSchema(context.TODO(), metadata)
+			schema, err := analyzer.BuildStreamSchema(context.TODO(), metadata)
 			tester.NoError(err)
 
 			plan, err := tt.unresolvedPlan.Analyze(schema)
 			tester.NoError(err)
 			tester.NotNil(plan)
 
-			entities, err := plan.Execute(streamT)
+			entities, err := plan.Execute(streamSvc)
 			tester.NoError(err)
 			tester.Len(entities, tt.wantLength)
 		})
@@ -277,9 +297,10 @@ func TestPlanExecution_IndexScan(t *testing.T) {
 }
 
 func TestPlanExecution_OrderBy(t *testing.T) {
-	streamT, deferFunc := setup(require.New(t))
+	tester := require.New(t)
+	streamSvc, metaService, deferFunc := setup(tester)
 	defer deferFunc()
-	baseTs := setupQueryData(t, "multiple_shards.json", streamT)
+	baseTs := setupQueryData(t, "multiple_shards.json", streamSvc)
 
 	metadata := &commonv1.Metadata{
 		Name:  "sw",
@@ -288,6 +309,10 @@ func TestPlanExecution_OrderBy(t *testing.T) {
 
 	sT, eT := baseTs, baseTs.Add(1*time.Hour)
 
+	analyzer, err := logical.CreateAnalyzerFromMetaService(metaService)
+	tester.NoError(err)
+	tester.NotNil(analyzer)
+
 	tests := []struct {
 		name            string
 		targetIndexRule string
@@ -325,34 +350,34 @@ func TestPlanExecution_OrderBy(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			tester := require.New(t)
-			schema, err := logical2.DefaultAnalyzer().BuildStreamSchema(context.TODO(), metadata)
+			schema, err := analyzer.BuildStreamSchema(context.TODO(), metadata)
 			tester.NoError(err)
 			tester.NotNil(schema)
 
 			if tt.targetIndexRule == "" {
-				p, err := logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry},
-					logical2.OrderBy("", tt.sortDirection), logical2.NewTags("searchable", "start_time")).
+				p, err := logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry},
+					logical.OrderBy("", tt.sortDirection), logical.NewTags("searchable", "start_time")).
 					Analyze(schema)
 				tester.NoError(err)
 				tester.NotNil(p)
 
-				entities, err := p.Execute(streamT)
+				entities, err := p.Execute(streamSvc)
 				tester.NoError(err)
 				tester.NotNil(entities)
 
-				tester.True(logical2.SortedByTimestamp(entities, tt.sortDirection))
+				tester.True(logical.SortedByTimestamp(entities, tt.sortDirection))
 			} else {
-				p, err := logical2.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry},
-					logical2.OrderBy(tt.targetIndexRule, tt.sortDirection), logical2.NewTags("searchable", tt.targetIndexRule)).
+				p, err := logical.IndexScan(sT, eT, metadata, nil, tsdb.Entity{tsdb.AnyEntry, tsdb.AnyEntry, tsdb.AnyEntry},
+					logical.OrderBy(tt.targetIndexRule, tt.sortDirection), logical.NewTags("searchable", tt.targetIndexRule)).
 					Analyze(schema)
 				tester.NoError(err)
 				tester.NotNil(p)
 
-				entities, err := p.Execute(streamT)
+				entities, err := p.Execute(streamSvc)
 				tester.NoError(err)
 				tester.NotNil(entities)
 
-				tester.True(logical2.SortedByIndex(entities, tt.targetFamilyIdx, tt.targetTagIdx, tt.sortDirection))
+				tester.True(logical.SortedByIndex(entities, tt.targetFamilyIdx, tt.targetTagIdx, tt.sortDirection))
 			}
 		})
 	}
diff --git a/pkg/test/etcd.go b/pkg/test/etcd.go
new file mode 100644
index 0000000..5e2b1d3
--- /dev/null
+++ b/pkg/test/etcd.go
@@ -0,0 +1,100 @@
+// Licensed to Apache Software Foundation (ASF) under one or more contributor
+// license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright
+// ownership. Apache Software Foundation (ASF) licenses this file to you under
+// the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package test
+
+import (
+	"context"
+	"embed"
+	"fmt"
+	"math/rand"
+	"os"
+	"path"
+
+	"github.com/google/uuid"
+	"google.golang.org/protobuf/encoding/protojson"
+
+	databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
+	"github.com/apache/skywalking-banyandb/banyand/metadata/schema"
+)
+
+const indexRuleDir = "testdata/index_rules"
+
+var (
+	//go:embed testdata/index_rules/*.json
+	indexRuleStore embed.FS
+	//go:embed testdata/index_rule_binding.json
+	indexRuleBindingJSON string
+	//go:embed testdata/stream.json
+	streamJSON string
+)
+
+func PreloadSchema(e schema.Registry) error {
+	if err := e.CreateGroup(context.TODO(), "default"); err != nil {
+		return err
+	}
+
+	s := &databasev1.Stream{}
+	if err := protojson.Unmarshal([]byte(streamJSON), s); err != nil {
+		return err
+	}
+	err := e.UpdateStream(context.Background(), s)
+	if err != nil {
+		return err
+	}
+
+	indexRuleBinding := &databasev1.IndexRuleBinding{}
+	if err = protojson.Unmarshal([]byte(indexRuleBindingJSON), indexRuleBinding); err != nil {
+		return err
+	}
+	err = e.UpdateIndexRuleBinding(context.Background(), indexRuleBinding)
+	if err != nil {
+		return err
+	}
+
+	entries, err := indexRuleStore.ReadDir(indexRuleDir)
+	if err != nil {
+		return err
+	}
+	for _, entry := range entries {
+		data, err := indexRuleStore.ReadFile(indexRuleDir + "/" + entry.Name())
+		if err != nil {
+			return err
+		}
+		var idxRule databasev1.IndexRule
+		err = protojson.Unmarshal(data, &idxRule)
+		if err != nil {
+			return err
+		}
+		err = e.UpdateIndexRule(context.Background(), &idxRule)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func RandomTempDir() string {
+	return path.Join(os.TempDir(), fmt.Sprintf("banyandb-embed-etcd-%s", uuid.New().String()))
+}
+
+func RandomUnixDomainListener() (string, string) {
+	i := rand.Uint64()
+	return fmt.Sprintf("%s://localhost:%d%06d", "unix", os.Getpid(), i),
+		fmt.Sprintf("%s://localhost:%d%06d", "unix", os.Getpid(), i+1)
+}
diff --git a/banyand/metadata/schema/data/index_rule_binding.json b/pkg/test/testdata/index_rule_binding.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rule_binding.json
rename to pkg/test/testdata/index_rule_binding.json
diff --git a/banyand/metadata/schema/data/index_rules/db.instance.json b/pkg/test/testdata/index_rules/db.instance.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/db.instance.json
rename to pkg/test/testdata/index_rules/db.instance.json
diff --git a/banyand/metadata/schema/data/index_rules/db.type.json b/pkg/test/testdata/index_rules/db.type.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/db.type.json
rename to pkg/test/testdata/index_rules/db.type.json
diff --git a/banyand/metadata/schema/data/index_rules/duration.json b/pkg/test/testdata/index_rules/duration.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/duration.json
rename to pkg/test/testdata/index_rules/duration.json
diff --git a/banyand/metadata/schema/data/index_rules/endpoint_id.json b/pkg/test/testdata/index_rules/endpoint_id.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/endpoint_id.json
rename to pkg/test/testdata/index_rules/endpoint_id.json
diff --git a/banyand/metadata/schema/data/index_rules/http.method.json b/pkg/test/testdata/index_rules/http.method.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/http.method.json
rename to pkg/test/testdata/index_rules/http.method.json
diff --git a/banyand/metadata/schema/data/index_rules/mq.broker.json b/pkg/test/testdata/index_rules/mq.broker.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/mq.broker.json
rename to pkg/test/testdata/index_rules/mq.broker.json
diff --git a/banyand/metadata/schema/data/index_rules/mq.queue.json b/pkg/test/testdata/index_rules/mq.queue.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/mq.queue.json
rename to pkg/test/testdata/index_rules/mq.queue.json
diff --git a/banyand/metadata/schema/data/index_rules/mq.topic.json b/pkg/test/testdata/index_rules/mq.topic.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/mq.topic.json
rename to pkg/test/testdata/index_rules/mq.topic.json
diff --git a/banyand/metadata/schema/data/index_rules/status_code.json b/pkg/test/testdata/index_rules/status_code.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/status_code.json
rename to pkg/test/testdata/index_rules/status_code.json
diff --git a/banyand/metadata/schema/data/index_rules/trace_id.json b/pkg/test/testdata/index_rules/trace_id.json
similarity index 100%
rename from banyand/metadata/schema/data/index_rules/trace_id.json
rename to pkg/test/testdata/index_rules/trace_id.json
diff --git a/banyand/metadata/schema/data/stream.json b/pkg/test/testdata/stream.json
similarity index 100%
rename from banyand/metadata/schema/data/stream.json
rename to pkg/test/testdata/stream.json
diff --git a/scripts/build/base.mk b/scripts/build/base.mk
index 728874b..37ad749 100644
--- a/scripts/build/base.mk
+++ b/scripts/build/base.mk
@@ -24,34 +24,11 @@ tool_include := "$(root_dir)/include"
 uname_os := $(shell uname -s)
 uname_arch := $(shell uname -m)
 
-protoc_version ?= 3.17.3
-
-# There are no protobuf releases for Darwin ARM so for
-# now we always use the x86_64 release through Rosetta.
-ifeq ($(uname_os),Darwin)
-protoc_os := osx
-protoc_arch := x86_64
-endif
-ifeq ($(uname_os),Linux)
-protoc_os = linux
-protoc_arch := $(uname_arch)
-endif
-
+buf_version ?= v1.0.0-rc5
 
 ## Tools
-
-PROTOC := $(tool_bin)/protoc
-$(PROTOC):
-	@echo "Install protoc..."
-	@if ! command -v curl >/dev/null 2>/dev/null; then echo "error: curl must be installed"  >&2; exit 1; fi
-	@if ! command -v unzip >/dev/null 2>/dev/null; then echo "error: unzip must be installed"  >&2; exit 1; fi
-	@rm -f $(tool_bin)/protoc
-	@rm -rf $(tool_include)/google
-	@mkdir -p $(tool_bin) $(tool_include)
-	$(eval protoc_tmp := $(shell mktemp -d))
-	cd $(protoc_tmp); curl -sSL https://github.com/protocolbuffers/protobuf/releases/download/v$(protoc_version)/protoc-$(protoc_version)-$(protoc_os)-$(protoc_arch).zip -o protoc.zip
-	cd $(protoc_tmp); unzip protoc.zip && mv bin/protoc $(tool_bin)/protoc && mv include/google $(tool_include)/google
-	@rm -rf $(protoc_tmp)
+BUF := $(tool_bin)/buf
+$(BUF):
 	@echo "Install proto plugins..."
 	@rm -f $(tool_bin)/protoc-gen-go
 	@rm -f $(tool_bin)/protoc-gen-go-grpc
@@ -60,9 +37,9 @@ $(PROTOC):
 	@rm -f $(tool_bin)/protoc-gen-buf-lint
 	@GOBIN=$(tool_bin) go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1
 	@GOBIN=$(tool_bin) go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
-	@GOBIN=$(tool_bin) go install github.com/bufbuild/buf/cmd/buf@v0.44.0
-	@GOBIN=$(tool_bin) go install github.com/bufbuild/buf/cmd/protoc-gen-buf-breaking@v0.44.0
-	@GOBIN=$(tool_bin) go install github.com/bufbuild/buf/cmd/protoc-gen-buf-lint@v0.44.0
+	@GOBIN=$(tool_bin) go install github.com/bufbuild/buf/cmd/buf@$(buf_version)
+	@GOBIN=$(tool_bin) go install github.com/bufbuild/buf/cmd/protoc-gen-buf-breaking@$(buf_version)
+	@GOBIN=$(tool_bin) go install github.com/bufbuild/buf/cmd/protoc-gen-buf-lint@$(buf_version)
 
 MOCKGEN := $(tool_bin)/mockgen
 $(MOCKGEN):