mirror of https://github.com/hashicorp/consul
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
6.3 KiB
219 lines
6.3 KiB
// Copyright (c) HashiCorp, Inc. |
|
// SPDX-License-Identifier: BUSL-1.1 |
|
|
|
package pbcommon |
|
|
|
import ( |
|
"time" |
|
|
|
"github.com/hashicorp/consul/agent/structs" |
|
durationpb "google.golang.org/protobuf/types/known/durationpb" |
|
) |
|
|
|
// IsRead is always true for QueryOption |
|
func (q *QueryOptions) IsRead() bool { |
|
return true |
|
} |
|
|
|
// AllowStaleRead returns whether a stale read should be allowed |
|
func (q *QueryOptions) AllowStaleRead() bool { |
|
return q.AllowStale |
|
} |
|
|
|
func (q *QueryOptions) TokenSecret() string { |
|
return q.Token |
|
} |
|
|
|
func (q *QueryOptions) SetTokenSecret(s string) { |
|
q.Token = s |
|
} |
|
|
|
// SetToken is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetToken(token string) { |
|
q.Token = token |
|
} |
|
|
|
// SetMinQueryIndex is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetMinQueryIndex(minQueryIndex uint64) { |
|
q.MinQueryIndex = minQueryIndex |
|
} |
|
|
|
// SetMaxQueryTime is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetMaxQueryTime(maxQueryTime time.Duration) { |
|
q.MaxQueryTime = durationpb.New(maxQueryTime) |
|
} |
|
|
|
// SetAllowStale is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetAllowStale(allowStale bool) { |
|
q.AllowStale = allowStale |
|
} |
|
|
|
// SetRequireConsistent is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetRequireConsistent(requireConsistent bool) { |
|
q.RequireConsistent = requireConsistent |
|
} |
|
|
|
// SetUseCache is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetUseCache(useCache bool) { |
|
q.UseCache = useCache |
|
} |
|
|
|
// SetMaxStaleDuration is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetMaxStaleDuration(maxStaleDuration time.Duration) { |
|
q.MaxStaleDuration = durationpb.New(maxStaleDuration) |
|
} |
|
|
|
// SetMaxAge is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetMaxAge(maxAge time.Duration) { |
|
q.MaxAge = durationpb.New(maxAge) |
|
} |
|
|
|
// SetMustRevalidate is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetMustRevalidate(mustRevalidate bool) { |
|
q.MustRevalidate = mustRevalidate |
|
} |
|
|
|
// SetStaleIfError is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetStaleIfError(staleIfError time.Duration) { |
|
q.StaleIfError = durationpb.New(staleIfError) |
|
} |
|
|
|
func (q *QueryOptions) HasTimedOut(start time.Time, rpcHoldTimeout, maxQueryTime, defaultQueryTime time.Duration) (bool, error) { |
|
// In addition to BlockingTimeout, allow for an additional rpcHoldTimeout buffer |
|
// in case we need to wait for a leader election. |
|
return time.Since(start) > rpcHoldTimeout+q.BlockingTimeout(maxQueryTime, defaultQueryTime), nil |
|
} |
|
|
|
// BlockingTimeout implements pool.BlockableQuery |
|
func (q *QueryOptions) BlockingTimeout(maxQueryTime, defaultQueryTime time.Duration) time.Duration { |
|
maxTime := q.MaxQueryTime.AsDuration() |
|
o := structs.QueryOptions{ |
|
MaxQueryTime: maxTime, |
|
MinQueryIndex: q.MinQueryIndex, |
|
} |
|
return o.BlockingTimeout(maxQueryTime, defaultQueryTime) |
|
} |
|
|
|
// SetFilter is needed to implement the structs.QueryOptionsCompat interface |
|
func (q *QueryOptions) SetFilter(filter string) { |
|
q.Filter = filter |
|
} |
|
|
|
// WriteRequest only applies to writes, always false |
|
// |
|
// IsRead implements structs.RPCInfo |
|
func (w *WriteRequest) IsRead() bool { |
|
return false |
|
} |
|
|
|
// SetTokenSecret implements structs.RPCInfo |
|
func (w *WriteRequest) TokenSecret() string { |
|
return w.Token |
|
} |
|
|
|
// SetTokenSecret implements structs.RPCInfo |
|
func (w *WriteRequest) SetTokenSecret(s string) { |
|
w.Token = s |
|
} |
|
|
|
// AllowStaleRead returns whether a stale read should be allowed |
|
// |
|
// AllowStaleRead implements structs.RPCInfo |
|
func (w *WriteRequest) AllowStaleRead() bool { |
|
return false |
|
} |
|
|
|
// HasTimedOut implements structs.RPCInfo |
|
func (w *WriteRequest) HasTimedOut(start time.Time, rpcHoldTimeout, maxQueryTime, defaultQueryTime time.Duration) (bool, error) { |
|
return time.Since(start) > rpcHoldTimeout, nil |
|
} |
|
|
|
// IsRead implements structs.RPCInfo |
|
func (r *ReadRequest) IsRead() bool { |
|
return true |
|
} |
|
|
|
// AllowStaleRead implements structs.RPCInfo |
|
func (r *ReadRequest) AllowStaleRead() bool { |
|
// TODO(partitions): plumb this? |
|
return false |
|
} |
|
|
|
// TokenSecret implements structs.RPCInfo |
|
func (r *ReadRequest) TokenSecret() string { |
|
return r.Token |
|
} |
|
|
|
// SetTokenSecret implements structs.RPCInfo |
|
func (r *ReadRequest) SetTokenSecret(token string) { |
|
r.Token = token |
|
} |
|
|
|
// HasTimedOut implements structs.RPCInfo |
|
func (r *ReadRequest) HasTimedOut(start time.Time, rpcHoldTimeout, _, _ time.Duration) (bool, error) { |
|
return time.Since(start) > rpcHoldTimeout, nil |
|
} |
|
|
|
// RequestDatacenter implements structs.RPCInfo |
|
func (td *TargetDatacenter) RequestDatacenter() string { |
|
return td.Datacenter |
|
} |
|
|
|
// SetLastContact is needed to implement the structs.QueryMetaCompat interface |
|
func (q *QueryMeta) SetLastContact(lastContact time.Duration) { |
|
q.LastContact = durationpb.New(lastContact) |
|
} |
|
|
|
// SetKnownLeader is needed to implement the structs.QueryMetaCompat interface |
|
func (q *QueryMeta) SetKnownLeader(knownLeader bool) { |
|
q.KnownLeader = knownLeader |
|
} |
|
|
|
// SetIndex is needed to implement the structs.QueryMetaCompat interface |
|
func (q *QueryMeta) SetIndex(index uint64) { |
|
q.Index = index |
|
} |
|
|
|
// SetConsistencyLevel is needed to implement the structs.QueryMetaCompat interface |
|
func (q *QueryMeta) SetConsistencyLevel(consistencyLevel string) { |
|
q.ConsistencyLevel = consistencyLevel |
|
} |
|
|
|
func (q *QueryMeta) GetBackend() structs.QueryBackend { |
|
return structs.QueryBackend(0) |
|
} |
|
|
|
// SetResultsFilteredByACLs is needed to implement the structs.QueryMetaCompat interface |
|
func (q *QueryMeta) SetResultsFilteredByACLs(v bool) { |
|
q.ResultsFilteredByACLs = v |
|
} |
|
|
|
// IsEmpty returns true if the Locality is unset or contains an empty region and zone. |
|
func (l *Locality) IsEmpty() bool { |
|
if l == nil { |
|
return true |
|
} |
|
return l.Region == "" && l.Zone == "" |
|
} |
|
|
|
// LocalityFromProto converts a protobuf Locality to a struct Locality. |
|
func LocalityFromProto(l *Locality) *structs.Locality { |
|
if l == nil { |
|
return nil |
|
} |
|
return &structs.Locality{ |
|
Region: l.Region, |
|
Zone: l.Zone, |
|
} |
|
} |
|
|
|
// LocalityFromProto converts a struct Locality to a protobuf Locality. |
|
func LocalityToProto(l *structs.Locality) *Locality { |
|
if l == nil { |
|
return nil |
|
} |
|
return &Locality{ |
|
Region: l.Region, |
|
Zone: l.Zone, |
|
} |
|
}
|
|
|