syntax = "proto3";
package state;
option go_package = "github.com/nspcc-dev/neofs-proto/state";

import "service/meta.proto";
import "service/verify.proto";
import "bootstrap/types.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";

option (gogoproto.stable_marshaler_all) = true;

// Status service provides node's healthcheck and status info
service Status {
    // Netmap request allows to receive current [bootstrap.SpreadMap](bootstrap.md#bootstrap.SpreadMap)
    rpc Netmap(NetmapRequest) returns (bootstrap.SpreadMap);
    // Metrics request allows to receive metrics in prometheus format
    rpc Metrics(MetricsRequest) returns (MetricsResponse);
    // HealthCheck request allows to check health status of the node.
    // If node unhealthy field Status would contains detailed info.
    rpc HealthCheck(HealthRequest) returns (HealthResponse);
    // DumpConfig request allows dumping settings for the current node.
    // To permit access, used server config options.
    // The request should be signed.
    rpc DumpConfig(DumpRequest) returns (DumpResponse);
}

// NetmapRequest message to request current node netmap
message NetmapRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// MetricsRequest message to request node metrics
message MetricsRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// MetricsResponse contains [][]byte,
// every []byte is marshaled MetricFamily proto message
// from github.com/prometheus/client_model/metrics.proto
message MetricsResponse {
    repeated bytes Metrics = 1;
}

// HealthRequest message to check current state
message HealthRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// HealthResponse message with current state
message HealthResponse {
    // Healthy is true when node alive and healthy
    bool Healthy  = 1;
    // Status contains detailed information about health status
    string Status = 2;
}

// DumpRequest message to fetch current server config.
message DumpRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// DumpResponse message contains current server config.
// Config stored in JSON encoded into slice of bytes.
message DumpResponse {
    bytes Config = 1;
}