syntax = "proto3";

// Package gnmi_ext defines a set of extensions messages which can be optionally
// included with the request and response messages of gNMI RPCs. A set of
// well-known extensions are defined within this file, along with a registry for
// extensions defined outside of this package.
package gnmi_ext;

option go_package = "github.com/openconfig/gnmi/proto/gnmi_ext";

// The Extension message contains a single gNMI extension.
message Extension {
  oneof ext {
    RegisteredExtension registered_ext = 1;    // A registered extension.
    // Well known extensions.
    MasterArbitration master_arbitration = 2;  // Master arbitration extension.
    History history = 3;                       // History extension.
  }
}

// The RegisteredExtension message defines an extension which is defined outside
// of this file.
message RegisteredExtension {
  ExtensionID id = 1; // The unique ID assigned to this extension.
  bytes msg = 2;      // The binary-marshalled protobuf extension payload.
}

// RegisteredExtension is an enumeration acting as a registry for extensions
// defined by external sources.
enum ExtensionID {
  EID_UNSET = 0;
  // New extensions are to be defined within this enumeration - their definition
  // MUST link to a reference describing their implementation.

  // An experimental extension that may be used during prototyping of a new
  // extension.
  EID_EXPERIMENTAL = 999;
}

// MasterArbitration is used to select the master among multiple gNMI clients
// with the same Roles. The client with the largest election_id is honored as
// the master.
// The document about gNMI master arbitration can be found at
// https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-master-arbitration.md
message MasterArbitration {
  Role role = 1;
  Uint128 election_id = 2;
}

// Representation of unsigned 128-bit integer.
message Uint128 {
  uint64 high = 1;
  uint64 low = 2;
}

// There can be one master for each role. The role is identified by its id.
message Role {
  string id = 1;
  // More fields can be added if needed, for example, to specify what paths the
  // role can read/write.
}

// The History extension allows clients to request historical data. Its
// spec can be found at
// https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md
message History {
  oneof request {
    int64 snapshot_time = 1; // Nanoseconds since the epoch
    TimeRange range = 2;
  }
}

message TimeRange {
  int64 start = 1; // Nanoseconds since the epoch
  int64 end = 2;   // Nanoseconds since the epoch
}