syntax = "proto3";

option go_package = "github.com/opencord/voltha-protos/go/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->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;

}


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;

}

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

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