syntax = "proto3";

option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
package dmi;

import "dmi/commons.proto";
import "dmi/hw.proto";

// The model used to represent the event data on the SensorData of a component as described
// in RFC8348 (https://tools.ietf.org/html/rfc8348)

// Management of Metrics and protos for encoding of Metrics

enum MetricNames {
    METRIC_NAME_UNDEFINED = 0;

    // FAN related metrics
    METRIC_FAN_SPEED = 1;

    // CPU related metrics
    METRIC_CPU_TEMP = 100;
    METRIC_CPU_USAGE_PERCENTAGE = 101;

    // Transceiver related metrics
    METRIC_TRANSCEIVER_TEMP = 200;
    METRIC_TRANSCEIVER_VOLTAGE = 201;
    METRIC_TRANSCEIVER_BIAS = 202;
    METRIC_TRANSCEIVER_RX_POWER = 203;
    METRIC_TRANSCEIVER_TX_POWER = 204;
    METRIC_TRANSCEIVER_WAVELENGTH = 205;

    // Disk related metrics
    METRIC_DISK_TEMP = 300;
    METRIC_DISK_CAPACITY = 301;
    METRIC_DISK_USAGE = 302;
    METRIC_DISK_USAGE_PERCENTAGE = 303;
    METRIC_DISK_READ_WRITE_PERCENTAGE = 304;
    METRIC_DISK_FAULTY_CELLS_PERCENTAGE = 305;

    // RAM related metrics
    METRIC_RAM_TEMP = 400;
    METRIC_RAM_CAPACITY = 401;
    METRIC_RAM_USAGE = 402;
    METRIC_RAM_USAGE_PERCENTAGE = 403;

    // Power related metrics
    METRIC_POWER_MAX = 500;
    METRIC_POWER_USAGE = 501;
    METRIC_POWER_USAGE_PERCENTAGE = 502;

    // Chassis related metrics
    METRIC_INNER_SURROUNDING_TEMP = 600;
}

message MetricConfig {
    MetricNames metric_id = 1;
    // Whether the device manager is collecting and reporting this metric or not
    bool is_configured = 2;
    // Number of seconds between two consecutive polls of the particular metric
    // Each device manager implemenation could have it's per metric default poll frequency which
    // can be requested to be changed using this value
    uint32 poll_interval = 3;
}

message MetricsConfig {
    repeated MetricConfig metrics = 1;
}

message ListMetricsResponse {
    enum Reason {
        UNDEFINED_REASON = 0;
        UNKNOWN_DEVICE = 1;
        INTERNAL_ERROR = 2;
        DEVICE_UNREACHABLE = 3;
    }
    Status status = 1;
    Reason reason = 2;
    MetricsConfig metrics = 3;
    string reason_detail = 4;
}

message MetricsConfigurationRequest {
    Uuid device_uuid = 1;
    oneof operation {
        MetricsConfig changes = 2;
        bool reset_to_default = 3;
    }
}

message MetricsConfigurationResponse {
    enum Reason {
        UNDEFINED_REASON = 0;
        UNKNOWN_DEVICE = 1;
        INTERNAL_ERROR = 2;
        POLL_INTERVAL_UNSUPPORTED = 3;
        INVALID_METRIC = 4;
        DEVICE_UNREACHABLE = 5;
    }
    Status status = 1;
    Reason reason = 2;
    string reason_detail = 3;
}

message MetricMetaData {
    Uuid device_uuid = 1;
    // uuid of the component
    Uuid component_uuid = 2;
    string component_name = 3;
}

// The Metrics are conveyed to external systems by submitting them on a kafka bus.
// The topic to which are Metrics are submitted would be configured as startup
// configuration of the components
message Metric {
    MetricNames metric_id = 1;
    MetricMetaData metric_metadata = 2;
    ComponentSensorData value = 3;
}

message GetMetricRequest {
    MetricMetaData meta_data = 1;
    MetricNames metric_id = 2;
}

message GetMetricResponse {
    enum Reason {
        UNDEFINED_REASON = 0;
        UNKNOWN_DEVICE = 1;
        UNKNOWN_COMPONENT = 2;
        INTERNAL_ERROR = 3;
        INVALID_METRIC = 4;
        DEVICE_UNREACHABLE = 5;
    }
    Status status = 1;
    Reason reason = 2;
    Metric metric = 3;
    string reason_detail = 4;
}

service NativeMetricsManagementService {

    // List the supported metrics for the passed device.
    // This would be the first call that you make to know about the metrics that a particular device supports and
    // then use the UpdateMetricsConfiguration API to monitor only the required metrics.
    rpc ListMetrics(HardwareID) returns(ListMetricsResponse);

    // Updates the configuration of the list of metrics in the request
    // Acts upon single metric configuration, collection of a single metric can be started/stopped
    // by changing its configuration.
    //
    // This configuration is persisted across restart of the device or the device manager
    rpc UpdateMetricsConfiguration(MetricsConfigurationRequest) returns(MetricsConfigurationResponse);

    // Get the instantenous value of a metric
    rpc GetMetric(GetMetricRequest) returns(GetMetricResponse);
}
