You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by el...@apache.org on 2021/04/03 08:32:02 UTC

[ozone-go] 01/01: Initial commit.

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

elek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone-go.git

commit 958c91b5ee3527ee4d494458ed2e1862d2576ce3
Author: Elek Márton <el...@apache.org>
AuthorDate: Sat Apr 3 00:09:11 2021 +0200

    Initial commit.
    
    Moving initial version from the poc branch, based on the
    discussion at: https://lists.apache.org/thread.html/r4fc84fa8299ad9d4d9c2dbb54b974ee3d3222d0f9238a47b014ad154%40%3Cdev.ozone.apache.org%3E
---
 .asf.yaml                                       |    30 +
 .github/workflows/build.yaml                    |    52 +
 .gitignore                                      |     8 +
 LICENSE                                         |   202 +
 NOTICE.txt                                      |     5 +
 README.md                                       |    59 +
 api/bucket.go                                   |    31 +
 api/common/types.go                             |    41 +
 api/datanode/datanode.go                        |   261 +
 api/datanode/ratis.go                           |   103 +
 api/datanode/standalone.go                      |    45 +
 api/go.mod                                      |    32 +
 api/go.sum                                      |   112 +
 api/key.go                                      |   204 +
 api/om/bucket.go                                |   105 +
 api/om/om.go                                    |   215 +
 api/om/volume.go                                |    99 +
 api/ozone.go                                    |    31 +
 api/ozone_test.go                               |    68 +
 api/proto/common/Security.pb.go                 |   745 ++
 api/proto/datanode/DatanodeClientProtocol.pb.go |  4876 +++++++++
 api/proto/hdds/hdds.pb.go                       |  2452 +++++
 api/proto/ozone/OmClientProtocol.pb.go          | 12561 ++++++++++++++++++++++
 api/proto/ratis/raft.pb.go                      |  4733 ++++++++
 api/proto/ratis/ratis-grpc.pb.go                |   766 ++
 api/volume.go                                   |    30 +
 cli/build.sh                                    |    22 +
 cli/go.mod                                      |    26 +
 cli/go.sum                                      |   113 +
 cli/main.go                                     |   238 +
 codegen.sh                                      |    51 +
 fuse/build.sh                                   |    22 +
 fuse/go.mod                                     |    28 +
 fuse/go.sum                                     |   128 +
 fuse/ozone-fuse/file.go                         |   147 +
 fuse/ozone-fuse/main.go                         |   156 +
 lib/build.sh                                    |    23 +
 lib/go.mod                                      |    22 +
 lib/go.sum                                      |    96 +
 lib/lib.go                                      |    71 +
 license-check.sh                                |    27 +
 python/test.py                                  |    27 +
 42 files changed, 29063 insertions(+)

diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 0000000..984ae2a
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,30 @@
+# Licensed to the 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.
+# The 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.
+github:
+  description: "Apache Ozone go client and fuse driver (experimental)"
+  homepage: https://ozone.apache.org
+  labels:
+    - ozone
+    - go
+    - fuse
+  enabled_merge_buttons:
+    squash:  true
+    merge:   false
+    rebase:  false
+notifications:
+  commits:      commits@ozone.apache.org
+  issues:       issues@ozone.apache.org
+  pullrequests: issues@ozone.apache.org
+  jira_options: link label worklog
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
new file mode 100644
index 0000000..e7953f1
--- /dev/null
+++ b/.github/workflows/build.yaml
@@ -0,0 +1,52 @@
+# Licensed to the 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.
+# The 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.
+name: build-branch
+on:
+  - pull_request
+  - push
+jobs:
+  cli:
+    runs-on: ubuntu-18.04
+    steps:
+      - name: Checkout project
+        uses: actions/checkout@v2
+      - name: Set up Go
+        uses: actions/setup-go@v2
+        with:
+          go-version: 1.15
+      - name: Run a full build
+        run: cli/build.sh
+  fuse:
+    runs-on: ubuntu-18.04
+    steps:
+      - name: Checkout project
+        uses: actions/checkout@v2
+      - name: Set up Go
+        uses: actions/setup-go@v2
+        with:
+          go-version: 1.15
+      - name: Run a full build
+        run: fuse/build.sh
+  library:
+    runs-on: ubuntu-18.04
+    steps:
+      - name: Checkout project
+        uses: actions/checkout@v2
+      - name: Set up Go
+        uses: actions/setup-go@v2
+        with:
+          go-version: 1.15
+      - name: Run a full build
+        run: lib/build.sh
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6cadd37
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+.idea
+vendor
+ozone.so
+ozone.h
+lib/lib
+lib/lib.h
+cli/ozone-go
+fuse/ozone-fuse/ozone-fuse
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..82b2385
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Ozone
+Copyright 2020-2021 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6394f20
--- /dev/null
+++ b/README.md
@@ -0,0 +1,59 @@
+# Go client for Apache Ozone
+
+This repository contains an experimental, **proof-of-concept** Golang client for Apache Ozone.
+
+It's not ready yet for using in production / non-production.
+
+The repository contains the following sub-modules
+
+ * api: the location for the generic golang api for Apache Ozone
+ * cli: standalone executable tool for main operations (similar to the original `ozone sh`)
+ * lib: proof-of-concept shared C library
+ * python: example python script uses the shared C library
+ * HA failovoer is missing
+
+Status:
+
+ * api
+   * main OM metadata operations worked well, but not all the fields are implemented
+   * data read / write are implemented on some level but needs further work
+   * security can be supported by the used Hadoop RPC implementation, but not tested
+ * fuse
+   * first working POC, files are successfully listed and files can be read
+   * write is not implemented at all
+   * requires major work
+  * shared lib / python: very basic example, poc
+
+## Testing with cli:
+
+```
+cd cli
+./build.sh
+./ozone-go --om localhost volume create vol1
+```
+
+Or you can install it:
+
+```
+cd cli
+go install
+ozone -om 127.0.0.1 volume create vol1
+```
+
+## Testing Fuse file system
+
+```
+cd fuse
+./build.sh
+./ozone-fuse/ozone-fuse --om localhost --volume vol1 --bucket bucket1 /tmp/bucket1
+```
+
+## Testing the python binding
+
+Create the shared library:
+
+```
+go build -o ozone.so -buildmode=c-shared lib/lib.go
+```
+
+Modify parameters of `python/test.py` (om address) and run it.
diff --git a/api/bucket.go b/api/bucket.go
new file mode 100644
index 0000000..1a08370
--- /dev/null
+++ b/api/bucket.go
@@ -0,0 +1,31 @@
+// Licensed to the 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.  The 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 api
+
+import "github.com/apache/ozone-go/api/common"
+
+func (ozoneClient *OzoneClient) CreateBucket(volume string, bucket string) error {
+	return ozoneClient.OmClient.CreateBucket(volume, bucket)
+}
+
+func (ozoneClient *OzoneClient) GetBucket(volume string, bucket string) (common.Bucket, error) {
+	return ozoneClient.OmClient.GetBucket(volume, bucket)
+}
+
+func (ozoneClient *OzoneClient) ListBucket(volume string) ([]common.Bucket, error) {
+	return ozoneClient.OmClient.ListBucket(volume)
+
+}
\ No newline at end of file
diff --git a/api/common/types.go b/api/common/types.go
new file mode 100644
index 0000000..5d6bc28
--- /dev/null
+++ b/api/common/types.go
@@ -0,0 +1,41 @@
+// Licensed to the 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.  The 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 common
+
+type ReplicationType int
+
+const (
+	RATIS      ReplicationType = 1
+	STANDALONE ReplicationType = 2
+)
+
+type Volume struct {
+	Name  string
+	Owner string
+}
+
+type Key struct {
+	Name        string
+	BucketName  string
+	VolumeName  string
+	Replication ReplicationType
+	Size        uint64
+}
+
+type Bucket struct {
+	Name       string
+	VolumeName string
+}
diff --git a/api/datanode/datanode.go b/api/datanode/datanode.go
new file mode 100644
index 0000000..24746a2
--- /dev/null
+++ b/api/datanode/datanode.go
@@ -0,0 +1,261 @@
+// Licensed to the 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.  The 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 datanode
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	dnapi "github.com/apache/ozone-go/api/proto/datanode"
+	"github.com/apache/ozone-go/api/proto/hdds"
+	"github.com/apache/ozone-go/api/proto/ratis"
+	"google.golang.org/grpc"
+	"io"
+	"strconv"
+)
+
+type ChunkInfo struct {
+	Name   string
+	Offset uint64
+	Len    uint64
+}
+
+type DatanodeClient struct {
+	ratisClient        *ratis.RaftClientProtocolService_UnorderedClient
+	ratisReceiver      chan ratis.RaftClientReplyProto
+	standaloneClient   *dnapi.XceiverClientProtocolService_SendClient
+	standaloneReceiver chan dnapi.ContainerCommandResponseProto
+
+	ctx             context.Context
+	datanodes       []*hdds.DatanodeDetailsProto
+	currentDatanode hdds.DatanodeDetailsProto
+	grpcConnection  *grpc.ClientConn
+	pipelineId      *hdds.PipelineID
+	memberIndex     int
+}
+
+func (dn *DatanodeClient) GetCurrentDnUUid() *string {
+	uid := dn.currentDatanode.GetUuid()
+	return &uid
+}
+
+func (dnClient *DatanodeClient) connectToNext() error {
+	if dnClient.grpcConnection != nil {
+		dnClient.grpcConnection.Close()
+	}
+	dnClient.memberIndex = dnClient.memberIndex + 1
+	if dnClient.memberIndex == len(dnClient.datanodes) {
+		dnClient.memberIndex = 0
+	}
+	selectedDatanode := dnClient.datanodes[dnClient.memberIndex]
+	dnClient.currentDatanode = *selectedDatanode
+
+	standalonePort := 0
+	for _, port := range dnClient.currentDatanode.Ports {
+		if *port.Name == "STANDALONE" {
+			standalonePort = int(*port.Value)
+		}
+	}
+
+	address := *dnClient.currentDatanode.IpAddress + ":" + strconv.Itoa(standalonePort)
+	println("Connecting to the " + address)
+	conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
+	if err != nil {
+		return err
+	}
+
+	dnClient.ratisReceiver = make(chan ratis.RaftClientReplyProto)
+	dnClient.standaloneReceiver = make(chan dnapi.ContainerCommandResponseProto)
+
+	client, err := dnapi.NewXceiverClientProtocolServiceClient(conn).Send(dnClient.ctx)
+	dnClient.standaloneClient = &client
+	//
+	//client, err := ratis.NewRaftClientProtocolServiceClient(conn).Unordered(dnClient.ctx)
+	//if err != nil {
+	//	panic(err)
+	//}
+	//dnClient.ratisClient = &client
+	//go dnClient.RaftReceiver()
+	go dnClient.StandaloneReceive()
+	return nil
+}
+
+func CreateDatanodeClient(pipeline *hdds.Pipeline) (*DatanodeClient, error) {
+	dnClient := &DatanodeClient{
+		ctx:         context.Background(),
+		pipelineId:  pipeline.Id,
+		datanodes:   pipeline.Members,
+		memberIndex: -1,
+	}
+	err := dnClient.connectToNext()
+	if err != nil {
+		return nil, err
+	}
+	return dnClient, nil
+}
+func (dnClient *DatanodeClient) RaftReceiver() {
+	for {
+		proto, err := (*dnClient.ratisClient).Recv()
+		if err == io.EOF {
+			return
+		}
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+		dnClient.ratisReceiver <- *proto
+	}
+}
+
+func (dnClient *DatanodeClient) CreateAndWriteChunk(id *dnapi.DatanodeBlockID, blockOffset uint64, buffer []byte, length uint64) (dnapi.ChunkInfo, error) {
+	bpc := uint32(12)
+	checksumType := dnapi.ChecksumType_NONE
+	checksumDataProto := dnapi.ChecksumData{
+		Type:             &checksumType,
+		BytesPerChecksum: &bpc,
+	}
+	chunkName := fmt.Sprintf("chunk_%d", blockOffset)
+	chunkInfoProto := dnapi.ChunkInfo{
+		ChunkName:    &chunkName,
+		Offset:       &blockOffset,
+		Len:          &length,
+		ChecksumData: &checksumDataProto,
+	}
+	return dnClient.WriteChunk(id, chunkInfoProto, buffer[0:length])
+}
+
+func (dnClient *DatanodeClient) WriteChunk(id *dnapi.DatanodeBlockID, info dnapi.ChunkInfo, data []byte) (dnapi.ChunkInfo, error) {
+
+	req := dnapi.WriteChunkRequestProto{
+		BlockID:   id,
+		ChunkData: &info,
+		Data:      data,
+	}
+	commandType := dnapi.Type_WriteChunk
+	uuid := dnClient.currentDatanode.GetUuid()
+	proto := dnapi.ContainerCommandRequestProto{
+		CmdType:      &commandType,
+		WriteChunk:   &req,
+		ContainerID:  id.ContainerID,
+		DatanodeUuid: &uuid,
+	}
+
+	_, err := dnClient.sendDatanodeCommand(proto)
+	if err != nil {
+		return info, err
+	}
+	return info, nil
+}
+
+func (dnClient *DatanodeClient) ReadChunk(id *dnapi.DatanodeBlockID, info ChunkInfo) ([]byte, error) {
+	result := make([]byte, 0)
+
+	bpc := uint32(12)
+	checksumType := dnapi.ChecksumType_NONE
+	checksumDataProto := dnapi.ChecksumData{
+		Type:             &checksumType,
+		BytesPerChecksum: &bpc,
+	}
+	chunkInfoProto := dnapi.ChunkInfo{
+		ChunkName:    &info.Name,
+		Offset:       &info.Offset,
+		Len:          &info.Len,
+		ChecksumData: &checksumDataProto,
+	}
+	req := dnapi.ReadChunkRequestProto{
+		BlockID:   id,
+		ChunkData: &chunkInfoProto,
+	}
+	commandType := dnapi.Type_ReadChunk
+	uuid := dnClient.currentDatanode.GetUuid()
+	proto := dnapi.ContainerCommandRequestProto{
+		CmdType:      &commandType,
+		ReadChunk:    &req,
+		ContainerID:  id.ContainerID,
+		DatanodeUuid: &uuid,
+	}
+
+	resp, err := dnClient.sendDatanodeCommand(proto)
+	if err != nil {
+		return result, err
+	}
+	if resp.GetResult() != dnapi.Result_SUCCESS {
+		return nil, errors.New(resp.GetResult().String() + " " + resp.GetMessage())
+	}
+	return resp.GetReadChunk().Data, nil
+}
+
+func (dnClient *DatanodeClient) PutBlock(id *dnapi.DatanodeBlockID, chunks []*dnapi.ChunkInfo) error {
+
+	flags := int64(0)
+	req := dnapi.PutBlockRequestProto{
+		BlockData: &dnapi.BlockData{
+			BlockID:  id,
+			Flags:    &flags,
+			Metadata: make([]*dnapi.KeyValue, 0),
+			Chunks:   chunks,
+		},
+	}
+	commandType := dnapi.Type_PutBlock
+	proto := dnapi.ContainerCommandRequestProto{
+		CmdType:      &commandType,
+		PutBlock:     &req,
+		ContainerID:  id.ContainerID,
+		DatanodeUuid: dnClient.GetCurrentDnUUid(),
+	}
+
+	_, err := dnClient.sendDatanodeCommand(proto)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (dnClient *DatanodeClient) GetBlock(id *dnapi.DatanodeBlockID) ([]ChunkInfo, error) {
+	result := make([]ChunkInfo, 0)
+
+	req := dnapi.GetBlockRequestProto{
+		BlockID: id,
+	}
+	commandType := dnapi.Type_GetBlock
+	proto := dnapi.ContainerCommandRequestProto{
+		CmdType:      &commandType,
+		GetBlock:     &req,
+		ContainerID:  id.ContainerID,
+		DatanodeUuid: dnClient.GetCurrentDnUUid(),
+	}
+
+	resp, err := dnClient.sendDatanodeCommand(proto)
+	if err != nil {
+		return result, err
+	}
+	for _, chunkInfo := range resp.GetGetBlock().GetBlockData().Chunks {
+		result = append(result, ChunkInfo{
+			Name:   chunkInfo.GetChunkName(),
+			Offset: chunkInfo.GetOffset(),
+			Len:    chunkInfo.GetLen(),
+		})
+	}
+	return result, nil
+}
+
+func (dnClient *DatanodeClient) sendDatanodeCommand(proto dnapi.ContainerCommandRequestProto) (dnapi.ContainerCommandResponseProto, error) {
+	return dnClient.sendStandaloneDatanodeCommand(proto)
+}
+
+func (dn *DatanodeClient) Close() {
+	(*dn.standaloneClient).CloseSend()
+}
diff --git a/api/datanode/ratis.go b/api/datanode/ratis.go
new file mode 100644
index 0000000..2c626eb
--- /dev/null
+++ b/api/datanode/ratis.go
@@ -0,0 +1,103 @@
+// Licensed to the 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.  The 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 datanode
+
+import (
+	"encoding/binary"
+	"github.com/apache/ozone-go/api/proto/datanode"
+	"github.com/apache/ozone-go/api/proto/ratis"
+	protobuf "github.com/golang/protobuf/proto"
+)
+
+func (dnClient *DatanodeClient) sendRatisDatanodeCommand(proto datanode.ContainerCommandRequestProto) (datanode.ContainerCommandResponseProto, error) {
+	group := ratis.RaftGroupIdProto{
+		Id: make([]byte, 0), //TODO
+	}
+	request := ratis.RaftRpcRequestProto{
+		RequestorId: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5},
+		ReplyId:     []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5},
+		RaftGroupId: &group,
+		CallId:      12,
+	}
+	bytes, err := protobuf.Marshal(&proto)
+	if err != nil {
+		return datanode.ContainerCommandResponseProto{}, err
+	}
+
+	lengthHeader := make([]byte, 4)
+	binary.BigEndian.PutUint32(lengthHeader, uint32(len(bytes)))
+
+	message := ratis.ClientMessageEntryProto{
+		Content: append(lengthHeader, bytes...),
+	}
+	readRequestType := ratis.ReadRequestTypeProto{}
+	readType := ratis.RaftClientRequestProto_Read{
+		Read: &readRequestType,
+	}
+	raft := ratis.RaftClientRequestProto{
+		RpcRequest: &request,
+		Message:    &message,
+		Type:       &readType,
+	}
+	resp, err := dnClient.sendRatisMessage(raft)
+	if err != nil {
+		return datanode.ContainerCommandResponseProto{}, err
+	}
+
+	containerResponse := datanode.ContainerCommandResponseProto{}
+	err = protobuf.Unmarshal(resp.Message.Content, &containerResponse)
+	if err != nil {
+		return containerResponse, err
+	}
+	return containerResponse, nil
+}
+func (dnClient *DatanodeClient) sendRatisMessage(request ratis.RaftClientRequestProto) (ratis.RaftClientReplyProto, error) {
+	resp, err := dnClient.sendRatisMessageToServer(request)
+	if err != nil {
+		return ratis.RaftClientReplyProto{}, err
+	}
+	if resp.GetNotLeaderException() != nil {
+		err = dnClient.connectToNext()
+		if err != nil {
+			return ratis.RaftClientReplyProto{}, err
+		}
+		resp, err = dnClient.sendRatisMessageToServer(request)
+		if err != nil {
+			return ratis.RaftClientReplyProto{}, err
+		}
+	}
+	if resp.GetNotLeaderException() != nil {
+		err = dnClient.connectToNext()
+		if err != nil {
+			return ratis.RaftClientReplyProto{}, err
+		}
+		resp, err = dnClient.sendRatisMessageToServer(request)
+		if err != nil {
+			return ratis.RaftClientReplyProto{}, err
+		}
+	}
+	return resp, nil
+}
+
+func (dnClient *DatanodeClient) sendRatisMessageToServer(request ratis.RaftClientRequestProto) (ratis.RaftClientReplyProto, error) {
+
+	err := (*dnClient.ratisClient).Send(&request)
+	if err != nil {
+		return ratis.RaftClientReplyProto{}, err
+	}
+	resp := <-dnClient.ratisReceiver
+	return resp, err
+}
diff --git a/api/datanode/standalone.go b/api/datanode/standalone.go
new file mode 100644
index 0000000..b9feb69
--- /dev/null
+++ b/api/datanode/standalone.go
@@ -0,0 +1,45 @@
+// Licensed to the 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.  The 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 datanode
+
+import (
+	"fmt"
+	dnapi "github.com/apache/ozone-go/api/proto/datanode"
+	"io"
+)
+
+func (dnClient *DatanodeClient) sendStandaloneDatanodeCommand(proto dnapi.ContainerCommandRequestProto) (dnapi.ContainerCommandResponseProto, error) {
+	err := (*dnClient.standaloneClient).Send(&proto)
+	if err != nil {
+		return dnapi.ContainerCommandResponseProto{}, err
+	}
+	resp := <-dnClient.standaloneReceiver
+	return resp, err
+}
+
+func (dnClient *DatanodeClient) StandaloneReceive() {
+	for {
+		proto, err := (*dnClient.standaloneClient).Recv()
+		if err == io.EOF {
+			return
+		}
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+		dnClient.standaloneReceiver <- *proto
+	}
+}
diff --git a/api/go.mod b/api/go.mod
new file mode 100644
index 0000000..5d6e1ec
--- /dev/null
+++ b/api/go.mod
@@ -0,0 +1,32 @@
+// Licensed to the 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.  The 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.
+
+module github.com/apache/ozone-go/api
+
+go 1.13
+
+require (
+	github.com/golang/protobuf v1.4.3
+	github.com/hortonworks/gohadoop v0.0.0-20180913181356-4e92e1475b38
+	github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d
+	github.com/stretchr/testify v1.7.0
+	golang.org/x/net v0.0.0-20210226172049-e18ecbb05110
+	golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c // indirect
+	golang.org/x/text v0.3.5 // indirect
+	google.golang.org/genproto v0.0.0-20210312152112-fc591d9ea70f // indirect
+	google.golang.org/grpc v1.36.0
+	google.golang.org/protobuf v1.25.0
+)
diff --git a/api/go.sum b/api/go.sum
new file mode 100644
index 0000000..b3fbbb1
--- /dev/null
+++ b/api/go.sum
@@ -0,0 +1,112 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/hortonworks/gohadoop v0.0.0-20180913181356-4e92e1475b38 h1:Fksvn6jtn0B8nE74Y/6hqcX1DJC3/1jPQQhb61EmWsw=
+github.com/hortonworks/gohadoop v0.0.0-20180913181356-4e92e1475b38/go.mod h1:Vs/bWYFXkega47bl5bp3dkBRDEv3s2kvJaNUoONM86c=
+github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=
+github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
+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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c h1:coiPEfMv+ThsjULRDygLrJVlNE1gDdL2g65s0LhV2os=
+golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20210312152112-fc591d9ea70f h1:YRBxgxUW6GFi+AKsn8WGA9k1SZohK+gGuEqdeT5aoNQ=
+google.golang.org/genproto v0.0.0-20210312152112-fc591d9ea70f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.36.0 h1:o1bcQ6imQMIOpdrO3SWf2z5RV72WbDwdXuK0MDlc8As=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/api/key.go b/api/key.go
new file mode 100644
index 0000000..a6c7399
--- /dev/null
+++ b/api/key.go
@@ -0,0 +1,204 @@
+// Licensed to the 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.  The 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 api
+
+import (
+	"errors"
+	"github.com/apache/ozone-go/api/common"
+	"github.com/apache/ozone-go/api/datanode"
+	dnproto "github.com/apache/ozone-go/api/proto/datanode"
+	"github.com/apache/ozone-go/api/proto/hdds"
+	omproto "github.com/apache/ozone-go/api/proto/ozone"
+	"io"
+)
+
+func (ozoneClient *OzoneClient) ListKeys(volume string, bucket string) ([]common.Key, error) {
+
+	keys, err := ozoneClient.OmClient.ListKeys(volume, bucket)
+	if err != nil {
+		return make([]common.Key, 0), err
+	}
+
+	ret := make([]common.Key, 0)
+	for _, r := range keys {
+		ret = append(ret, KeyFromProto(r))
+	}
+	return ret, nil
+
+}
+
+func (ozoneClient *OzoneClient) ListKeysPrefix(volume string, bucket string, prefix string) ([]common.Key, error) {
+	keys, err := ozoneClient.OmClient.ListKeysPrefix(volume, bucket, prefix)
+	if err != nil {
+		return make([]common.Key, 0), err
+	}
+
+	ret := make([]common.Key, 0)
+	for _, r := range keys {
+		ret = append(ret, KeyFromProto(r))
+	}
+	return ret, nil
+
+}
+
+func (ozoneClient *OzoneClient) InfoKey(volume string, bucket string, key string) (common.Key, error) {
+	k, err := ozoneClient.OmClient.GetKey(volume, bucket, key)
+	return KeyFromProto(k), err
+}
+
+func (ozoneClient *OzoneClient) GetKey(volume string, bucket string, key string, destination io.Writer) (common.Key, error) {
+	keyInfo, err := ozoneClient.OmClient.GetKey(volume, bucket, key)
+
+	if err != nil {
+		return common.Key{}, err
+	}
+
+	if len(keyInfo.KeyLocationList) == 0 {
+		return common.Key{}, errors.New("Get key returned with zero key location version " + volume + "/" + bucket + "/" + key)
+	}
+
+	if len(keyInfo.KeyLocationList[0].KeyLocations) == 0 {
+		return common.Key{}, errors.New("Key location doesn't have any datanode for key " + volume + "/" + bucket + "/" + key)
+	}
+	for _, location := range keyInfo.KeyLocationList[0].KeyLocations {
+		pipeline := location.Pipeline
+
+		dnBlockId := ConvertBlockId(location.BlockID)
+		dnClient, err := datanode.CreateDatanodeClient(pipeline)
+		chunks, err := dnClient.GetBlock(dnBlockId)
+		if err != nil {
+			return common.Key{}, err
+		}
+		for _, chunk := range chunks {
+			data, err := dnClient.ReadChunk(dnBlockId, chunk)
+			if err != nil {
+				return common.Key{}, err
+			}
+			destination.Write(data)
+		}
+		dnClient.Close()
+	}
+	return common.Key{}, nil
+}
+
+func ConvertBlockId(bid *hdds.BlockID) *dnproto.DatanodeBlockID {
+	id := dnproto.DatanodeBlockID{
+		ContainerID: bid.ContainerBlockID.ContainerID,
+		LocalID:     bid.ContainerBlockID.LocalID,
+	}
+	return &id
+}
+
+func (ozoneClient *OzoneClient) PutKey(volume string, bucket string, key string, source io.Reader) (common.Key, error) {
+	createKey, err := ozoneClient.OmClient.CreateKey(volume, bucket, key)
+	if err != nil {
+		return common.Key{}, err
+	}
+
+	keyInfo := createKey.KeyInfo
+	location := keyInfo.KeyLocationList[0].KeyLocations[0]
+	pipeline := location.Pipeline
+
+	dnClient, err := datanode.CreateDatanodeClient(pipeline)
+	if err != nil {
+		return common.Key{}, err
+	}
+
+	chunkSize := 4096
+	buffer := make([]byte, chunkSize)
+
+	chunks := make([]*dnproto.ChunkInfo, 0)
+	keySize := uint64(0)
+
+	locations := make([]*omproto.KeyLocation, 0)
+
+	blockId := ConvertBlockId(location.BlockID)
+	eof := false
+
+	for ; ; {
+		blockOffset := uint64(0)
+		for i := 0; i < 64; i++ {
+			count, err := source.Read(buffer)
+			if err == io.EOF {
+				eof = true
+			} else if err != nil {
+				return common.Key{}, err
+			}
+			if count > 0 {
+				chunk, err := dnClient.CreateAndWriteChunk(blockId, blockOffset, buffer[0:count], uint64(count))
+				if err != nil {
+					return common.Key{}, err
+				}
+				blockOffset += uint64(count)
+				keySize += uint64(count)
+				chunks = append(chunks, &chunk)
+			}
+			if eof {
+				break
+			}
+		}
+
+		err = dnClient.PutBlock(blockId, chunks)
+		if err != nil {
+			return common.Key{}, err
+		}
+		if eof {
+			break
+		}
+
+		//get new block and reset counters
+
+		nextBlockResponse, err := ozoneClient.OmClient.AllocateBlock(volume, bucket, key, createKey.ID)
+		if err != nil {
+			return common.Key{}, err
+		}
+
+		dnClient.Close()
+		location = nextBlockResponse.KeyLocation
+		pipeline = location.Pipeline
+		dnClient, err = datanode.CreateDatanodeClient(pipeline)
+		if err != nil {
+			return common.Key{}, err
+		}
+		blockId = ConvertBlockId(location.BlockID)
+		blockOffset = 0
+		chunks = make([]*dnproto.ChunkInfo, 0)
+
+	}
+	zero := uint64(0)
+	locations = append(locations, &omproto.KeyLocation{
+		BlockID:  location.BlockID,
+		Pipeline: location.Pipeline,
+		Length:   &keySize,
+		Offset:   &zero,
+	})
+
+	ozoneClient.OmClient.CommitKey(volume, bucket, key, createKey.ID, locations, keySize)
+	return common.Key{}, nil
+}
+
+func KeyFromProto(keyProto *omproto.KeyInfo) common.Key {
+	replicationType := common.ReplicationType(*keyProto.Type)
+
+	result := common.Key{
+		Name:        *keyProto.KeyName,
+		Replication: replicationType,
+		VolumeName:  *keyProto.VolumeName,
+		BucketName:  *keyProto.BucketName,
+		Size:        *keyProto.DataSize,
+	}
+	return result
+}
diff --git a/api/om/bucket.go b/api/om/bucket.go
new file mode 100644
index 0000000..fb6b843
--- /dev/null
+++ b/api/om/bucket.go
@@ -0,0 +1,105 @@
+// Licensed to the 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.  The 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 om
+
+import (
+	"github.com/apache/ozone-go/api/common"
+	ozone_proto "github.com/apache/ozone-go/api/proto/ozone"
+)
+
+func (om *OmClient) CreateBucket(volume string, bucket string) error {
+	isVersionEnabled := false
+	storageType := ozone_proto.StorageTypeProto_DISK
+	bucketInfo := ozone_proto.BucketInfo{
+		BucketName:       &bucket,
+		VolumeName:       &volume,
+		IsVersionEnabled: &isVersionEnabled,
+		StorageType:      &storageType,
+
+	}
+	req := ozone_proto.CreateBucketRequest{
+		BucketInfo: &bucketInfo,
+	}
+
+	cmdType := ozone_proto.Type_CreateBucket
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:             &cmdType,
+		CreateBucketRequest: &req,
+		ClientId:            &om.clientId,
+	}
+
+	_, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (om *OmClient) GetBucket(volume string, bucket string) (common.Bucket, error) {
+	req := ozone_proto.InfoBucketRequest{
+		VolumeName: &volume,
+		BucketName: &bucket,
+	}
+
+	cmdType := ozone_proto.Type_InfoBucket
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:           &cmdType,
+		InfoBucketRequest: &req,
+		ClientId:          &om.clientId,
+	}
+
+	resp, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return common.Bucket{}, err
+	}
+	b := common.Bucket{
+		Name:       *resp.InfoBucketResponse.BucketInfo.BucketName,
+		VolumeName: *resp.InfoBucketResponse.BucketInfo.VolumeName,
+	}
+	return b, nil
+}
+
+func (om *OmClient) ListBucket(volume string) ([]common.Bucket, error) {
+	res := make([]common.Bucket, 0)
+
+	req := ozone_proto.ListBucketsRequest{
+		VolumeName: &volume,
+		StartKey:   ptr(""),
+		Count:      ptri(100),
+	}
+
+	cmdType := ozone_proto.Type_ListBuckets
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:            &cmdType,
+		ListBucketsRequest: &req,
+		ClientId:           &om.clientId,
+	}
+
+	resp, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return res, err
+	}
+	for _, b := range resp.ListBucketsResponse.BucketInfo {
+		cb := common.Bucket{
+			Name:       *b.BucketName,
+			VolumeName: *b.VolumeName,
+		}
+		res = append(res, cb)
+	}
+	return res, nil
+}
+
+
diff --git a/api/om/om.go b/api/om/om.go
new file mode 100644
index 0000000..41ce98e
--- /dev/null
+++ b/api/om/om.go
@@ -0,0 +1,215 @@
+// Licensed to the 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.  The 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 om
+
+import (
+	"errors"
+	"github.com/apache/ozone-go/api/common"
+	"github.com/apache/ozone-go/api/proto/hdds"
+	ozone_proto "github.com/apache/ozone-go/api/proto/ozone"
+	"github.com/hortonworks/gohadoop"
+	hadoop_ipc_client "github.com/hortonworks/gohadoop/hadoop_common/ipc/client"
+	uuid "github.com/nu7hatch/gouuid"
+	"net"
+	"strconv"
+	"sync"
+)
+
+var OM_PROTOCOL = "org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol"
+
+type OmClient struct {
+	OmHost   string
+	client   *hadoop_ipc_client.Client
+	clientId string
+	mu       sync.Mutex
+}
+
+func CreateOmClient(omhost string) OmClient {
+	clientId, _ := uuid.NewV4()
+	ugi, _ := gohadoop.CreateSimpleUGIProto()
+	c := &hadoop_ipc_client.Client{
+		ClientId:      clientId,
+		Ugi:           ugi,
+		ServerAddress: net.JoinHostPort(omhost, strconv.Itoa(9862))}
+
+	return OmClient{
+		OmHost: omhost,
+		client: c,
+	}
+}
+
+func (om *OmClient) GetKey(volume string, bucket string, key string) (*ozone_proto.KeyInfo, error) {
+
+	keyArgs := &ozone_proto.KeyArgs{
+		VolumeName: &volume,
+		BucketName: &bucket,
+		KeyName:    &key,
+	}
+	req := ozone_proto.LookupKeyRequest{
+		KeyArgs: keyArgs,
+	}
+
+	requestType := ozone_proto.Type_LookupKey
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:          &requestType,
+		LookupKeyRequest: &req,
+		ClientId:         &om.clientId,
+	}
+
+	resp, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return nil, err
+	}
+	keyProto := resp.GetLookupKeyResponse().GetKeyInfo()
+	println(keyProto)
+	return keyProto, nil
+}
+
+func (om *OmClient) ListKeys(volume string, bucket string) ([]*ozone_proto.KeyInfo, error) {
+	return om.ListKeysPrefix(volume, bucket, "")
+
+}
+
+func (om *OmClient) AllocateBlock(volume string, bucket string, key string, clientID *uint64) (*ozone_proto.AllocateBlockResponse,error) {
+	req := ozone_proto.AllocateBlockRequest{
+		KeyArgs: &ozone_proto.KeyArgs{
+			VolumeName: &volume,
+			BucketName: &bucket,
+			KeyName:    &key,
+		},
+		ClientID: clientID,
+	}
+
+	msgType := ozone_proto.Type_AllocateBlock
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:              &msgType,
+		AllocateBlockRequest: &req,
+		ClientId:             &om.clientId,
+	}
+	resp, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return nil, err
+	}
+	return resp.AllocateBlockResponse, nil
+}
+
+func (om *OmClient) CreateKey(volume string, bucket string, key string) (*ozone_proto.CreateKeyResponse, error) {
+	req := ozone_proto.CreateKeyRequest{
+		KeyArgs: &ozone_proto.KeyArgs{
+			VolumeName: &volume,
+			BucketName: &bucket,
+			KeyName:    &key,
+		},
+	}
+
+	createKeys := ozone_proto.Type_CreateKey
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:          &createKeys,
+		CreateKeyRequest: &req,
+		ClientId:         &om.clientId,
+	}
+	resp, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return nil, err
+	}
+	return resp.CreateKeyResponse, nil
+}
+
+func (om *OmClient) CommitKey(volume string, bucket string, key string, id *uint64, keyLocations []*ozone_proto.KeyLocation, size uint64) (common.Key, error) {
+	one := hdds.ReplicationFactor_ONE
+	standalone := hdds.ReplicationType_STAND_ALONE
+	req := ozone_proto.CommitKeyRequest{
+		KeyArgs: &ozone_proto.KeyArgs{
+			VolumeName:   &volume,
+			BucketName:   &bucket,
+			KeyName:      &key,
+			KeyLocations: keyLocations,
+			DataSize:     &size,
+			Factor:       &one,
+			Type:         &standalone,
+		},
+		ClientID: id,
+	}
+
+	messageType := ozone_proto.Type_CommitKey
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:          &messageType,
+		CommitKeyRequest: &req,
+		ClientId:         &om.clientId,
+	}
+	_, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return common.Key{}, err
+	}
+
+	return common.Key{}, nil
+}
+
+func (om *OmClient) ListKeysPrefix(volume string, bucket string, prefix string) ([]*ozone_proto.KeyInfo, error) {
+
+	req := ozone_proto.ListKeysRequest{
+		VolumeName: &volume,
+		BucketName: &bucket,
+		Prefix:     ptr(prefix),
+		Count:      ptri(1000),
+	}
+
+	listKeys := ozone_proto.Type_ListKeys
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:         &listKeys,
+		ListKeysRequest: &req,
+		ClientId:        &om.clientId,
+	}
+
+	resp, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return nil, err
+	}
+
+	return resp.GetListKeysResponse().GetKeyInfo(), nil
+}
+
+func getRpcPort(ports []*hdds.Port) uint32 {
+	for _, port := range ports {
+		if port.GetName() == "RATIS" {
+			return port.GetValue()
+		}
+	}
+	return 0
+}
+
+func ptri(i int32) *int32 {
+	return &i
+}
+
+func ptr(s string) *string {
+	return &s
+}
+
+func (om *OmClient) submitRequest(request *ozone_proto.OMRequest, ) (*ozone_proto.OMResponse, error) {
+	wrapperResponse := ozone_proto.OMResponse{}
+	om.mu.Lock()
+	err := om.client.Call(gohadoop.GetCalleeRPCRequestHeaderProto(&OM_PROTOCOL), request, &wrapperResponse)
+	om.mu.Unlock()
+	if err != nil {
+		return nil, err
+	}
+	if *wrapperResponse.Status != ozone_proto.Status_OK {
+		return nil, errors.New("Error on calling OM " + wrapperResponse.Status.String() + " " + *wrapperResponse.Message)
+	}
+	return &wrapperResponse, nil
+}
+
diff --git a/api/om/volume.go b/api/om/volume.go
new file mode 100644
index 0000000..43fa85d
--- /dev/null
+++ b/api/om/volume.go
@@ -0,0 +1,99 @@
+// Licensed to the 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.  The 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 om
+
+import (
+	"github.com/apache/ozone-go/api/common"
+	ozone_proto "github.com/apache/ozone-go/api/proto/ozone"
+)
+
+func (om *OmClient) ListVolumes() ([]common.Volume, error) {
+	scope := ozone_proto.ListVolumeRequest_VOLUMES_BY_USER
+	req := ozone_proto.ListVolumeRequest{
+		Scope:    &scope,
+		UserName: ptr("hadoop"),
+		Prefix:   ptr(""),
+	}
+
+	listKeys := ozone_proto.Type_ListVolume
+	clientId := "goClient"
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:           &listKeys,
+		ListVolumeRequest: &req,
+		ClientId:          &clientId,
+	}
+
+	volumes := make([]common.Volume, 0)
+	resp, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return nil, err
+	}
+	for _, volProto := range resp.GetListVolumeResponse().GetVolumeInfo() {
+		volumes = append(volumes, common.Volume{Name: *volProto.Volume})
+	}
+	return volumes, nil
+}
+
+func (om *OmClient) CreateVolume(name string) error {
+	onegig := uint64(1024 * 1024 * 1024)
+	volumeInfo := ozone_proto.VolumeInfo{
+		AdminName:    ptr("hadoop"),
+		OwnerName:    ptr("hadoop"),
+		Volume:       ptr(name),
+		QuotaInBytes: &onegig,
+	}
+	req := ozone_proto.CreateVolumeRequest{
+		VolumeInfo: &volumeInfo,
+	}
+
+	cmdType := ozone_proto.Type_CreateVolume
+	clientId := "goClient"
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:             &cmdType,
+		CreateVolumeRequest: &req,
+		ClientId:            &clientId,
+	}
+
+	_, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (om *OmClient) GetVolume(name string) (common.Volume, error) {
+	req := ozone_proto.InfoVolumeRequest{
+		VolumeName: &name,
+	}
+
+	cmdType := ozone_proto.Type_InfoVolume
+	wrapperRequest := ozone_proto.OMRequest{
+		CmdType:           &cmdType,
+		InfoVolumeRequest: &req,
+		ClientId:          &om.clientId,
+	}
+
+	resp, err := om.submitRequest(&wrapperRequest)
+	if err != nil {
+		return common.Volume{}, err
+	}
+
+	vol := common.Volume{}
+	vol.Name = *resp.InfoVolumeResponse.VolumeInfo.Volume
+	vol.Owner = *resp.InfoVolumeResponse.VolumeInfo.OwnerName
+
+	return vol, nil
+}
diff --git a/api/ozone.go b/api/ozone.go
new file mode 100644
index 0000000..937e644
--- /dev/null
+++ b/api/ozone.go
@@ -0,0 +1,31 @@
+// Licensed to the 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.  The 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 api
+
+import (
+	"github.com/apache/ozone-go/api/om"
+)
+
+type OzoneClient struct {
+	OmClient *om.OmClient
+}
+
+func CreateOzoneClient(omhost string) *OzoneClient {
+	client := om.CreateOmClient(omhost)
+	return &OzoneClient{
+		OmClient: &client,
+	}
+}
diff --git a/api/ozone_test.go b/api/ozone_test.go
new file mode 100644
index 0000000..17d1688
--- /dev/null
+++ b/api/ozone_test.go
@@ -0,0 +1,68 @@
+// Licensed to the 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.  The 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 api
+
+import (
+	"fmt"
+	"math/rand"
+	"testing"
+	"time"
+)
+import "github.com/stretchr/testify/assert"
+
+func randomName(prefix string) string {
+	seq := rand.New(rand.NewSource(time.Now().Unix())).Int31()
+	return prefix + fmt.Sprintf("%d", seq)
+}
+
+func TestOzoneClientVolumeCreateGet(t *testing.T) {
+	client := CreateOzoneClient("localhost")
+
+	volumeName := randomName("vol")
+	err := client.CreateVolume(volumeName)
+	assert.Nil(t, err)
+
+	vol, err := client.GetVolume(volumeName)
+	assert.Nil(t, err)
+
+	assert.Equal(t, volumeName, vol.Name)
+}
+
+func TestOzoneClientBucketCreateGet(t *testing.T) {
+
+	client := CreateOzoneClient("localhost")
+
+	//volumeName := "vol1"
+	volumeName := randomName("vol")
+	bucketName := randomName("bucket")
+
+	err := client.CreateVolume(volumeName)
+	assert.Nil(t, err)
+
+	time.Sleep(4 * time.Second)
+
+
+
+
+	err = client.CreateBucket(volumeName, bucketName)
+	assert.Nil(t, err)
+
+	bucket, err := client.GetBucket(volumeName, bucketName)
+	assert.Nil(t, err)
+
+	assert.Equal(t, bucketName, bucket.Name)
+	assert.Equal(t, volumeName, bucket.VolumeName)
+}
diff --git a/api/proto/common/Security.pb.go b/api/proto/common/Security.pb.go
new file mode 100644
index 0000000..f907fa2
--- /dev/null
+++ b/api/proto/common/Security.pb.go
@@ -0,0 +1,745 @@
+/**
+ * Licensed to the 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.  The 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.24.0
+// 	protoc        v3.15.6
+// source: Security.proto
+
+package common
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+//*
+// Security token identifier
+type TokenProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Identifier []byte  `protobuf:"bytes,1,req,name=identifier" json:"identifier,omitempty"`
+	Password   []byte  `protobuf:"bytes,2,req,name=password" json:"password,omitempty"`
+	Kind       *string `protobuf:"bytes,3,req,name=kind" json:"kind,omitempty"`
+	Service    *string `protobuf:"bytes,4,req,name=service" json:"service,omitempty"`
+}
+
+func (x *TokenProto) Reset() {
+	*x = TokenProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TokenProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TokenProto) ProtoMessage() {}
+
+func (x *TokenProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 TokenProto.ProtoReflect.Descriptor instead.
+func (*TokenProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *TokenProto) GetIdentifier() []byte {
+	if x != nil {
+		return x.Identifier
+	}
+	return nil
+}
+
+func (x *TokenProto) GetPassword() []byte {
+	if x != nil {
+		return x.Password
+	}
+	return nil
+}
+
+func (x *TokenProto) GetKind() string {
+	if x != nil && x.Kind != nil {
+		return *x.Kind
+	}
+	return ""
+}
+
+func (x *TokenProto) GetService() string {
+	if x != nil && x.Service != nil {
+		return *x.Service
+	}
+	return ""
+}
+
+type CredentialsKVProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Alias  *string     `protobuf:"bytes,1,req,name=alias" json:"alias,omitempty"`
+	Token  *TokenProto `protobuf:"bytes,2,opt,name=token" json:"token,omitempty"`
+	Secret []byte      `protobuf:"bytes,3,opt,name=secret" json:"secret,omitempty"`
+}
+
+func (x *CredentialsKVProto) Reset() {
+	*x = CredentialsKVProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CredentialsKVProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CredentialsKVProto) ProtoMessage() {}
+
+func (x *CredentialsKVProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 CredentialsKVProto.ProtoReflect.Descriptor instead.
+func (*CredentialsKVProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *CredentialsKVProto) GetAlias() string {
+	if x != nil && x.Alias != nil {
+		return *x.Alias
+	}
+	return ""
+}
+
+func (x *CredentialsKVProto) GetToken() *TokenProto {
+	if x != nil {
+		return x.Token
+	}
+	return nil
+}
+
+func (x *CredentialsKVProto) GetSecret() []byte {
+	if x != nil {
+		return x.Secret
+	}
+	return nil
+}
+
+type CredentialsProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Tokens  []*CredentialsKVProto `protobuf:"bytes,1,rep,name=tokens" json:"tokens,omitempty"`
+	Secrets []*CredentialsKVProto `protobuf:"bytes,2,rep,name=secrets" json:"secrets,omitempty"`
+}
+
+func (x *CredentialsProto) Reset() {
+	*x = CredentialsProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CredentialsProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CredentialsProto) ProtoMessage() {}
+
+func (x *CredentialsProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 CredentialsProto.ProtoReflect.Descriptor instead.
+func (*CredentialsProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *CredentialsProto) GetTokens() []*CredentialsKVProto {
+	if x != nil {
+		return x.Tokens
+	}
+	return nil
+}
+
+func (x *CredentialsProto) GetSecrets() []*CredentialsKVProto {
+	if x != nil {
+		return x.Secrets
+	}
+	return nil
+}
+
+type GetDelegationTokenRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Renewer *string `protobuf:"bytes,1,req,name=renewer" json:"renewer,omitempty"`
+}
+
+func (x *GetDelegationTokenRequestProto) Reset() {
+	*x = GetDelegationTokenRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetDelegationTokenRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDelegationTokenRequestProto) ProtoMessage() {}
+
+func (x *GetDelegationTokenRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 GetDelegationTokenRequestProto.ProtoReflect.Descriptor instead.
+func (*GetDelegationTokenRequestProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *GetDelegationTokenRequestProto) GetRenewer() string {
+	if x != nil && x.Renewer != nil {
+		return *x.Renewer
+	}
+	return ""
+}
+
+type GetDelegationTokenResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Token *TokenProto `protobuf:"bytes,1,opt,name=token" json:"token,omitempty"`
+}
+
+func (x *GetDelegationTokenResponseProto) Reset() {
+	*x = GetDelegationTokenResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetDelegationTokenResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDelegationTokenResponseProto) ProtoMessage() {}
+
+func (x *GetDelegationTokenResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 GetDelegationTokenResponseProto.ProtoReflect.Descriptor instead.
+func (*GetDelegationTokenResponseProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetDelegationTokenResponseProto) GetToken() *TokenProto {
+	if x != nil {
+		return x.Token
+	}
+	return nil
+}
+
+type RenewDelegationTokenRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Token *TokenProto `protobuf:"bytes,1,req,name=token" json:"token,omitempty"`
+}
+
+func (x *RenewDelegationTokenRequestProto) Reset() {
+	*x = RenewDelegationTokenRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RenewDelegationTokenRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RenewDelegationTokenRequestProto) ProtoMessage() {}
+
+func (x *RenewDelegationTokenRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 RenewDelegationTokenRequestProto.ProtoReflect.Descriptor instead.
+func (*RenewDelegationTokenRequestProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *RenewDelegationTokenRequestProto) GetToken() *TokenProto {
+	if x != nil {
+		return x.Token
+	}
+	return nil
+}
+
+type RenewDelegationTokenResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	NewExpiryTime *uint64 `protobuf:"varint,1,req,name=newExpiryTime" json:"newExpiryTime,omitempty"`
+}
+
+func (x *RenewDelegationTokenResponseProto) Reset() {
+	*x = RenewDelegationTokenResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RenewDelegationTokenResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RenewDelegationTokenResponseProto) ProtoMessage() {}
+
+func (x *RenewDelegationTokenResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 RenewDelegationTokenResponseProto.ProtoReflect.Descriptor instead.
+func (*RenewDelegationTokenResponseProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *RenewDelegationTokenResponseProto) GetNewExpiryTime() uint64 {
+	if x != nil && x.NewExpiryTime != nil {
+		return *x.NewExpiryTime
+	}
+	return 0
+}
+
+type CancelDelegationTokenRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Token *TokenProto `protobuf:"bytes,1,req,name=token" json:"token,omitempty"`
+}
+
+func (x *CancelDelegationTokenRequestProto) Reset() {
+	*x = CancelDelegationTokenRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CancelDelegationTokenRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CancelDelegationTokenRequestProto) ProtoMessage() {}
+
+func (x *CancelDelegationTokenRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 CancelDelegationTokenRequestProto.ProtoReflect.Descriptor instead.
+func (*CancelDelegationTokenRequestProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *CancelDelegationTokenRequestProto) GetToken() *TokenProto {
+	if x != nil {
+		return x.Token
+	}
+	return nil
+}
+
+type CancelDelegationTokenResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CancelDelegationTokenResponseProto) Reset() {
+	*x = CancelDelegationTokenResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_Security_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CancelDelegationTokenResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CancelDelegationTokenResponseProto) ProtoMessage() {}
+
+func (x *CancelDelegationTokenResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_Security_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 CancelDelegationTokenResponseProto.ProtoReflect.Descriptor instead.
+func (*CancelDelegationTokenResponseProto) Descriptor() ([]byte, []int) {
+	return file_Security_proto_rawDescGZIP(), []int{8}
+}
+
+var File_Security_proto protoreflect.FileDescriptor
+
+var file_Security_proto_rawDesc = []byte{
+	0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x0d, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22,
+	0x76, 0x0a, 0x0a, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1e, 0x0a,
+	0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x02, 0x28,
+	0x0c, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1a, 0x0a,
+	0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0c, 0x52,
+	0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e,
+	0x64, 0x18, 0x03, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a,
+	0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x02, 0x28, 0x09, 0x52, 0x07,
+	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x73, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x65,
+	0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x4b, 0x56, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x0a,
+	0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c,
+	0x69, 0x61, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x19, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x74,
+	0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x8a, 0x01, 0x0a,
+	0x10, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x39, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x21, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+	0x6e, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x4b, 0x56, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x07,
+	0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e,
+	0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x72,
+	0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x4b, 0x56, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x1e, 0x47, 0x65, 0x74,
+	0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x72,
+	0x65, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65,
+	0x6e, 0x65, 0x77, 0x65, 0x72, 0x22, 0x52, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65,
+	0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2f, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65,
+	0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70,
+	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x53, 0x0a, 0x20, 0x52, 0x65, 0x6e,
+	0x65, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65,
+	0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2f, 0x0a,
+	0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x68,
+	0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x54, 0x6f, 0x6b,
+	0x65, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x49,
+	0x0a, 0x21, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79,
+	0x54, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x45,
+	0x78, 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x54, 0x0a, 0x21, 0x43, 0x61, 0x6e,
+	0x63, 0x65, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b,
+	0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2f,
+	0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+	0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x54, 0x6f,
+	0x6b, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22,
+	0x24, 0x0a, 0x22, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x6b, 0x0a, 0x26, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61,
+	0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x6f, 0x7a, 0x6f, 0x6e, 0x65,
+	0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42,
+	0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x5a,
+	0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63,
+	0x68, 0x65, 0x2f, 0x6f, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x67, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0xa0,
+	0x01, 0x01,
+}
+
+var (
+	file_Security_proto_rawDescOnce sync.Once
+	file_Security_proto_rawDescData = file_Security_proto_rawDesc
+)
+
+func file_Security_proto_rawDescGZIP() []byte {
+	file_Security_proto_rawDescOnce.Do(func() {
+		file_Security_proto_rawDescData = protoimpl.X.CompressGZIP(file_Security_proto_rawDescData)
+	})
+	return file_Security_proto_rawDescData
+}
+
+var file_Security_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_Security_proto_goTypes = []interface{}{
+	(*TokenProto)(nil),                         // 0: hadoop.common.TokenProto
+	(*CredentialsKVProto)(nil),                 // 1: hadoop.common.CredentialsKVProto
+	(*CredentialsProto)(nil),                   // 2: hadoop.common.CredentialsProto
+	(*GetDelegationTokenRequestProto)(nil),     // 3: hadoop.common.GetDelegationTokenRequestProto
+	(*GetDelegationTokenResponseProto)(nil),    // 4: hadoop.common.GetDelegationTokenResponseProto
+	(*RenewDelegationTokenRequestProto)(nil),   // 5: hadoop.common.RenewDelegationTokenRequestProto
+	(*RenewDelegationTokenResponseProto)(nil),  // 6: hadoop.common.RenewDelegationTokenResponseProto
+	(*CancelDelegationTokenRequestProto)(nil),  // 7: hadoop.common.CancelDelegationTokenRequestProto
+	(*CancelDelegationTokenResponseProto)(nil), // 8: hadoop.common.CancelDelegationTokenResponseProto
+}
+var file_Security_proto_depIdxs = []int32{
+	0, // 0: hadoop.common.CredentialsKVProto.token:type_name -> hadoop.common.TokenProto
+	1, // 1: hadoop.common.CredentialsProto.tokens:type_name -> hadoop.common.CredentialsKVProto
+	1, // 2: hadoop.common.CredentialsProto.secrets:type_name -> hadoop.common.CredentialsKVProto
+	0, // 3: hadoop.common.GetDelegationTokenResponseProto.token:type_name -> hadoop.common.TokenProto
+	0, // 4: hadoop.common.RenewDelegationTokenRequestProto.token:type_name -> hadoop.common.TokenProto
+	0, // 5: hadoop.common.CancelDelegationTokenRequestProto.token:type_name -> hadoop.common.TokenProto
+	6, // [6:6] is the sub-list for method output_type
+	6, // [6:6] is the sub-list for method input_type
+	6, // [6:6] is the sub-list for extension type_name
+	6, // [6:6] is the sub-list for extension extendee
+	0, // [0:6] is the sub-list for field type_name
+}
+
+func init() { file_Security_proto_init() }
+func file_Security_proto_init() {
+	if File_Security_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_Security_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TokenProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_Security_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CredentialsKVProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_Security_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CredentialsProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_Security_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetDelegationTokenRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_Security_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetDelegationTokenResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_Security_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RenewDelegationTokenRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_Security_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RenewDelegationTokenResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_Security_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CancelDelegationTokenRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_Security_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CancelDelegationTokenResponseProto); 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_Security_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   9,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_Security_proto_goTypes,
+		DependencyIndexes: file_Security_proto_depIdxs,
+		MessageInfos:      file_Security_proto_msgTypes,
+	}.Build()
+	File_Security_proto = out.File
+	file_Security_proto_rawDesc = nil
+	file_Security_proto_goTypes = nil
+	file_Security_proto_depIdxs = nil
+}
diff --git a/api/proto/datanode/DatanodeClientProtocol.pb.go b/api/proto/datanode/DatanodeClientProtocol.pb.go
new file mode 100644
index 0000000..7008fd5
--- /dev/null
+++ b/api/proto/datanode/DatanodeClientProtocol.pb.go
@@ -0,0 +1,4876 @@
+//*
+// Licensed to the 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.  The 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.
+
+//*
+// These .proto interfaces are private and Unstable.
+// Please see http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/InterfaceClassification.html
+// for what changes are allowed for a *Unstable* .proto interface.
+
+// This file contains protocol buffers that are used to transfer data
+// to and from the datanode.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.24.0
+// 	protoc        v3.15.6
+// source: DatanodeClientProtocol.proto
+
+package datanode
+
+import (
+	context "context"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type Type int32
+
+const (
+	Type_CreateContainer Type = 1
+	Type_ReadContainer   Type = 2
+	Type_UpdateContainer Type = 3
+	Type_DeleteContainer Type = 4
+	Type_ListContainer   Type = 5
+	Type_PutBlock        Type = 6
+	Type_GetBlock        Type = 7
+	Type_DeleteBlock     Type = 8
+	Type_ListBlock       Type = 9
+	Type_ReadChunk       Type = 10
+	Type_DeleteChunk     Type = 11
+	Type_WriteChunk      Type = 12
+	Type_ListChunk       Type = 13
+	Type_CompactChunk    Type = 14
+	//* Combines Block and Chunk Operation into Single RPC.
+	Type_PutSmallFile            Type = 15
+	Type_GetSmallFile            Type = 16
+	Type_CloseContainer          Type = 17
+	Type_GetCommittedBlockLength Type = 18
+)
+
+// Enum value maps for Type.
+var (
+	Type_name = map[int32]string{
+		1:  "CreateContainer",
+		2:  "ReadContainer",
+		3:  "UpdateContainer",
+		4:  "DeleteContainer",
+		5:  "ListContainer",
+		6:  "PutBlock",
+		7:  "GetBlock",
+		8:  "DeleteBlock",
+		9:  "ListBlock",
+		10: "ReadChunk",
+		11: "DeleteChunk",
+		12: "WriteChunk",
+		13: "ListChunk",
+		14: "CompactChunk",
+		15: "PutSmallFile",
+		16: "GetSmallFile",
+		17: "CloseContainer",
+		18: "GetCommittedBlockLength",
+	}
+	Type_value = map[string]int32{
+		"CreateContainer":         1,
+		"ReadContainer":           2,
+		"UpdateContainer":         3,
+		"DeleteContainer":         4,
+		"ListContainer":           5,
+		"PutBlock":                6,
+		"GetBlock":                7,
+		"DeleteBlock":             8,
+		"ListBlock":               9,
+		"ReadChunk":               10,
+		"DeleteChunk":             11,
+		"WriteChunk":              12,
+		"ListChunk":               13,
+		"CompactChunk":            14,
+		"PutSmallFile":            15,
+		"GetSmallFile":            16,
+		"CloseContainer":          17,
+		"GetCommittedBlockLength": 18,
+	}
+)
+
+func (x Type) Enum() *Type {
+	p := new(Type)
+	*p = x
+	return p
+}
+
+func (x Type) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_DatanodeClientProtocol_proto_enumTypes[0].Descriptor()
+}
+
+func (Type) Type() protoreflect.EnumType {
+	return &file_DatanodeClientProtocol_proto_enumTypes[0]
+}
+
+func (x Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Type) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = Type(num)
+	return nil
+}
+
+// Deprecated: Use Type.Descriptor instead.
+func (Type) EnumDescriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{0}
+}
+
+type Result int32
+
+const (
+	Result_SUCCESS                         Result = 1
+	Result_UNSUPPORTED_REQUEST             Result = 2
+	Result_MALFORMED_REQUEST               Result = 3
+	Result_CONTAINER_INTERNAL_ERROR        Result = 4
+	Result_INVALID_CONFIG                  Result = 5
+	Result_INVALID_FILE_HASH_FOUND         Result = 6
+	Result_CONTAINER_EXISTS                Result = 7
+	Result_NO_SUCH_ALGORITHM               Result = 8
+	Result_CONTAINER_NOT_FOUND             Result = 9
+	Result_IO_EXCEPTION                    Result = 10
+	Result_UNABLE_TO_READ_METADATA_DB      Result = 11
+	Result_NO_SUCH_BLOCK                   Result = 12
+	Result_OVERWRITE_FLAG_REQUIRED         Result = 13
+	Result_UNABLE_TO_FIND_DATA_DIR         Result = 14
+	Result_INVALID_WRITE_SIZE              Result = 15
+	Result_CHECKSUM_MISMATCH               Result = 16
+	Result_UNABLE_TO_FIND_CHUNK            Result = 17
+	Result_PROTOC_DECODING_ERROR           Result = 18
+	Result_INVALID_ARGUMENT                Result = 19
+	Result_PUT_SMALL_FILE_ERROR            Result = 20
+	Result_GET_SMALL_FILE_ERROR            Result = 21
+	Result_CLOSED_CONTAINER_IO             Result = 22
+	Result_ERROR_IN_COMPACT_DB             Result = 24
+	Result_UNCLOSED_CONTAINER_IO           Result = 25
+	Result_DELETE_ON_OPEN_CONTAINER        Result = 26
+	Result_CLOSED_CONTAINER_RETRY          Result = 27
+	Result_INVALID_CONTAINER_STATE         Result = 28
+	Result_DISK_OUT_OF_SPACE               Result = 29
+	Result_CONTAINER_ALREADY_EXISTS        Result = 30
+	Result_CONTAINER_METADATA_ERROR        Result = 31
+	Result_CONTAINER_FILES_CREATE_ERROR    Result = 32
+	Result_CONTAINER_CHECKSUM_ERROR        Result = 33
+	Result_UNKNOWN_CONTAINER_TYPE          Result = 34
+	Result_BLOCK_NOT_COMMITTED             Result = 35
+	Result_CONTAINER_UNHEALTHY             Result = 36
+	Result_UNKNOWN_BCSID                   Result = 37
+	Result_BCSID_MISMATCH                  Result = 38
+	Result_CONTAINER_NOT_OPEN              Result = 39
+	Result_CONTAINER_MISSING               Result = 40
+	Result_BLOCK_TOKEN_VERIFICATION_FAILED Result = 41
+	Result_ERROR_IN_DB_SYNC                Result = 42
+)
+
+// Enum value maps for Result.
+var (
+	Result_name = map[int32]string{
+		1:  "SUCCESS",
+		2:  "UNSUPPORTED_REQUEST",
+		3:  "MALFORMED_REQUEST",
+		4:  "CONTAINER_INTERNAL_ERROR",
+		5:  "INVALID_CONFIG",
+		6:  "INVALID_FILE_HASH_FOUND",
+		7:  "CONTAINER_EXISTS",
+		8:  "NO_SUCH_ALGORITHM",
+		9:  "CONTAINER_NOT_FOUND",
+		10: "IO_EXCEPTION",
+		11: "UNABLE_TO_READ_METADATA_DB",
+		12: "NO_SUCH_BLOCK",
+		13: "OVERWRITE_FLAG_REQUIRED",
+		14: "UNABLE_TO_FIND_DATA_DIR",
+		15: "INVALID_WRITE_SIZE",
+		16: "CHECKSUM_MISMATCH",
+		17: "UNABLE_TO_FIND_CHUNK",
+		18: "PROTOC_DECODING_ERROR",
+		19: "INVALID_ARGUMENT",
+		20: "PUT_SMALL_FILE_ERROR",
+		21: "GET_SMALL_FILE_ERROR",
+		22: "CLOSED_CONTAINER_IO",
+		24: "ERROR_IN_COMPACT_DB",
+		25: "UNCLOSED_CONTAINER_IO",
+		26: "DELETE_ON_OPEN_CONTAINER",
+		27: "CLOSED_CONTAINER_RETRY",
+		28: "INVALID_CONTAINER_STATE",
+		29: "DISK_OUT_OF_SPACE",
+		30: "CONTAINER_ALREADY_EXISTS",
+		31: "CONTAINER_METADATA_ERROR",
+		32: "CONTAINER_FILES_CREATE_ERROR",
+		33: "CONTAINER_CHECKSUM_ERROR",
+		34: "UNKNOWN_CONTAINER_TYPE",
+		35: "BLOCK_NOT_COMMITTED",
+		36: "CONTAINER_UNHEALTHY",
+		37: "UNKNOWN_BCSID",
+		38: "BCSID_MISMATCH",
+		39: "CONTAINER_NOT_OPEN",
+		40: "CONTAINER_MISSING",
+		41: "BLOCK_TOKEN_VERIFICATION_FAILED",
+		42: "ERROR_IN_DB_SYNC",
+	}
+	Result_value = map[string]int32{
+		"SUCCESS":                         1,
+		"UNSUPPORTED_REQUEST":             2,
+		"MALFORMED_REQUEST":               3,
+		"CONTAINER_INTERNAL_ERROR":        4,
+		"INVALID_CONFIG":                  5,
+		"INVALID_FILE_HASH_FOUND":         6,
+		"CONTAINER_EXISTS":                7,
+		"NO_SUCH_ALGORITHM":               8,
+		"CONTAINER_NOT_FOUND":             9,
+		"IO_EXCEPTION":                    10,
+		"UNABLE_TO_READ_METADATA_DB":      11,
+		"NO_SUCH_BLOCK":                   12,
+		"OVERWRITE_FLAG_REQUIRED":         13,
+		"UNABLE_TO_FIND_DATA_DIR":         14,
+		"INVALID_WRITE_SIZE":              15,
+		"CHECKSUM_MISMATCH":               16,
+		"UNABLE_TO_FIND_CHUNK":            17,
+		"PROTOC_DECODING_ERROR":           18,
+		"INVALID_ARGUMENT":                19,
+		"PUT_SMALL_FILE_ERROR":            20,
+		"GET_SMALL_FILE_ERROR":            21,
+		"CLOSED_CONTAINER_IO":             22,
+		"ERROR_IN_COMPACT_DB":             24,
+		"UNCLOSED_CONTAINER_IO":           25,
+		"DELETE_ON_OPEN_CONTAINER":        26,
+		"CLOSED_CONTAINER_RETRY":          27,
+		"INVALID_CONTAINER_STATE":         28,
+		"DISK_OUT_OF_SPACE":               29,
+		"CONTAINER_ALREADY_EXISTS":        30,
+		"CONTAINER_METADATA_ERROR":        31,
+		"CONTAINER_FILES_CREATE_ERROR":    32,
+		"CONTAINER_CHECKSUM_ERROR":        33,
+		"UNKNOWN_CONTAINER_TYPE":          34,
+		"BLOCK_NOT_COMMITTED":             35,
+		"CONTAINER_UNHEALTHY":             36,
+		"UNKNOWN_BCSID":                   37,
+		"BCSID_MISMATCH":                  38,
+		"CONTAINER_NOT_OPEN":              39,
+		"CONTAINER_MISSING":               40,
+		"BLOCK_TOKEN_VERIFICATION_FAILED": 41,
+		"ERROR_IN_DB_SYNC":                42,
+	}
+)
+
+func (x Result) Enum() *Result {
+	p := new(Result)
+	*p = x
+	return p
+}
+
+func (x Result) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Result) Descriptor() protoreflect.EnumDescriptor {
+	return file_DatanodeClientProtocol_proto_enumTypes[1].Descriptor()
+}
+
+func (Result) Type() protoreflect.EnumType {
+	return &file_DatanodeClientProtocol_proto_enumTypes[1]
+}
+
+func (x Result) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Result) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = Result(num)
+	return nil
+}
+
+// Deprecated: Use Result.Descriptor instead.
+func (Result) EnumDescriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{1}
+}
+
+type ContainerType int32
+
+const (
+	ContainerType_KeyValueContainer ContainerType = 1
+)
+
+// Enum value maps for ContainerType.
+var (
+	ContainerType_name = map[int32]string{
+		1: "KeyValueContainer",
+	}
+	ContainerType_value = map[string]int32{
+		"KeyValueContainer": 1,
+	}
+)
+
+func (x ContainerType) Enum() *ContainerType {
+	p := new(ContainerType)
+	*p = x
+	return p
+}
+
+func (x ContainerType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ContainerType) Descriptor() protoreflect.EnumDescriptor {
+	return file_DatanodeClientProtocol_proto_enumTypes[2].Descriptor()
+}
+
+func (ContainerType) Type() protoreflect.EnumType {
+	return &file_DatanodeClientProtocol_proto_enumTypes[2]
+}
+
+func (x ContainerType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *ContainerType) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = ContainerType(num)
+	return nil
+}
+
+// Deprecated: Use ContainerType.Descriptor instead.
+func (ContainerType) EnumDescriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{2}
+}
+
+type ChecksumType int32
+
+const (
+	ChecksumType_NONE   ChecksumType = 1
+	ChecksumType_CRC32  ChecksumType = 2
+	ChecksumType_CRC32C ChecksumType = 3
+	ChecksumType_SHA256 ChecksumType = 4
+	ChecksumType_MD5    ChecksumType = 5
+)
+
+// Enum value maps for ChecksumType.
+var (
+	ChecksumType_name = map[int32]string{
+		1: "NONE",
+		2: "CRC32",
+		3: "CRC32C",
+		4: "SHA256",
+		5: "MD5",
+	}
+	ChecksumType_value = map[string]int32{
+		"NONE":   1,
+		"CRC32":  2,
+		"CRC32C": 3,
+		"SHA256": 4,
+		"MD5":    5,
+	}
+)
+
+func (x ChecksumType) Enum() *ChecksumType {
+	p := new(ChecksumType)
+	*p = x
+	return p
+}
+
+func (x ChecksumType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ChecksumType) Descriptor() protoreflect.EnumDescriptor {
+	return file_DatanodeClientProtocol_proto_enumTypes[3].Descriptor()
+}
+
+func (ChecksumType) Type() protoreflect.EnumType {
+	return &file_DatanodeClientProtocol_proto_enumTypes[3]
+}
+
+func (x ChecksumType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *ChecksumType) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = ChecksumType(num)
+	return nil
+}
+
+// Deprecated: Use ChecksumType.Descriptor instead.
+func (ChecksumType) EnumDescriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{3}
+}
+
+type ContainerDataProto_State int32
+
+const (
+	ContainerDataProto_OPEN         ContainerDataProto_State = 1
+	ContainerDataProto_CLOSING      ContainerDataProto_State = 2
+	ContainerDataProto_QUASI_CLOSED ContainerDataProto_State = 3
+	ContainerDataProto_CLOSED       ContainerDataProto_State = 4
+	ContainerDataProto_UNHEALTHY    ContainerDataProto_State = 5
+	ContainerDataProto_INVALID      ContainerDataProto_State = 6
+	ContainerDataProto_DELETED      ContainerDataProto_State = 7
+)
+
+// Enum value maps for ContainerDataProto_State.
+var (
+	ContainerDataProto_State_name = map[int32]string{
+		1: "OPEN",
+		2: "CLOSING",
+		3: "QUASI_CLOSED",
+		4: "CLOSED",
+		5: "UNHEALTHY",
+		6: "INVALID",
+		7: "DELETED",
+	}
+	ContainerDataProto_State_value = map[string]int32{
+		"OPEN":         1,
+		"CLOSING":      2,
+		"QUASI_CLOSED": 3,
+		"CLOSED":       4,
+		"UNHEALTHY":    5,
+		"INVALID":      6,
+		"DELETED":      7,
+	}
+)
+
+func (x ContainerDataProto_State) Enum() *ContainerDataProto_State {
+	p := new(ContainerDataProto_State)
+	*p = x
+	return p
+}
+
+func (x ContainerDataProto_State) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ContainerDataProto_State) Descriptor() protoreflect.EnumDescriptor {
+	return file_DatanodeClientProtocol_proto_enumTypes[4].Descriptor()
+}
+
+func (ContainerDataProto_State) Type() protoreflect.EnumType {
+	return &file_DatanodeClientProtocol_proto_enumTypes[4]
+}
+
+func (x ContainerDataProto_State) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *ContainerDataProto_State) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = ContainerDataProto_State(num)
+	return nil
+}
+
+// Deprecated: Use ContainerDataProto_State.Descriptor instead.
+func (ContainerDataProto_State) EnumDescriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{4, 0}
+}
+
+//*
+// Block ID that uniquely identify a block in Datanode.
+type DatanodeBlockID struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerID           *int64  `protobuf:"varint,1,req,name=containerID" json:"containerID,omitempty"`
+	LocalID               *int64  `protobuf:"varint,2,req,name=localID" json:"localID,omitempty"`
+	BlockCommitSequenceId *uint64 `protobuf:"varint,3,opt,name=blockCommitSequenceId,def=0" json:"blockCommitSequenceId,omitempty"`
+}
+
+// Default values for DatanodeBlockID fields.
+const (
+	Default_DatanodeBlockID_BlockCommitSequenceId = uint64(0)
+)
+
+func (x *DatanodeBlockID) Reset() {
+	*x = DatanodeBlockID{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DatanodeBlockID) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DatanodeBlockID) ProtoMessage() {}
+
+func (x *DatanodeBlockID) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 DatanodeBlockID.ProtoReflect.Descriptor instead.
+func (*DatanodeBlockID) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *DatanodeBlockID) GetContainerID() int64 {
+	if x != nil && x.ContainerID != nil {
+		return *x.ContainerID
+	}
+	return 0
+}
+
+func (x *DatanodeBlockID) GetLocalID() int64 {
+	if x != nil && x.LocalID != nil {
+		return *x.LocalID
+	}
+	return 0
+}
+
+func (x *DatanodeBlockID) GetBlockCommitSequenceId() uint64 {
+	if x != nil && x.BlockCommitSequenceId != nil {
+		return *x.BlockCommitSequenceId
+	}
+	return Default_DatanodeBlockID_BlockCommitSequenceId
+}
+
+type KeyValue struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Key   *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"`
+	Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
+}
+
+func (x *KeyValue) Reset() {
+	*x = KeyValue{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *KeyValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KeyValue) ProtoMessage() {}
+
+func (x *KeyValue) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 KeyValue.ProtoReflect.Descriptor instead.
+func (*KeyValue) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *KeyValue) GetKey() string {
+	if x != nil && x.Key != nil {
+		return *x.Key
+	}
+	return ""
+}
+
+func (x *KeyValue) GetValue() string {
+	if x != nil && x.Value != nil {
+		return *x.Value
+	}
+	return ""
+}
+
+type ContainerCommandRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CmdType *Type `protobuf:"varint,1,req,name=cmdType,enum=hadoop.hdds.datanode.Type" json:"cmdType,omitempty"` // Type of the command
+	// A string that identifies this command, we generate  Trace ID in Ozone
+	// frontend and this allows us to trace that command all over ozone.
+	TraceID      *string `protobuf:"bytes,2,opt,name=traceID" json:"traceID,omitempty"`
+	ContainerID  *int64  `protobuf:"varint,3,req,name=containerID" json:"containerID,omitempty"`
+	DatanodeUuid *string `protobuf:"bytes,4,req,name=datanodeUuid" json:"datanodeUuid,omitempty"`
+	PipelineID   *string `protobuf:"bytes,5,opt,name=pipelineID" json:"pipelineID,omitempty"`
+	// One of the following command is available when the corresponding
+	// cmdType is set. At the protocol level we allow only
+	// one command in each packet.
+	// TODO : Upgrade to Protobuf 2.6 or later.
+	CreateContainer         *CreateContainerRequestProto         `protobuf:"bytes,6,opt,name=createContainer" json:"createContainer,omitempty"`
+	ReadContainer           *ReadContainerRequestProto           `protobuf:"bytes,7,opt,name=readContainer" json:"readContainer,omitempty"`
+	UpdateContainer         *UpdateContainerRequestProto         `protobuf:"bytes,8,opt,name=updateContainer" json:"updateContainer,omitempty"`
+	DeleteContainer         *DeleteContainerRequestProto         `protobuf:"bytes,9,opt,name=deleteContainer" json:"deleteContainer,omitempty"`
+	ListContainer           *ListContainerRequestProto           `protobuf:"bytes,10,opt,name=listContainer" json:"listContainer,omitempty"`
+	CloseContainer          *CloseContainerRequestProto          `protobuf:"bytes,11,opt,name=closeContainer" json:"closeContainer,omitempty"`
+	PutBlock                *PutBlockRequestProto                `protobuf:"bytes,12,opt,name=putBlock" json:"putBlock,omitempty"`
+	GetBlock                *GetBlockRequestProto                `protobuf:"bytes,13,opt,name=getBlock" json:"getBlock,omitempty"`
+	DeleteBlock             *DeleteBlockRequestProto             `protobuf:"bytes,14,opt,name=deleteBlock" json:"deleteBlock,omitempty"`
+	ListBlock               *ListBlockRequestProto               `protobuf:"bytes,15,opt,name=listBlock" json:"listBlock,omitempty"`
+	ReadChunk               *ReadChunkRequestProto               `protobuf:"bytes,16,opt,name=readChunk" json:"readChunk,omitempty"`
+	WriteChunk              *WriteChunkRequestProto              `protobuf:"bytes,17,opt,name=writeChunk" json:"writeChunk,omitempty"`
+	DeleteChunk             *DeleteChunkRequestProto             `protobuf:"bytes,18,opt,name=deleteChunk" json:"deleteChunk,omitempty"`
+	ListChunk               *ListChunkRequestProto               `protobuf:"bytes,19,opt,name=listChunk" json:"listChunk,omitempty"`
+	PutSmallFile            *PutSmallFileRequestProto            `protobuf:"bytes,20,opt,name=putSmallFile" json:"putSmallFile,omitempty"`
+	GetSmallFile            *GetSmallFileRequestProto            `protobuf:"bytes,21,opt,name=getSmallFile" json:"getSmallFile,omitempty"`
+	GetCommittedBlockLength *GetCommittedBlockLengthRequestProto `protobuf:"bytes,22,opt,name=getCommittedBlockLength" json:"getCommittedBlockLength,omitempty"`
+	EncodedToken            *string                              `protobuf:"bytes,23,opt,name=encodedToken" json:"encodedToken,omitempty"`
+}
+
+func (x *ContainerCommandRequestProto) Reset() {
+	*x = ContainerCommandRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ContainerCommandRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContainerCommandRequestProto) ProtoMessage() {}
+
+func (x *ContainerCommandRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ContainerCommandRequestProto.ProtoReflect.Descriptor instead.
+func (*ContainerCommandRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ContainerCommandRequestProto) GetCmdType() Type {
+	if x != nil && x.CmdType != nil {
+		return *x.CmdType
+	}
+	return Type_CreateContainer
+}
+
+func (x *ContainerCommandRequestProto) GetTraceID() string {
+	if x != nil && x.TraceID != nil {
+		return *x.TraceID
+	}
+	return ""
+}
+
+func (x *ContainerCommandRequestProto) GetContainerID() int64 {
+	if x != nil && x.ContainerID != nil {
+		return *x.ContainerID
+	}
+	return 0
+}
+
+func (x *ContainerCommandRequestProto) GetDatanodeUuid() string {
+	if x != nil && x.DatanodeUuid != nil {
+		return *x.DatanodeUuid
+	}
+	return ""
+}
+
+func (x *ContainerCommandRequestProto) GetPipelineID() string {
+	if x != nil && x.PipelineID != nil {
+		return *x.PipelineID
+	}
+	return ""
+}
+
+func (x *ContainerCommandRequestProto) GetCreateContainer() *CreateContainerRequestProto {
+	if x != nil {
+		return x.CreateContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetReadContainer() *ReadContainerRequestProto {
+	if x != nil {
+		return x.ReadContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetUpdateContainer() *UpdateContainerRequestProto {
+	if x != nil {
+		return x.UpdateContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetDeleteContainer() *DeleteContainerRequestProto {
+	if x != nil {
+		return x.DeleteContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetListContainer() *ListContainerRequestProto {
+	if x != nil {
+		return x.ListContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetCloseContainer() *CloseContainerRequestProto {
+	if x != nil {
+		return x.CloseContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetPutBlock() *PutBlockRequestProto {
+	if x != nil {
+		return x.PutBlock
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetGetBlock() *GetBlockRequestProto {
+	if x != nil {
+		return x.GetBlock
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetDeleteBlock() *DeleteBlockRequestProto {
+	if x != nil {
+		return x.DeleteBlock
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetListBlock() *ListBlockRequestProto {
+	if x != nil {
+		return x.ListBlock
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetReadChunk() *ReadChunkRequestProto {
+	if x != nil {
+		return x.ReadChunk
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetWriteChunk() *WriteChunkRequestProto {
+	if x != nil {
+		return x.WriteChunk
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetDeleteChunk() *DeleteChunkRequestProto {
+	if x != nil {
+		return x.DeleteChunk
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetListChunk() *ListChunkRequestProto {
+	if x != nil {
+		return x.ListChunk
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetPutSmallFile() *PutSmallFileRequestProto {
+	if x != nil {
+		return x.PutSmallFile
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetGetSmallFile() *GetSmallFileRequestProto {
+	if x != nil {
+		return x.GetSmallFile
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetGetCommittedBlockLength() *GetCommittedBlockLengthRequestProto {
+	if x != nil {
+		return x.GetCommittedBlockLength
+	}
+	return nil
+}
+
+func (x *ContainerCommandRequestProto) GetEncodedToken() string {
+	if x != nil && x.EncodedToken != nil {
+		return *x.EncodedToken
+	}
+	return ""
+}
+
+type ContainerCommandResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CmdType                 *Type                                 `protobuf:"varint,1,req,name=cmdType,enum=hadoop.hdds.datanode.Type" json:"cmdType,omitempty"`
+	TraceID                 *string                               `protobuf:"bytes,2,opt,name=traceID" json:"traceID,omitempty"`
+	Result                  *Result                               `protobuf:"varint,3,req,name=result,enum=hadoop.hdds.datanode.Result" json:"result,omitempty"`
+	Message                 *string                               `protobuf:"bytes,4,opt,name=message" json:"message,omitempty"`
+	CreateContainer         *CreateContainerResponseProto         `protobuf:"bytes,5,opt,name=createContainer" json:"createContainer,omitempty"`
+	ReadContainer           *ReadContainerResponseProto           `protobuf:"bytes,6,opt,name=readContainer" json:"readContainer,omitempty"`
+	UpdateContainer         *UpdateContainerResponseProto         `protobuf:"bytes,7,opt,name=updateContainer" json:"updateContainer,omitempty"`
+	DeleteContainer         *DeleteContainerResponseProto         `protobuf:"bytes,8,opt,name=deleteContainer" json:"deleteContainer,omitempty"`
+	ListContainer           *ListContainerResponseProto           `protobuf:"bytes,9,opt,name=listContainer" json:"listContainer,omitempty"`
+	CloseContainer          *CloseContainerResponseProto          `protobuf:"bytes,10,opt,name=closeContainer" json:"closeContainer,omitempty"`
+	PutBlock                *PutBlockResponseProto                `protobuf:"bytes,11,opt,name=putBlock" json:"putBlock,omitempty"`
+	GetBlock                *GetBlockResponseProto                `protobuf:"bytes,12,opt,name=getBlock" json:"getBlock,omitempty"`
+	DeleteBlock             *DeleteBlockResponseProto             `protobuf:"bytes,13,opt,name=deleteBlock" json:"deleteBlock,omitempty"`
+	ListBlock               *ListBlockResponseProto               `protobuf:"bytes,14,opt,name=listBlock" json:"listBlock,omitempty"`
+	WriteChunk              *WriteChunkResponseProto              `protobuf:"bytes,15,opt,name=writeChunk" json:"writeChunk,omitempty"`
+	ReadChunk               *ReadChunkResponseProto               `protobuf:"bytes,16,opt,name=readChunk" json:"readChunk,omitempty"`
+	DeleteChunk             *DeleteChunkResponseProto             `protobuf:"bytes,17,opt,name=deleteChunk" json:"deleteChunk,omitempty"`
+	ListChunk               *ListChunkResponseProto               `protobuf:"bytes,18,opt,name=listChunk" json:"listChunk,omitempty"`
+	PutSmallFile            *PutSmallFileResponseProto            `protobuf:"bytes,19,opt,name=putSmallFile" json:"putSmallFile,omitempty"`
+	GetSmallFile            *GetSmallFileResponseProto            `protobuf:"bytes,20,opt,name=getSmallFile" json:"getSmallFile,omitempty"`
+	GetCommittedBlockLength *GetCommittedBlockLengthResponseProto `protobuf:"bytes,21,opt,name=getCommittedBlockLength" json:"getCommittedBlockLength,omitempty"`
+}
+
+func (x *ContainerCommandResponseProto) Reset() {
+	*x = ContainerCommandResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ContainerCommandResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContainerCommandResponseProto) ProtoMessage() {}
+
+func (x *ContainerCommandResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ContainerCommandResponseProto.ProtoReflect.Descriptor instead.
+func (*ContainerCommandResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ContainerCommandResponseProto) GetCmdType() Type {
+	if x != nil && x.CmdType != nil {
+		return *x.CmdType
+	}
+	return Type_CreateContainer
+}
+
+func (x *ContainerCommandResponseProto) GetTraceID() string {
+	if x != nil && x.TraceID != nil {
+		return *x.TraceID
+	}
+	return ""
+}
+
+func (x *ContainerCommandResponseProto) GetResult() Result {
+	if x != nil && x.Result != nil {
+		return *x.Result
+	}
+	return Result_SUCCESS
+}
+
+func (x *ContainerCommandResponseProto) GetMessage() string {
+	if x != nil && x.Message != nil {
+		return *x.Message
+	}
+	return ""
+}
+
+func (x *ContainerCommandResponseProto) GetCreateContainer() *CreateContainerResponseProto {
+	if x != nil {
+		return x.CreateContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetReadContainer() *ReadContainerResponseProto {
+	if x != nil {
+		return x.ReadContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetUpdateContainer() *UpdateContainerResponseProto {
+	if x != nil {
+		return x.UpdateContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetDeleteContainer() *DeleteContainerResponseProto {
+	if x != nil {
+		return x.DeleteContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetListContainer() *ListContainerResponseProto {
+	if x != nil {
+		return x.ListContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetCloseContainer() *CloseContainerResponseProto {
+	if x != nil {
+		return x.CloseContainer
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetPutBlock() *PutBlockResponseProto {
+	if x != nil {
+		return x.PutBlock
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetGetBlock() *GetBlockResponseProto {
+	if x != nil {
+		return x.GetBlock
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetDeleteBlock() *DeleteBlockResponseProto {
+	if x != nil {
+		return x.DeleteBlock
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetListBlock() *ListBlockResponseProto {
+	if x != nil {
+		return x.ListBlock
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetWriteChunk() *WriteChunkResponseProto {
+	if x != nil {
+		return x.WriteChunk
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetReadChunk() *ReadChunkResponseProto {
+	if x != nil {
+		return x.ReadChunk
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetDeleteChunk() *DeleteChunkResponseProto {
+	if x != nil {
+		return x.DeleteChunk
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetListChunk() *ListChunkResponseProto {
+	if x != nil {
+		return x.ListChunk
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetPutSmallFile() *PutSmallFileResponseProto {
+	if x != nil {
+		return x.PutSmallFile
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetGetSmallFile() *GetSmallFileResponseProto {
+	if x != nil {
+		return x.GetSmallFile
+	}
+	return nil
+}
+
+func (x *ContainerCommandResponseProto) GetGetCommittedBlockLength() *GetCommittedBlockLengthResponseProto {
+	if x != nil {
+		return x.GetCommittedBlockLength
+	}
+	return nil
+}
+
+type ContainerDataProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerID   *int64                    `protobuf:"varint,1,req,name=containerID" json:"containerID,omitempty"`
+	Metadata      []*KeyValue               `protobuf:"bytes,2,rep,name=metadata" json:"metadata,omitempty"`
+	ContainerPath *string                   `protobuf:"bytes,4,opt,name=containerPath" json:"containerPath,omitempty"`
+	BytesUsed     *int64                    `protobuf:"varint,6,opt,name=bytesUsed" json:"bytesUsed,omitempty"`
+	Size          *int64                    `protobuf:"varint,7,opt,name=size" json:"size,omitempty"`
+	BlockCount    *int64                    `protobuf:"varint,8,opt,name=blockCount" json:"blockCount,omitempty"`
+	State         *ContainerDataProto_State `protobuf:"varint,9,opt,name=state,enum=hadoop.hdds.datanode.ContainerDataProto_State,def=1" json:"state,omitempty"`
+	ContainerType *ContainerType            `protobuf:"varint,10,opt,name=containerType,enum=hadoop.hdds.datanode.ContainerType,def=1" json:"containerType,omitempty"`
+}
+
+// Default values for ContainerDataProto fields.
+const (
+	Default_ContainerDataProto_State         = ContainerDataProto_OPEN
+	Default_ContainerDataProto_ContainerType = ContainerType_KeyValueContainer
+)
+
+func (x *ContainerDataProto) Reset() {
+	*x = ContainerDataProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ContainerDataProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContainerDataProto) ProtoMessage() {}
+
+func (x *ContainerDataProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ContainerDataProto.ProtoReflect.Descriptor instead.
+func (*ContainerDataProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *ContainerDataProto) GetContainerID() int64 {
+	if x != nil && x.ContainerID != nil {
+		return *x.ContainerID
+	}
+	return 0
+}
+
+func (x *ContainerDataProto) GetMetadata() []*KeyValue {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *ContainerDataProto) GetContainerPath() string {
+	if x != nil && x.ContainerPath != nil {
+		return *x.ContainerPath
+	}
+	return ""
+}
+
+func (x *ContainerDataProto) GetBytesUsed() int64 {
+	if x != nil && x.BytesUsed != nil {
+		return *x.BytesUsed
+	}
+	return 0
+}
+
+func (x *ContainerDataProto) GetSize() int64 {
+	if x != nil && x.Size != nil {
+		return *x.Size
+	}
+	return 0
+}
+
+func (x *ContainerDataProto) GetBlockCount() int64 {
+	if x != nil && x.BlockCount != nil {
+		return *x.BlockCount
+	}
+	return 0
+}
+
+func (x *ContainerDataProto) GetState() ContainerDataProto_State {
+	if x != nil && x.State != nil {
+		return *x.State
+	}
+	return Default_ContainerDataProto_State
+}
+
+func (x *ContainerDataProto) GetContainerType() ContainerType {
+	if x != nil && x.ContainerType != nil {
+		return *x.ContainerType
+	}
+	return Default_ContainerDataProto_ContainerType
+}
+
+type Container2BCSIDMapProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// repeated Container2BCSIDMapEntryProto container2BCSID = 1;
+	Container2BCSID map[int64]int64 `protobuf:"bytes,1,rep,name=container2BCSID" json:"container2BCSID,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
+}
+
+func (x *Container2BCSIDMapProto) Reset() {
+	*x = Container2BCSIDMapProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Container2BCSIDMapProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Container2BCSIDMapProto) ProtoMessage() {}
+
+func (x *Container2BCSIDMapProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 Container2BCSIDMapProto.ProtoReflect.Descriptor instead.
+func (*Container2BCSIDMapProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *Container2BCSIDMapProto) GetContainer2BCSID() map[int64]int64 {
+	if x != nil {
+		return x.Container2BCSID
+	}
+	return nil
+}
+
+// Container Messages.
+type CreateContainerRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata      []*KeyValue    `protobuf:"bytes,2,rep,name=metadata" json:"metadata,omitempty"`
+	ContainerType *ContainerType `protobuf:"varint,3,opt,name=containerType,enum=hadoop.hdds.datanode.ContainerType,def=1" json:"containerType,omitempty"`
+}
+
+// Default values for CreateContainerRequestProto fields.
+const (
+	Default_CreateContainerRequestProto_ContainerType = ContainerType_KeyValueContainer
+)
+
+func (x *CreateContainerRequestProto) Reset() {
+	*x = CreateContainerRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateContainerRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateContainerRequestProto) ProtoMessage() {}
+
+func (x *CreateContainerRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 CreateContainerRequestProto.ProtoReflect.Descriptor instead.
+func (*CreateContainerRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *CreateContainerRequestProto) GetMetadata() []*KeyValue {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *CreateContainerRequestProto) GetContainerType() ContainerType {
+	if x != nil && x.ContainerType != nil {
+		return *x.ContainerType
+	}
+	return Default_CreateContainerRequestProto_ContainerType
+}
+
+type CreateContainerResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CreateContainerResponseProto) Reset() {
+	*x = CreateContainerResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateContainerResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateContainerResponseProto) ProtoMessage() {}
+
+func (x *CreateContainerResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 CreateContainerResponseProto.ProtoReflect.Descriptor instead.
+func (*CreateContainerResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{7}
+}
+
+type ReadContainerRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ReadContainerRequestProto) Reset() {
+	*x = ReadContainerRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReadContainerRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReadContainerRequestProto) ProtoMessage() {}
+
+func (x *ReadContainerRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ReadContainerRequestProto.ProtoReflect.Descriptor instead.
+func (*ReadContainerRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{8}
+}
+
+type ReadContainerResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerData *ContainerDataProto `protobuf:"bytes,1,opt,name=containerData" json:"containerData,omitempty"`
+}
+
+func (x *ReadContainerResponseProto) Reset() {
+	*x = ReadContainerResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReadContainerResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReadContainerResponseProto) ProtoMessage() {}
+
+func (x *ReadContainerResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ReadContainerResponseProto.ProtoReflect.Descriptor instead.
+func (*ReadContainerResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *ReadContainerResponseProto) GetContainerData() *ContainerDataProto {
+	if x != nil {
+		return x.ContainerData
+	}
+	return nil
+}
+
+type UpdateContainerRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Metadata    []*KeyValue `protobuf:"bytes,2,rep,name=metadata" json:"metadata,omitempty"`
+	ForceUpdate *bool       `protobuf:"varint,3,opt,name=forceUpdate,def=0" json:"forceUpdate,omitempty"`
+}
+
+// Default values for UpdateContainerRequestProto fields.
+const (
+	Default_UpdateContainerRequestProto_ForceUpdate = bool(false)
+)
+
+func (x *UpdateContainerRequestProto) Reset() {
+	*x = UpdateContainerRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateContainerRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateContainerRequestProto) ProtoMessage() {}
+
+func (x *UpdateContainerRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 UpdateContainerRequestProto.ProtoReflect.Descriptor instead.
+func (*UpdateContainerRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *UpdateContainerRequestProto) GetMetadata() []*KeyValue {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *UpdateContainerRequestProto) GetForceUpdate() bool {
+	if x != nil && x.ForceUpdate != nil {
+		return *x.ForceUpdate
+	}
+	return Default_UpdateContainerRequestProto_ForceUpdate
+}
+
+type UpdateContainerResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UpdateContainerResponseProto) Reset() {
+	*x = UpdateContainerResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateContainerResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateContainerResponseProto) ProtoMessage() {}
+
+func (x *UpdateContainerResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 UpdateContainerResponseProto.ProtoReflect.Descriptor instead.
+func (*UpdateContainerResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{11}
+}
+
+type DeleteContainerRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ForceDelete *bool `protobuf:"varint,2,opt,name=forceDelete,def=0" json:"forceDelete,omitempty"`
+}
+
+// Default values for DeleteContainerRequestProto fields.
+const (
+	Default_DeleteContainerRequestProto_ForceDelete = bool(false)
+)
+
+func (x *DeleteContainerRequestProto) Reset() {
+	*x = DeleteContainerRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteContainerRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteContainerRequestProto) ProtoMessage() {}
+
+func (x *DeleteContainerRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 DeleteContainerRequestProto.ProtoReflect.Descriptor instead.
+func (*DeleteContainerRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *DeleteContainerRequestProto) GetForceDelete() bool {
+	if x != nil && x.ForceDelete != nil {
+		return *x.ForceDelete
+	}
+	return Default_DeleteContainerRequestProto_ForceDelete
+}
+
+type DeleteContainerResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteContainerResponseProto) Reset() {
+	*x = DeleteContainerResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteContainerResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteContainerResponseProto) ProtoMessage() {}
+
+func (x *DeleteContainerResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 DeleteContainerResponseProto.ProtoReflect.Descriptor instead.
+func (*DeleteContainerResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{13}
+}
+
+type ListContainerRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Count *uint32 `protobuf:"varint,2,opt,name=count" json:"count,omitempty"` // Max Results to return
+}
+
+func (x *ListContainerRequestProto) Reset() {
+	*x = ListContainerRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListContainerRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListContainerRequestProto) ProtoMessage() {}
+
+func (x *ListContainerRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ListContainerRequestProto.ProtoReflect.Descriptor instead.
+func (*ListContainerRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *ListContainerRequestProto) GetCount() uint32 {
+	if x != nil && x.Count != nil {
+		return *x.Count
+	}
+	return 0
+}
+
+type ListContainerResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerData []*ContainerDataProto `protobuf:"bytes,1,rep,name=containerData" json:"containerData,omitempty"`
+}
+
+func (x *ListContainerResponseProto) Reset() {
+	*x = ListContainerResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListContainerResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListContainerResponseProto) ProtoMessage() {}
+
+func (x *ListContainerResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ListContainerResponseProto.ProtoReflect.Descriptor instead.
+func (*ListContainerResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *ListContainerResponseProto) GetContainerData() []*ContainerDataProto {
+	if x != nil {
+		return x.ContainerData
+	}
+	return nil
+}
+
+type CloseContainerRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CloseContainerRequestProto) Reset() {
+	*x = CloseContainerRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CloseContainerRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CloseContainerRequestProto) ProtoMessage() {}
+
+func (x *CloseContainerRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 CloseContainerRequestProto.ProtoReflect.Descriptor instead.
+func (*CloseContainerRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{16}
+}
+
+type CloseContainerResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Hash        *string `protobuf:"bytes,1,opt,name=hash" json:"hash,omitempty"`
+	ContainerID *int64  `protobuf:"varint,2,opt,name=containerID" json:"containerID,omitempty"`
+}
+
+func (x *CloseContainerResponseProto) Reset() {
+	*x = CloseContainerResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CloseContainerResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CloseContainerResponseProto) ProtoMessage() {}
+
+func (x *CloseContainerResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 CloseContainerResponseProto.ProtoReflect.Descriptor instead.
+func (*CloseContainerResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *CloseContainerResponseProto) GetHash() string {
+	if x != nil && x.Hash != nil {
+		return *x.Hash
+	}
+	return ""
+}
+
+func (x *CloseContainerResponseProto) GetContainerID() int64 {
+	if x != nil && x.ContainerID != nil {
+		return *x.ContainerID
+	}
+	return 0
+}
+
+type BlockData struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID  *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+	Flags    *int64           `protobuf:"varint,2,opt,name=flags" json:"flags,omitempty"` // for future use.
+	Metadata []*KeyValue      `protobuf:"bytes,3,rep,name=metadata" json:"metadata,omitempty"`
+	Chunks   []*ChunkInfo     `protobuf:"bytes,4,rep,name=chunks" json:"chunks,omitempty"`
+	Size     *int64           `protobuf:"varint,5,opt,name=size" json:"size,omitempty"`
+}
+
+func (x *BlockData) Reset() {
+	*x = BlockData{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BlockData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BlockData) ProtoMessage() {}
+
+func (x *BlockData) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 BlockData.ProtoReflect.Descriptor instead.
+func (*BlockData) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *BlockData) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+func (x *BlockData) GetFlags() int64 {
+	if x != nil && x.Flags != nil {
+		return *x.Flags
+	}
+	return 0
+}
+
+func (x *BlockData) GetMetadata() []*KeyValue {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *BlockData) GetChunks() []*ChunkInfo {
+	if x != nil {
+		return x.Chunks
+	}
+	return nil
+}
+
+func (x *BlockData) GetSize() int64 {
+	if x != nil && x.Size != nil {
+		return *x.Size
+	}
+	return 0
+}
+
+// Block Messages.
+type PutBlockRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockData *BlockData `protobuf:"bytes,1,req,name=blockData" json:"blockData,omitempty"`
+	Eof       *bool      `protobuf:"varint,2,opt,name=eof" json:"eof,omitempty"`
+}
+
+func (x *PutBlockRequestProto) Reset() {
+	*x = PutBlockRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PutBlockRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PutBlockRequestProto) ProtoMessage() {}
+
+func (x *PutBlockRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 PutBlockRequestProto.ProtoReflect.Descriptor instead.
+func (*PutBlockRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *PutBlockRequestProto) GetBlockData() *BlockData {
+	if x != nil {
+		return x.BlockData
+	}
+	return nil
+}
+
+func (x *PutBlockRequestProto) GetEof() bool {
+	if x != nil && x.Eof != nil {
+		return *x.Eof
+	}
+	return false
+}
+
+type PutBlockResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CommittedBlockLength *GetCommittedBlockLengthResponseProto `protobuf:"bytes,1,req,name=committedBlockLength" json:"committedBlockLength,omitempty"`
+}
+
+func (x *PutBlockResponseProto) Reset() {
+	*x = PutBlockResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PutBlockResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PutBlockResponseProto) ProtoMessage() {}
+
+func (x *PutBlockResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 PutBlockResponseProto.ProtoReflect.Descriptor instead.
+func (*PutBlockResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *PutBlockResponseProto) GetCommittedBlockLength() *GetCommittedBlockLengthResponseProto {
+	if x != nil {
+		return x.CommittedBlockLength
+	}
+	return nil
+}
+
+type GetBlockRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+}
+
+func (x *GetBlockRequestProto) Reset() {
+	*x = GetBlockRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetBlockRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetBlockRequestProto) ProtoMessage() {}
+
+func (x *GetBlockRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 GetBlockRequestProto.ProtoReflect.Descriptor instead.
+func (*GetBlockRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *GetBlockRequestProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+type GetBlockResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockData *BlockData `protobuf:"bytes,1,req,name=blockData" json:"blockData,omitempty"`
+}
+
+func (x *GetBlockResponseProto) Reset() {
+	*x = GetBlockResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetBlockResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetBlockResponseProto) ProtoMessage() {}
+
+func (x *GetBlockResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 GetBlockResponseProto.ProtoReflect.Descriptor instead.
+func (*GetBlockResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *GetBlockResponseProto) GetBlockData() *BlockData {
+	if x != nil {
+		return x.BlockData
+	}
+	return nil
+}
+
+type DeleteBlockRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+}
+
+func (x *DeleteBlockRequestProto) Reset() {
+	*x = DeleteBlockRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteBlockRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteBlockRequestProto) ProtoMessage() {}
+
+func (x *DeleteBlockRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 DeleteBlockRequestProto.ProtoReflect.Descriptor instead.
+func (*DeleteBlockRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *DeleteBlockRequestProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+type GetCommittedBlockLengthRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+}
+
+func (x *GetCommittedBlockLengthRequestProto) Reset() {
+	*x = GetCommittedBlockLengthRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetCommittedBlockLengthRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetCommittedBlockLengthRequestProto) ProtoMessage() {}
+
+func (x *GetCommittedBlockLengthRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 GetCommittedBlockLengthRequestProto.ProtoReflect.Descriptor instead.
+func (*GetCommittedBlockLengthRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *GetCommittedBlockLengthRequestProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+type GetCommittedBlockLengthResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID     *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+	BlockLength *int64           `protobuf:"varint,2,req,name=blockLength" json:"blockLength,omitempty"`
+}
+
+func (x *GetCommittedBlockLengthResponseProto) Reset() {
+	*x = GetCommittedBlockLengthResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetCommittedBlockLengthResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetCommittedBlockLengthResponseProto) ProtoMessage() {}
+
+func (x *GetCommittedBlockLengthResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 GetCommittedBlockLengthResponseProto.ProtoReflect.Descriptor instead.
+func (*GetCommittedBlockLengthResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *GetCommittedBlockLengthResponseProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+func (x *GetCommittedBlockLengthResponseProto) GetBlockLength() int64 {
+	if x != nil && x.BlockLength != nil {
+		return *x.BlockLength
+	}
+	return 0
+}
+
+type DeleteBlockResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteBlockResponseProto) Reset() {
+	*x = DeleteBlockResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteBlockResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteBlockResponseProto) ProtoMessage() {}
+
+func (x *DeleteBlockResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 DeleteBlockResponseProto.ProtoReflect.Descriptor instead.
+func (*DeleteBlockResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{26}
+}
+
+type ListBlockRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	StartLocalID *int64  `protobuf:"varint,2,opt,name=startLocalID" json:"startLocalID,omitempty"`
+	Count        *uint32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"`
+}
+
+func (x *ListBlockRequestProto) Reset() {
+	*x = ListBlockRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListBlockRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListBlockRequestProto) ProtoMessage() {}
+
+func (x *ListBlockRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ListBlockRequestProto.ProtoReflect.Descriptor instead.
+func (*ListBlockRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *ListBlockRequestProto) GetStartLocalID() int64 {
+	if x != nil && x.StartLocalID != nil {
+		return *x.StartLocalID
+	}
+	return 0
+}
+
+func (x *ListBlockRequestProto) GetCount() uint32 {
+	if x != nil && x.Count != nil {
+		return *x.Count
+	}
+	return 0
+}
+
+type ListBlockResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockData []*BlockData `protobuf:"bytes,1,rep,name=blockData" json:"blockData,omitempty"`
+}
+
+func (x *ListBlockResponseProto) Reset() {
+	*x = ListBlockResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListBlockResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListBlockResponseProto) ProtoMessage() {}
+
+func (x *ListBlockResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ListBlockResponseProto.ProtoReflect.Descriptor instead.
+func (*ListBlockResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *ListBlockResponseProto) GetBlockData() []*BlockData {
+	if x != nil {
+		return x.BlockData
+	}
+	return nil
+}
+
+type ChunkInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ChunkName    *string       `protobuf:"bytes,1,req,name=chunkName" json:"chunkName,omitempty"`
+	Offset       *uint64       `protobuf:"varint,2,req,name=offset" json:"offset,omitempty"`
+	Len          *uint64       `protobuf:"varint,3,req,name=len" json:"len,omitempty"`
+	Metadata     []*KeyValue   `protobuf:"bytes,4,rep,name=metadata" json:"metadata,omitempty"`
+	ChecksumData *ChecksumData `protobuf:"bytes,5,req,name=checksumData" json:"checksumData,omitempty"`
+}
+
+func (x *ChunkInfo) Reset() {
+	*x = ChunkInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ChunkInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChunkInfo) ProtoMessage() {}
+
+func (x *ChunkInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ChunkInfo.ProtoReflect.Descriptor instead.
+func (*ChunkInfo) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *ChunkInfo) GetChunkName() string {
+	if x != nil && x.ChunkName != nil {
+		return *x.ChunkName
+	}
+	return ""
+}
+
+func (x *ChunkInfo) GetOffset() uint64 {
+	if x != nil && x.Offset != nil {
+		return *x.Offset
+	}
+	return 0
+}
+
+func (x *ChunkInfo) GetLen() uint64 {
+	if x != nil && x.Len != nil {
+		return *x.Len
+	}
+	return 0
+}
+
+func (x *ChunkInfo) GetMetadata() []*KeyValue {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *ChunkInfo) GetChecksumData() *ChecksumData {
+	if x != nil {
+		return x.ChecksumData
+	}
+	return nil
+}
+
+type ChecksumData struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Type             *ChecksumType `protobuf:"varint,1,req,name=type,enum=hadoop.hdds.datanode.ChecksumType" json:"type,omitempty"`
+	BytesPerChecksum *uint32       `protobuf:"varint,2,req,name=bytesPerChecksum" json:"bytesPerChecksum,omitempty"`
+	Checksums        [][]byte      `protobuf:"bytes,3,rep,name=checksums" json:"checksums,omitempty"`
+}
+
+func (x *ChecksumData) Reset() {
+	*x = ChecksumData{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ChecksumData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChecksumData) ProtoMessage() {}
+
+func (x *ChecksumData) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ChecksumData.ProtoReflect.Descriptor instead.
+func (*ChecksumData) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *ChecksumData) GetType() ChecksumType {
+	if x != nil && x.Type != nil {
+		return *x.Type
+	}
+	return ChecksumType_NONE
+}
+
+func (x *ChecksumData) GetBytesPerChecksum() uint32 {
+	if x != nil && x.BytesPerChecksum != nil {
+		return *x.BytesPerChecksum
+	}
+	return 0
+}
+
+func (x *ChecksumData) GetChecksums() [][]byte {
+	if x != nil {
+		return x.Checksums
+	}
+	return nil
+}
+
+type WriteChunkRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID   *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+	ChunkData *ChunkInfo       `protobuf:"bytes,2,req,name=chunkData" json:"chunkData,omitempty"`
+	Data      []byte           `protobuf:"bytes,3,opt,name=data" json:"data,omitempty"`
+}
+
+func (x *WriteChunkRequestProto) Reset() {
+	*x = WriteChunkRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WriteChunkRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WriteChunkRequestProto) ProtoMessage() {}
+
+func (x *WriteChunkRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 WriteChunkRequestProto.ProtoReflect.Descriptor instead.
+func (*WriteChunkRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *WriteChunkRequestProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+func (x *WriteChunkRequestProto) GetChunkData() *ChunkInfo {
+	if x != nil {
+		return x.ChunkData
+	}
+	return nil
+}
+
+func (x *WriteChunkRequestProto) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type WriteChunkResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *WriteChunkResponseProto) Reset() {
+	*x = WriteChunkResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WriteChunkResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WriteChunkResponseProto) ProtoMessage() {}
+
+func (x *WriteChunkResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 WriteChunkResponseProto.ProtoReflect.Descriptor instead.
+func (*WriteChunkResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{32}
+}
+
+type ReadChunkRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID   *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+	ChunkData *ChunkInfo       `protobuf:"bytes,2,req,name=chunkData" json:"chunkData,omitempty"`
+}
+
+func (x *ReadChunkRequestProto) Reset() {
+	*x = ReadChunkRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReadChunkRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReadChunkRequestProto) ProtoMessage() {}
+
+func (x *ReadChunkRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ReadChunkRequestProto.ProtoReflect.Descriptor instead.
+func (*ReadChunkRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{33}
+}
+
+func (x *ReadChunkRequestProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+func (x *ReadChunkRequestProto) GetChunkData() *ChunkInfo {
+	if x != nil {
+		return x.ChunkData
+	}
+	return nil
+}
+
+type ReadChunkResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID   *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+	ChunkData *ChunkInfo       `protobuf:"bytes,2,req,name=chunkData" json:"chunkData,omitempty"`
+	Data      []byte           `protobuf:"bytes,3,req,name=data" json:"data,omitempty"`
+}
+
+func (x *ReadChunkResponseProto) Reset() {
+	*x = ReadChunkResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ReadChunkResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReadChunkResponseProto) ProtoMessage() {}
+
+func (x *ReadChunkResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ReadChunkResponseProto.ProtoReflect.Descriptor instead.
+func (*ReadChunkResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *ReadChunkResponseProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+func (x *ReadChunkResponseProto) GetChunkData() *ChunkInfo {
+	if x != nil {
+		return x.ChunkData
+	}
+	return nil
+}
+
+func (x *ReadChunkResponseProto) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type DeleteChunkRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID   *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+	ChunkData *ChunkInfo       `protobuf:"bytes,2,req,name=chunkData" json:"chunkData,omitempty"`
+}
+
+func (x *DeleteChunkRequestProto) Reset() {
+	*x = DeleteChunkRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteChunkRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteChunkRequestProto) ProtoMessage() {}
+
+func (x *DeleteChunkRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 DeleteChunkRequestProto.ProtoReflect.Descriptor instead.
+func (*DeleteChunkRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *DeleteChunkRequestProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+func (x *DeleteChunkRequestProto) GetChunkData() *ChunkInfo {
+	if x != nil {
+		return x.ChunkData
+	}
+	return nil
+}
+
+type DeleteChunkResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteChunkResponseProto) Reset() {
+	*x = DeleteChunkResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[36]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteChunkResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteChunkResponseProto) ProtoMessage() {}
+
+func (x *DeleteChunkResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 DeleteChunkResponseProto.ProtoReflect.Descriptor instead.
+func (*DeleteChunkResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{36}
+}
+
+type ListChunkRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	BlockID       *DatanodeBlockID `protobuf:"bytes,1,req,name=blockID" json:"blockID,omitempty"`
+	PrevChunkName *string          `protobuf:"bytes,2,req,name=prevChunkName" json:"prevChunkName,omitempty"`
+	Count         *uint32          `protobuf:"varint,3,req,name=count" json:"count,omitempty"`
+}
+
+func (x *ListChunkRequestProto) Reset() {
+	*x = ListChunkRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[37]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListChunkRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListChunkRequestProto) ProtoMessage() {}
+
+func (x *ListChunkRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ListChunkRequestProto.ProtoReflect.Descriptor instead.
+func (*ListChunkRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *ListChunkRequestProto) GetBlockID() *DatanodeBlockID {
+	if x != nil {
+		return x.BlockID
+	}
+	return nil
+}
+
+func (x *ListChunkRequestProto) GetPrevChunkName() string {
+	if x != nil && x.PrevChunkName != nil {
+		return *x.PrevChunkName
+	}
+	return ""
+}
+
+func (x *ListChunkRequestProto) GetCount() uint32 {
+	if x != nil && x.Count != nil {
+		return *x.Count
+	}
+	return 0
+}
+
+type ListChunkResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ChunkData []*ChunkInfo `protobuf:"bytes,1,rep,name=chunkData" json:"chunkData,omitempty"`
+}
+
+func (x *ListChunkResponseProto) Reset() {
+	*x = ListChunkResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[38]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ListChunkResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListChunkResponseProto) ProtoMessage() {}
+
+func (x *ListChunkResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 ListChunkResponseProto.ProtoReflect.Descriptor instead.
+func (*ListChunkResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{38}
+}
+
+func (x *ListChunkResponseProto) GetChunkData() []*ChunkInfo {
+	if x != nil {
+		return x.ChunkData
+	}
+	return nil
+}
+
+type PutSmallFileRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Block     *PutBlockRequestProto `protobuf:"bytes,1,req,name=block" json:"block,omitempty"`
+	ChunkInfo *ChunkInfo            `protobuf:"bytes,2,req,name=chunkInfo" json:"chunkInfo,omitempty"`
+	Data      []byte                `protobuf:"bytes,3,req,name=data" json:"data,omitempty"`
+}
+
+func (x *PutSmallFileRequestProto) Reset() {
+	*x = PutSmallFileRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[39]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PutSmallFileRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PutSmallFileRequestProto) ProtoMessage() {}
+
+func (x *PutSmallFileRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 PutSmallFileRequestProto.ProtoReflect.Descriptor instead.
+func (*PutSmallFileRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{39}
+}
+
+func (x *PutSmallFileRequestProto) GetBlock() *PutBlockRequestProto {
+	if x != nil {
+		return x.Block
+	}
+	return nil
+}
+
+func (x *PutSmallFileRequestProto) GetChunkInfo() *ChunkInfo {
+	if x != nil {
+		return x.ChunkInfo
+	}
+	return nil
+}
+
+func (x *PutSmallFileRequestProto) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type PutSmallFileResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CommittedBlockLength *GetCommittedBlockLengthResponseProto `protobuf:"bytes,1,req,name=committedBlockLength" json:"committedBlockLength,omitempty"`
+}
+
+func (x *PutSmallFileResponseProto) Reset() {
+	*x = PutSmallFileResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[40]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PutSmallFileResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PutSmallFileResponseProto) ProtoMessage() {}
+
+func (x *PutSmallFileResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 PutSmallFileResponseProto.ProtoReflect.Descriptor instead.
+func (*PutSmallFileResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{40}
+}
+
+func (x *PutSmallFileResponseProto) GetCommittedBlockLength() *GetCommittedBlockLengthResponseProto {
+	if x != nil {
+		return x.CommittedBlockLength
+	}
+	return nil
+}
+
+type GetSmallFileRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Block *GetBlockRequestProto `protobuf:"bytes,1,req,name=block" json:"block,omitempty"`
+}
+
+func (x *GetSmallFileRequestProto) Reset() {
+	*x = GetSmallFileRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[41]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetSmallFileRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSmallFileRequestProto) ProtoMessage() {}
+
+func (x *GetSmallFileRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 GetSmallFileRequestProto.ProtoReflect.Descriptor instead.
+func (*GetSmallFileRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *GetSmallFileRequestProto) GetBlock() *GetBlockRequestProto {
+	if x != nil {
+		return x.Block
+	}
+	return nil
+}
+
+type GetSmallFileResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Data *ReadChunkResponseProto `protobuf:"bytes,1,req,name=data" json:"data,omitempty"`
+}
+
+func (x *GetSmallFileResponseProto) Reset() {
+	*x = GetSmallFileResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[42]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetSmallFileResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSmallFileResponseProto) ProtoMessage() {}
+
+func (x *GetSmallFileResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 GetSmallFileResponseProto.ProtoReflect.Descriptor instead.
+func (*GetSmallFileResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *GetSmallFileResponseProto) GetData() *ReadChunkResponseProto {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type CopyContainerRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerID *int64  `protobuf:"varint,1,req,name=containerID" json:"containerID,omitempty"`
+	ReadOffset  *uint64 `protobuf:"varint,2,req,name=readOffset" json:"readOffset,omitempty"`
+	Len         *uint64 `protobuf:"varint,3,opt,name=len" json:"len,omitempty"`
+}
+
+func (x *CopyContainerRequestProto) Reset() {
+	*x = CopyContainerRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[43]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CopyContainerRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CopyContainerRequestProto) ProtoMessage() {}
+
+func (x *CopyContainerRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 CopyContainerRequestProto.ProtoReflect.Descriptor instead.
+func (*CopyContainerRequestProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *CopyContainerRequestProto) GetContainerID() int64 {
+	if x != nil && x.ContainerID != nil {
+		return *x.ContainerID
+	}
+	return 0
+}
+
+func (x *CopyContainerRequestProto) GetReadOffset() uint64 {
+	if x != nil && x.ReadOffset != nil {
+		return *x.ReadOffset
+	}
+	return 0
+}
+
+func (x *CopyContainerRequestProto) GetLen() uint64 {
+	if x != nil && x.Len != nil {
+		return *x.Len
+	}
+	return 0
+}
+
+type CopyContainerResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerID *int64  `protobuf:"varint,1,req,name=containerID" json:"containerID,omitempty"`
+	ReadOffset  *uint64 `protobuf:"varint,2,req,name=readOffset" json:"readOffset,omitempty"`
+	Len         *uint64 `protobuf:"varint,3,req,name=len" json:"len,omitempty"`
+	Eof         *bool   `protobuf:"varint,4,req,name=eof" json:"eof,omitempty"`
+	Data        []byte  `protobuf:"bytes,5,req,name=data" json:"data,omitempty"`
+	Checksum    *int64  `protobuf:"varint,6,opt,name=checksum" json:"checksum,omitempty"`
+}
+
+func (x *CopyContainerResponseProto) Reset() {
+	*x = CopyContainerResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_DatanodeClientProtocol_proto_msgTypes[44]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CopyContainerResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CopyContainerResponseProto) ProtoMessage() {}
+
+func (x *CopyContainerResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_DatanodeClientProtocol_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 CopyContainerResponseProto.ProtoReflect.Descriptor instead.
+func (*CopyContainerResponseProto) Descriptor() ([]byte, []int) {
+	return file_DatanodeClientProtocol_proto_rawDescGZIP(), []int{44}
+}
+
+func (x *CopyContainerResponseProto) GetContainerID() int64 {
+	if x != nil && x.ContainerID != nil {
+		return *x.ContainerID
+	}
+	return 0
+}
+
+func (x *CopyContainerResponseProto) GetReadOffset() uint64 {
+	if x != nil && x.ReadOffset != nil {
+		return *x.ReadOffset
+	}
+	return 0
+}
+
+func (x *CopyContainerResponseProto) GetLen() uint64 {
+	if x != nil && x.Len != nil {
+		return *x.Len
+	}
+	return 0
+}
+
+func (x *CopyContainerResponseProto) GetEof() bool {
+	if x != nil && x.Eof != nil {
+		return *x.Eof
+	}
+	return false
+}
+
+func (x *CopyContainerResponseProto) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+func (x *CopyContainerResponseProto) GetChecksum() int64 {
+	if x != nil && x.Checksum != nil {
+		return *x.Checksum
+	}
+	return 0
+}
+
+var File_DatanodeClientProtocol_proto protoreflect.FileDescriptor
+
+var file_DatanodeClientProtocol_proto_rawDesc = []byte{
+	0x0a, 0x1c, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14,
+	0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x6e, 0x6f, 0x64, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64,
+	0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0b, 0x63,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x6f,
+	0x63, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x02, 0x20, 0x02, 0x28, 0x03, 0x52, 0x07, 0x6c, 0x6f, 0x63,
+	0x61, 0x6c, 0x49, 0x44, 0x12, 0x37, 0x0a, 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6d,
+	0x6d, 0x69, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x04, 0x3a, 0x01, 0x30, 0x52, 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6d,
+	0x6d, 0x69, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x32, 0x0a,
+	0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+	0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x22, 0x95, 0x0d, 0x0a, 0x1c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43,
+	0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6d, 0x64, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
+	0x02, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64,
+	0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52,
+	0x07, 0x63, 0x6d, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x63,
+	0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65,
+	0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49,
+	0x44, 0x18, 0x03, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65,
+	0x55, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61,
+	0x6e, 0x6f, 0x64, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x69,
+	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x44, 0x12, 0x5b, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x55, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x68,
+	0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e,
+	0x6f, 0x64, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0d, 0x72,
+	0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x0f,
+	0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x0f, 0x64, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x55, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x43, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e,
+	0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0d,
+	0x6c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x58, 0x0a,
+	0x0e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18,
+	0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x6c, 0x6f,
+	0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x08, 0x70, 0x75, 0x74, 0x42, 0x6c,
+	0x6f, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x64, 0x6f,
+	0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65,
+	0x2e, 0x50, 0x75, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, 0x75, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12,
+	0x46, 0x0a, 0x08, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63,
+	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x67,
+	0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4f, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68,
+	0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e,
+	0x6f, 0x64, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0b, 0x64, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x49, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74,
+	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6c,
+	0x6f, 0x63, 0x6b, 0x12, 0x49, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b,
+	0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e,
+	0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x65,
+	0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x4c,
+	0x0a, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x11, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43,
+	0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x52, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x4f, 0x0a, 0x0b,
+	0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x12, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43,
+	0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x49, 0x0a,
+	0x09, 0x6c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2b, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e,
+	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x6c,
+	0x69, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x52, 0x0a, 0x0c, 0x70, 0x75, 0x74, 0x53,
+	0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e,
+	0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69,
+	0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0c,
+	0x70, 0x75, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x52, 0x0a, 0x0c,
+	0x67, 0x65, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x15, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6d, 0x61,
+	0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65,
+	0x12, 0x73, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64,
+	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x16, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d,
+	0x69, 0x74, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x17, 0x67, 0x65,
+	0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c,
+	0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64,
+	0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63,
+	0x6f, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xed, 0x0c, 0x0a, 0x1d, 0x43, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x34, 0x0a, 0x07, 0x63,
+	0x6d, 0x64, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x68,
+	0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e,
+	0x6f, 0x64, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6d, 0x64, 0x54, 0x79, 0x70,
+	0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, 0x12, 0x34, 0x0a, 0x06, 0x72,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c,
+	0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x5c, 0x0a, 0x0f, 0x63,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x0d, 0x72, 0x65, 0x61,
+	0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x30, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x12, 0x5c, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61,
+	0x69, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x64,
+	0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64,
+	0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0f,
+	0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12,
+	0x5c, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f,
+	0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0f, 0x64, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x56, 0x0a,
+	0x0d, 0x6c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x0e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e,
+	0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+	0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x12, 0x47, 0x0a, 0x08, 0x70, 0x75, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x50, 0x75, 0x74, 0x42, 0x6c, 0x6f,
+	0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52,
+	0x08, 0x70, 0x75, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x47, 0x0a, 0x08, 0x67, 0x65, 0x74,
+	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f,
+	0x63, 0x6b, 0x12, 0x50, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63,
+	0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70,
+	0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42,
+	0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4a, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63,
+	0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70,
+	0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4c,
+	0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+	0x12, 0x4d, 0x0a, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x0f,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x57, 0x72, 0x69, 0x74,
+	0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12,
+	0x4a, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x10, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68,
+	0x75, 0x6e, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x50, 0x0a, 0x0b, 0x64,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68,
+	0x75, 0x6e, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x4a, 0x0a,
+	0x09, 0x6c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2c, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64,
+	0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e,
+	0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09,
+	0x6c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x53, 0x0a, 0x0c, 0x70, 0x75, 0x74,
+	0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x2f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46,
+	0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x52, 0x0c, 0x70, 0x75, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x53,
+	0x0a, 0x0c, 0x67, 0x65, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x14,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x53,
+	0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46,
+	0x69, 0x6c, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
+	0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x15,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43,
+	0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e,
+	0x67, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x52, 0x17, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x42, 0x6c,
+	0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0xfb, 0x03, 0x0a, 0x12, 0x43, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18,
+	0x01, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x49, 0x44, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24,
+	0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x50, 0x61, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x79, 0x74, 0x65, 0x73, 0x55, 0x73, 0x65,
+	0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x79, 0x74, 0x65, 0x73, 0x55, 0x73,
+	0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43,
+	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63,
+	0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x04, 0x4f, 0x50, 0x45, 0x4e, 0x52, 0x05, 0x73, 0x74, 0x61,
+	0x74, 0x65, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54,
+	0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x68, 0x61, 0x64, 0x6f,
+	0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65,
+	0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x11,
+	0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65,
+	0x22, 0x65, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45,
+	0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c, 0x4f, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x02,
+	0x12, 0x10, 0x0a, 0x0c, 0x51, 0x55, 0x41, 0x53, 0x49, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44,
+	0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0d,
+	0x0a, 0x09, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x05, 0x12, 0x0b, 0x0a,
+	0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45,
+	0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x07, 0x22, 0xcb, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x32, 0x42, 0x43, 0x53, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x6c, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x32, 0x42, 0x43, 0x53, 0x49, 0x44, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x68,
+	0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e,
+	0x6f, 0x64, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x32, 0x42, 0x43,
+	0x53, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x32, 0x42, 0x43, 0x53, 0x49, 0x44, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x32, 0x42, 0x43, 0x53, 0x49,
+	0x44, 0x1a, 0x42, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x32, 0x42,
+	0x43, 0x53, 0x49, 0x44, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb7, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70,
+	0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4b,
+	0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79,
+	0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f,
+	0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x11, 0x4b,
+	0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22,
+	0x1e, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22,
+	0x1b, 0x0a, 0x19, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x1a,
+	0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x4e, 0x0a, 0x0d, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x28, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0d, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0x82, 0x01, 0x0a, 0x1b, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x68,
+	0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e,
+	0x6f, 0x64, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c,
+	0x73, 0x65, 0x52, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22,
+	0x1e, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22,
+	0x46, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x27,
+	0x0a, 0x0b, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x66, 0x6f, 0x72, 0x63,
+	0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x1e, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x31, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x6c, 0x0a, 0x1a, 0x4c, 0x69,
+	0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x4e, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x28, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+	0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0x1c, 0x0a, 0x1a, 0x43, 0x6c, 0x6f, 0x73,
+	0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x53, 0x0a, 0x1b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b,
+	0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x22, 0xeb, 0x01, 0x0a, 0x09,
+	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c, 0x6f,
+	0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x64,
+	0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64,
+	0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49,
+	0x44, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c,
+	0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73,
+	0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x06,
+	0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x68,
+	0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e,
+	0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63,
+	0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x67, 0x0a, 0x14, 0x50, 0x75, 0x74,
+	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x3d, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01,
+	0x20, 0x02, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63,
+	0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61,
+	0x12, 0x10, 0x0a, 0x03, 0x65, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x65,
+	0x6f, 0x66, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x6e, 0x0a, 0x14,
+	0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65,
+	0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x64,
+	0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64,
+	0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x42, 0x6c,
+	0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65,
+	0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x57, 0x0a, 0x14,
+	0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x18,
+	0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x61, 0x74,
+	0x61, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52, 0x07, 0x62, 0x6c,
+	0x6f, 0x63, 0x6b, 0x49, 0x44, 0x22, 0x56, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63,
+	0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3d,
+	0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x02, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61,
+	0x74, 0x61, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x22, 0x5a, 0x0a,
+	0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x63,
+	0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x64, 0x6f,
+	0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65,
+	0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44,
+	0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x22, 0x66, 0x0a, 0x23, 0x47, 0x65, 0x74,
+	0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65,
+	0x6e, 0x67, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28,
+	0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64,
+	0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49,
+	0x44, 0x22, 0x89, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74,
+	0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c,
+	0x6f, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+	0x49, 0x44, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x62,
+	0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x02, 0x28, 0x03,
+	0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x1a, 0x0a,
+	0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x51, 0x0a, 0x15, 0x4c, 0x69, 0x73,
+	0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c,
+	0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c,
+	0x6f, 0x63, 0x61, 0x6c, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
+	0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x57, 0x0a, 0x16,
+	0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3d, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44,
+	0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f,
+	0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65,
+	0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63,
+	0x6b, 0x44, 0x61, 0x74, 0x61, 0x22, 0xd7, 0x01, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x49,
+	0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x4e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x4e, 0x61, 0x6d,
+	0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x02, 0x28,
+	0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x65, 0x6e,
+	0x18, 0x03, 0x20, 0x02, 0x28, 0x04, 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
+	0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x0c, 0x63, 0x68, 0x65, 0x63, 0x6b,
+	0x73, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+	0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x44, 0x61, 0x74,
+	0x61, 0x52, 0x0c, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x22,
+	0x90, 0x01, 0x0a, 0x0c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61,
+	0x12, 0x36, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x22,
+	0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x54, 0x79,
+	0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65,
+	0x73, 0x50, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x02,
+	0x28, 0x0d, 0x52, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63,
+	0x6b, 0x73, 0x75, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,
+	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75,
+	0x6d, 0x73, 0x22, 0xac, 0x01, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e,
+	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3f, 0x0a,
+	0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x25,
+	0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74,
+	0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x6c,
+	0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x3d,
+	0x0a, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x02, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x6e,
+	0x66, 0x6f, 0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a,
+	0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74,
+	0x61, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x01, 0x0a,
+	0x15, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49,
+	0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70,
+	0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44,
+	0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52, 0x07,
+	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x3d, 0x0a, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b,
+	0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64,
+	0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64,
+	0x65, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x68, 0x75,
+	0x6e, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x22, 0xac, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x61, 0x64, 0x43,
+	0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02,
+	0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
+	0x49, 0x44, 0x12, 0x3d, 0x0a, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18,
+	0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x75,
+	0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x61, 0x74,
+	0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0c, 0x52,
+	0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x99, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02,
+	0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73,
+	0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
+	0x49, 0x44, 0x12, 0x3d, 0x0a, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18,
+	0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x75,
+	0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x61, 0x74,
+	0x61, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x94, 0x01,
+	0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
+	0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f,
+	0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e,
+	0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52,
+	0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76,
+	0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x09, 0x52,
+	0x0d, 0x70, 0x72, 0x65, 0x76, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14,
+	0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x05, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x22, 0x57, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x75, 0x6e,
+	0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3d,
+	0x0a, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x6e,
+	0x66, 0x6f, 0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x22, 0xaf, 0x01,
+	0x0a, 0x18, 0x50, 0x75, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x40, 0x0a, 0x05, 0x62, 0x6c,
+	0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x64, 0x6f,
+	0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65,
+	0x2e, 0x50, 0x75, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3d, 0x0a, 0x09,
+	0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32,
+	0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61,
+	0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f,
+	0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x64,
+	0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22,
+	0x8b, 0x01, 0x0a, 0x19, 0x50, 0x75, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x6e, 0x0a,
+	0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c,
+	0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x42,
+	0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74,
+	0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x5c, 0x0a,
+	0x18, 0x47, 0x65, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x40, 0x0a, 0x05, 0x62, 0x6c, 0x6f,
+	0x63, 0x6b, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f,
+	0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e,
+	0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x5d, 0x0a, 0x19, 0x47,
+	0x65, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x40, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,
+	0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e,
+	0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x65,
+	0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6f, 0x0a, 0x19, 0x43, 0x6f,
+	0x70, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+	0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x61,
+	0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0a, 0x72,
+	0x65, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x65, 0x6e,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x22, 0xb2, 0x01, 0x0a, 0x1a,
+	0x43, 0x6f, 0x70, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x03, 0x52,
+	0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a,
+	0x72, 0x65, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04,
+	0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03,
+	0x6c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x02, 0x28, 0x04, 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x10,
+	0x0a, 0x03, 0x65, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x02, 0x28, 0x08, 0x52, 0x03, 0x65, 0x6f, 0x66,
+	0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x04,
+	0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,
+	0x2a, 0xcd, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10, 0x01, 0x12, 0x11,
+	0x0a, 0x0d, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10,
+	0x02, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61,
+	0x69, 0x6e, 0x65, 0x72, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x4c,
+	0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10, 0x05, 0x12, 0x0c,
+	0x0a, 0x08, 0x50, 0x75, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08,
+	0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x4c,
+	0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65,
+	0x61, 0x64, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x57, 0x72,
+	0x69, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x69,
+	0x73, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x6f, 0x6d,
+	0x70, 0x61, 0x63, 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x50,
+	0x75, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x10, 0x0f, 0x12, 0x10, 0x0a,
+	0x0c, 0x47, 0x65, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x10, 0x10, 0x12,
+	0x12, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x10, 0x11, 0x12, 0x1b, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
+	0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x10, 0x12,
+	0x2a, 0x9d, 0x08, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53,
+	0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x4e, 0x53, 0x55,
+	0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10,
+	0x02, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x41, 0x4c, 0x46, 0x4f, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x52,
+	0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x4e, 0x54,
+	0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45,
+	0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49,
+	0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x4e,
+	0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x5f,
+	0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4e, 0x54, 0x41,
+	0x49, 0x4e, 0x45, 0x52, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x07, 0x12, 0x15, 0x0a,
+	0x11, 0x4e, 0x4f, 0x5f, 0x53, 0x55, 0x43, 0x48, 0x5f, 0x41, 0x4c, 0x47, 0x4f, 0x52, 0x49, 0x54,
+	0x48, 0x4d, 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45,
+	0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x09, 0x12, 0x10, 0x0a,
+	0x0c, 0x49, 0x4f, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0a, 0x12,
+	0x1e, 0x0a, 0x1a, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41,
+	0x44, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x44, 0x42, 0x10, 0x0b, 0x12,
+	0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x5f, 0x53, 0x55, 0x43, 0x48, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b,
+	0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x56, 0x45, 0x52, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f,
+	0x46, 0x4c, 0x41, 0x47, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x0d, 0x12,
+	0x1b, 0x0a, 0x17, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x46, 0x49, 0x4e,
+	0x44, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x44, 0x49, 0x52, 0x10, 0x0e, 0x12, 0x16, 0x0a, 0x12,
+	0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x53, 0x49,
+	0x5a, 0x45, 0x10, 0x0f, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x53, 0x55, 0x4d,
+	0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x10, 0x12, 0x18, 0x0a, 0x14, 0x55,
+	0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x46, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x48,
+	0x55, 0x4e, 0x4b, 0x10, 0x11, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x5f,
+	0x44, 0x45, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x12,
+	0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x55,
+	0x4d, 0x45, 0x4e, 0x54, 0x10, 0x13, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x55, 0x54, 0x5f, 0x53, 0x4d,
+	0x41, 0x4c, 0x4c, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x14,
+	0x12, 0x18, 0x0a, 0x14, 0x47, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x5f, 0x46, 0x49,
+	0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x15, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4c,
+	0x4f, 0x53, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x49,
+	0x4f, 0x10, 0x16, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x5f,
+	0x43, 0x4f, 0x4d, 0x50, 0x41, 0x43, 0x54, 0x5f, 0x44, 0x42, 0x10, 0x18, 0x12, 0x19, 0x0a, 0x15,
+	0x55, 0x4e, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e,
+	0x45, 0x52, 0x5f, 0x49, 0x4f, 0x10, 0x19, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x45, 0x4c, 0x45, 0x54,
+	0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49,
+	0x4e, 0x45, 0x52, 0x10, 0x1a, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f,
+	0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x59, 0x10,
+	0x1b, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x43, 0x4f, 0x4e,
+	0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x1c, 0x12, 0x15,
+	0x0a, 0x11, 0x44, 0x49, 0x53, 0x4b, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x50,
+	0x41, 0x43, 0x45, 0x10, 0x1d, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e,
+	0x45, 0x52, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54,
+	0x53, 0x10, 0x1e, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
+	0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10,
+	0x1f, 0x12, 0x20, 0x0a, 0x1c, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x46,
+	0x49, 0x4c, 0x45, 0x53, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f,
+	0x52, 0x10, 0x20, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
+	0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x53, 0x55, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10,
+	0x21, 0x12, 0x1a, 0x0a, 0x16, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4e,
+	0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x22, 0x12, 0x17, 0x0a,
+	0x13, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49,
+	0x54, 0x54, 0x45, 0x44, 0x10, 0x23, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49,
+	0x4e, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x24, 0x12,
+	0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x42, 0x43, 0x53, 0x49, 0x44,
+	0x10, 0x25, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x43, 0x53, 0x49, 0x44, 0x5f, 0x4d, 0x49, 0x53, 0x4d,
+	0x41, 0x54, 0x43, 0x48, 0x10, 0x26, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49,
+	0x4e, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x27, 0x12, 0x15,
+	0x0a, 0x11, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53,
+	0x49, 0x4e, 0x47, 0x10, 0x28, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x54,
+	0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f,
+	0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x29, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x52,
+	0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x42, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x2a,
+	0x2a, 0x26, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70,
+	0x65, 0x12, 0x15, 0x0a, 0x11, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10, 0x01, 0x2a, 0x44, 0x0a, 0x0c, 0x43, 0x68, 0x65, 0x63,
+	0x6b, 0x73, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45,
+	0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0x02, 0x12, 0x0a, 0x0a,
+	0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41,
+	0x32, 0x35, 0x36, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x05, 0x32, 0x95,
+	0x01, 0x0a, 0x1c, 0x58, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
+	0x75, 0x0a, 0x04, 0x73, 0x65, 0x6e, 0x64, 0x12, 0x32, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70,
+	0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x33, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d,
+	0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0x8f, 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x74, 0x72, 0x61,
+	0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6f, 0x0a, 0x08, 0x64, 0x6f, 0x77, 0x6e, 0x6c,
+	0x6f, 0x61, 0x64, 0x12, 0x2f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64,
+	0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x43,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x30, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x6f, 0x70, 0x79,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x30, 0x01, 0x42, 0x73, 0x0a, 0x2e, 0x6f, 0x72, 0x67, 0x2e,
+	0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64,
+	0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x64, 0x61, 0x74, 0x61,
+	0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x0f, 0x43, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x5a, 0x2d, 0x67, 0x69, 0x74,
+	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x6f,
+	0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x67, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0xa0, 0x01, 0x01,
+}
+
+var (
+	file_DatanodeClientProtocol_proto_rawDescOnce sync.Once
+	file_DatanodeClientProtocol_proto_rawDescData = file_DatanodeClientProtocol_proto_rawDesc
+)
+
+func file_DatanodeClientProtocol_proto_rawDescGZIP() []byte {
+	file_DatanodeClientProtocol_proto_rawDescOnce.Do(func() {
+		file_DatanodeClientProtocol_proto_rawDescData = protoimpl.X.CompressGZIP(file_DatanodeClientProtocol_proto_rawDescData)
+	})
+	return file_DatanodeClientProtocol_proto_rawDescData
+}
+
+var file_DatanodeClientProtocol_proto_enumTypes = make([]protoimpl.EnumInfo, 5)
+var file_DatanodeClientProtocol_proto_msgTypes = make([]protoimpl.MessageInfo, 46)
+var file_DatanodeClientProtocol_proto_goTypes = []interface{}{
+	(Type)(0),                                    // 0: hadoop.hdds.datanode.Type
+	(Result)(0),                                  // 1: hadoop.hdds.datanode.Result
+	(ContainerType)(0),                           // 2: hadoop.hdds.datanode.ContainerType
+	(ChecksumType)(0),                            // 3: hadoop.hdds.datanode.ChecksumType
+	(ContainerDataProto_State)(0),                // 4: hadoop.hdds.datanode.ContainerDataProto.State
+	(*DatanodeBlockID)(nil),                      // 5: hadoop.hdds.datanode.DatanodeBlockID
+	(*KeyValue)(nil),                             // 6: hadoop.hdds.datanode.KeyValue
+	(*ContainerCommandRequestProto)(nil),         // 7: hadoop.hdds.datanode.ContainerCommandRequestProto
+	(*ContainerCommandResponseProto)(nil),        // 8: hadoop.hdds.datanode.ContainerCommandResponseProto
+	(*ContainerDataProto)(nil),                   // 9: hadoop.hdds.datanode.ContainerDataProto
+	(*Container2BCSIDMapProto)(nil),              // 10: hadoop.hdds.datanode.Container2BCSIDMapProto
+	(*CreateContainerRequestProto)(nil),          // 11: hadoop.hdds.datanode.CreateContainerRequestProto
+	(*CreateContainerResponseProto)(nil),         // 12: hadoop.hdds.datanode.CreateContainerResponseProto
+	(*ReadContainerRequestProto)(nil),            // 13: hadoop.hdds.datanode.ReadContainerRequestProto
+	(*ReadContainerResponseProto)(nil),           // 14: hadoop.hdds.datanode.ReadContainerResponseProto
+	(*UpdateContainerRequestProto)(nil),          // 15: hadoop.hdds.datanode.UpdateContainerRequestProto
+	(*UpdateContainerResponseProto)(nil),         // 16: hadoop.hdds.datanode.UpdateContainerResponseProto
+	(*DeleteContainerRequestProto)(nil),          // 17: hadoop.hdds.datanode.DeleteContainerRequestProto
+	(*DeleteContainerResponseProto)(nil),         // 18: hadoop.hdds.datanode.DeleteContainerResponseProto
+	(*ListContainerRequestProto)(nil),            // 19: hadoop.hdds.datanode.ListContainerRequestProto
+	(*ListContainerResponseProto)(nil),           // 20: hadoop.hdds.datanode.ListContainerResponseProto
+	(*CloseContainerRequestProto)(nil),           // 21: hadoop.hdds.datanode.CloseContainerRequestProto
+	(*CloseContainerResponseProto)(nil),          // 22: hadoop.hdds.datanode.CloseContainerResponseProto
+	(*BlockData)(nil),                            // 23: hadoop.hdds.datanode.BlockData
+	(*PutBlockRequestProto)(nil),                 // 24: hadoop.hdds.datanode.PutBlockRequestProto
+	(*PutBlockResponseProto)(nil),                // 25: hadoop.hdds.datanode.PutBlockResponseProto
+	(*GetBlockRequestProto)(nil),                 // 26: hadoop.hdds.datanode.GetBlockRequestProto
+	(*GetBlockResponseProto)(nil),                // 27: hadoop.hdds.datanode.GetBlockResponseProto
+	(*DeleteBlockRequestProto)(nil),              // 28: hadoop.hdds.datanode.DeleteBlockRequestProto
+	(*GetCommittedBlockLengthRequestProto)(nil),  // 29: hadoop.hdds.datanode.GetCommittedBlockLengthRequestProto
+	(*GetCommittedBlockLengthResponseProto)(nil), // 30: hadoop.hdds.datanode.GetCommittedBlockLengthResponseProto
+	(*DeleteBlockResponseProto)(nil),             // 31: hadoop.hdds.datanode.DeleteBlockResponseProto
+	(*ListBlockRequestProto)(nil),                // 32: hadoop.hdds.datanode.ListBlockRequestProto
+	(*ListBlockResponseProto)(nil),               // 33: hadoop.hdds.datanode.ListBlockResponseProto
+	(*ChunkInfo)(nil),                            // 34: hadoop.hdds.datanode.ChunkInfo
+	(*ChecksumData)(nil),                         // 35: hadoop.hdds.datanode.ChecksumData
+	(*WriteChunkRequestProto)(nil),               // 36: hadoop.hdds.datanode.WriteChunkRequestProto
+	(*WriteChunkResponseProto)(nil),              // 37: hadoop.hdds.datanode.WriteChunkResponseProto
+	(*ReadChunkRequestProto)(nil),                // 38: hadoop.hdds.datanode.ReadChunkRequestProto
+	(*ReadChunkResponseProto)(nil),               // 39: hadoop.hdds.datanode.ReadChunkResponseProto
+	(*DeleteChunkRequestProto)(nil),              // 40: hadoop.hdds.datanode.DeleteChunkRequestProto
+	(*DeleteChunkResponseProto)(nil),             // 41: hadoop.hdds.datanode.DeleteChunkResponseProto
+	(*ListChunkRequestProto)(nil),                // 42: hadoop.hdds.datanode.ListChunkRequestProto
+	(*ListChunkResponseProto)(nil),               // 43: hadoop.hdds.datanode.ListChunkResponseProto
+	(*PutSmallFileRequestProto)(nil),             // 44: hadoop.hdds.datanode.PutSmallFileRequestProto
+	(*PutSmallFileResponseProto)(nil),            // 45: hadoop.hdds.datanode.PutSmallFileResponseProto
+	(*GetSmallFileRequestProto)(nil),             // 46: hadoop.hdds.datanode.GetSmallFileRequestProto
+	(*GetSmallFileResponseProto)(nil),            // 47: hadoop.hdds.datanode.GetSmallFileResponseProto
+	(*CopyContainerRequestProto)(nil),            // 48: hadoop.hdds.datanode.CopyContainerRequestProto
+	(*CopyContainerResponseProto)(nil),           // 49: hadoop.hdds.datanode.CopyContainerResponseProto
+	nil,                                          // 50: hadoop.hdds.datanode.Container2BCSIDMapProto.Container2BCSIDEntry
+}
+var file_DatanodeClientProtocol_proto_depIdxs = []int32{
+	0,  // 0: hadoop.hdds.datanode.ContainerCommandRequestProto.cmdType:type_name -> hadoop.hdds.datanode.Type
+	11, // 1: hadoop.hdds.datanode.ContainerCommandRequestProto.createContainer:type_name -> hadoop.hdds.datanode.CreateContainerRequestProto
+	13, // 2: hadoop.hdds.datanode.ContainerCommandRequestProto.readContainer:type_name -> hadoop.hdds.datanode.ReadContainerRequestProto
+	15, // 3: hadoop.hdds.datanode.ContainerCommandRequestProto.updateContainer:type_name -> hadoop.hdds.datanode.UpdateContainerRequestProto
+	17, // 4: hadoop.hdds.datanode.ContainerCommandRequestProto.deleteContainer:type_name -> hadoop.hdds.datanode.DeleteContainerRequestProto
+	19, // 5: hadoop.hdds.datanode.ContainerCommandRequestProto.listContainer:type_name -> hadoop.hdds.datanode.ListContainerRequestProto
+	21, // 6: hadoop.hdds.datanode.ContainerCommandRequestProto.closeContainer:type_name -> hadoop.hdds.datanode.CloseContainerRequestProto
+	24, // 7: hadoop.hdds.datanode.ContainerCommandRequestProto.putBlock:type_name -> hadoop.hdds.datanode.PutBlockRequestProto
+	26, // 8: hadoop.hdds.datanode.ContainerCommandRequestProto.getBlock:type_name -> hadoop.hdds.datanode.GetBlockRequestProto
+	28, // 9: hadoop.hdds.datanode.ContainerCommandRequestProto.deleteBlock:type_name -> hadoop.hdds.datanode.DeleteBlockRequestProto
+	32, // 10: hadoop.hdds.datanode.ContainerCommandRequestProto.listBlock:type_name -> hadoop.hdds.datanode.ListBlockRequestProto
+	38, // 11: hadoop.hdds.datanode.ContainerCommandRequestProto.readChunk:type_name -> hadoop.hdds.datanode.ReadChunkRequestProto
+	36, // 12: hadoop.hdds.datanode.ContainerCommandRequestProto.writeChunk:type_name -> hadoop.hdds.datanode.WriteChunkRequestProto
+	40, // 13: hadoop.hdds.datanode.ContainerCommandRequestProto.deleteChunk:type_name -> hadoop.hdds.datanode.DeleteChunkRequestProto
+	42, // 14: hadoop.hdds.datanode.ContainerCommandRequestProto.listChunk:type_name -> hadoop.hdds.datanode.ListChunkRequestProto
+	44, // 15: hadoop.hdds.datanode.ContainerCommandRequestProto.putSmallFile:type_name -> hadoop.hdds.datanode.PutSmallFileRequestProto
+	46, // 16: hadoop.hdds.datanode.ContainerCommandRequestProto.getSmallFile:type_name -> hadoop.hdds.datanode.GetSmallFileRequestProto
+	29, // 17: hadoop.hdds.datanode.ContainerCommandRequestProto.getCommittedBlockLength:type_name -> hadoop.hdds.datanode.GetCommittedBlockLengthRequestProto
+	0,  // 18: hadoop.hdds.datanode.ContainerCommandResponseProto.cmdType:type_name -> hadoop.hdds.datanode.Type
+	1,  // 19: hadoop.hdds.datanode.ContainerCommandResponseProto.result:type_name -> hadoop.hdds.datanode.Result
+	12, // 20: hadoop.hdds.datanode.ContainerCommandResponseProto.createContainer:type_name -> hadoop.hdds.datanode.CreateContainerResponseProto
+	14, // 21: hadoop.hdds.datanode.ContainerCommandResponseProto.readContainer:type_name -> hadoop.hdds.datanode.ReadContainerResponseProto
+	16, // 22: hadoop.hdds.datanode.ContainerCommandResponseProto.updateContainer:type_name -> hadoop.hdds.datanode.UpdateContainerResponseProto
+	18, // 23: hadoop.hdds.datanode.ContainerCommandResponseProto.deleteContainer:type_name -> hadoop.hdds.datanode.DeleteContainerResponseProto
+	20, // 24: hadoop.hdds.datanode.ContainerCommandResponseProto.listContainer:type_name -> hadoop.hdds.datanode.ListContainerResponseProto
+	22, // 25: hadoop.hdds.datanode.ContainerCommandResponseProto.closeContainer:type_name -> hadoop.hdds.datanode.CloseContainerResponseProto
+	25, // 26: hadoop.hdds.datanode.ContainerCommandResponseProto.putBlock:type_name -> hadoop.hdds.datanode.PutBlockResponseProto
+	27, // 27: hadoop.hdds.datanode.ContainerCommandResponseProto.getBlock:type_name -> hadoop.hdds.datanode.GetBlockResponseProto
+	31, // 28: hadoop.hdds.datanode.ContainerCommandResponseProto.deleteBlock:type_name -> hadoop.hdds.datanode.DeleteBlockResponseProto
+	33, // 29: hadoop.hdds.datanode.ContainerCommandResponseProto.listBlock:type_name -> hadoop.hdds.datanode.ListBlockResponseProto
+	37, // 30: hadoop.hdds.datanode.ContainerCommandResponseProto.writeChunk:type_name -> hadoop.hdds.datanode.WriteChunkResponseProto
+	39, // 31: hadoop.hdds.datanode.ContainerCommandResponseProto.readChunk:type_name -> hadoop.hdds.datanode.ReadChunkResponseProto
+	41, // 32: hadoop.hdds.datanode.ContainerCommandResponseProto.deleteChunk:type_name -> hadoop.hdds.datanode.DeleteChunkResponseProto
+	43, // 33: hadoop.hdds.datanode.ContainerCommandResponseProto.listChunk:type_name -> hadoop.hdds.datanode.ListChunkResponseProto
+	45, // 34: hadoop.hdds.datanode.ContainerCommandResponseProto.putSmallFile:type_name -> hadoop.hdds.datanode.PutSmallFileResponseProto
+	47, // 35: hadoop.hdds.datanode.ContainerCommandResponseProto.getSmallFile:type_name -> hadoop.hdds.datanode.GetSmallFileResponseProto
+	30, // 36: hadoop.hdds.datanode.ContainerCommandResponseProto.getCommittedBlockLength:type_name -> hadoop.hdds.datanode.GetCommittedBlockLengthResponseProto
+	6,  // 37: hadoop.hdds.datanode.ContainerDataProto.metadata:type_name -> hadoop.hdds.datanode.KeyValue
+	4,  // 38: hadoop.hdds.datanode.ContainerDataProto.state:type_name -> hadoop.hdds.datanode.ContainerDataProto.State
+	2,  // 39: hadoop.hdds.datanode.ContainerDataProto.containerType:type_name -> hadoop.hdds.datanode.ContainerType
+	50, // 40: hadoop.hdds.datanode.Container2BCSIDMapProto.container2BCSID:type_name -> hadoop.hdds.datanode.Container2BCSIDMapProto.Container2BCSIDEntry
+	6,  // 41: hadoop.hdds.datanode.CreateContainerRequestProto.metadata:type_name -> hadoop.hdds.datanode.KeyValue
+	2,  // 42: hadoop.hdds.datanode.CreateContainerRequestProto.containerType:type_name -> hadoop.hdds.datanode.ContainerType
+	9,  // 43: hadoop.hdds.datanode.ReadContainerResponseProto.containerData:type_name -> hadoop.hdds.datanode.ContainerDataProto
+	6,  // 44: hadoop.hdds.datanode.UpdateContainerRequestProto.metadata:type_name -> hadoop.hdds.datanode.KeyValue
+	9,  // 45: hadoop.hdds.datanode.ListContainerResponseProto.containerData:type_name -> hadoop.hdds.datanode.ContainerDataProto
+	5,  // 46: hadoop.hdds.datanode.BlockData.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	6,  // 47: hadoop.hdds.datanode.BlockData.metadata:type_name -> hadoop.hdds.datanode.KeyValue
+	34, // 48: hadoop.hdds.datanode.BlockData.chunks:type_name -> hadoop.hdds.datanode.ChunkInfo
+	23, // 49: hadoop.hdds.datanode.PutBlockRequestProto.blockData:type_name -> hadoop.hdds.datanode.BlockData
+	30, // 50: hadoop.hdds.datanode.PutBlockResponseProto.committedBlockLength:type_name -> hadoop.hdds.datanode.GetCommittedBlockLengthResponseProto
+	5,  // 51: hadoop.hdds.datanode.GetBlockRequestProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	23, // 52: hadoop.hdds.datanode.GetBlockResponseProto.blockData:type_name -> hadoop.hdds.datanode.BlockData
+	5,  // 53: hadoop.hdds.datanode.DeleteBlockRequestProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	5,  // 54: hadoop.hdds.datanode.GetCommittedBlockLengthRequestProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	5,  // 55: hadoop.hdds.datanode.GetCommittedBlockLengthResponseProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	23, // 56: hadoop.hdds.datanode.ListBlockResponseProto.blockData:type_name -> hadoop.hdds.datanode.BlockData
+	6,  // 57: hadoop.hdds.datanode.ChunkInfo.metadata:type_name -> hadoop.hdds.datanode.KeyValue
+	35, // 58: hadoop.hdds.datanode.ChunkInfo.checksumData:type_name -> hadoop.hdds.datanode.ChecksumData
+	3,  // 59: hadoop.hdds.datanode.ChecksumData.type:type_name -> hadoop.hdds.datanode.ChecksumType
+	5,  // 60: hadoop.hdds.datanode.WriteChunkRequestProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	34, // 61: hadoop.hdds.datanode.WriteChunkRequestProto.chunkData:type_name -> hadoop.hdds.datanode.ChunkInfo
+	5,  // 62: hadoop.hdds.datanode.ReadChunkRequestProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	34, // 63: hadoop.hdds.datanode.ReadChunkRequestProto.chunkData:type_name -> hadoop.hdds.datanode.ChunkInfo
+	5,  // 64: hadoop.hdds.datanode.ReadChunkResponseProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	34, // 65: hadoop.hdds.datanode.ReadChunkResponseProto.chunkData:type_name -> hadoop.hdds.datanode.ChunkInfo
+	5,  // 66: hadoop.hdds.datanode.DeleteChunkRequestProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	34, // 67: hadoop.hdds.datanode.DeleteChunkRequestProto.chunkData:type_name -> hadoop.hdds.datanode.ChunkInfo
+	5,  // 68: hadoop.hdds.datanode.ListChunkRequestProto.blockID:type_name -> hadoop.hdds.datanode.DatanodeBlockID
+	34, // 69: hadoop.hdds.datanode.ListChunkResponseProto.chunkData:type_name -> hadoop.hdds.datanode.ChunkInfo
+	24, // 70: hadoop.hdds.datanode.PutSmallFileRequestProto.block:type_name -> hadoop.hdds.datanode.PutBlockRequestProto
+	34, // 71: hadoop.hdds.datanode.PutSmallFileRequestProto.chunkInfo:type_name -> hadoop.hdds.datanode.ChunkInfo
+	30, // 72: hadoop.hdds.datanode.PutSmallFileResponseProto.committedBlockLength:type_name -> hadoop.hdds.datanode.GetCommittedBlockLengthResponseProto
+	26, // 73: hadoop.hdds.datanode.GetSmallFileRequestProto.block:type_name -> hadoop.hdds.datanode.GetBlockRequestProto
+	39, // 74: hadoop.hdds.datanode.GetSmallFileResponseProto.data:type_name -> hadoop.hdds.datanode.ReadChunkResponseProto
+	7,  // 75: hadoop.hdds.datanode.XceiverClientProtocolService.send:input_type -> hadoop.hdds.datanode.ContainerCommandRequestProto
+	48, // 76: hadoop.hdds.datanode.IntraDatanodeProtocolService.download:input_type -> hadoop.hdds.datanode.CopyContainerRequestProto
+	8,  // 77: hadoop.hdds.datanode.XceiverClientProtocolService.send:output_type -> hadoop.hdds.datanode.ContainerCommandResponseProto
+	49, // 78: hadoop.hdds.datanode.IntraDatanodeProtocolService.download:output_type -> hadoop.hdds.datanode.CopyContainerResponseProto
+	77, // [77:79] is the sub-list for method output_type
+	75, // [75:77] is the sub-list for method input_type
+	75, // [75:75] is the sub-list for extension type_name
+	75, // [75:75] is the sub-list for extension extendee
+	0,  // [0:75] is the sub-list for field type_name
+}
+
+func init() { file_DatanodeClientProtocol_proto_init() }
+func file_DatanodeClientProtocol_proto_init() {
+	if File_DatanodeClientProtocol_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_DatanodeClientProtocol_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DatanodeBlockID); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*KeyValue); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ContainerCommandRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ContainerCommandResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ContainerDataProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Container2BCSIDMapProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateContainerRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateContainerResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReadContainerRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReadContainerResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateContainerRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateContainerResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteContainerRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteContainerResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListContainerRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListContainerResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CloseContainerRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CloseContainerResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BlockData); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PutBlockRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PutBlockResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetBlockRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetBlockResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteBlockRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetCommittedBlockLengthRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetCommittedBlockLengthResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteBlockResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListBlockRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListBlockResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ChunkInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ChecksumData); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WriteChunkRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WriteChunkResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReadChunkRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReadChunkResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteChunkRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteChunkResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListChunkRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListChunkResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PutSmallFileRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PutSmallFileResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetSmallFileRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetSmallFileResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CopyContainerRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_DatanodeClientProtocol_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CopyContainerResponseProto); 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_DatanodeClientProtocol_proto_rawDesc,
+			NumEnums:      5,
+			NumMessages:   46,
+			NumExtensions: 0,
+			NumServices:   2,
+		},
+		GoTypes:           file_DatanodeClientProtocol_proto_goTypes,
+		DependencyIndexes: file_DatanodeClientProtocol_proto_depIdxs,
+		EnumInfos:         file_DatanodeClientProtocol_proto_enumTypes,
+		MessageInfos:      file_DatanodeClientProtocol_proto_msgTypes,
+	}.Build()
+	File_DatanodeClientProtocol_proto = out.File
+	file_DatanodeClientProtocol_proto_rawDesc = nil
+	file_DatanodeClientProtocol_proto_goTypes = nil
+	file_DatanodeClientProtocol_proto_depIdxs = nil
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// XceiverClientProtocolServiceClient is the client API for XceiverClientProtocolService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type XceiverClientProtocolServiceClient interface {
+	// A client-to-datanode RPC to send container commands
+	Send(ctx context.Context, opts ...grpc.CallOption) (XceiverClientProtocolService_SendClient, error)
+}
+
+type xceiverClientProtocolServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewXceiverClientProtocolServiceClient(cc grpc.ClientConnInterface) XceiverClientProtocolServiceClient {
+	return &xceiverClientProtocolServiceClient{cc}
+}
+
+func (c *xceiverClientProtocolServiceClient) Send(ctx context.Context, opts ...grpc.CallOption) (XceiverClientProtocolService_SendClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_XceiverClientProtocolService_serviceDesc.Streams[0], "/hadoop.hdds.datanode.XceiverClientProtocolService/send", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &xceiverClientProtocolServiceSendClient{stream}
+	return x, nil
+}
+
+type XceiverClientProtocolService_SendClient interface {
+	Send(*ContainerCommandRequestProto) error
+	Recv() (*ContainerCommandResponseProto, error)
+	grpc.ClientStream
+}
+
+type xceiverClientProtocolServiceSendClient struct {
+	grpc.ClientStream
+}
+
+func (x *xceiverClientProtocolServiceSendClient) Send(m *ContainerCommandRequestProto) error {
+	return x.ClientStream.SendMsg(m)
+}
+
+func (x *xceiverClientProtocolServiceSendClient) Recv() (*ContainerCommandResponseProto, error) {
+	m := new(ContainerCommandResponseProto)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// XceiverClientProtocolServiceServer is the server API for XceiverClientProtocolService service.
+type XceiverClientProtocolServiceServer interface {
+	// A client-to-datanode RPC to send container commands
+	Send(XceiverClientProtocolService_SendServer) error
+}
+
+// UnimplementedXceiverClientProtocolServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedXceiverClientProtocolServiceServer struct {
+}
+
+func (*UnimplementedXceiverClientProtocolServiceServer) Send(XceiverClientProtocolService_SendServer) error {
+	return status.Errorf(codes.Unimplemented, "method Send not implemented")
+}
+
+func RegisterXceiverClientProtocolServiceServer(s *grpc.Server, srv XceiverClientProtocolServiceServer) {
+	s.RegisterService(&_XceiverClientProtocolService_serviceDesc, srv)
+}
+
+func _XceiverClientProtocolService_Send_Handler(srv interface{}, stream grpc.ServerStream) error {
+	return srv.(XceiverClientProtocolServiceServer).Send(&xceiverClientProtocolServiceSendServer{stream})
+}
+
+type XceiverClientProtocolService_SendServer interface {
+	Send(*ContainerCommandResponseProto) error
+	Recv() (*ContainerCommandRequestProto, error)
+	grpc.ServerStream
+}
+
+type xceiverClientProtocolServiceSendServer struct {
+	grpc.ServerStream
+}
+
+func (x *xceiverClientProtocolServiceSendServer) Send(m *ContainerCommandResponseProto) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func (x *xceiverClientProtocolServiceSendServer) Recv() (*ContainerCommandRequestProto, error) {
+	m := new(ContainerCommandRequestProto)
+	if err := x.ServerStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+var _XceiverClientProtocolService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "hadoop.hdds.datanode.XceiverClientProtocolService",
+	HandlerType: (*XceiverClientProtocolServiceServer)(nil),
+	Methods:     []grpc.MethodDesc{},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "send",
+			Handler:       _XceiverClientProtocolService_Send_Handler,
+			ServerStreams: true,
+			ClientStreams: true,
+		},
+	},
+	Metadata: "DatanodeClientProtocol.proto",
+}
+
+// IntraDatanodeProtocolServiceClient is the client API for IntraDatanodeProtocolService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type IntraDatanodeProtocolServiceClient interface {
+	// An intradatanode service to copy the raw container data between nodes
+	Download(ctx context.Context, in *CopyContainerRequestProto, opts ...grpc.CallOption) (IntraDatanodeProtocolService_DownloadClient, error)
+}
+
+type intraDatanodeProtocolServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewIntraDatanodeProtocolServiceClient(cc grpc.ClientConnInterface) IntraDatanodeProtocolServiceClient {
+	return &intraDatanodeProtocolServiceClient{cc}
+}
+
+func (c *intraDatanodeProtocolServiceClient) Download(ctx context.Context, in *CopyContainerRequestProto, opts ...grpc.CallOption) (IntraDatanodeProtocolService_DownloadClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_IntraDatanodeProtocolService_serviceDesc.Streams[0], "/hadoop.hdds.datanode.IntraDatanodeProtocolService/download", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &intraDatanodeProtocolServiceDownloadClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type IntraDatanodeProtocolService_DownloadClient interface {
+	Recv() (*CopyContainerResponseProto, error)
+	grpc.ClientStream
+}
+
+type intraDatanodeProtocolServiceDownloadClient struct {
+	grpc.ClientStream
+}
+
+func (x *intraDatanodeProtocolServiceDownloadClient) Recv() (*CopyContainerResponseProto, error) {
+	m := new(CopyContainerResponseProto)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// IntraDatanodeProtocolServiceServer is the server API for IntraDatanodeProtocolService service.
+type IntraDatanodeProtocolServiceServer interface {
+	// An intradatanode service to copy the raw container data between nodes
+	Download(*CopyContainerRequestProto, IntraDatanodeProtocolService_DownloadServer) error
+}
+
+// UnimplementedIntraDatanodeProtocolServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedIntraDatanodeProtocolServiceServer struct {
+}
+
+func (*UnimplementedIntraDatanodeProtocolServiceServer) Download(*CopyContainerRequestProto, IntraDatanodeProtocolService_DownloadServer) error {
+	return status.Errorf(codes.Unimplemented, "method Download not implemented")
+}
+
+func RegisterIntraDatanodeProtocolServiceServer(s *grpc.Server, srv IntraDatanodeProtocolServiceServer) {
+	s.RegisterService(&_IntraDatanodeProtocolService_serviceDesc, srv)
+}
+
+func _IntraDatanodeProtocolService_Download_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(CopyContainerRequestProto)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(IntraDatanodeProtocolServiceServer).Download(m, &intraDatanodeProtocolServiceDownloadServer{stream})
+}
+
+type IntraDatanodeProtocolService_DownloadServer interface {
+	Send(*CopyContainerResponseProto) error
+	grpc.ServerStream
+}
+
+type intraDatanodeProtocolServiceDownloadServer struct {
+	grpc.ServerStream
+}
+
+func (x *intraDatanodeProtocolServiceDownloadServer) Send(m *CopyContainerResponseProto) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+var _IntraDatanodeProtocolService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "hadoop.hdds.datanode.IntraDatanodeProtocolService",
+	HandlerType: (*IntraDatanodeProtocolServiceServer)(nil),
+	Methods:     []grpc.MethodDesc{},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "download",
+			Handler:       _IntraDatanodeProtocolService_Download_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "DatanodeClientProtocol.proto",
+}
diff --git a/api/proto/hdds/hdds.pb.go b/api/proto/hdds/hdds.pb.go
new file mode 100644
index 0000000..32d9eb4
--- /dev/null
+++ b/api/proto/hdds/hdds.pb.go
@@ -0,0 +1,2452 @@
+/**
+ * Licensed to the 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.  The 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 hdds
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type PipelineState int32
+
+const (
+	PipelineState_PIPELINE_ALLOCATED PipelineState = 1
+	PipelineState_PIPELINE_OPEN      PipelineState = 2
+	PipelineState_PIPELINE_DORMANT   PipelineState = 3
+	PipelineState_PIPELINE_CLOSED    PipelineState = 4
+)
+
+// Enum value maps for PipelineState.
+var (
+	PipelineState_name = map[int32]string{
+		1: "PIPELINE_ALLOCATED",
+		2: "PIPELINE_OPEN",
+		3: "PIPELINE_DORMANT",
+		4: "PIPELINE_CLOSED",
+	}
+	PipelineState_value = map[string]int32{
+		"PIPELINE_ALLOCATED": 1,
+		"PIPELINE_OPEN":      2,
+		"PIPELINE_DORMANT":   3,
+		"PIPELINE_CLOSED":    4,
+	}
+)
+
+func (x PipelineState) Enum() *PipelineState {
+	p := new(PipelineState)
+	*p = x
+	return p
+}
+
+func (x PipelineState) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (PipelineState) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[0].Descriptor()
+}
+
+func (PipelineState) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[0]
+}
+
+func (x PipelineState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *PipelineState) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = PipelineState(num)
+	return nil
+}
+
+// Deprecated: Use PipelineState.Descriptor instead.
+func (PipelineState) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{0}
+}
+
+//*
+// Type of the node.
+type NodeType int32
+
+const (
+	NodeType_OM       NodeType = 1 // Ozone Manager
+	NodeType_SCM      NodeType = 2 // Storage Container Manager
+	NodeType_DATANODE NodeType = 3 // DataNode
+	NodeType_RECON    NodeType = 4 // Recon
+)
+
+// Enum value maps for NodeType.
+var (
+	NodeType_name = map[int32]string{
+		1: "OM",
+		2: "SCM",
+		3: "DATANODE",
+		4: "RECON",
+	}
+	NodeType_value = map[string]int32{
+		"OM":       1,
+		"SCM":      2,
+		"DATANODE": 3,
+		"RECON":    4,
+	}
+)
+
+func (x NodeType) Enum() *NodeType {
+	p := new(NodeType)
+	*p = x
+	return p
+}
+
+func (x NodeType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (NodeType) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[1].Descriptor()
+}
+
+func (NodeType) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[1]
+}
+
+func (x NodeType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *NodeType) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = NodeType(num)
+	return nil
+}
+
+// Deprecated: Use NodeType.Descriptor instead.
+func (NodeType) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{1}
+}
+
+//*
+// Enum that represents the Node State. This is used in calls to getNodeList
+// and getNodeCount.
+type NodeState int32
+
+const (
+	NodeState_HEALTHY         NodeState = 1
+	NodeState_STALE           NodeState = 2
+	NodeState_DEAD            NodeState = 3
+	NodeState_DECOMMISSIONING NodeState = 4
+	NodeState_DECOMMISSIONED  NodeState = 5
+)
+
+// Enum value maps for NodeState.
+var (
+	NodeState_name = map[int32]string{
+		1: "HEALTHY",
+		2: "STALE",
+		3: "DEAD",
+		4: "DECOMMISSIONING",
+		5: "DECOMMISSIONED",
+	}
+	NodeState_value = map[string]int32{
+		"HEALTHY":         1,
+		"STALE":           2,
+		"DEAD":            3,
+		"DECOMMISSIONING": 4,
+		"DECOMMISSIONED":  5,
+	}
+)
+
+func (x NodeState) Enum() *NodeState {
+	p := new(NodeState)
+	*p = x
+	return p
+}
+
+func (x NodeState) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (NodeState) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[2].Descriptor()
+}
+
+func (NodeState) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[2]
+}
+
+func (x NodeState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *NodeState) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = NodeState(num)
+	return nil
+}
+
+// Deprecated: Use NodeState.Descriptor instead.
+func (NodeState) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{2}
+}
+
+type QueryScope int32
+
+const (
+	QueryScope_CLUSTER QueryScope = 1
+	QueryScope_POOL    QueryScope = 2
+)
+
+// Enum value maps for QueryScope.
+var (
+	QueryScope_name = map[int32]string{
+		1: "CLUSTER",
+		2: "POOL",
+	}
+	QueryScope_value = map[string]int32{
+		"CLUSTER": 1,
+		"POOL":    2,
+	}
+)
+
+func (x QueryScope) Enum() *QueryScope {
+	p := new(QueryScope)
+	*p = x
+	return p
+}
+
+func (x QueryScope) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (QueryScope) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[3].Descriptor()
+}
+
+func (QueryScope) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[3]
+}
+
+func (x QueryScope) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *QueryScope) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = QueryScope(num)
+	return nil
+}
+
+// Deprecated: Use QueryScope.Descriptor instead.
+func (QueryScope) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{3}
+}
+
+type LifeCycleState int32
+
+const (
+	LifeCycleState_OPEN         LifeCycleState = 1
+	LifeCycleState_CLOSING      LifeCycleState = 2
+	LifeCycleState_QUASI_CLOSED LifeCycleState = 3
+	LifeCycleState_CLOSED       LifeCycleState = 4
+	LifeCycleState_DELETING     LifeCycleState = 5
+	LifeCycleState_DELETED      LifeCycleState = 6 // object is deleted.
+)
+
+// Enum value maps for LifeCycleState.
+var (
+	LifeCycleState_name = map[int32]string{
+		1: "OPEN",
+		2: "CLOSING",
+		3: "QUASI_CLOSED",
+		4: "CLOSED",
+		5: "DELETING",
+		6: "DELETED",
+	}
+	LifeCycleState_value = map[string]int32{
+		"OPEN":         1,
+		"CLOSING":      2,
+		"QUASI_CLOSED": 3,
+		"CLOSED":       4,
+		"DELETING":     5,
+		"DELETED":      6,
+	}
+)
+
+func (x LifeCycleState) Enum() *LifeCycleState {
+	p := new(LifeCycleState)
+	*p = x
+	return p
+}
+
+func (x LifeCycleState) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (LifeCycleState) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[4].Descriptor()
+}
+
+func (LifeCycleState) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[4]
+}
+
+func (x LifeCycleState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *LifeCycleState) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = LifeCycleState(num)
+	return nil
+}
+
+// Deprecated: Use LifeCycleState.Descriptor instead.
+func (LifeCycleState) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{4}
+}
+
+type LifeCycleEvent int32
+
+const (
+	LifeCycleEvent_FINALIZE    LifeCycleEvent = 1
+	LifeCycleEvent_QUASI_CLOSE LifeCycleEvent = 2
+	LifeCycleEvent_CLOSE       LifeCycleEvent = 3 // !!Event after this has not been used yet.
+	LifeCycleEvent_FORCE_CLOSE LifeCycleEvent = 4
+	LifeCycleEvent_DELETE      LifeCycleEvent = 5
+	LifeCycleEvent_CLEANUP     LifeCycleEvent = 6
+)
+
+// Enum value maps for LifeCycleEvent.
+var (
+	LifeCycleEvent_name = map[int32]string{
+		1: "FINALIZE",
+		2: "QUASI_CLOSE",
+		3: "CLOSE",
+		4: "FORCE_CLOSE",
+		5: "DELETE",
+		6: "CLEANUP",
+	}
+	LifeCycleEvent_value = map[string]int32{
+		"FINALIZE":    1,
+		"QUASI_CLOSE": 2,
+		"CLOSE":       3,
+		"FORCE_CLOSE": 4,
+		"DELETE":      5,
+		"CLEANUP":     6,
+	}
+)
+
+func (x LifeCycleEvent) Enum() *LifeCycleEvent {
+	p := new(LifeCycleEvent)
+	*p = x
+	return p
+}
+
+func (x LifeCycleEvent) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (LifeCycleEvent) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[5].Descriptor()
+}
+
+func (LifeCycleEvent) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[5]
+}
+
+func (x LifeCycleEvent) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *LifeCycleEvent) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = LifeCycleEvent(num)
+	return nil
+}
+
+// Deprecated: Use LifeCycleEvent.Descriptor instead.
+func (LifeCycleEvent) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{5}
+}
+
+type ReplicationType int32
+
+const (
+	ReplicationType_RATIS       ReplicationType = 1
+	ReplicationType_STAND_ALONE ReplicationType = 2
+	ReplicationType_CHAINED     ReplicationType = 3
+)
+
+// Enum value maps for ReplicationType.
+var (
+	ReplicationType_name = map[int32]string{
+		1: "RATIS",
+		2: "STAND_ALONE",
+		3: "CHAINED",
+	}
+	ReplicationType_value = map[string]int32{
+		"RATIS":       1,
+		"STAND_ALONE": 2,
+		"CHAINED":     3,
+	}
+)
+
+func (x ReplicationType) Enum() *ReplicationType {
+	p := new(ReplicationType)
+	*p = x
+	return p
+}
+
+func (x ReplicationType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ReplicationType) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[6].Descriptor()
+}
+
+func (ReplicationType) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[6]
+}
+
+func (x ReplicationType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *ReplicationType) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = ReplicationType(num)
+	return nil
+}
+
+// Deprecated: Use ReplicationType.Descriptor instead.
+func (ReplicationType) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{6}
+}
+
+type ReplicationFactor int32
+
+const (
+	ReplicationFactor_ONE   ReplicationFactor = 1
+	ReplicationFactor_THREE ReplicationFactor = 3
+)
+
+// Enum value maps for ReplicationFactor.
+var (
+	ReplicationFactor_name = map[int32]string{
+		1: "ONE",
+		3: "THREE",
+	}
+	ReplicationFactor_value = map[string]int32{
+		"ONE":   1,
+		"THREE": 3,
+	}
+)
+
+func (x ReplicationFactor) Enum() *ReplicationFactor {
+	p := new(ReplicationFactor)
+	*p = x
+	return p
+}
+
+func (x ReplicationFactor) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ReplicationFactor) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[7].Descriptor()
+}
+
+func (ReplicationFactor) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[7]
+}
+
+func (x ReplicationFactor) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *ReplicationFactor) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = ReplicationFactor(num)
+	return nil
+}
+
+// Deprecated: Use ReplicationFactor.Descriptor instead.
+func (ReplicationFactor) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{7}
+}
+
+type ScmOps int32
+
+const (
+	ScmOps_allocateBlock             ScmOps = 1
+	ScmOps_keyBlocksInfoList         ScmOps = 2
+	ScmOps_getScmInfo                ScmOps = 3
+	ScmOps_deleteBlock               ScmOps = 4
+	ScmOps_createReplicationPipeline ScmOps = 5
+	ScmOps_allocateContainer         ScmOps = 6
+	ScmOps_getContainer              ScmOps = 7
+	ScmOps_getContainerWithPipeline  ScmOps = 8
+	ScmOps_listContainer             ScmOps = 9
+	ScmOps_deleteContainer           ScmOps = 10
+	ScmOps_queryNode                 ScmOps = 11
+)
+
+// Enum value maps for ScmOps.
+var (
+	ScmOps_name = map[int32]string{
+		1:  "allocateBlock",
+		2:  "keyBlocksInfoList",
+		3:  "getScmInfo",
+		4:  "deleteBlock",
+		5:  "createReplicationPipeline",
+		6:  "allocateContainer",
+		7:  "getContainer",
+		8:  "getContainerWithPipeline",
+		9:  "listContainer",
+		10: "deleteContainer",
+		11: "queryNode",
+	}
+	ScmOps_value = map[string]int32{
+		"allocateBlock":             1,
+		"keyBlocksInfoList":         2,
+		"getScmInfo":                3,
+		"deleteBlock":               4,
+		"createReplicationPipeline": 5,
+		"allocateContainer":         6,
+		"getContainer":              7,
+		"getContainerWithPipeline":  8,
+		"listContainer":             9,
+		"deleteContainer":           10,
+		"queryNode":                 11,
+	}
+)
+
+func (x ScmOps) Enum() *ScmOps {
+	p := new(ScmOps)
+	*p = x
+	return p
+}
+
+func (x ScmOps) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ScmOps) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[8].Descriptor()
+}
+
+func (ScmOps) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[8]
+}
+
+func (x ScmOps) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *ScmOps) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = ScmOps(num)
+	return nil
+}
+
+// Deprecated: Use ScmOps.Descriptor instead.
+func (ScmOps) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{8}
+}
+
+//*
+// File access permissions mode.
+type BlockTokenSecretProto_AccessModeProto int32
+
+const (
+	BlockTokenSecretProto_READ   BlockTokenSecretProto_AccessModeProto = 1
+	BlockTokenSecretProto_WRITE  BlockTokenSecretProto_AccessModeProto = 2
+	BlockTokenSecretProto_COPY   BlockTokenSecretProto_AccessModeProto = 3
+	BlockTokenSecretProto_DELETE BlockTokenSecretProto_AccessModeProto = 4
+)
+
+// Enum value maps for BlockTokenSecretProto_AccessModeProto.
+var (
+	BlockTokenSecretProto_AccessModeProto_name = map[int32]string{
+		1: "READ",
+		2: "WRITE",
+		3: "COPY",
+		4: "DELETE",
+	}
+	BlockTokenSecretProto_AccessModeProto_value = map[string]int32{
+		"READ":   1,
+		"WRITE":  2,
+		"COPY":   3,
+		"DELETE": 4,
+	}
+)
+
+func (x BlockTokenSecretProto_AccessModeProto) Enum() *BlockTokenSecretProto_AccessModeProto {
+	p := new(BlockTokenSecretProto_AccessModeProto)
+	*p = x
+	return p
+}
+
+func (x BlockTokenSecretProto_AccessModeProto) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (BlockTokenSecretProto_AccessModeProto) Descriptor() protoreflect.EnumDescriptor {
+	return file_hdds_proto_enumTypes[9].Descriptor()
+}
+
+func (BlockTokenSecretProto_AccessModeProto) Type() protoreflect.EnumType {
+	return &file_hdds_proto_enumTypes[9]
+}
+
+func (x BlockTokenSecretProto_AccessModeProto) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *BlockTokenSecretProto_AccessModeProto) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = BlockTokenSecretProto_AccessModeProto(num)
+	return nil
+}
+
+// Deprecated: Use BlockTokenSecretProto_AccessModeProto.Descriptor instead.
+func (BlockTokenSecretProto_AccessModeProto) EnumDescriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{15, 0}
+}
+
+type UUID struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	MostSigBits  *int64 `protobuf:"varint,1,req,name=mostSigBits" json:"mostSigBits,omitempty"`
+	LeastSigBits *int64 `protobuf:"varint,2,req,name=leastSigBits" json:"leastSigBits,omitempty"`
+}
+
+func (x *UUID) Reset() {
+	*x = UUID{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UUID) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UUID) ProtoMessage() {}
+
+func (x *UUID) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 UUID.ProtoReflect.Descriptor instead.
+func (*UUID) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *UUID) GetMostSigBits() int64 {
+	if x != nil && x.MostSigBits != nil {
+		return *x.MostSigBits
+	}
+	return 0
+}
+
+func (x *UUID) GetLeastSigBits() int64 {
+	if x != nil && x.LeastSigBits != nil {
+		return *x.LeastSigBits
+	}
+	return 0
+}
+
+type DatanodeDetailsProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// deprecated, please use uuid128 instead
+	Uuid         *string `protobuf:"bytes,1,opt,name=uuid" json:"uuid,omitempty"`           // UUID assigned to the Datanode.
+	IpAddress    *string `protobuf:"bytes,2,req,name=ipAddress" json:"ipAddress,omitempty"` // IP address
+	HostName     *string `protobuf:"bytes,3,req,name=hostName" json:"hostName,omitempty"`   // hostname
+	Ports        []*Port `protobuf:"bytes,4,rep,name=ports" json:"ports,omitempty"`
+	CertSerialId *string `protobuf:"bytes,5,opt,name=certSerialId" json:"certSerialId,omitempty"` // Certificate serial id.
+	// network name, can be Ip address or host name, depends
+	NetworkName     *string `protobuf:"bytes,6,opt,name=networkName" json:"networkName,omitempty"`
+	NetworkLocation *string `protobuf:"bytes,7,opt,name=networkLocation" json:"networkLocation,omitempty"` // Network topology location
+	Version         *string `protobuf:"bytes,8,opt,name=version" json:"version,omitempty"`                 // Datanode version
+	SetupTime       *int64  `protobuf:"varint,9,opt,name=setupTime" json:"setupTime,omitempty"`
+	Revision        *string `protobuf:"bytes,10,opt,name=revision" json:"revision,omitempty"`
+	BuildDate       *string `protobuf:"bytes,11,opt,name=buildDate" json:"buildDate,omitempty"`
+	// TODO(runzhiwang): when uuid is gone, specify 1 as the index of uuid128 and mark as required
+	Uuid128 *UUID `protobuf:"bytes,100,opt,name=uuid128" json:"uuid128,omitempty"` // UUID with 128 bits assigned to the Datanode.
+}
+
+func (x *DatanodeDetailsProto) Reset() {
+	*x = DatanodeDetailsProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DatanodeDetailsProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DatanodeDetailsProto) ProtoMessage() {}
+
+func (x *DatanodeDetailsProto) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 DatanodeDetailsProto.ProtoReflect.Descriptor instead.
+func (*DatanodeDetailsProto) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *DatanodeDetailsProto) GetUuid() string {
+	if x != nil && x.Uuid != nil {
+		return *x.Uuid
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetIpAddress() string {
+	if x != nil && x.IpAddress != nil {
+		return *x.IpAddress
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetHostName() string {
+	if x != nil && x.HostName != nil {
+		return *x.HostName
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetPorts() []*Port {
+	if x != nil {
+		return x.Ports
+	}
+	return nil
+}
+
+func (x *DatanodeDetailsProto) GetCertSerialId() string {
+	if x != nil && x.CertSerialId != nil {
+		return *x.CertSerialId
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetNetworkName() string {
+	if x != nil && x.NetworkName != nil {
+		return *x.NetworkName
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetNetworkLocation() string {
+	if x != nil && x.NetworkLocation != nil {
+		return *x.NetworkLocation
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetVersion() string {
+	if x != nil && x.Version != nil {
+		return *x.Version
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetSetupTime() int64 {
+	if x != nil && x.SetupTime != nil {
+		return *x.SetupTime
+	}
+	return 0
+}
+
+func (x *DatanodeDetailsProto) GetRevision() string {
+	if x != nil && x.Revision != nil {
+		return *x.Revision
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetBuildDate() string {
+	if x != nil && x.BuildDate != nil {
+		return *x.BuildDate
+	}
+	return ""
+}
+
+func (x *DatanodeDetailsProto) GetUuid128() *UUID {
+	if x != nil {
+		return x.Uuid128
+	}
+	return nil
+}
+
+//*
+//Proto message encapsulating information required to uniquely identify a
+//OzoneManager.
+type OzoneManagerDetailsProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Uuid      *string `protobuf:"bytes,1,req,name=uuid" json:"uuid,omitempty"`           // UUID assigned to the OzoneManager.
+	IpAddress *string `protobuf:"bytes,2,req,name=ipAddress" json:"ipAddress,omitempty"` // IP address of OM.
+	HostName  *string `protobuf:"bytes,3,req,name=hostName" json:"hostName,omitempty"`   // Hostname of OM.
+	Ports     []*Port `protobuf:"bytes,4,rep,name=ports" json:"ports,omitempty"`
+}
+
+func (x *OzoneManagerDetailsProto) Reset() {
+	*x = OzoneManagerDetailsProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OzoneManagerDetailsProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OzoneManagerDetailsProto) ProtoMessage() {}
+
+func (x *OzoneManagerDetailsProto) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 OzoneManagerDetailsProto.ProtoReflect.Descriptor instead.
+func (*OzoneManagerDetailsProto) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *OzoneManagerDetailsProto) GetUuid() string {
+	if x != nil && x.Uuid != nil {
+		return *x.Uuid
+	}
+	return ""
+}
+
+func (x *OzoneManagerDetailsProto) GetIpAddress() string {
+	if x != nil && x.IpAddress != nil {
+		return *x.IpAddress
+	}
+	return ""
+}
+
+func (x *OzoneManagerDetailsProto) GetHostName() string {
+	if x != nil && x.HostName != nil {
+		return *x.HostName
+	}
+	return ""
+}
+
+func (x *OzoneManagerDetailsProto) GetPorts() []*Port {
+	if x != nil {
+		return x.Ports
+	}
+	return nil
+}
+
+type Port struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name  *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
+	Value *uint32 `protobuf:"varint,2,req,name=value" json:"value,omitempty"`
+}
+
+func (x *Port) Reset() {
+	*x = Port{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Port) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Port) ProtoMessage() {}
+
+func (x *Port) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 Port.ProtoReflect.Descriptor instead.
+func (*Port) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *Port) GetName() string {
+	if x != nil && x.Name != nil {
+		return *x.Name
+	}
+	return ""
+}
+
+func (x *Port) GetValue() uint32 {
+	if x != nil && x.Value != nil {
+		return *x.Value
+	}
+	return 0
+}
+
+type PipelineID struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// deprecated, please use uuid128 instead
+	Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
+	// TODO(runzhiwang): when id is gone, specify 1 as the index of uuid128 and mark as required
+	Uuid128 *UUID `protobuf:"bytes,100,opt,name=uuid128" json:"uuid128,omitempty"`
+}
+
+func (x *PipelineID) Reset() {
+	*x = PipelineID{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PipelineID) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PipelineID) ProtoMessage() {}
+
+func (x *PipelineID) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 PipelineID.ProtoReflect.Descriptor instead.
+func (*PipelineID) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *PipelineID) GetId() string {
+	if x != nil && x.Id != nil {
+		return *x.Id
+	}
+	return ""
+}
+
+func (x *PipelineID) GetUuid128() *UUID {
+	if x != nil {
+		return x.Uuid128
+	}
+	return nil
+}
+
+type Pipeline struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Members []*DatanodeDetailsProto `protobuf:"bytes,1,rep,name=members" json:"members,omitempty"`
+	// TODO: remove the state and leaderID from this class
+	State             *PipelineState     `protobuf:"varint,2,opt,name=state,enum=hadoop.hdds.PipelineState,def=1" json:"state,omitempty"`
+	Type              *ReplicationType   `protobuf:"varint,3,opt,name=type,enum=hadoop.hdds.ReplicationType,def=2" json:"type,omitempty"`
+	Factor            *ReplicationFactor `protobuf:"varint,4,opt,name=factor,enum=hadoop.hdds.ReplicationFactor,def=1" json:"factor,omitempty"`
+	Id                *PipelineID        `protobuf:"bytes,5,req,name=id" json:"id,omitempty"`
+	LeaderID          *string            `protobuf:"bytes,6,opt,name=leaderID" json:"leaderID,omitempty"`
+	MemberOrders      []uint32           `protobuf:"varint,7,rep,name=memberOrders" json:"memberOrders,omitempty"`
+	CreationTimeStamp *uint64            `protobuf:"varint,8,opt,name=creationTimeStamp" json:"creationTimeStamp,omitempty"`
+	// TODO(runzhiwang): when leaderID is gone, specify 6 as the index of leaderID128
+	LeaderID128 *UUID `protobuf:"bytes,100,opt,name=leaderID128" json:"leaderID128,omitempty"`
+}
+
+// Default values for Pipeline fields.
+const (
+	Default_Pipeline_State  = PipelineState_PIPELINE_ALLOCATED
+	Default_Pipeline_Type   = ReplicationType_STAND_ALONE
+	Default_Pipeline_Factor = ReplicationFactor_ONE
+)
+
+func (x *Pipeline) Reset() {
+	*x = Pipeline{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Pipeline) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Pipeline) ProtoMessage() {}
+
+func (x *Pipeline) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 Pipeline.ProtoReflect.Descriptor instead.
+func (*Pipeline) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *Pipeline) GetMembers() []*DatanodeDetailsProto {
+	if x != nil {
+		return x.Members
+	}
+	return nil
+}
+
+func (x *Pipeline) GetState() PipelineState {
+	if x != nil && x.State != nil {
+		return *x.State
+	}
+	return Default_Pipeline_State
+}
+
+func (x *Pipeline) GetType() ReplicationType {
+	if x != nil && x.Type != nil {
+		return *x.Type
+	}
+	return Default_Pipeline_Type
+}
+
+func (x *Pipeline) GetFactor() ReplicationFactor {
+	if x != nil && x.Factor != nil {
+		return *x.Factor
+	}
+	return Default_Pipeline_Factor
+}
+
+func (x *Pipeline) GetId() *PipelineID {
+	if x != nil {
+		return x.Id
+	}
+	return nil
+}
+
+func (x *Pipeline) GetLeaderID() string {
+	if x != nil && x.LeaderID != nil {
+		return *x.LeaderID
+	}
+	return ""
+}
+
+func (x *Pipeline) GetMemberOrders() []uint32 {
+	if x != nil {
+		return x.MemberOrders
+	}
+	return nil
+}
+
+func (x *Pipeline) GetCreationTimeStamp() uint64 {
+	if x != nil && x.CreationTimeStamp != nil {
+		return *x.CreationTimeStamp
+	}
+	return 0
+}
+
+func (x *Pipeline) GetLeaderID128() *UUID {
+	if x != nil {
+		return x.LeaderID128
+	}
+	return nil
+}
+
+type KeyValue struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Key   *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"`
+	Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
+}
+
+func (x *KeyValue) Reset() {
+	*x = KeyValue{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *KeyValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KeyValue) ProtoMessage() {}
+
+func (x *KeyValue) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 KeyValue.ProtoReflect.Descriptor instead.
+func (*KeyValue) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *KeyValue) GetKey() string {
+	if x != nil && x.Key != nil {
+		return *x.Key
+	}
+	return ""
+}
+
+func (x *KeyValue) GetValue() string {
+	if x != nil && x.Value != nil {
+		return *x.Value
+	}
+	return ""
+}
+
+type Node struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	NodeID     *DatanodeDetailsProto `protobuf:"bytes,1,req,name=nodeID" json:"nodeID,omitempty"`
+	NodeStates []NodeState           `protobuf:"varint,2,rep,name=nodeStates,enum=hadoop.hdds.NodeState" json:"nodeStates,omitempty"`
+}
+
+func (x *Node) Reset() {
+	*x = Node{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Node) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Node) ProtoMessage() {}
+
+func (x *Node) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 Node.ProtoReflect.Descriptor instead.
+func (*Node) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *Node) GetNodeID() *DatanodeDetailsProto {
+	if x != nil {
+		return x.NodeID
+	}
+	return nil
+}
+
+func (x *Node) GetNodeStates() []NodeState {
+	if x != nil {
+		return x.NodeStates
+	}
+	return nil
+}
+
+type NodePool struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Nodes []*Node `protobuf:"bytes,1,rep,name=nodes" json:"nodes,omitempty"`
+}
+
+func (x *NodePool) Reset() {
+	*x = NodePool{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NodePool) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NodePool) ProtoMessage() {}
+
+func (x *NodePool) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 NodePool.ProtoReflect.Descriptor instead.
+func (*NodePool) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *NodePool) GetNodes() []*Node {
+	if x != nil {
+		return x.Nodes
+	}
+	return nil
+}
+
+type ContainerInfoProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerID         *int64             `protobuf:"varint,1,req,name=containerID" json:"containerID,omitempty"`
+	State               *LifeCycleState    `protobuf:"varint,2,req,name=state,enum=hadoop.hdds.LifeCycleState" json:"state,omitempty"`
+	PipelineID          *PipelineID        `protobuf:"bytes,3,opt,name=pipelineID" json:"pipelineID,omitempty"`
+	UsedBytes           *uint64            `protobuf:"varint,4,req,name=usedBytes" json:"usedBytes,omitempty"`
+	NumberOfKeys        *uint64            `protobuf:"varint,5,req,name=numberOfKeys" json:"numberOfKeys,omitempty"`
+	StateEnterTime      *int64             `protobuf:"varint,6,opt,name=stateEnterTime" json:"stateEnterTime,omitempty"`
+	Owner               *string            `protobuf:"bytes,7,req,name=owner" json:"owner,omitempty"`
+	DeleteTransactionId *int64             `protobuf:"varint,8,opt,name=deleteTransactionId" json:"deleteTransactionId,omitempty"`
+	SequenceId          *int64             `protobuf:"varint,9,opt,name=sequenceId" json:"sequenceId,omitempty"`
+	ReplicationFactor   *ReplicationFactor `protobuf:"varint,10,req,name=replicationFactor,enum=hadoop.hdds.ReplicationFactor" json:"replicationFactor,omitempty"`
+	ReplicationType     *ReplicationType   `protobuf:"varint,11,req,name=replicationType,enum=hadoop.hdds.ReplicationType" json:"replicationType,omitempty"`
+}
+
+func (x *ContainerInfoProto) Reset() {
+	*x = ContainerInfoProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ContainerInfoProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContainerInfoProto) ProtoMessage() {}
+
+func (x *ContainerInfoProto) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 ContainerInfoProto.ProtoReflect.Descriptor instead.
+func (*ContainerInfoProto) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *ContainerInfoProto) GetContainerID() int64 {
+	if x != nil && x.ContainerID != nil {
+		return *x.ContainerID
+	}
+	return 0
+}
+
+func (x *ContainerInfoProto) GetState() LifeCycleState {
+	if x != nil && x.State != nil {
+		return *x.State
+	}
+	return LifeCycleState_OPEN
+}
+
+func (x *ContainerInfoProto) GetPipelineID() *PipelineID {
+	if x != nil {
+		return x.PipelineID
+	}
+	return nil
+}
+
+func (x *ContainerInfoProto) GetUsedBytes() uint64 {
+	if x != nil && x.UsedBytes != nil {
+		return *x.UsedBytes
+	}
+	return 0
+}
+
+func (x *ContainerInfoProto) GetNumberOfKeys() uint64 {
+	if x != nil && x.NumberOfKeys != nil {
+		return *x.NumberOfKeys
+	}
+	return 0
+}
+
+func (x *ContainerInfoProto) GetStateEnterTime() int64 {
+	if x != nil && x.StateEnterTime != nil {
+		return *x.StateEnterTime
+	}
+	return 0
+}
+
+func (x *ContainerInfoProto) GetOwner() string {
+	if x != nil && x.Owner != nil {
+		return *x.Owner
+	}
+	return ""
+}
+
+func (x *ContainerInfoProto) GetDeleteTransactionId() int64 {
+	if x != nil && x.DeleteTransactionId != nil {
+		return *x.DeleteTransactionId
+	}
+	return 0
+}
+
+func (x *ContainerInfoProto) GetSequenceId() int64 {
+	if x != nil && x.SequenceId != nil {
+		return *x.SequenceId
+	}
+	return 0
+}
+
+func (x *ContainerInfoProto) GetReplicationFactor() ReplicationFactor {
+	if x != nil && x.ReplicationFactor != nil {
+		return *x.ReplicationFactor
+	}
+	return ReplicationFactor_ONE
+}
+
+func (x *ContainerInfoProto) GetReplicationType() ReplicationType {
+	if x != nil && x.ReplicationType != nil {
+		return *x.ReplicationType
+	}
+	return ReplicationType_RATIS
+}
+
+type ContainerWithPipeline struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerInfo *ContainerInfoProto `protobuf:"bytes,1,req,name=containerInfo" json:"containerInfo,omitempty"`
+	Pipeline      *Pipeline           `protobuf:"bytes,2,req,name=pipeline" json:"pipeline,omitempty"`
+}
+
+func (x *ContainerWithPipeline) Reset() {
+	*x = ContainerWithPipeline{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ContainerWithPipeline) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContainerWithPipeline) ProtoMessage() {}
+
+func (x *ContainerWithPipeline) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 ContainerWithPipeline.ProtoReflect.Descriptor instead.
+func (*ContainerWithPipeline) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *ContainerWithPipeline) GetContainerInfo() *ContainerInfoProto {
+	if x != nil {
+		return x.ContainerInfo
+	}
+	return nil
+}
+
+func (x *ContainerWithPipeline) GetPipeline() *Pipeline {
+	if x != nil {
+		return x.Pipeline
+	}
+	return nil
+}
+
+type GetScmInfoRequestProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	TraceID *string `protobuf:"bytes,1,opt,name=traceID" json:"traceID,omitempty"`
+}
+
+func (x *GetScmInfoRequestProto) Reset() {
+	*x = GetScmInfoRequestProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetScmInfoRequestProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetScmInfoRequestProto) ProtoMessage() {}
+
+func (x *GetScmInfoRequestProto) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 GetScmInfoRequestProto.ProtoReflect.Descriptor instead.
+func (*GetScmInfoRequestProto) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *GetScmInfoRequestProto) GetTraceID() string {
+	if x != nil && x.TraceID != nil {
+		return *x.TraceID
+	}
+	return ""
+}
+
+type GetScmInfoResponseProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ClusterId *string `protobuf:"bytes,1,req,name=clusterId" json:"clusterId,omitempty"`
+	ScmId     *string `protobuf:"bytes,2,req,name=scmId" json:"scmId,omitempty"`
+}
+
+func (x *GetScmInfoResponseProto) Reset() {
+	*x = GetScmInfoResponseProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetScmInfoResponseProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetScmInfoResponseProto) ProtoMessage() {}
+
+func (x *GetScmInfoResponseProto) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 GetScmInfoResponseProto.ProtoReflect.Descriptor instead.
+func (*GetScmInfoResponseProto) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *GetScmInfoResponseProto) GetClusterId() string {
+	if x != nil && x.ClusterId != nil {
+		return *x.ClusterId
+	}
+	return ""
+}
+
+func (x *GetScmInfoResponseProto) GetScmId() string {
+	if x != nil && x.ScmId != nil {
+		return *x.ScmId
+	}
+	return ""
+}
+
+type ExcludeListProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Datanodes    []string      `protobuf:"bytes,1,rep,name=datanodes" json:"datanodes,omitempty"`
+	ContainerIds []int64       `protobuf:"varint,2,rep,name=containerIds" json:"containerIds,omitempty"`
+	PipelineIds  []*PipelineID `protobuf:"bytes,3,rep,name=pipelineIds" json:"pipelineIds,omitempty"`
+}
+
+func (x *ExcludeListProto) Reset() {
+	*x = ExcludeListProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExcludeListProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExcludeListProto) ProtoMessage() {}
+
+func (x *ExcludeListProto) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 ExcludeListProto.ProtoReflect.Descriptor instead.
+func (*ExcludeListProto) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *ExcludeListProto) GetDatanodes() []string {
+	if x != nil {
+		return x.Datanodes
+	}
+	return nil
+}
+
+func (x *ExcludeListProto) GetContainerIds() []int64 {
+	if x != nil {
+		return x.ContainerIds
+	}
+	return nil
+}
+
+func (x *ExcludeListProto) GetPipelineIds() []*PipelineID {
+	if x != nil {
+		return x.PipelineIds
+	}
+	return nil
+}
+
+//*
+// Block ID that uniquely identify a block by SCM.
+type ContainerBlockID struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerID *int64 `protobuf:"varint,1,req,name=containerID" json:"containerID,omitempty"`
+	LocalID     *int64 `protobuf:"varint,2,req,name=localID" json:"localID,omitempty"`
+}
+
+func (x *ContainerBlockID) Reset() {
+	*x = ContainerBlockID{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ContainerBlockID) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ContainerBlockID) ProtoMessage() {}
+
+func (x *ContainerBlockID) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 ContainerBlockID.ProtoReflect.Descriptor instead.
+func (*ContainerBlockID) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *ContainerBlockID) GetContainerID() int64 {
+	if x != nil && x.ContainerID != nil {
+		return *x.ContainerID
+	}
+	return 0
+}
+
+func (x *ContainerBlockID) GetLocalID() int64 {
+	if x != nil && x.LocalID != nil {
+		return *x.LocalID
+	}
+	return 0
+}
+
+//*
+// Information for the Hdds block token.
+// When adding further fields, make sure they are optional as they would
+// otherwise not be backwards compatible.
+type BlockTokenSecretProto struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	OwnerId        *string                                 `protobuf:"bytes,1,req,name=ownerId" json:"ownerId,omitempty"`
+	BlockId        *string                                 `protobuf:"bytes,2,req,name=blockId" json:"blockId,omitempty"`
+	ExpiryDate     *uint64                                 `protobuf:"varint,3,req,name=expiryDate" json:"expiryDate,omitempty"`
+	OmCertSerialId *string                                 `protobuf:"bytes,4,req,name=omCertSerialId" json:"omCertSerialId,omitempty"`
+	Modes          []BlockTokenSecretProto_AccessModeProto `protobuf:"varint,5,rep,name=modes,enum=hadoop.hdds.BlockTokenSecretProto_AccessModeProto" json:"modes,omitempty"`
+	MaxLength      *uint64                                 `protobuf:"varint,6,req,name=maxLength" json:"maxLength,omitempty"`
+}
+
+func (x *BlockTokenSecretProto) Reset() {
+	*x = BlockTokenSecretProto{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BlockTokenSecretProto) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BlockTokenSecretProto) ProtoMessage() {}
+
+func (x *BlockTokenSecretProto) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 BlockTokenSecretProto.ProtoReflect.Descriptor instead.
+func (*BlockTokenSecretProto) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *BlockTokenSecretProto) GetOwnerId() string {
+	if x != nil && x.OwnerId != nil {
+		return *x.OwnerId
+	}
+	return ""
+}
+
+func (x *BlockTokenSecretProto) GetBlockId() string {
+	if x != nil && x.BlockId != nil {
+		return *x.BlockId
+	}
+	return ""
+}
+
+func (x *BlockTokenSecretProto) GetExpiryDate() uint64 {
+	if x != nil && x.ExpiryDate != nil {
+		return *x.ExpiryDate
+	}
+	return 0
+}
+
+func (x *BlockTokenSecretProto) GetOmCertSerialId() string {
+	if x != nil && x.OmCertSerialId != nil {
+		return *x.OmCertSerialId
+	}
+	return ""
+}
+
+func (x *BlockTokenSecretProto) GetModes() []BlockTokenSecretProto_AccessModeProto {
+	if x != nil {
+		return x.Modes
+	}
+	return nil
+}
+
+func (x *BlockTokenSecretProto) GetMaxLength() uint64 {
+	if x != nil && x.MaxLength != nil {
+		return *x.MaxLength
+	}
+	return 0
+}
+
+type BlockID struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ContainerBlockID      *ContainerBlockID `protobuf:"bytes,1,req,name=containerBlockID" json:"containerBlockID,omitempty"`
+	BlockCommitSequenceId *uint64           `protobuf:"varint,2,opt,name=blockCommitSequenceId,def=0" json:"blockCommitSequenceId,omitempty"`
+}
+
+// Default values for BlockID fields.
+const (
+	Default_BlockID_BlockCommitSequenceId = uint64(0)
+)
+
+func (x *BlockID) Reset() {
+	*x = BlockID{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_hdds_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BlockID) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BlockID) ProtoMessage() {}
+
+func (x *BlockID) ProtoReflect() protoreflect.Message {
+	mi := &file_hdds_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 BlockID.ProtoReflect.Descriptor instead.
+func (*BlockID) Descriptor() ([]byte, []int) {
+	return file_hdds_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *BlockID) GetContainerBlockID() *ContainerBlockID {
+	if x != nil {
+		return x.ContainerBlockID
+	}
+	return nil
+}
+
+func (x *BlockID) GetBlockCommitSequenceId() uint64 {
+	if x != nil && x.BlockCommitSequenceId != nil {
+		return *x.BlockCommitSequenceId
+	}
+	return Default_BlockID_BlockCommitSequenceId
+}
+
+var File_hdds_proto protoreflect.FileDescriptor
+
+var file_hdds_proto_rawDesc = []byte{
+	0x0a, 0x0a, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x22, 0x4c, 0x0a, 0x04, 0x55, 0x55, 0x49,
+	0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x6f, 0x73, 0x74, 0x53, 0x69, 0x67, 0x42, 0x69, 0x74, 0x73,
+	0x18, 0x01, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x6f, 0x73, 0x74, 0x53, 0x69, 0x67, 0x42,
+	0x69, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x53, 0x69, 0x67, 0x42,
+	0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x65, 0x61, 0x73, 0x74,
+	0x53, 0x69, 0x67, 0x42, 0x69, 0x74, 0x73, 0x22, 0x9c, 0x03, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61,
+	0x6e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x75, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x18, 0x02, 0x20, 0x02, 0x28, 0x09, 0x52, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03,
+	0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27,
+	0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e,
+	0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x50, 0x6f, 0x72, 0x74,
+	0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x65, 0x72, 0x74, 0x53,
+	0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63,
+	0x65, 0x72, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e,
+	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a,
+	0x0f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c,
+	0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
+	0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+	0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x65, 0x74, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12,
+	0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x62,
+	0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x62, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x75, 0x75, 0x69,
+	0x64, 0x31, 0x32, 0x38, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x68, 0x61, 0x64,
+	0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x55, 0x55, 0x49, 0x44, 0x52, 0x07, 0x75,
+	0x75, 0x69, 0x64, 0x31, 0x32, 0x38, 0x22, 0x91, 0x01, 0x0a, 0x18, 0x4f, 0x7a, 0x6f, 0x6e, 0x65,
+	0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28,
+	0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64,
+	0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x02, 0x28, 0x09, 0x52, 0x09, 0x69, 0x70, 0x41, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d,
+	0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d,
+	0x65, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x11, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x50,
+	0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x22, 0x30, 0x0a, 0x04, 0x50, 0x6f,
+	0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x49, 0x0a, 0x0a,
+	0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x07, 0x75, 0x75,
+	0x69, 0x64, 0x31, 0x32, 0x38, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x55, 0x55, 0x49, 0x44, 0x52, 0x07,
+	0x75, 0x75, 0x69, 0x64, 0x31, 0x32, 0x38, 0x22, 0xd5, 0x03, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61,
+	0x69, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+	0x73, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x1a, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x50,
+	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x12, 0x50, 0x49,
+	0x50, 0x45, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x45, 0x44,
+	0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54,
+	0x79, 0x70, 0x65, 0x3a, 0x0b, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x5f, 0x41, 0x4c, 0x4f, 0x4e, 0x45,
+	0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e,
+	0x68, 0x64, 0x64, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x03, 0x4f, 0x4e, 0x45, 0x52, 0x06, 0x66, 0x61, 0x63,
+	0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0b, 0x32,
+	0x17, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x50, 0x69,
+	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08,
+	0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x62,
+	0x65, 0x72, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0c,
+	0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x11,
+	0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d,
+	0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x0b, 0x6c, 0x65,
+	0x61, 0x64, 0x65, 0x72, 0x49, 0x44, 0x31, 0x32, 0x38, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x11, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x55, 0x55,
+	0x49, 0x44, 0x52, 0x0b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x44, 0x31, 0x32, 0x38, 0x22,
+	0x32, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x22, 0x79, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6e,
+	0x6f, 0x64, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x6e, 0x6f,
+	0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06,
+	0x6e, 0x6f, 0x64, 0x65, 0x49, 0x44, 0x12, 0x36, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x74,
+	0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x68, 0x61, 0x64,
+	0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61,
+	0x74, 0x65, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x33,
+	0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x27, 0x0a, 0x05, 0x6e, 0x6f,
+	0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x68, 0x61, 0x64, 0x6f,
+	0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f,
+	0x64, 0x65, 0x73, 0x22, 0x8a, 0x04, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x03, 0x52,
+	0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12, 0x31, 0x0a, 0x05,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x43, 0x79,
+	0x63, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12,
+	0x37, 0x0a, 0x0a, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x44, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64,
+	0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x44, 0x52, 0x0a, 0x70, 0x69,
+	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64,
+	0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x02, 0x28, 0x04, 0x52, 0x09, 0x75, 0x73, 0x65,
+	0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+	0x4f, 0x66, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0c, 0x6e, 0x75,
+	0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x54, 0x69,
+	0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x02, 0x28,
+	0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x72, 0x61,
+	0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65,
+	0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
+	0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x72, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18,
+	0x0a, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68,
+	0x64, 0x64, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46,
+	0x61, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x46, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x02, 0x28,
+	0x0e, 0x32, 0x1c, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52,
+	0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65,
+	0x22, 0x91, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x69,
+	0x74, 0x68, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0d, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x02, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x66,
+	0x6f, 0x12, 0x31, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20,
+	0x02, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64,
+	0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65,
+	0x6c, 0x69, 0x6e, 0x65, 0x22, 0x32, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x63, 0x6d, 0x49, 0x6e,
+	0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18,
+	0x0a, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x44, 0x22, 0x4d, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53,
+	0x63, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64,
+	0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49,
+	0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6d, 0x49, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, 0x09,
+	0x52, 0x05, 0x73, 0x63, 0x6d, 0x49, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x10, 0x45, 0x78, 0x63, 0x6c,
+	0x75, 0x64, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x0a, 0x09,
+	0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x09, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03,
+	0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x39,
+	0x0a, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x73, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64,
+	0x73, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x44, 0x52, 0x0b, 0x70, 0x69,
+	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x73, 0x22, 0x4e, 0x0a, 0x10, 0x43, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x20, 0x0a,
+	0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02,
+	0x28, 0x03, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12,
+	0x18, 0x0a, 0x07, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x02, 0x20, 0x02, 0x28, 0x03,
+	0x52, 0x07, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x44, 0x22, 0xb9, 0x02, 0x0a, 0x15, 0x42, 0x6c,
+	0x6f, 0x63, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01,
+	0x20, 0x02, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a,
+	0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, 0x09, 0x52, 0x07,
+	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72,
+	0x79, 0x44, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x78, 0x70,
+	0x69, 0x72, 0x79, 0x44, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x6f, 0x6d, 0x43, 0x65, 0x72,
+	0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x09, 0x52,
+	0x0e, 0x6f, 0x6d, 0x43, 0x65, 0x72, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x64, 0x12,
+	0x48, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x32,
+	0x2e, 0x68, 0x61, 0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x42, 0x6c, 0x6f,
+	0x63, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78,
+	0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x02, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61,
+	0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x3c, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x65, 0x73,
+	0x73, 0x4d, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45,
+	0x41, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x02, 0x12,
+	0x08, 0x0a, 0x04, 0x43, 0x4f, 0x50, 0x59, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c,
+	0x45, 0x54, 0x45, 0x10, 0x04, 0x22, 0x8d, 0x01, 0x0a, 0x07, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49,
+	0x44, 0x12, 0x49, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x6c,
+	0x6f, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+	0x6e, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x37, 0x0a, 0x15,
+	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65,
+	0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x3a, 0x01, 0x30, 0x52, 0x15,
+	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65,
+	0x6e, 0x63, 0x65, 0x49, 0x64, 0x2a, 0x65, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e,
+	0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x49, 0x50, 0x45, 0x4c, 0x49,
+	0x4e, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x11,
+	0x0a, 0x0d, 0x50, 0x49, 0x50, 0x45, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10,
+	0x02, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x49, 0x50, 0x45, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x44, 0x4f,
+	0x52, 0x4d, 0x41, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x49, 0x50, 0x45, 0x4c,
+	0x49, 0x4e, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x34, 0x0a, 0x08,
+	0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4d, 0x10, 0x01,
+	0x12, 0x07, 0x0a, 0x03, 0x53, 0x43, 0x4d, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x41, 0x54,
+	0x41, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x43, 0x4f, 0x4e,
+	0x10, 0x04, 0x2a, 0x56, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
+	0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05,
+	0x53, 0x54, 0x41, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10,
+	0x03, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f,
+	0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x43, 0x4f, 0x4d, 0x4d,
+	0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x2a, 0x23, 0x0a, 0x0a, 0x51, 0x75,
+	0x65, 0x72, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c, 0x55, 0x53,
+	0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0x02, 0x2a,
+	0x60, 0x0a, 0x0e, 0x4c, 0x69, 0x66, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74,
+	0x65, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x43,
+	0x4c, 0x4f, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x51, 0x55, 0x41, 0x53,
+	0x49, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c,
+	0x4f, 0x53, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49,
+	0x4e, 0x47, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10,
+	0x06, 0x2a, 0x64, 0x0a, 0x0e, 0x4c, 0x69, 0x66, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x10,
+	0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x51, 0x55, 0x41, 0x53, 0x49, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45,
+	0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a,
+	0x0b, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x04, 0x12, 0x0a,
+	0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4c,
+	0x45, 0x41, 0x4e, 0x55, 0x50, 0x10, 0x06, 0x2a, 0x3a, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x69,
+	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x41,
+	0x54, 0x49, 0x53, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x5f, 0x41,
+	0x4c, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x45,
+	0x44, 0x10, 0x03, 0x2a, 0x27, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x4e, 0x45, 0x10,
+	0x01, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x48, 0x52, 0x45, 0x45, 0x10, 0x03, 0x2a, 0xf0, 0x01, 0x0a,
+	0x06, 0x53, 0x63, 0x6d, 0x4f, 0x70, 0x73, 0x12, 0x11, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x63,
+	0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x6b, 0x65,
+	0x79, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x4c, 0x69, 0x73, 0x74, 0x10,
+	0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x67, 0x65, 0x74, 0x53, 0x63, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x10,
+	0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+	0x10, 0x04, 0x12, 0x1d, 0x0a, 0x19, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x10,
+	0x05, 0x12, 0x15, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x43,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10, 0x07, 0x12, 0x1c, 0x0a, 0x18, 0x67, 0x65,
+	0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x50, 0x69,
+	0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10, 0x09, 0x12, 0x13, 0x0a, 0x0f, 0x64,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x10, 0x0a,
+	0x12, 0x0d, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x10, 0x0b, 0x42,
+	0x64, 0x0a, 0x25, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61,
+	0x64, 0x6f, 0x6f, 0x70, 0x2e, 0x68, 0x64, 0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x0a, 0x48, 0x64, 0x64, 0x73, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x73, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x6f, 0x7a, 0x6f, 0x6e, 0x65, 0x2d, 0x67, 0x6f,
+	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x68, 0x64, 0x64, 0x73, 0x88,
+	0x01, 0x01, 0xa0, 0x01, 0x01,
+}
+
+var (
+	file_hdds_proto_rawDescOnce sync.Once
+	file_hdds_proto_rawDescData = file_hdds_proto_rawDesc
+)
+
+func file_hdds_proto_rawDescGZIP() []byte {
+	file_hdds_proto_rawDescOnce.Do(func() {
+		file_hdds_proto_rawDescData = protoimpl.X.CompressGZIP(file_hdds_proto_rawDescData)
+	})
+	return file_hdds_proto_rawDescData
+}
+
+var file_hdds_proto_enumTypes = make([]protoimpl.EnumInfo, 10)
+var file_hdds_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
+var file_hdds_proto_goTypes = []interface{}{
+	(PipelineState)(0),     // 0: hadoop.hdds.PipelineState
+	(NodeType)(0),          // 1: hadoop.hdds.NodeType
+	(NodeState)(0),         // 2: hadoop.hdds.NodeState
+	(QueryScope)(0),        // 3: hadoop.hdds.QueryScope
+	(LifeCycleState)(0),    // 4: hadoop.hdds.LifeCycleState
+	(LifeCycleEvent)(0),    // 5: hadoop.hdds.LifeCycleEvent
+	(ReplicationType)(0),   // 6: hadoop.hdds.ReplicationType
+	(ReplicationFactor)(0), // 7: hadoop.hdds.ReplicationFactor
+	(ScmOps)(0),            // 8: hadoop.hdds.ScmOps
+	(BlockTokenSecretProto_AccessModeProto)(0), // 9: hadoop.hdds.BlockTokenSecretProto.AccessModeProto
+	(*UUID)(nil),                     // 10: hadoop.hdds.UUID
+	(*DatanodeDetailsProto)(nil),     // 11: hadoop.hdds.DatanodeDetailsProto
+	(*OzoneManagerDetailsProto)(nil), // 12: hadoop.hdds.OzoneManagerDetailsProto
+	(*Port)(nil),                     // 13: hadoop.hdds.Port
+	(*PipelineID)(nil),               // 14: hadoop.hdds.PipelineID
+	(*Pipeline)(nil),                 // 15: hadoop.hdds.Pipeline
+	(*KeyValue)(nil),                 // 16: hadoop.hdds.KeyValue
+	(*Node)(nil),                     // 17: hadoop.hdds.Node
+	(*NodePool)(nil),                 // 18: hadoop.hdds.NodePool
+	(*ContainerInfoProto)(nil),       // 19: hadoop.hdds.ContainerInfoProto
+	(*ContainerWithPipeline)(nil),    // 20: hadoop.hdds.ContainerWithPipeline
+	(*GetScmInfoRequestProto)(nil),   // 21: hadoop.hdds.GetScmInfoRequestProto
+	(*GetScmInfoResponseProto)(nil),  // 22: hadoop.hdds.GetScmInfoResponseProto
+	(*ExcludeListProto)(nil),         // 23: hadoop.hdds.ExcludeListProto
+	(*ContainerBlockID)(nil),         // 24: hadoop.hdds.ContainerBlockID
+	(*BlockTokenSecretProto)(nil),    // 25: hadoop.hdds.BlockTokenSecretProto
+	(*BlockID)(nil),                  // 26: hadoop.hdds.BlockID
+}
+var file_hdds_proto_depIdxs = []int32{
+	13, // 0: hadoop.hdds.DatanodeDetailsProto.ports:type_name -> hadoop.hdds.Port
+	10, // 1: hadoop.hdds.DatanodeDetailsProto.uuid128:type_name -> hadoop.hdds.UUID
+	13, // 2: hadoop.hdds.OzoneManagerDetailsProto.ports:type_name -> hadoop.hdds.Port
+	10, // 3: hadoop.hdds.PipelineID.uuid128:type_name -> hadoop.hdds.UUID
+	11, // 4: hadoop.hdds.Pipeline.members:type_name -> hadoop.hdds.DatanodeDetailsProto
+	0,  // 5: hadoop.hdds.Pipeline.state:type_name -> hadoop.hdds.PipelineState
+	6,  // 6: hadoop.hdds.Pipeline.type:type_name -> hadoop.hdds.ReplicationType
+	7,  // 7: hadoop.hdds.Pipeline.factor:type_name -> hadoop.hdds.ReplicationFactor
+	14, // 8: hadoop.hdds.Pipeline.id:type_name -> hadoop.hdds.PipelineID
+	10, // 9: hadoop.hdds.Pipeline.leaderID128:type_name -> hadoop.hdds.UUID
+	11, // 10: hadoop.hdds.Node.nodeID:type_name -> hadoop.hdds.DatanodeDetailsProto
+	2,  // 11: hadoop.hdds.Node.nodeStates:type_name -> hadoop.hdds.NodeState
+	17, // 12: hadoop.hdds.NodePool.nodes:type_name -> hadoop.hdds.Node
+	4,  // 13: hadoop.hdds.ContainerInfoProto.state:type_name -> hadoop.hdds.LifeCycleState
+	14, // 14: hadoop.hdds.ContainerInfoProto.pipelineID:type_name -> hadoop.hdds.PipelineID
+	7,  // 15: hadoop.hdds.ContainerInfoProto.replicationFactor:type_name -> hadoop.hdds.ReplicationFactor
+	6,  // 16: hadoop.hdds.ContainerInfoProto.replicationType:type_name -> hadoop.hdds.ReplicationType
+	19, // 17: hadoop.hdds.ContainerWithPipeline.containerInfo:type_name -> hadoop.hdds.ContainerInfoProto
+	15, // 18: hadoop.hdds.ContainerWithPipeline.pipeline:type_name -> hadoop.hdds.Pipeline
+	14, // 19: hadoop.hdds.ExcludeListProto.pipelineIds:type_name -> hadoop.hdds.PipelineID
+	9,  // 20: hadoop.hdds.BlockTokenSecretProto.modes:type_name -> hadoop.hdds.BlockTokenSecretProto.AccessModeProto
+	24, // 21: hadoop.hdds.BlockID.containerBlockID:type_name -> hadoop.hdds.ContainerBlockID
+	22, // [22:22] is the sub-list for method output_type
+	22, // [22:22] is the sub-list for method input_type
+	22, // [22:22] is the sub-list for extension type_name
+	22, // [22:22] is the sub-list for extension extendee
+	0,  // [0:22] is the sub-list for field type_name
+}
+
+func init() { file_hdds_proto_init() }
+func file_hdds_proto_init() {
+	if File_hdds_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_hdds_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UUID); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DatanodeDetailsProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OzoneManagerDetailsProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Port); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PipelineID); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Pipeline); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*KeyValue); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Node); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NodePool); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ContainerInfoProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ContainerWithPipeline); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetScmInfoRequestProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetScmInfoResponseProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExcludeListProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ContainerBlockID); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BlockTokenSecretProto); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_hdds_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BlockID); 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_hdds_proto_rawDesc,
+			NumEnums:      10,
+			NumMessages:   17,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_hdds_proto_goTypes,
+		DependencyIndexes: file_hdds_proto_depIdxs,
+		EnumInfos:         file_hdds_proto_enumTypes,
+		MessageInfos:      file_hdds_proto_msgTypes,
+	}.Build()
+	File_hdds_proto = out.File
+	file_hdds_proto_rawDesc = nil
+	file_hdds_proto_goTypes = nil
+	file_hdds_proto_depIdxs = nil
+}
diff --git a/api/proto/ozone/OmClientProtocol.pb.go b/api/proto/ozone/OmClientProtocol.pb.go
new file mode 100644
index 0000000..b94db63
--- /dev/null
+++ b/api/proto/ozone/OmClientProtocol.pb.go
@@ -0,0 +1,12561 @@
+//*
+// Licensed to the 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.  The 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.
+
+//*
+// These .proto interfaces are private and unstable.
+// Please see http://wiki.apache.org/hadoop/Compatibility
+// for what changes are allowed for a *unstable* .proto interface.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.24.0
+// 	protoc        v3.15.6
+// source: OmClientProtocol.proto
+
+package ozone
+
+import (
... 19371 lines suppressed ...

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org