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;
}