// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

syntax = "proto3";

package hashicorp.consul.internal.common;

import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";

// RaftIndex is used to track the index used while creating
// or modifying a given struct type.
//
// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.RaftIndex
// output=common.gen.go
// name=Structs
// ignore-fields=state,sizeCache,unknownFields
message RaftIndex {
  // @gotags: bexpr:"-"
  uint64 CreateIndex = 1;
  // @gotags: bexpr:"-"
  uint64 ModifyIndex = 2;
}

// TargetDatacenter is intended to be used within other messages used for RPC routing
// amongst the various Consul datacenters
message TargetDatacenter {
  string Datacenter = 1;
}

// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.WriteRequest
// output=common.gen.go
// name=Structs
// ignore-fields=state,sizeCache,unknownFields
message WriteRequest {
  // Token is the ACL token ID. If not provided, the 'anonymous'
  // token is assumed for backwards compatibility.
  string Token = 1;
}

// ReadRequest is a type that may be embedded into any requests for read
// operations.
// It is a replacement for QueryOptions now that we no longer need any of those
// fields because we are moving away from using blocking queries.
// It is also similar to WriteRequest. It is a separate type so that in the
// future we can introduce fields that may only be relevant for reads.
message ReadRequest {
  // Token is the ACL token ID. If not provided, the 'anonymous'
  // token is assumed for backwards compatibility.
  string Token = 1;

  // RequireConsistent indicates that the request must be sent to the leader.
  bool RequireConsistent = 2;
}

// QueryOptions is used to specify various flags for read queries
//
// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.QueryOptions
// output=common.gen.go
// name=Structs
// ignore-fields=StaleIfError,AllowNotModifiedResponse,state,sizeCache,unknownFields
message QueryOptions {
  // Token is the ACL token ID. If not provided, the 'anonymous'
  // token is assumed for backwards compatibility.
  string Token = 1;

  // If set, wait until query exceeds given index. Must be provided
  // with MaxQueryTime.
  uint64 MinQueryIndex = 2;

  // Provided with MinQueryIndex to wait for change.
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration MaxQueryTime = 3;

  // If set, any follower can service the request. Results
  // may be arbitrarily stale.
  bool AllowStale = 4;

  // If set, the leader must verify leadership prior to
  // servicing the request. Prevents a stale read.
  bool RequireConsistent = 5;

  // If set, the local agent may respond with an arbitrarily stale locally
  // cached response. The semantics differ from AllowStale since the agent may
  // be entirely partitioned from the servers and still considered "healthy" by
  // operators. Stale responses from Servers are also arbitrarily stale, but can
  // provide additional bounds on the last contact time from the leader. It's
  // expected that servers that are partitioned are noticed and replaced in a
  // timely way by operators while the same may not be true for client agents.
  bool UseCache = 6;

  // If set and AllowStale is true, will try first a stale
  // read, and then will perform a consistent read if stale
  // read is older than value.
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration MaxStaleDuration = 7;

  // MaxAge limits how old a cached value will be returned if UseCache is true.
  // If there is a cached response that is older than the MaxAge, it is treated
  // as a cache miss and a new fetch invoked. If the fetch fails, the error is
  // returned. Clients that wish to allow for stale results on error can set
  // StaleIfError to a longer duration to change this behavior. It is ignored
  // if the endpoint supports background refresh caching. See
  // https://www.consul.io/api/index.html#agent-caching for more details.
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration MaxAge = 8;

  // MustRevalidate forces the agent to fetch a fresh version of a cached
  // resource or at least validate that the cached version is still fresh. It is
  // implied by either max-age=0 or must-revalidate Cache-Control headers. It
  // only makes sense when UseCache is true. We store it since MaxAge = 0 is the
  // default unset value.
  bool MustRevalidate = 9;

  // StaleIfError specifies how stale the client will accept a cached response
  // if the servers are unavailable to fetch a fresh one. Only makes sense when
  // UseCache is true and MaxAge is set to a lower, non-zero value. It is
  // ignored if the endpoint supports background refresh caching. See
  // https://www.consul.io/api/index.html#agent-caching for more details.
  google.protobuf.Duration StaleIfError = 10;

  // Filter specifies the go-bexpr filter expression to be used for
  // filtering the data prior to returning a response
  string Filter = 11;
}

// QueryMeta allows a query response to include potentially
// useful metadata about a query
//
// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.QueryMeta
// output=common.gen.go
// name=Structs
// ignore-fields=NotModified,Backend,state,sizeCache,unknownFields
message QueryMeta {
  // This is the index associated with the read
  uint64 Index = 1;

  // If AllowStale is used, this is time elapsed since
  // last contact between the follower and leader. This
  // can be used to gauge staleness.
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration LastContact = 2;

  // Used to indicate if there is a known leader node
  bool KnownLeader = 3;

  // Consistencylevel returns the consistency used to serve the query
  // Having `discovery_max_stale` on the agent can affect whether
  // the request was served by a leader.
  string ConsistencyLevel = 4;

  // Reserved for NotModified and Backend.
  reserved 5, 6;

  // ResultsFilteredByACLs is true when some of the query's results were
  // filtered out by enforcing ACLs. It may be false because nothing was
  // removed, or because the endpoint does not yet support this flag.
  bool ResultsFilteredByACLs = 7;
}

// EnterpriseMeta contains metadata that is only used by the Enterprise version
// of Consul.
message EnterpriseMeta {
  // Namespace in which the entity exists.
  string Namespace = 1;
  // Partition in which the entity exists.
  string Partition = 2;
}

// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.EnvoyExtension
// output=common.gen.go
// name=Structs
message EnvoyExtension {
  string Name = 1;
  bool Required = 2;
  // mog: func-to=ProtobufTypesStructToMapStringInterface func-from=MapStringInterfaceToProtobufTypesStruct
  google.protobuf.Struct Arguments = 3;
  string ConsulVersion = 4;
  string EnvoyVersion = 5;
}

// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.Locality
// output=common.gen.go
// name=Structs
message Locality {
  // Region is region the zone belongs to.
  string Region = 1;

  // Zone is the zone the entity is running in.
  string Zone = 2;
}
