//
// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
syntax = "proto3";

import "google/protobuf/any.proto";
import "google/protobuf/descriptor.proto";

// Package gNMI defines a service specification for the gRPC Network Management
// Interface. This interface is defined to be a standard interface via which
// a network management system ("client") can subscribe to state values,
// retrieve snapshots of state information, and manipulate the state of a data
// tree supported by a device ("target").
//
// This document references the gNMI Specification which can be found at
// http://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi.md
package gnmi;

// Define a protobuf FileOption that defines the gNMI service version.
extend google.protobuf.FileOptions {
    // The gNMI service semantic version.
    string gnmi_service = 1001;
}

// gNMI_service is the current version of the gNMI service, returned through
// the Capabilities RPC.
option (gnmi_service) = "0.4.0";

service gNMI {
    // Capabilities allows the client to retrieve the set of capabilities that
    // is supported by the target. This allows the target to validate the
    // service version that is implemented and retrieve the set of models that
    // the target supports. The models can then be specified in subsequent RPCs
    // to restrict the set of data that is utilized.
    // Reference: gNMI Specification Section 3.2
    rpc Capabilities(CapabilityRequest) returns (CapabilityResponse);
    // Retrieve a snapshot of data from the target. A Get RPC requests that the
    // target snapshots a subset of the data tree as specified by the paths
    // included in the message and serializes this to be returned to the
    // client using the specified encoding.
    // Reference: gNMI Specification Section 3.3
    rpc Get(GetRequest) returns (GetResponse);
    // Set allows the client to modify the state of data on the target. The
    // paths to modified along with the new values that the client wishes
    // to set the value to.
    // Reference: gNMI Specification Section 3.4
    rpc Set(SetRequest) returns (SetResponse);
    // Subscribe allows a client to request the target to send it values
    // of particular paths within the data tree. These values may be streamed
    // at a particular cadence (STREAM), sent one off on a long-lived channel
    // (POLL), or sent as a one-off retrieval (ONCE).
    // Reference: gNMI Specification Section 3.5
    rpc Subscribe(stream SubscribeRequest) returns (stream SubscribeResponse);
}

// Notification is a re-usable message that is used to encode data from the
// target to the client. A Notification carries two types of changes to the data
// tree:
//  - Deleted values (delete) - a set of paths that have been removed from the
//    data tree.
//  - Updated values (update) - a set of path-value pairs indicating the path
//    whose value has changed in the data tree.
// Reference: gNMI Specification Section 2.1
message Notification {
    int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
    Path prefix = 2;              // Prefix used for paths in the message.
    // An alias for the path specified in the prefix field.
    // Reference: gNMI Specification Section 2.4.2
    string alias = 3;
    repeated Update update = 4;   // Data elements that have changed values.
    repeated Path delete = 5;     // Data elements that have been deleted.
}

// Update is a re-usable message that is used to store a particular Path,
// Value pair.
// Reference: gNMI Specification Section 2.1
message Update {
    Path path = 1;                      // The path (key) for the update.
    Value value = 2 [deprecated=true];  // The value (value) for the update.
    TypedValue val = 3;                 // The explicitly typed update value.
}

// TypedValue is used to encode a value being sent between the client and
// target (originated by either entity).
message TypedValue {
    // One of the fields within the val oneof is populated with the value
    // of the update. The type of the value being included in the Update
    // determines which field should be populated. In the case that the
    // encoding is a particular form of the base protobuf type, a specific
    // field is used to store the value (e.g., json_val).
    oneof value {
        string string_val = 1;            // String value.
        int64 int_val = 2;                // Integer value.
        uint64 uint_val = 3;              // Unsigned integer value.
        bool bool_val = 4;                // Bool value.
        bytes bytes_val = 5;              // Arbitrary byte sequence value.
        float float_val = 6;              // Floating point value.
        Decimal64 decimal_val = 7;        // Decimal64 encoded value.
        ScalarArray leaflist_val = 8;     // Mixed type scalar array value.
        google.protobuf.Any any_val = 9;  // protobuf.Any encoded bytes.
        bytes json_val = 10;              // JSON-encoded text.
        bytes json_ietf_val = 11;         // JSON-encoded text per RFC7951.
        string ascii_val = 12;            // Arbitrary ASCII text.
    }
}

// Path encodes a data tree path as a series of repeated strings, with
// each element of the path representing a data tree node name and the
// associated attributes.
// Reference: gNMI Specification Section 2.2.2.
message Path {
    // Elements of the path are no longer encoded as a string, but rather within
    // the elem field as a PathElem message.
    repeated string element = 1 [deprecated=true];
    string origin = 2;                              // Label to disambiguate path.
    repeated PathElem elem = 3;                     // Elements of the path.
}

// PathElem encodes an element of a gNMI path, along ith any attributes (keys)
// that may be associated with it.
// Reference: gNMI Specification Section 2.2.2.
message PathElem {
    string name = 1;                    // The name of the element in the path.
    map<string, string> key = 2;        // Map of key (attribute) name to value.
}

// Value encodes a data tree node's value - along with the way in which
// the value is encoded. This message is deprecated by gNMI 0.3.0.
// Reference: gNMI Specification Section 2.2.3.
message Value {
    option deprecated = true;
    bytes value = 1;      // Value of the variable being transmitted.
    Encoding type = 2;    // Encoding used for the value field.
}

// Encoding defines the value encoding formats that are supported by the gNMI
// protocol. These encodings are used by both the client (when sending Set
// messages to modify the state of the target) and the target when serializing
// data to be returned to the client (in both Subscribe and Get RPCs).
// Reference: gNMI Specification Section 2.3
enum Encoding {
    JSON = 0;           // JSON encoded text.
    BYTES = 1;          // Arbitrarily encoded bytes.
    PROTO = 2;          // Encoded according to out-of-band agreed Protobuf.
    ASCII = 3;          // ASCII text of an out-of-band agreed format.
    JSON_IETF = 4;      // JSON encoded text as per RFC7951.
}

// Error message previously utilised to return errors to the client. Deprecated
// in favour of using the google.golang.org/genproto/googleapis/rpc/status
// message in the RPC response.
// Reference: gNMI Specification Section 2.5
message Error {
    option deprecated = true;
    uint32 code = 1;                // Canonical gRPC error code.
    string message = 2;             // Human readable error.
    google.protobuf.Any data = 3;   // Optional additional information.
}

// Decimal64 is used to encode a fixed precision decimal number. The value
// is expressed as a set of digits with the precision specifying the
// number of digits following the decimal point in the digit set.
message Decimal64 {
    uint64 digits = 1;        // Set of digits.
    uint32 precision = 2;     // Number of digits following the decimal point.
}

// ScalarArray is used to encode a mixed-type array of values.
message ScalarArray {
    // The set of elements within the array. Each TypedValue message should
    // specify only elements that have a field identifier of 1-7 (i.e., the
    // values are scalar values).
    repeated TypedValue element = 1;
}

// SubscribeRequest is the message sent by the client to the target when
// initiating a subscription to a set of paths within the data tree. The
// request field must be populated and the initial message must specify a
// SubscriptionList to initiate a subscription. The message is subsequently
// used to define aliases or trigger polled data to be sent by the target.
// Reference: gNMI Specification Section 3.5.1.1
message SubscribeRequest {
    oneof request {
        SubscriptionList subscribe = 1; // Specify the paths within a subscription.
        Poll poll = 3;                  // Trigger a polled update.
        AliasList aliases = 4;          // Aliases to be created.
    }
}

// Poll is sent within a SubscribeRequest to trigger the device to
// send telemetry updates for the paths that are associated with the
// subscription.
// Reference: gNMI Specification Section Section 3.5.1.4
message Poll {
}

// SubscribeResponse is the message used by the target within a Subscribe RPC.
// The target includes a Notification message which is used to transmit values
// of the path(s) that are associated with the subscription. The same message
// is to indicate that the target has sent all data values once (is
// synchronized).
// Reference: gNMI Specification Section 3.5.1.4
message SubscribeResponse {
    oneof response {
        Notification update = 1;          // Changed or sampled value for a path.
        // Indicate target has sent all values associated with the subscription
        // at least once.
        bool sync_response = 3;
        // Deprecated in favour of google.golang.org/genproto/googleapis/rpc/status
        Error error = 4 [deprecated=true];
    }
}

// SubscriptionList is used within a Subscribe message to specify the list of
// paths that the client wishes to subscribe to. The message consists of a
// list of (possibly prefixed) paths, and options that relate to the
// subscription.
// Reference: gNMI Specification Section 3.5.1.2
message SubscriptionList {
    Path prefix = 1;                          // Prefix used for paths.
    repeated Subscription subscription = 2;   // Set of subscriptions to create.
    // Whether target defined aliases are allowed within the subscription.
    bool use_aliases = 3;
    QOSMarking qos = 4;                       // DSCP marking to be used.
    // Mode of the subscription.
    enum Mode {
        STREAM = 0; // Values streamed by the target (Sec. 3.5.1.5.2).
        ONCE = 1;   // Values sent once-off by the target (Sec. 3.5.1.5.1).
        POLL = 2;   // Values sent in response to a poll request (Sec. 3.5.1.5.3).
    }
    Mode mode = 5;
    // Whether elements of the schema that are marked as eligible for aggregation
    // should be aggregated or not.
    bool allow_aggregation = 6;
    // The set of schemas that define the elements of the data tree that should
    // be sent by the target.
    repeated ModelData use_models = 7;
    // The encoding that the target should use within the Notifications generated
    // corresponding to the SubscriptionList.
    Encoding encoding = 8;
}

// Subscription is a single request within a SubscriptionList. The path
// specified is interpreted (along with the prefix) as the elements of the data
// tree that the client is subscribing to. The mode determines how the target
// should trigger updates to be sent.
// Reference: gNMI Specification Section 3.5.1.3
message Subscription {
    Path path = 1;                    // The data tree path.
    SubscriptionMode mode = 2;        // Subscription mode to be used.
    uint64 sample_interval = 3;       // ns between samples in SAMPLE mode.
    // Indicates whether values that not changed should be sent in a SAMPLE
    // subscription.
    bool suppress_redundant = 4;
    // Specifies the maximum allowable silent period in nanoseconds when
    // suppress_redundant is in use. The target should send a value at least once
    // in the period specified.
    uint64 heartbeat_interval = 5;
}

// SubscriptionMode is the mode of the subscription, specifying how the
// target must return values in a subscription.
// Reference: gNMI Specification Section 3.5.1.3
enum SubscriptionMode {
    TARGET_DEFINED = 0;  // The target selects the relevant mode for each element.
    ON_CHANGE      = 1;  // The target sends an update on element value change.
    SAMPLE         = 2;  // The target samples values according to the interval.
}

// QOSMarking specifies the DSCP value to be set on transmitted telemetry
// updates from the target.
// Reference: gNMI Specification Section 3.5.1.2
message QOSMarking {
    uint32 marking = 1;
}

// Alias specifies a data tree path, and an associated string which defines an
// alias which is to be used for this path in the context of the RPC. The alias
// is specified as a string which is prefixed with "#" to disambiguate it from
// data tree element paths.
// Reference: gNMI Specification Section 2.4.2
message Alias {
    Path path = 1;     // The path to be aliased.
    string alias = 2;  // The alias value, a string prefixed by "#".
}

// AliasList specifies a list of aliases. It is used in a SubscribeRequest for
// a client to create a set of aliases that the target is to utilize.
// Reference: gNMI Specification Section 3.5.1.6
message AliasList {
    repeated Alias alias = 1;    // The set of aliases to be created.
}

// SetRequest is sent from a client to the target to update values in the data
// tree. Paths are either deleted by the client, or modified by means of being
// updated, or replaced. Where a replace is used, unspecified values are
// considered to be replaced, whereas when update is used the changes are
// considered to be incremental. The set of changes that are specified within
// a single SetRequest are considered to be a transaction.
// Reference: gNMI Specification Section 3.4.1
message SetRequest {
    Path prefix = 1;                // Prefix used for paths in the message.
    repeated Path delete = 2;       // Paths to be deleted from the data tree.
    repeated Update replace = 3;    // Updates specifying elements to be replaced.
    repeated Update update = 4;     // Updates specifying elements to updated.
}

// SetResponse is the response to a SetRequest, sent from the target to the
// client. It reports the result of the modifications to the data tree that were
// specified by the client. Errors for this RPC should be reported using the
// https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto
// message in the RPC return. The gnmi.Error message can be used to add additional
// details where required.
// Reference: gNMI Specification Section 3.4.2
message SetResponse {
    Path prefix = 1;                      // Prefix used for paths.
    // A set of responses specifying the result of the operations specified in
    // the SetRequest.
    repeated UpdateResult response = 2;
    Error message = 3 [deprecated=true]; // The overall status of the transaction.
    int64 timestamp = 4;                 // Timestamp of transaction (ns since epoch).
}

// UpdateResult is used within the SetResponse message to communicate the
// result of an operation specified within a SetRequest message.
// Reference: gNMI Specification Section 3.4.2
message UpdateResult {
    // The operation that was associated with the Path specified.
    enum Operation {
        INVALID = 0;
        DELETE = 1;           // The result relates to a delete of Path.
        REPLACE = 2;          // The result relates to a replace of Path.
        UPDATE = 3;           // The result relates to an update of Path.
    }
    // Deprecated timestamp for the UpdateResult, this field has been
    // replaced by the timestamp within the SetResponse message, since
    // all mutations effected by a set should be applied as a single
    // transaction.
    int64 timestamp = 1 [deprecated=true];
    Path path = 2;                            // Path associated with the update.
    Error message = 3 [deprecated=true];      // Status of the update operation.
    Operation op = 4;                         // Update operation type.
}

// GetRequest is sent when a client initiates a Get RPC. It is used to specify
// the set of data elements for which the target should return a snapshot of
// data. The use_models field specifies the set of schema modules that are to
// be used by the target - where use_models is not specified then the target
// must use all schema models that it has.
// Reference: gNMI Specification Section 3.3.1
message GetRequest {
    Path prefix = 1;                      // Prefix used for paths.
    repeated Path path = 2;               // Paths requested by the client.
    // Type of elements within the data tree.
    enum DataType {
        ALL = 0;                            // All data elements.
        CONFIG = 1;                         // Config (rw) only elements.
        STATE = 2;                          // State (ro) only elements.
        // Data elements marked in the schema as operational. This refers to data
        // elements whose value relates to the state of processes or interactions
        // running on the device.
        OPERATIONAL = 3;
    }
    DataType type = 3;                    // The type of data being requested.
    Encoding encoding = 5;                // Encoding to be used.
    repeated ModelData use_models = 6;    // The schema models to be used.
}

// GetResponse is used by the target to respond to a GetRequest from a client.
// The set of Notifications corresponds to the data values that are requested
// by the client in the GetRequest.
// Reference: gNMI Specification Section 3.3.2
message GetResponse {
    repeated Notification notification = 1;   // Data values.
    Error error = 2 [deprecated=true];       // Errors that occurred in the Get.
}

// CapabilityRequest is sent by the client in the Capabilities RPC to request
// that the target reports its capabilities.
// Reference: gNMI Specification Section 3.2.1
message CapabilityRequest {
}

// CapabilityResponse is used by the target to report its capabilities to the
// client within the Capabilities RPC.
// Reference: gNMI Specification Section 3.2.2
message CapabilityResponse {
    repeated ModelData supported_models = 1;    // Supported schema models.
    repeated Encoding supported_encodings = 2;  // Supported encodings.
    string gNMI_version = 3;                    // Supported gNMI version.
}

// ModelData is used to describe a set of schema modules. It can be used in a
// CapabilityResponse where a target reports the set of modules that it
// supports, and within the SubscribeRequest and GetRequest messages to specify
// the set of models from which data tree elements should be reported.
// Reference: gNMI Specification Section 3.2.3
message ModelData {
    string name = 1;            // Name of the model.
    string organization = 2;    // Organization publishing the model.
    string version = 3;         // Semantic version of the model.
}
