From 4640099a67341f86e7b5b76fdb66fe41f7f1ee71 Mon Sep 17 00:00:00 2001
From: Leonard Lyubich <leonard@nspcc.ru>
Date: Mon, 15 Mar 2021 14:04:13 +0300
Subject: [PATCH] [#425] control: Implement service RPCs

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
---
 pkg/services/control/convert.go |  94 +++++++++++++++++++++++++++++
 pkg/services/control/rpc.go     | 102 ++++++++++++++++++++++++++++++++
 2 files changed, 196 insertions(+)
 create mode 100644 pkg/services/control/convert.go
 create mode 100644 pkg/services/control/rpc.go

diff --git a/pkg/services/control/convert.go b/pkg/services/control/convert.go
new file mode 100644
index 000000000..dd5d63091
--- /dev/null
+++ b/pkg/services/control/convert.go
@@ -0,0 +1,94 @@
+package control
+
+import (
+	"github.com/nspcc-dev/neofs-api-go/rpc/grpc"
+	"github.com/nspcc-dev/neofs-api-go/rpc/message"
+)
+
+type requestWrapper struct {
+	message.Message
+	m grpc.Message
+}
+
+func (w *requestWrapper) ToGRPCMessage() grpc.Message {
+	return w.m
+}
+
+type healthCheckResponseWrapper struct {
+	m *HealthCheckResponse
+}
+
+func (w *healthCheckResponseWrapper) ToGRPCMessage() grpc.Message {
+	return w.m
+}
+
+func (w *healthCheckResponseWrapper) FromGRPCMessage(m grpc.Message) error {
+	var ok bool
+
+	w.m, ok = m.(*HealthCheckResponse)
+	if !ok {
+		return message.NewUnexpectedMessageType(m, w.m)
+	}
+
+	return nil
+}
+
+type netmapSnapshotResponseWrapper struct {
+	message.Message
+	m *NetmapSnapshotResponse
+}
+
+func (w *netmapSnapshotResponseWrapper) ToGRPCMessage() grpc.Message {
+	return w.m
+}
+
+func (w *netmapSnapshotResponseWrapper) FromGRPCMessage(m grpc.Message) error {
+	var ok bool
+
+	w.m, ok = m.(*NetmapSnapshotResponse)
+	if !ok {
+		return message.NewUnexpectedMessageType(m, w.m)
+	}
+
+	return nil
+}
+
+type setNetmapStatusResponseWrapper struct {
+	message.Message
+	m *SetNetmapStatusResponse
+}
+
+func (w *setNetmapStatusResponseWrapper) ToGRPCMessage() grpc.Message {
+	return w.m
+}
+
+func (w *setNetmapStatusResponseWrapper) FromGRPCMessage(m grpc.Message) error {
+	var ok bool
+
+	w.m, ok = m.(*SetNetmapStatusResponse)
+	if !ok {
+		return message.NewUnexpectedMessageType(m, w.m)
+	}
+
+	return nil
+}
+
+type dropObjectsResponseWrapper struct {
+	message.Message
+	m *DropObjectsResponse
+}
+
+func (w *dropObjectsResponseWrapper) ToGRPCMessage() grpc.Message {
+	return w.m
+}
+
+func (w *dropObjectsResponseWrapper) FromGRPCMessage(m grpc.Message) error {
+	var ok bool
+
+	w.m, ok = m.(*DropObjectsResponse)
+	if !ok {
+		return message.NewUnexpectedMessageType(m, w.m)
+	}
+
+	return nil
+}
diff --git a/pkg/services/control/rpc.go b/pkg/services/control/rpc.go
new file mode 100644
index 000000000..15fdf1c43
--- /dev/null
+++ b/pkg/services/control/rpc.go
@@ -0,0 +1,102 @@
+package control
+
+import (
+	"github.com/nspcc-dev/neofs-api-go/rpc/client"
+	"github.com/nspcc-dev/neofs-api-go/rpc/common"
+)
+
+const serviceName = "control.ControlService"
+
+const (
+	rpcHealthCheck     = "HealthCheck"
+	rpcNetmapSnapshot  = "NetmapSnapshot"
+	rpcSetNetmapStatus = "SetNetmapStatus"
+	rpcDropObjects     = "DropObjects"
+)
+
+// HealthCheck executes ControlService.HealthCheck RPC.
+func HealthCheck(
+	cli *client.Client,
+	req *HealthCheckRequest,
+	opts ...client.CallOption,
+) (*HealthCheckResponse, error) {
+	wResp := &healthCheckResponseWrapper{
+		m: new(HealthCheckResponse),
+	}
+
+	wReq := &requestWrapper{
+		m: req,
+	}
+
+	err := client.SendUnary(cli, common.CallMethodInfoUnary(serviceName, rpcHealthCheck), wReq, wResp, opts...)
+	if err != nil {
+		return nil, err
+	}
+
+	return wResp.m, nil
+}
+
+// NetmapSnapshot executes ControlService.NetmapSnapshot RPC.
+func NetmapSnapshot(
+	cli *client.Client,
+	req *NetmapSnapshotRequest,
+	opts ...client.CallOption,
+) (*NetmapSnapshotResponse, error) {
+	wResp := &netmapSnapshotResponseWrapper{
+		m: new(NetmapSnapshotResponse),
+	}
+
+	wReq := &requestWrapper{
+		m: req,
+	}
+
+	err := client.SendUnary(cli, common.CallMethodInfoUnary(serviceName, rpcNetmapSnapshot), wReq, wResp, opts...)
+	if err != nil {
+		return nil, err
+	}
+
+	return wResp.m, nil
+}
+
+// SetNetmapStatus executes ControlService.SetNetmapStatus RPC.
+func SetNetmapStatus(
+	cli *client.Client,
+	req *SetNetmapStatusRequest,
+	opts ...client.CallOption,
+) (*SetNetmapStatusResponse, error) {
+	wResp := &setNetmapStatusResponseWrapper{
+		m: new(SetNetmapStatusResponse),
+	}
+
+	wReq := &requestWrapper{
+		m: req,
+	}
+
+	err := client.SendUnary(cli, common.CallMethodInfoUnary(serviceName, rpcSetNetmapStatus), wReq, wResp, opts...)
+	if err != nil {
+		return nil, err
+	}
+
+	return wResp.m, nil
+}
+
+// DropObjects executes ControlService.DropObjects RPC.
+func DropObjects(
+	cli *client.Client,
+	req *DropObjectsRequest,
+	opts ...client.CallOption,
+) (*DropObjectsResponse, error) {
+	wResp := &dropObjectsResponseWrapper{
+		m: new(DropObjectsResponse),
+	}
+
+	wReq := &requestWrapper{
+		m: req,
+	}
+	err := client.SendUnary(cli, common.CallMethodInfoUnary(serviceName, rpcDropObjects), wReq, wResp, opts...)
+	if err != nil {
+		return nil, err
+	}
+
+	return wResp.m, nil
+}