syntax = "proto3";

package ircontrol;

import "pkg/services/control/ir/types.proto";

option go_package = "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/ir/control";

// `ControlService` provides an interface for internal work with the Inner Ring
// node.
service ControlService {
  // Performs health check of the IR node.
  rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
  // Forces a new epoch to be signaled by the IR node with high probability.
  rpc TickEpoch(TickEpochRequest) returns (TickEpochResponse);
  // Forces a node removal to be signaled by the IR node with high probability.
  rpc RemoveNode(RemoveNodeRequest) returns (RemoveNodeResponse);
  // Forces a container removal to be signaled by the IR node with high
  // probability.
  rpc RemoveContainer(RemoveContainerRequest) returns (RemoveContainerResponse);
}

// Health check request.
message HealthCheckRequest {
  // Health check request body.
  message Body {}

  // Body of health check request message.
  Body body = 1;

  // Body signature.
  // Should be signed by node key or one of
  // the keys configured by the node.
  Signature signature = 2;
}

// Health check response.
message HealthCheckResponse {
  // Health check response body
  message Body {
    // Health status of IR node application.
    HealthStatus health_status = 1;
  }

  // Body of health check response message.
  Body body = 1;

  // Body signature.
  Signature signature = 2;
}

message TickEpochRequest {
  message Body {
    // Valid until block value override.
    uint32 vub = 1;
  }

  Body body = 1;
  Signature signature = 2;
}

message TickEpochResponse {
  message Body {
    // Valid until block value for transaction.
    uint32 vub = 1;
  }

  Body body = 1;
  Signature signature = 2;
}

message RemoveNodeRequest {
  message Body {
    bytes key = 1;
    // Valid until block value override.
    uint32 vub = 2;
  }

  Body body = 1;
  Signature signature = 2;
}

message RemoveNodeResponse {
  message Body {
    // Valid until block value for transaction.
    uint32 vub = 1;
  }

  Body body = 1;
  Signature signature = 2;
}

message RemoveContainerRequest {
  message Body {
    bytes container_id = 1;
    bytes owner = 2;
    // Valid until block value override.
    uint32 vub = 3;
  }

  Body body = 1;
  Signature signature = 2;
}

message RemoveContainerResponse {
  message Body {
    // Valid until block value for transaction.
    uint32 vub = 1;
  }

  Body body = 1;
  Signature signature = 2;
}