syntax = "proto3";

option go_package = "github.com/opencord/voltha-go/protos/voltha";

package voltha;

import "meta.proto";
import "google/api/annotations.proto";

message ConfigEventType {
    enum ConfigEventType {
        add = 0; // A new config has been added
        remove = 1; // A config has been removed
        update = 2; // A config has been updated
    }
}

message ConfigEvent {
    ConfigEventType.ConfigEventType type = 1;

    string hash = 2; // hash for this change, can be used for quick lookup
    string data = 3; // the actual new data, in json format
}

message KpiEventType {
    enum KpiEventType {
        slice = 0; // slice: a set of path/metric data for same time-stamp
        ts = 1; // time-series: array of data for same metric
    }
}

/*
 * Struct to convey a dictionary of metric metadata.
 */
message MetricMetaData {
    string title = 1;   // Metric group or individual metric name
    double ts = 2;      // UTC time-stamp of data (seconds since epoch) of
                        // when the metric or metric group was collected.
                        // If this is a 15-min historical group, it is the
                        // time of the collection and reporting, not the
                        // start or end of the 15-min group interval.

    string logical_device_id = 3; // The logical device ID of the VOLTHA
                                  // (equivalent to the DPID that ONOS has
                                  // for the VOLTHA device without the
                                  //  'of:' prefix
    string serial_no = 4;         // The OLT, ONU, ... device serial number
    string device_id = 5;         // The OLT, ONU, ... physical device ID

    map<string, string> context = 6; // Name value pairs that provide additional
                                     // context information on the metrics being
                                     // reported.
}

/*
 * Struct to convey a dictionary of metric->value pairs. Typically used in
 * pure shared-timestamp or shared-timestamp + shared object prefix situations.
 */
message MetricValuePairs {

    // Metric / value pairs.
    map<string, float> metrics = 1;

}

/*
 * Struct to group metadata for a metric (or group of metrics) with the key-value
 * pairs of collected metrics
 */
message MetricInformation {
    MetricMetaData metadata = 1;
    map<string, float> metrics = 2;
}

/*
 * Legacy KPI Event structured.  In mid-August, the KPI event format was updated
 *                               to a more easily parsable format. See VOL-1140
 *                               for more information.
 */
message KpiEvent {

    KpiEventType.KpiEventType type = 1;

    // Fields used when for slice:

    float ts = 2; // UTC time-stamp of data in slice mode (seconds since epoc)

    map<string, MetricValuePairs> prefixes = 3;

}

message KpiEvent2 {
    // Type of KPI Event
    KpiEventType.KpiEventType type = 1;

    // Fields used when for slice:
    double ts = 2;  // UTC time-stamp of data in slice mode (seconds since epoch)
                    // of the time this entire KpiEvent was published to the kafka bus

    repeated MetricInformation slice_data = 3;
}

/*
 * Identify to the area of the system impacted by the alarm
 */
message AlarmEventType {
    enum AlarmEventType {
        COMMUNICATION = 0;
        ENVIRONMENT = 1;
        EQUIPMENT = 2;
        SERVICE = 3;
        PROCESSING = 4;
        SECURITY = 5;
    }
}

/*
 * Identify to the functional category originating the alarm
 */
message AlarmEventCategory {
    enum AlarmEventCategory {
        PON = 0;
        OLT = 1;
        ONT = 2;
        ONU = 3;
        NNI = 4;
    }
}

/*
 * Active state of the alarm
 */
message AlarmEventState {
    enum AlarmEventState {
        RAISED = 0;
        CLEARED = 1;
    }
}

/*
 * Identify the overall impact of the alarm on the system
 */
message AlarmEventSeverity {
    enum AlarmEventSeverity {
        INDETERMINATE = 0;
        WARNING = 1;
        MINOR = 2;
        MAJOR = 3;
        CRITICAL = 4;
    }
}

/*
 *
 */
message AlarmEvent {
    // Unique ID for this alarm.  e.g. voltha.some_olt.1234
    string id = 1;

    // Refers to the area of the system impacted by the alarm
    AlarmEventType.AlarmEventType type = 2;

    // Refers to functional category of the alarm
    AlarmEventCategory.AlarmEventCategory category = 3;

    // Current active state of the alarm
    AlarmEventState.AlarmEventState state = 4;

    // Overall impact of the alarm on the system
    AlarmEventSeverity.AlarmEventSeverity severity = 5;

    // Timestamp at which the alarm was first raised
    float raised_ts = 6;

    // Timestamp at which the alarm was reported
    float reported_ts = 7;

    // Timestamp at which the alarm has changed since it was raised
    float changed_ts = 8;

    // Identifier of the originating resource of the alarm
    string resource_id = 9;

    // Textual explanation of the alarm
    string description = 10;

    // Key/Value storage for extra information that may give context to the alarm
    map<string, string> context = 11;

    // logical device id
    string logical_device_id = 12;

    // alarm_type  name indicates clearly the name of the alarm
    string alarm_type_name = 13;
}
