Expand the QueryOptions and QueryMeta interfaces (#6545)

In a previous PR I made it so that we had interfaces that would work enough to allow blockingQueries to work. However to complete this we need all fields to be settable and gettable.

Notes:
   • If Go ever gets contracts/generics then we could get rid of all the Getters/Setters
   • protoc / protoc-gen-gogo are going to generate all the getters for us.
   • I copied all the getters/setters from the protobuf funcs into agent/structs/protobuf_compat.go
   • Also added JSON marshaling funcs that use jsonpb for protobuf types.
This commit is contained in:
Matt Keeler 2019-09-26 09:55:02 -04:00 committed by GitHub
parent fdd10dd8b8
commit 76cf54068b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 718 additions and 281 deletions

View File

@ -14,68 +14,99 @@ func (q *QueryOptions) AllowStaleRead() bool {
return q.AllowStale return q.AllowStale
} }
// TokenSecret returns the token to be used to authorize the request
func (q *QueryOptions) TokenSecret() string { func (q *QueryOptions) TokenSecret() string {
return q.Token return q.Token
} }
// GetMinQueryIndex implements the interface necessary to be used // SetToken is needed to implement the structs.QueryOptionsCompat interface
// in a blocking query func (q *QueryOptions) SetToken(token string) {
func (q *QueryOptions) GetMinQueryIndex() uint64 { q.Token = token
return q.MinQueryIndex
} }
// GetMaxQueryTime implements the interface necessary to be used // SetMinQueryIndex is needed to implement the structs.QueryOptionsCompat interface
// in a blocking query func (q *QueryOptions) SetMinQueryIndex(minQueryIndex uint64) {
func (q *QueryOptions) GetMaxQueryTime() time.Duration { q.MinQueryIndex = minQueryIndex
return q.MaxQueryTime
} }
// GetRequireConsistent implements the interface necessary to be used // SetMaxQueryTime is needed to implement the structs.QueryOptionsCompat interface
// in a blocking query func (q *QueryOptions) SetMaxQueryTime(maxQueryTime time.Duration) {
func (q *QueryOptions) GetRequireConsistent() bool { q.MaxQueryTime = maxQueryTime
return q.RequireConsistent
} }
// SetLastContact implements the interface necessary to be used // SetAllowStale is needed to implement the structs.QueryOptionsCompat interface
// in a blocking query 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 = maxStaleDuration
}
// SetMaxAge is needed to implement the structs.QueryOptionsCompat interface
func (q *QueryOptions) SetMaxAge(maxAge time.Duration) {
q.MaxAge = 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 = staleIfError
}
// SetFilter is needed to implement the structs.QueryOptionsCompat interface
func (q *QueryOptions) SetFilter(filter string) {
q.Filter = filter
}
// SetLastContact is needed to implement the structs.QueryMetaCompat interface
func (q *QueryMeta) SetLastContact(lastContact time.Duration) { func (q *QueryMeta) SetLastContact(lastContact time.Duration) {
q.LastContact = lastContact q.LastContact = lastContact
} }
// SetKnownLeader implements the interface necessary to be used // SetKnownLeader is needed to implement the structs.QueryMetaCompat interface
// in a blocking query
func (q *QueryMeta) SetKnownLeader(knownLeader bool) { func (q *QueryMeta) SetKnownLeader(knownLeader bool) {
q.KnownLeader = knownLeader q.KnownLeader = knownLeader
} }
// GetIndex implements the interface necessary to be used // SetIndex is needed to implement the structs.QueryMetaCompat interface
// in a blocking query
func (q *QueryMeta) GetIndex() uint64 {
return q.Index
}
// SetIndex implements the interface necessary to be used
// in a blocking query
func (q *QueryMeta) SetIndex(index uint64) { func (q *QueryMeta) SetIndex(index uint64) {
q.Index = index q.Index = index
} }
// SetConsistencyLevel is needed to implement the structs.QueryMetaCompat interface
func (q *QueryMeta) SetConsistencyLevel(consistencyLevel string) {
q.ConsistencyLevel = consistencyLevel
}
// WriteRequest only applies to writes, always false // WriteRequest only applies to writes, always false
func (w WriteRequest) IsRead() bool { func (w WriteRequest) IsRead() bool {
return false return false
} }
func (w WriteRequest) TokenSecret() string {
return w.Token
}
// AllowStaleRead returns whether a stale read should be allowed // AllowStaleRead returns whether a stale read should be allowed
func (w WriteRequest) AllowStaleRead() bool { func (w WriteRequest) AllowStaleRead() bool {
return false return false
} }
// TokenSecret returns the token to be used to authorize the request
func (w WriteRequest) TokenSecret() string {
return w.Token
}
func (td TargetDatacenter) RequestDatacenter() string { func (td TargetDatacenter) RequestDatacenter() string {
return td.Datacenter return td.Datacenter
} }

View File

@ -11,6 +11,7 @@ import (
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
io "io" io "io"
math "math" math "math"
math_bits "math/bits"
time "time" time "time"
) )
@ -24,7 +25,7 @@ var _ = time.Kitchen
// is compatible with the proto package it is being compiled against. // is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the // A compilation error at this line likely means your copy of the
// proto package needs to be updated. // proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// RaftIndex is used to track the index used while creating // RaftIndex is used to track the index used while creating
// or modifying a given struct type. // or modifying a given struct type.
@ -47,7 +48,7 @@ func (m *RaftIndex) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_RaftIndex.Marshal(b, m, deterministic) return xxx_messageInfo_RaftIndex.Marshal(b, m, deterministic)
} else { } else {
b = b[:cap(b)] b = b[:cap(b)]
n, err := m.MarshalTo(b) n, err := m.MarshalToSizedBuffer(b)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -86,7 +87,7 @@ func (m *TargetDatacenter) XXX_Marshal(b []byte, deterministic bool) ([]byte, er
return xxx_messageInfo_TargetDatacenter.Marshal(b, m, deterministic) return xxx_messageInfo_TargetDatacenter.Marshal(b, m, deterministic)
} else { } else {
b = b[:cap(b)] b = b[:cap(b)]
n, err := m.MarshalTo(b) n, err := m.MarshalToSizedBuffer(b)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -125,7 +126,7 @@ func (m *WriteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
return xxx_messageInfo_WriteRequest.Marshal(b, m, deterministic) return xxx_messageInfo_WriteRequest.Marshal(b, m, deterministic)
} else { } else {
b = b[:cap(b)] b = b[:cap(b)]
n, err := m.MarshalTo(b) n, err := m.MarshalToSizedBuffer(b)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -144,6 +145,13 @@ func (m *WriteRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_WriteRequest proto.InternalMessageInfo var xxx_messageInfo_WriteRequest proto.InternalMessageInfo
func (m *WriteRequest) GetToken() string {
if m != nil {
return m.Token
}
return ""
}
// QueryOptions is used to specify various flags for read queries // QueryOptions is used to specify various flags for read queries
type QueryOptions struct { type QueryOptions struct {
// Token is the ACL token ID. If not provided, the 'anonymous' // Token is the ACL token ID. If not provided, the 'anonymous'
@ -211,7 +219,7 @@ func (m *QueryOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
return xxx_messageInfo_QueryOptions.Marshal(b, m, deterministic) return xxx_messageInfo_QueryOptions.Marshal(b, m, deterministic)
} else { } else {
b = b[:cap(b)] b = b[:cap(b)]
n, err := m.MarshalTo(b) n, err := m.MarshalToSizedBuffer(b)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -230,6 +238,83 @@ func (m *QueryOptions) XXX_DiscardUnknown() {
var xxx_messageInfo_QueryOptions proto.InternalMessageInfo var xxx_messageInfo_QueryOptions proto.InternalMessageInfo
func (m *QueryOptions) GetToken() string {
if m != nil {
return m.Token
}
return ""
}
func (m *QueryOptions) GetMinQueryIndex() uint64 {
if m != nil {
return m.MinQueryIndex
}
return 0
}
func (m *QueryOptions) GetMaxQueryTime() time.Duration {
if m != nil {
return m.MaxQueryTime
}
return 0
}
func (m *QueryOptions) GetAllowStale() bool {
if m != nil {
return m.AllowStale
}
return false
}
func (m *QueryOptions) GetRequireConsistent() bool {
if m != nil {
return m.RequireConsistent
}
return false
}
func (m *QueryOptions) GetUseCache() bool {
if m != nil {
return m.UseCache
}
return false
}
func (m *QueryOptions) GetMaxStaleDuration() time.Duration {
if m != nil {
return m.MaxStaleDuration
}
return 0
}
func (m *QueryOptions) GetMaxAge() time.Duration {
if m != nil {
return m.MaxAge
}
return 0
}
func (m *QueryOptions) GetMustRevalidate() bool {
if m != nil {
return m.MustRevalidate
}
return false
}
func (m *QueryOptions) GetStaleIfError() time.Duration {
if m != nil {
return m.StaleIfError
}
return 0
}
func (m *QueryOptions) GetFilter() string {
if m != nil {
return m.Filter
}
return ""
}
// QueryMeta allows a query response to include potentially // QueryMeta allows a query response to include potentially
// useful metadata about a query // useful metadata about a query
type QueryMeta struct { type QueryMeta struct {
@ -261,7 +346,7 @@ func (m *QueryMeta) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryMeta.Marshal(b, m, deterministic) return xxx_messageInfo_QueryMeta.Marshal(b, m, deterministic)
} else { } else {
b = b[:cap(b)] b = b[:cap(b)]
n, err := m.MarshalTo(b) n, err := m.MarshalToSizedBuffer(b)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -280,6 +365,34 @@ func (m *QueryMeta) XXX_DiscardUnknown() {
var xxx_messageInfo_QueryMeta proto.InternalMessageInfo var xxx_messageInfo_QueryMeta proto.InternalMessageInfo
func (m *QueryMeta) GetIndex() uint64 {
if m != nil {
return m.Index
}
return 0
}
func (m *QueryMeta) GetLastContact() time.Duration {
if m != nil {
return m.LastContact
}
return 0
}
func (m *QueryMeta) GetKnownLeader() bool {
if m != nil {
return m.KnownLeader
}
return false
}
func (m *QueryMeta) GetConsistencyLevel() string {
if m != nil {
return m.ConsistencyLevel
}
return ""
}
func init() { func init() {
proto.RegisterType((*RaftIndex)(nil), "agentpb.RaftIndex") proto.RegisterType((*RaftIndex)(nil), "agentpb.RaftIndex")
proto.RegisterType((*TargetDatacenter)(nil), "agentpb.TargetDatacenter") proto.RegisterType((*TargetDatacenter)(nil), "agentpb.TargetDatacenter")
@ -291,47 +404,47 @@ func init() {
func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) } func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) }
var fileDescriptor_555bd8c177793206 = []byte{ var fileDescriptor_555bd8c177793206 = []byte{
// 529 bytes of a gzipped FileDescriptorProto // 538 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x41, 0x6f, 0x12, 0x4f, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xc1, 0x6e, 0xd3, 0x40,
0x1c, 0xdd, 0xfd, 0xff, 0x29, 0x65, 0x7f, 0x50, 0x83, 0x93, 0xc6, 0xac, 0x1c, 0x06, 0xb2, 0x69, 0x14, 0xb4, 0x21, 0x4d, 0xe3, 0x97, 0x14, 0x85, 0x55, 0x85, 0x4c, 0x0e, 0x4e, 0x64, 0x21, 0x14,
0x0c, 0x31, 0x0a, 0x49, 0xbd, 0xe9, 0xa9, 0xd0, 0x6a, 0x1a, 0xd9, 0x34, 0x8e, 0x18, 0xcf, 0x03, 0x55, 0x90, 0x48, 0xe5, 0x56, 0x4e, 0x4d, 0x5a, 0x50, 0x45, 0xac, 0x8a, 0x25, 0x88, 0xf3, 0x26,
0xfc, 0x58, 0x37, 0x2e, 0x33, 0x38, 0x3b, 0xb4, 0xf0, 0x2d, 0x3c, 0x78, 0xe8, 0x27, 0xf1, 0x33, 0x79, 0x31, 0x16, 0xce, 0x6e, 0x58, 0x6f, 0xda, 0xe4, 0x0f, 0x38, 0x72, 0xac, 0x38, 0xf1, 0x21,
0x70, 0xec, 0xd1, 0x53, 0x55, 0xf8, 0x06, 0x7e, 0x02, 0xb3, 0xb3, 0x50, 0xb7, 0xd2, 0x03, 0xde, 0x7c, 0x40, 0x8e, 0x3d, 0x72, 0x2a, 0x90, 0xfc, 0x01, 0x5f, 0x80, 0xbc, 0x76, 0x8a, 0x4b, 0x7a,
0xf6, 0xbd, 0x7d, 0x6f, 0xe6, 0xcd, 0xef, 0xf7, 0xa0, 0xd4, 0x97, 0xa3, 0x91, 0x14, 0x8d, 0xb1, 0x08, 0x37, 0xcf, 0x78, 0x66, 0x77, 0xf6, 0xbd, 0x81, 0x52, 0x5f, 0x8c, 0x46, 0x82, 0x37, 0xc6,
0x92, 0x5a, 0x92, 0x5d, 0x1e, 0xa0, 0xd0, 0xe3, 0x5e, 0x85, 0x06, 0x52, 0x06, 0x11, 0x36, 0x0d, 0x52, 0x28, 0x41, 0xb6, 0x99, 0x8f, 0x5c, 0x8d, 0x7b, 0x15, 0xc7, 0x17, 0xc2, 0x0f, 0xb1, 0xa9,
0xdd, 0x9b, 0x0c, 0x9b, 0x83, 0x89, 0xe2, 0x3a, 0x5c, 0x0b, 0x2b, 0xfb, 0x81, 0x0c, 0xa4, 0xf9, 0xe9, 0xde, 0x64, 0xd8, 0x1c, 0x4c, 0x24, 0x53, 0xc1, 0x4a, 0x58, 0xd9, 0xf5, 0x85, 0x2f, 0xf4,
0x6c, 0x26, 0x5f, 0x29, 0xeb, 0x8d, 0xc0, 0x61, 0x7c, 0xa8, 0x4f, 0xc5, 0x00, 0xa7, 0xa4, 0x09, 0x67, 0x33, 0xfe, 0x4a, 0x58, 0x77, 0x04, 0x16, 0x65, 0x43, 0x75, 0xc2, 0x07, 0x38, 0x25, 0x4d,
0xc5, 0xb6, 0x42, 0xae, 0xd1, 0x40, 0xd7, 0xae, 0xd9, 0xf5, 0x5c, 0x6b, 0xef, 0xd7, 0x75, 0xd5, 0x28, 0xb6, 0x25, 0x32, 0x85, 0x1a, 0xda, 0x66, 0xcd, 0xac, 0xe7, 0x5a, 0x3b, 0xbf, 0xaf, 0xaa,
0xe9, 0xe1, 0x74, 0xac, 0x9e, 0x7b, 0x4f, 0x3d, 0x96, 0x55, 0x24, 0x06, 0x5f, 0x0e, 0xc2, 0xe1, 0x56, 0x0f, 0xa7, 0x63, 0x79, 0xe0, 0x3e, 0x75, 0x69, 0x56, 0x11, 0x1b, 0x3c, 0x31, 0x08, 0x86,
0x2c, 0x35, 0xfc, 0x77, 0xa7, 0x21, 0xa3, 0xf0, 0x0e, 0xa1, 0xdc, 0xe5, 0x2a, 0x40, 0x7d, 0xcc, 0xb3, 0xc4, 0x70, 0xe7, 0x56, 0x43, 0x46, 0xe1, 0xee, 0x43, 0xb9, 0xcb, 0xa4, 0x8f, 0xea, 0x88,
0x35, 0xef, 0xa3, 0xd0, 0xa8, 0x08, 0x05, 0xf8, 0x83, 0xcc, 0xa5, 0x0e, 0xcb, 0x30, 0xde, 0x01, 0x29, 0xd6, 0x47, 0xae, 0x50, 0x12, 0x07, 0xe0, 0x2f, 0xd2, 0x97, 0x5a, 0x34, 0xc3, 0xb8, 0x7b,
0x94, 0xde, 0xab, 0x50, 0x23, 0xc3, 0x4f, 0x13, 0x8c, 0x35, 0xd9, 0x87, 0x9d, 0xae, 0xfc, 0x88, 0x50, 0x7a, 0x27, 0x03, 0x85, 0x14, 0x3f, 0x4e, 0x30, 0x52, 0x64, 0x17, 0xb6, 0xba, 0xe2, 0x03,
0x62, 0x25, 0x4d, 0x81, 0xf7, 0x25, 0x07, 0xa5, 0x37, 0x13, 0x54, 0xb3, 0xb3, 0x71, 0xf2, 0xe8, 0xf2, 0x54, 0x9a, 0x80, 0x83, 0xdc, 0xa7, 0xaf, 0x55, 0xd3, 0xfd, 0x92, 0x83, 0xd2, 0xeb, 0x09,
0xf8, 0x6e, 0x19, 0x39, 0x80, 0x3d, 0x3f, 0x14, 0x46, 0x98, 0xc9, 0xcc, 0x6e, 0x93, 0xe4, 0x15, 0xca, 0xd9, 0xe9, 0x38, 0x7e, 0x7a, 0x74, 0xbb, 0x98, 0x3c, 0x82, 0x1d, 0x2f, 0xe0, 0x5a, 0x98,
0x94, 0x7c, 0x3e, 0x35, 0x44, 0x37, 0x1c, 0xa1, 0xfb, 0x7f, 0xcd, 0xae, 0x17, 0x0f, 0x1f, 0x36, 0x49, 0x4e, 0x6f, 0x92, 0xe4, 0x25, 0x94, 0x3c, 0x36, 0xd5, 0x44, 0x37, 0x18, 0xa1, 0x7d, 0xb7,
0xd2, 0x11, 0x37, 0xd6, 0x23, 0x6e, 0x1c, 0xaf, 0x46, 0xdc, 0x2a, 0xcc, 0xaf, 0xab, 0xd6, 0xe5, 0x66, 0xd6, 0x8b, 0xfb, 0x0f, 0x1b, 0xc9, 0xa0, 0x1b, 0xab, 0x41, 0x37, 0x8e, 0xd2, 0x41, 0xb7,
0xf7, 0xaa, 0xcd, 0x6e, 0x19, 0x93, 0xb7, 0x1d, 0x45, 0x91, 0xbc, 0x78, 0xab, 0x79, 0x84, 0x6e, 0x0a, 0xf3, 0xab, 0xaa, 0x71, 0xf1, 0xa3, 0x6a, 0xd2, 0x1b, 0xc6, 0xf8, 0x85, 0x87, 0x61, 0x28,
0xae, 0x66, 0xd7, 0x0b, 0x2c, 0xc3, 0x90, 0x27, 0x70, 0x3f, 0x79, 0x56, 0xa8, 0xb0, 0x2d, 0x45, 0xce, 0xdf, 0x28, 0x16, 0xa2, 0x9d, 0xab, 0x99, 0xf5, 0x02, 0xcd, 0x30, 0xe4, 0x09, 0xdc, 0x8f,
0x1c, 0xc6, 0x1a, 0x85, 0x76, 0x77, 0x8c, 0x6c, 0xf3, 0x07, 0xa9, 0x40, 0xe1, 0x5d, 0x8c, 0x6d, 0x1f, 0x17, 0x48, 0x6c, 0x0b, 0x1e, 0x05, 0x91, 0x42, 0xae, 0xec, 0x2d, 0x2d, 0x5b, 0xff, 0x41,
0xde, 0xff, 0x80, 0x6e, 0xde, 0x88, 0x6e, 0x30, 0x39, 0x83, 0xb2, 0xcf, 0xa7, 0xe6, 0xd4, 0x75, 0x2a, 0x50, 0x78, 0x1b, 0x61, 0x9b, 0xf5, 0xdf, 0xa3, 0x9d, 0xd7, 0xa2, 0x6b, 0x4c, 0x4e, 0xa1,
0x2a, 0x77, 0x77, 0xfb, 0xd8, 0x1b, 0x66, 0xf2, 0x02, 0xf2, 0x3e, 0x9f, 0x1e, 0x05, 0xe8, 0x16, 0xec, 0xb1, 0xa9, 0x3e, 0x75, 0x95, 0xca, 0xde, 0xde, 0x3c, 0xf6, 0x9a, 0x99, 0x3c, 0x87, 0xbc,
0xb6, 0x3f, 0x66, 0x65, 0x21, 0x8f, 0xe0, 0x9e, 0x3f, 0x89, 0x35, 0xc3, 0x73, 0x1e, 0x85, 0x03, 0xc7, 0xa6, 0x87, 0x3e, 0xda, 0x85, 0xcd, 0x8f, 0x49, 0x2d, 0xe4, 0x31, 0xdc, 0xf3, 0x26, 0x91,
0xae, 0xd1, 0x75, 0x4c, 0xde, 0xbf, 0xd8, 0x64, 0xd0, 0xe6, 0xd6, 0xd3, 0xe1, 0x89, 0x52, 0x52, 0xa2, 0x78, 0xc6, 0xc2, 0x60, 0xc0, 0x14, 0xda, 0x96, 0xce, 0xfb, 0x0f, 0x1b, 0x0f, 0x5a, 0xdf,
0xb9, 0xf0, 0x0f, 0x83, 0xce, 0x1a, 0xc9, 0x03, 0xc8, 0xbf, 0x0c, 0xa3, 0xa4, 0x40, 0x45, 0xb3, 0x7a, 0x32, 0x3c, 0x96, 0x52, 0x48, 0x1b, 0xfe, 0x63, 0xd0, 0x59, 0x23, 0x79, 0x00, 0xf9, 0x17,
0xee, 0x15, 0xf2, 0xbe, 0xda, 0xe0, 0x98, 0x75, 0xf8, 0xa8, 0x79, 0xd2, 0x89, 0x4c, 0xb5, 0x59, 0x41, 0x18, 0xd7, 0xa8, 0xa8, 0xd7, 0x9d, 0xa2, 0xb4, 0x1c, 0xdf, 0x4c, 0xb0, 0xf4, 0x52, 0x3c,
0x0a, 0xc8, 0x09, 0x14, 0x3b, 0x3c, 0xd6, 0x6d, 0x29, 0x34, 0xef, 0x6b, 0xd3, 0x88, 0x2d, 0x33, 0x54, 0x2c, 0x6e, 0x46, 0xa6, 0xe6, 0x34, 0x01, 0xe4, 0x18, 0x8a, 0x1d, 0x16, 0xa9, 0xb6, 0xe0,
0x64, 0x7d, 0xa4, 0x06, 0xc5, 0xd7, 0x42, 0x5e, 0x88, 0x0e, 0xf2, 0x01, 0x2a, 0xd3, 0x99, 0x02, 0x8a, 0xf5, 0x95, 0xee, 0xc5, 0x86, 0x49, 0xb2, 0x3e, 0x52, 0x83, 0xe2, 0x2b, 0x2e, 0xce, 0x79,
0xcb, 0x52, 0xe4, 0x31, 0x94, 0x6f, 0xb6, 0xd9, 0x9f, 0x75, 0xf0, 0x1c, 0x23, 0xd3, 0x09, 0x87, 0x07, 0xd9, 0x00, 0xa5, 0x6e, 0x4e, 0x81, 0x66, 0x29, 0xb2, 0x07, 0xe5, 0xeb, 0x9d, 0xf6, 0x67,
0x6d, 0xf0, 0xad, 0xda, 0xfc, 0x27, 0xb5, 0xe6, 0x0b, 0x6a, 0x5f, 0x2d, 0xa8, 0xfd, 0x63, 0x41, 0x1d, 0x3c, 0xc3, 0x50, 0x37, 0xc3, 0xa2, 0x6b, 0x7c, 0x12, 0xbf, 0x55, 0x9b, 0xff, 0x72, 0x8c,
0xed, 0xcf, 0x4b, 0x6a, 0x5d, 0x2e, 0xa9, 0x75, 0xb5, 0xa4, 0xd6, 0xb7, 0x25, 0xb5, 0x7a, 0x79, 0xf9, 0xc2, 0x31, 0x2f, 0x17, 0x8e, 0xf9, 0x73, 0xe1, 0x98, 0x9f, 0x97, 0x8e, 0x71, 0xb1, 0x74,
0x93, 0xec, 0xd9, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x68, 0x40, 0xc8, 0x10, 0x04, 0x00, 0x8c, 0xcb, 0xa5, 0x63, 0x7c, 0x5f, 0x3a, 0x46, 0x2f, 0xaf, 0xf3, 0x3d, 0xfb, 0x13, 0x00, 0x00,
0x00, 0xff, 0xff, 0x1c, 0x85, 0xfc, 0x3b, 0x22, 0x04, 0x00, 0x00,
} }
func (m *RaftIndex) Marshal() (dAtA []byte, err error) { func (m *RaftIndex) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA) n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -339,27 +452,32 @@ func (m *RaftIndex) Marshal() (dAtA []byte, err error) {
} }
func (m *RaftIndex) MarshalTo(dAtA []byte) (int, error) { func (m *RaftIndex) MarshalTo(dAtA []byte) (int, error) {
var i int size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *RaftIndex) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i _ = i
var l int var l int
_ = l _ = l
if m.CreateIndex != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintCommon(dAtA, i, uint64(m.CreateIndex))
}
if m.ModifyIndex != 0 { if m.ModifyIndex != 0 {
dAtA[i] = 0x10
i++
i = encodeVarintCommon(dAtA, i, uint64(m.ModifyIndex)) i = encodeVarintCommon(dAtA, i, uint64(m.ModifyIndex))
i--
dAtA[i] = 0x10
} }
return i, nil if m.CreateIndex != 0 {
i = encodeVarintCommon(dAtA, i, uint64(m.CreateIndex))
i--
dAtA[i] = 0x8
}
return len(dAtA) - i, nil
} }
func (m *TargetDatacenter) Marshal() (dAtA []byte, err error) { func (m *TargetDatacenter) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA) n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -367,23 +485,29 @@ func (m *TargetDatacenter) Marshal() (dAtA []byte, err error) {
} }
func (m *TargetDatacenter) MarshalTo(dAtA []byte) (int, error) { func (m *TargetDatacenter) MarshalTo(dAtA []byte) (int, error) {
var i int size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *TargetDatacenter) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i _ = i
var l int var l int
_ = l _ = l
if len(m.Datacenter) > 0 { if len(m.Datacenter) > 0 {
dAtA[i] = 0xa i -= len(m.Datacenter)
i++ copy(dAtA[i:], m.Datacenter)
i = encodeVarintCommon(dAtA, i, uint64(len(m.Datacenter))) i = encodeVarintCommon(dAtA, i, uint64(len(m.Datacenter)))
i += copy(dAtA[i:], m.Datacenter) i--
dAtA[i] = 0xa
} }
return i, nil return len(dAtA) - i, nil
} }
func (m *WriteRequest) Marshal() (dAtA []byte, err error) { func (m *WriteRequest) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA) n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -391,23 +515,29 @@ func (m *WriteRequest) Marshal() (dAtA []byte, err error) {
} }
func (m *WriteRequest) MarshalTo(dAtA []byte) (int, error) { func (m *WriteRequest) MarshalTo(dAtA []byte) (int, error) {
var i int size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *WriteRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i _ = i
var l int var l int
_ = l _ = l
if len(m.Token) > 0 { if len(m.Token) > 0 {
dAtA[i] = 0xa i -= len(m.Token)
i++ copy(dAtA[i:], m.Token)
i = encodeVarintCommon(dAtA, i, uint64(len(m.Token))) i = encodeVarintCommon(dAtA, i, uint64(len(m.Token)))
i += copy(dAtA[i:], m.Token) i--
dAtA[i] = 0xa
} }
return i, nil return len(dAtA) - i, nil
} }
func (m *QueryOptions) Marshal() (dAtA []byte, err error) { func (m *QueryOptions) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA) n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -415,106 +545,113 @@ func (m *QueryOptions) Marshal() (dAtA []byte, err error) {
} }
func (m *QueryOptions) MarshalTo(dAtA []byte) (int, error) { func (m *QueryOptions) MarshalTo(dAtA []byte) (int, error) {
var i int size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i _ = i
var l int var l int
_ = l _ = l
if len(m.Token) > 0 { if len(m.Filter) > 0 {
dAtA[i] = 0xa i -= len(m.Filter)
i++ copy(dAtA[i:], m.Filter)
i = encodeVarintCommon(dAtA, i, uint64(len(m.Token))) i = encodeVarintCommon(dAtA, i, uint64(len(m.Filter)))
i += copy(dAtA[i:], m.Token) i--
dAtA[i] = 0x5a
} }
if m.MinQueryIndex != 0 { n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.StaleIfError, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.StaleIfError):])
dAtA[i] = 0x10 if err1 != nil {
i++ return 0, err1
i = encodeVarintCommon(dAtA, i, uint64(m.MinQueryIndex))
} }
dAtA[i] = 0x1a i -= n1
i++ i = encodeVarintCommon(dAtA, i, uint64(n1))
i = encodeVarintCommon(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxQueryTime))) i--
n1, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxQueryTime, dAtA[i:]) dAtA[i] = 0x52
if err != nil {
return 0, err
}
i += n1
if m.AllowStale {
dAtA[i] = 0x20
i++
if m.AllowStale {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i++
}
if m.RequireConsistent {
dAtA[i] = 0x28
i++
if m.RequireConsistent {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i++
}
if m.UseCache {
dAtA[i] = 0x30
i++
if m.UseCache {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i++
}
dAtA[i] = 0x3a
i++
i = encodeVarintCommon(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxStaleDuration)))
n2, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxStaleDuration, dAtA[i:])
if err != nil {
return 0, err
}
i += n2
dAtA[i] = 0x42
i++
i = encodeVarintCommon(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAge)))
n3, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxAge, dAtA[i:])
if err != nil {
return 0, err
}
i += n3
if m.MustRevalidate { if m.MustRevalidate {
dAtA[i] = 0x48 i--
i++
if m.MustRevalidate { if m.MustRevalidate {
dAtA[i] = 1 dAtA[i] = 1
} else { } else {
dAtA[i] = 0 dAtA[i] = 0
} }
i++ i--
dAtA[i] = 0x48
} }
dAtA[i] = 0x52 n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxAge, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAge):])
i++ if err2 != nil {
i = encodeVarintCommon(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdDuration(m.StaleIfError))) return 0, err2
n4, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.StaleIfError, dAtA[i:])
if err != nil {
return 0, err
} }
i += n4 i -= n2
if len(m.Filter) > 0 { i = encodeVarintCommon(dAtA, i, uint64(n2))
dAtA[i] = 0x5a i--
i++ dAtA[i] = 0x42
i = encodeVarintCommon(dAtA, i, uint64(len(m.Filter))) n3, err3 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxStaleDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxStaleDuration):])
i += copy(dAtA[i:], m.Filter) if err3 != nil {
return 0, err3
} }
return i, nil i -= n3
i = encodeVarintCommon(dAtA, i, uint64(n3))
i--
dAtA[i] = 0x3a
if m.UseCache {
i--
if m.UseCache {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x30
}
if m.RequireConsistent {
i--
if m.RequireConsistent {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x28
}
if m.AllowStale {
i--
if m.AllowStale {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x20
}
n4, err4 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxQueryTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxQueryTime):])
if err4 != nil {
return 0, err4
}
i -= n4
i = encodeVarintCommon(dAtA, i, uint64(n4))
i--
dAtA[i] = 0x1a
if m.MinQueryIndex != 0 {
i = encodeVarintCommon(dAtA, i, uint64(m.MinQueryIndex))
i--
dAtA[i] = 0x10
}
if len(m.Token) > 0 {
i -= len(m.Token)
copy(dAtA[i:], m.Token)
i = encodeVarintCommon(dAtA, i, uint64(len(m.Token)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
} }
func (m *QueryMeta) Marshal() (dAtA []byte, err error) { func (m *QueryMeta) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA) n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -522,50 +659,58 @@ func (m *QueryMeta) Marshal() (dAtA []byte, err error) {
} }
func (m *QueryMeta) MarshalTo(dAtA []byte) (int, error) { func (m *QueryMeta) MarshalTo(dAtA []byte) (int, error) {
var i int size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryMeta) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i _ = i
var l int var l int
_ = l _ = l
if m.Index != 0 { if len(m.ConsistencyLevel) > 0 {
dAtA[i] = 0x8 i -= len(m.ConsistencyLevel)
i++ copy(dAtA[i:], m.ConsistencyLevel)
i = encodeVarintCommon(dAtA, i, uint64(m.Index)) i = encodeVarintCommon(dAtA, i, uint64(len(m.ConsistencyLevel)))
i--
dAtA[i] = 0x22
} }
dAtA[i] = 0x12
i++
i = encodeVarintCommon(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdDuration(m.LastContact)))
n5, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.LastContact, dAtA[i:])
if err != nil {
return 0, err
}
i += n5
if m.KnownLeader { if m.KnownLeader {
dAtA[i] = 0x18 i--
i++
if m.KnownLeader { if m.KnownLeader {
dAtA[i] = 1 dAtA[i] = 1
} else { } else {
dAtA[i] = 0 dAtA[i] = 0
} }
i++ i--
dAtA[i] = 0x18
} }
if len(m.ConsistencyLevel) > 0 { n5, err5 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.LastContact, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.LastContact):])
dAtA[i] = 0x22 if err5 != nil {
i++ return 0, err5
i = encodeVarintCommon(dAtA, i, uint64(len(m.ConsistencyLevel)))
i += copy(dAtA[i:], m.ConsistencyLevel)
} }
return i, nil i -= n5
i = encodeVarintCommon(dAtA, i, uint64(n5))
i--
dAtA[i] = 0x12
if m.Index != 0 {
i = encodeVarintCommon(dAtA, i, uint64(m.Index))
i--
dAtA[i] = 0x8
}
return len(dAtA) - i, nil
} }
func encodeVarintCommon(dAtA []byte, offset int, v uint64) int { func encodeVarintCommon(dAtA []byte, offset int, v uint64) int {
offset -= sovCommon(v)
base := offset
for v >= 1<<7 { for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80) dAtA[offset] = uint8(v&0x7f | 0x80)
v >>= 7 v >>= 7
offset++ offset++
} }
dAtA[offset] = uint8(v) dAtA[offset] = uint8(v)
return offset + 1 return base
} }
func (m *RaftIndex) Size() (n int) { func (m *RaftIndex) Size() (n int) {
if m == nil { if m == nil {
@ -670,14 +815,7 @@ func (m *QueryMeta) Size() (n int) {
} }
func sovCommon(x uint64) (n int) { func sovCommon(x uint64) (n int) {
for { return (math_bits.Len64(x|1) + 6) / 7
n++
x >>= 7
if x == 0 {
break
}
}
return n
} }
func sozCommon(x uint64) (n int) { func sozCommon(x uint64) (n int) {
return sovCommon(uint64((x << 1) ^ uint64((int64(x) >> 63)))) return sovCommon(uint64((x << 1) ^ uint64((int64(x) >> 63))))

View File

@ -29,6 +29,8 @@ message TargetDatacenter {
} }
message WriteRequest { message WriteRequest {
option (gogoproto.goproto_getters) = true;
// Token is the ACL token ID. If not provided, the 'anonymous' // Token is the ACL token ID. If not provided, the 'anonymous'
// token is assumed for backwards compatibility. // token is assumed for backwards compatibility.
string Token = 1; string Token = 1;
@ -36,6 +38,10 @@ message WriteRequest {
// QueryOptions is used to specify various flags for read queries // QueryOptions is used to specify various flags for read queries
message QueryOptions { message QueryOptions {
// The autogenerated getters will implement half of the
// structs.QueryOptionsCompat interface
option (gogoproto.goproto_getters) = true;
// Token is the ACL token ID. If not provided, the 'anonymous' // Token is the ACL token ID. If not provided, the 'anonymous'
// token is assumed for backwards compatibility. // token is assumed for backwards compatibility.
string Token = 1; string Token = 1;
@ -104,6 +110,10 @@ message QueryOptions {
// QueryMeta allows a query response to include potentially // QueryMeta allows a query response to include potentially
// useful metadata about a query // useful metadata about a query
message QueryMeta { message QueryMeta {
// The auto-generated getters will implement half of the
// structs.QueryMetaCompat interface
option (gogoproto.goproto_getters) = true;
// This is the index associated with the read // This is the index associated with the read
uint64 Index = 1; uint64 Index = 1;

View File

@ -1,8 +1,12 @@
package agentpb package agentpb
import ( import (
"bytes"
"fmt" "fmt"
"io"
"github.com/gogo/protobuf/jsonpb"
"github.com/gogo/protobuf/proto"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
) )
@ -33,3 +37,27 @@ func Decode(buf []byte, out ProtoMarshaller) error {
// Note that this assumes the leading byte indicating the type has already been stripped off // Note that this assumes the leading byte indicating the type has already been stripped off
return out.Unmarshal(buf) return out.Unmarshal(buf)
} }
func MarshalJSON(msg proto.Message) ([]byte, error) {
m := jsonpb.Marshaler{
EmitDefaults: false,
}
var buf bytes.Buffer
if err := m.Marshal(&buf, msg); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func UnmarshalJSON(r io.Reader, msg proto.Message) error {
u := jsonpb.Unmarshaler{
AllowUnknownFields: true,
}
return u.Unmarshal(r, msg)
}
func UnmarshalJSONBytes(b []byte, msg proto.Message) error {
return UnmarshalJSON(bytes.NewReader(b), msg)
}

View File

@ -454,25 +454,8 @@ func (s *Server) raftApplyWithEncoder(t structs.MessageType, msg interface{}, en
// a snapshot. // a snapshot.
type queryFn func(memdb.WatchSet, *state.Store) error type queryFn func(memdb.WatchSet, *state.Store) error
// we specify this as an interface so that we can allow a our legacy structs.QueryOptions
// and the protobuf defined QueryOptions struct to both be used here.
type queryOptions interface {
GetMinQueryIndex() uint64
GetMaxQueryTime() time.Duration
GetRequireConsistent() bool
}
// we specify this as an interface so that we can allow a our legacy structs.QueryMeta
// and the protobuf defined QueryMeta struct to both be used here.
type queryMeta interface {
SetLastContact(time.Duration)
SetKnownLeader(bool)
GetIndex() uint64
SetIndex(uint64)
}
// blockingQuery is used to process a potentially blocking query operation. // blockingQuery is used to process a potentially blocking query operation.
func (s *Server) blockingQuery(queryOpts queryOptions, queryMeta queryMeta, fn queryFn) error { func (s *Server) blockingQuery(queryOpts structs.QueryOptionsCompat, queryMeta structs.QueryMetaCompat, fn queryFn) error {
var timeout *time.Timer var timeout *time.Timer
var queryTimeout time.Duration var queryTimeout time.Duration
@ -557,7 +540,7 @@ RUN_QUERY:
} }
// setQueryMeta is used to populate the QueryMeta data for an RPC call // setQueryMeta is used to populate the QueryMeta data for an RPC call
func (s *Server) setQueryMeta(m queryMeta) { func (s *Server) setQueryMeta(m structs.QueryMetaCompat) {
if s.IsLeader() { if s.IsLeader() {
m.SetLastContact(0) m.SetLastContact(0)
m.SetKnownLeader(true) m.SetKnownLeader(true)

View File

@ -682,11 +682,11 @@ func setLastContact(resp http.ResponseWriter, last time.Duration) {
} }
// setMeta is used to set the query response meta data // setMeta is used to set the query response meta data
func setMeta(resp http.ResponseWriter, m *structs.QueryMeta) { func setMeta(resp http.ResponseWriter, m structs.QueryMetaCompat) {
setIndex(resp, m.Index) setIndex(resp, m.GetIndex())
setLastContact(resp, m.LastContact) setLastContact(resp, m.GetLastContact())
setKnownLeader(resp, m.KnownLeader) setKnownLeader(resp, m.GetKnownLeader())
setConsistency(resp, m.ConsistencyLevel) setConsistency(resp, m.GetConsistencyLevel())
} }
// setCacheMeta sets http response headers to indicate cache status. // setCacheMeta sets http response headers to indicate cache status.
@ -713,7 +713,7 @@ func setHeaders(resp http.ResponseWriter, headers map[string]string) {
// parseWait is used to parse the ?wait and ?index query params // parseWait is used to parse the ?wait and ?index query params
// Returns true on error // Returns true on error
func parseWait(resp http.ResponseWriter, req *http.Request, b *structs.QueryOptions) bool { func parseWait(resp http.ResponseWriter, req *http.Request, b structs.QueryOptionsCompat) bool {
query := req.URL.Query() query := req.URL.Query()
if wait := query.Get("wait"); wait != "" { if wait := query.Get("wait"); wait != "" {
dur, err := time.ParseDuration(wait) dur, err := time.ParseDuration(wait)
@ -722,7 +722,7 @@ func parseWait(resp http.ResponseWriter, req *http.Request, b *structs.QueryOpti
fmt.Fprint(resp, "Invalid wait time") fmt.Fprint(resp, "Invalid wait time")
return true return true
} }
b.MaxQueryTime = dur b.SetMaxQueryTime(dur)
} }
if idx := query.Get("index"); idx != "" { if idx := query.Get("index"); idx != "" {
index, err := strconv.ParseUint(idx, 10, 64) index, err := strconv.ParseUint(idx, 10, 64)
@ -731,14 +731,14 @@ func parseWait(resp http.ResponseWriter, req *http.Request, b *structs.QueryOpti
fmt.Fprint(resp, "Invalid index") fmt.Fprint(resp, "Invalid index")
return true return true
} }
b.MinQueryIndex = index b.SetMinQueryIndex(index)
} }
return false return false
} }
// parseCacheControl parses the CacheControl HTTP header value. So far we only // parseCacheControl parses the CacheControl HTTP header value. So far we only
// support maxage directive. // support maxage directive.
func parseCacheControl(resp http.ResponseWriter, req *http.Request, b *structs.QueryOptions) bool { func parseCacheControl(resp http.ResponseWriter, req *http.Request, b structs.QueryOptionsCompat) bool {
raw := strings.ToLower(req.Header.Get("Cache-Control")) raw := strings.ToLower(req.Header.Get("Cache-Control"))
if raw == "" { if raw == "" {
@ -766,7 +766,7 @@ func parseCacheControl(resp http.ResponseWriter, req *http.Request, b *structs.Q
d = strings.ToLower(strings.TrimSpace(d)) d = strings.ToLower(strings.TrimSpace(d))
if d == "must-revalidate" { if d == "must-revalidate" {
b.MustRevalidate = true b.SetMustRevalidate(true)
} }
if strings.HasPrefix(d, "max-age=") { if strings.HasPrefix(d, "max-age=") {
@ -774,12 +774,12 @@ func parseCacheControl(resp http.ResponseWriter, req *http.Request, b *structs.Q
if failed { if failed {
return true return true
} }
b.MaxAge = d b.SetMaxAge(d)
if d == 0 { if d == 0 {
// max-age=0 specifically means that we need to consider the cache stale // max-age=0 specifically means that we need to consider the cache stale
// immediately however MaxAge = 0 is indistinguishable from the default // immediately however MaxAge = 0 is indistinguishable from the default
// where MaxAge is unset. // where MaxAge is unset.
b.MustRevalidate = true b.SetMustRevalidate(true)
} }
} }
if strings.HasPrefix(d, "stale-if-error=") { if strings.HasPrefix(d, "stale-if-error=") {
@ -787,7 +787,7 @@ func parseCacheControl(resp http.ResponseWriter, req *http.Request, b *structs.Q
if failed { if failed {
return true return true
} }
b.StaleIfError = d b.SetStaleIfError(d)
} }
} }
@ -796,22 +796,22 @@ func parseCacheControl(resp http.ResponseWriter, req *http.Request, b *structs.Q
// parseConsistency is used to parse the ?stale and ?consistent query params. // parseConsistency is used to parse the ?stale and ?consistent query params.
// Returns true on error // Returns true on error
func (s *HTTPServer) parseConsistency(resp http.ResponseWriter, req *http.Request, b *structs.QueryOptions) bool { func (s *HTTPServer) parseConsistency(resp http.ResponseWriter, req *http.Request, b structs.QueryOptionsCompat) bool {
query := req.URL.Query() query := req.URL.Query()
defaults := true defaults := true
if _, ok := query["stale"]; ok { if _, ok := query["stale"]; ok {
b.AllowStale = true b.SetAllowStale(true)
defaults = false defaults = false
} }
if _, ok := query["consistent"]; ok { if _, ok := query["consistent"]; ok {
b.RequireConsistent = true b.SetRequireConsistent(true)
defaults = false defaults = false
} }
if _, ok := query["leader"]; ok { if _, ok := query["leader"]; ok {
defaults = false defaults = false
} }
if _, ok := query["cached"]; ok { if _, ok := query["cached"]; ok {
b.UseCache = true b.SetUseCache(true)
defaults = false defaults = false
} }
if maxStale := query.Get("max_stale"); maxStale != "" { if maxStale := query.Get("max_stale"); maxStale != "" {
@ -821,9 +821,9 @@ func (s *HTTPServer) parseConsistency(resp http.ResponseWriter, req *http.Reques
fmt.Fprintf(resp, "Invalid max_stale value %q", maxStale) fmt.Fprintf(resp, "Invalid max_stale value %q", maxStale)
return true return true
} }
b.MaxStaleDuration = dur b.SetMaxStaleDuration(dur)
if dur.Nanoseconds() > 0 { if dur.Nanoseconds() > 0 {
b.AllowStale = true b.SetAllowStale(true)
defaults = false defaults = false
} }
} }
@ -832,17 +832,17 @@ func (s *HTTPServer) parseConsistency(resp http.ResponseWriter, req *http.Reques
path := req.URL.Path path := req.URL.Path
if strings.HasPrefix(path, "/v1/catalog") || strings.HasPrefix(path, "/v1/health") { if strings.HasPrefix(path, "/v1/catalog") || strings.HasPrefix(path, "/v1/health") {
if s.agent.config.DiscoveryMaxStale.Nanoseconds() > 0 { if s.agent.config.DiscoveryMaxStale.Nanoseconds() > 0 {
b.MaxStaleDuration = s.agent.config.DiscoveryMaxStale b.SetMaxStaleDuration(s.agent.config.DiscoveryMaxStale)
b.AllowStale = true b.SetAllowStale(true)
} }
} }
} }
if b.AllowStale && b.RequireConsistent { if b.GetAllowStale() && b.GetRequireConsistent() {
resp.WriteHeader(http.StatusBadRequest) resp.WriteHeader(http.StatusBadRequest)
fmt.Fprint(resp, "Cannot specify ?stale with ?consistent, conflicting semantics.") fmt.Fprint(resp, "Cannot specify ?stale with ?consistent, conflicting semantics.")
return true return true
} }
if b.UseCache && b.RequireConsistent { if b.GetUseCache() && b.GetRequireConsistent() {
resp.WriteHeader(http.StatusBadRequest) resp.WriteHeader(http.StatusBadRequest)
fmt.Fprint(resp, "Cannot specify ?cached with ?consistent, conflicting semantics.") fmt.Fprint(resp, "Cannot specify ?cached with ?consistent, conflicting semantics.")
return true return true
@ -959,10 +959,14 @@ func (s *HTTPServer) parseMetaFilter(req *http.Request) map[string]string {
// parseInternal is a convenience method for endpoints that need // parseInternal is a convenience method for endpoints that need
// to use both parseWait and parseDC. // to use both parseWait and parseDC.
func (s *HTTPServer) parseInternal(resp http.ResponseWriter, req *http.Request, dc *string, b *structs.QueryOptions) bool { func (s *HTTPServer) parseInternal(resp http.ResponseWriter, req *http.Request, dc *string, b structs.QueryOptionsCompat) bool {
s.parseDC(req, dc) s.parseDC(req, dc)
s.parseTokenInternal(req, &b.Token) var token string
s.parseFilter(req, &b.Filter) s.parseTokenInternal(req, &token)
b.SetToken(token)
var filter string
s.parseFilter(req, &filter)
b.SetFilter(filter)
if s.parseConsistency(resp, req, b) { if s.parseConsistency(resp, req, b) {
return true return true
} }
@ -974,7 +978,7 @@ func (s *HTTPServer) parseInternal(resp http.ResponseWriter, req *http.Request,
// parse is a convenience method for endpoints that need // parse is a convenience method for endpoints that need
// to use both parseWait and parseDC. // to use both parseWait and parseDC.
func (s *HTTPServer) parse(resp http.ResponseWriter, req *http.Request, dc *string, b *structs.QueryOptions) bool { func (s *HTTPServer) parse(resp http.ResponseWriter, req *http.Request, dc *string, b structs.QueryOptionsCompat) bool {
return s.parseInternal(resp, req, dc, b) return s.parseInternal(resp, req, dc, b)
} }

View File

@ -0,0 +1,271 @@
package structs
import (
"time"
)
// QueryOptionsCompat is the interface that both the structs.QueryOptions
// and the agentpb.QueryOptions structs need to implement so that they
// can be operated on interchangeably
type QueryOptionsCompat interface {
GetToken() string
SetToken(string)
GetMinQueryIndex() uint64
SetMinQueryIndex(uint64)
GetMaxQueryTime() time.Duration
SetMaxQueryTime(time.Duration)
GetAllowStale() bool
SetAllowStale(bool)
GetRequireConsistent() bool
SetRequireConsistent(bool)
GetUseCache() bool
SetUseCache(bool)
GetMaxStaleDuration() time.Duration
SetMaxStaleDuration(time.Duration)
GetMaxAge() time.Duration
SetMaxAge(time.Duration)
GetMustRevalidate() bool
SetMustRevalidate(bool)
GetStaleIfError() time.Duration
SetStaleIfError(time.Duration)
GetFilter() string
SetFilter(string)
}
// QueryMetaCompat is the interface that both the structs.QueryMeta
// and the agentpb.QueryMeta structs need to implement so that they
// can be operated on interchangeably
type QueryMetaCompat interface {
GetLastContact() time.Duration
SetLastContact(time.Duration)
GetKnownLeader() bool
SetKnownLeader(bool)
GetIndex() uint64
SetIndex(uint64)
GetConsistencyLevel() string
SetConsistencyLevel(string)
}
// GetToken helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetToken() string {
if m != nil {
return m.Token
}
return ""
}
// GetMinQueryIndex helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetMinQueryIndex() uint64 {
if m != nil {
return m.MinQueryIndex
}
return 0
}
// GetMaxQueryTime helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetMaxQueryTime() time.Duration {
if m != nil {
return m.MaxQueryTime
}
return 0
}
// GetAllowStale helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetAllowStale() bool {
if m != nil {
return m.AllowStale
}
return false
}
// GetRequireConsistent helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetRequireConsistent() bool {
if m != nil {
return m.RequireConsistent
}
return false
}
// GetUseCache helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetUseCache() bool {
if m != nil {
return m.UseCache
}
return false
}
// GetMaxStaleDuration helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetMaxStaleDuration() time.Duration {
if m != nil {
return m.MaxStaleDuration
}
return 0
}
// GetMaxAge helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetMaxAge() time.Duration {
if m != nil {
return m.MaxAge
}
return 0
}
// GetMustRevalidate helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetMustRevalidate() bool {
if m != nil {
return m.MustRevalidate
}
return false
}
// GetStaleIfError helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetStaleIfError() time.Duration {
if m != nil {
return m.StaleIfError
}
return 0
}
// GetFilter helps implement the QueryOptionsCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryOptions) GetFilter() string {
if m != nil {
return m.Filter
}
return ""
}
// SetToken is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetToken(token string) {
q.Token = token
}
// SetMinQueryIndex is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetMinQueryIndex(minQueryIndex uint64) {
q.MinQueryIndex = minQueryIndex
}
// SetMaxQueryTime is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetMaxQueryTime(maxQueryTime time.Duration) {
q.MaxQueryTime = maxQueryTime
}
// SetAllowStale is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetAllowStale(allowStale bool) {
q.AllowStale = allowStale
}
// SetRequireConsistent is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetRequireConsistent(requireConsistent bool) {
q.RequireConsistent = requireConsistent
}
// SetUseCache is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetUseCache(useCache bool) {
q.UseCache = useCache
}
// SetMaxStaleDuration is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetMaxStaleDuration(maxStaleDuration time.Duration) {
q.MaxStaleDuration = maxStaleDuration
}
// SetMaxAge is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetMaxAge(maxAge time.Duration) {
q.MaxAge = maxAge
}
// SetMustRevalidate is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetMustRevalidate(mustRevalidate bool) {
q.MustRevalidate = mustRevalidate
}
// SetStaleIfError is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetStaleIfError(staleIfError time.Duration) {
q.StaleIfError = staleIfError
}
// SetFilter is needed to implement the structs.QueryOptionsCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryOptions) SetFilter(filter string) {
q.Filter = filter
}
//
func (m *QueryMeta) GetIndex() uint64 {
if m != nil {
return m.Index
}
return 0
}
// GetLastContact helps implement the QueryMetaCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryMeta) GetLastContact() time.Duration {
if m != nil {
return m.LastContact
}
return 0
}
// GetKnownLeader helps implement the QueryMetaCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryMeta) GetKnownLeader() bool {
if m != nil {
return m.KnownLeader
}
return false
}
// GetConsistencyLevel helps implement the QueryMetaCompat interface
// Copied from agent/agentpb/common.pb.go
func (m *QueryMeta) GetConsistencyLevel() string {
if m != nil {
return m.ConsistencyLevel
}
return ""
}
// SetLastContact is needed to implement the structs.QueryMetaCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryMeta) SetLastContact(lastContact time.Duration) {
q.LastContact = lastContact
}
// SetKnownLeader is needed to implement the structs.QueryMetaCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryMeta) SetKnownLeader(knownLeader bool) {
q.KnownLeader = knownLeader
}
// SetIndex is needed to implement the structs.QueryMetaCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryMeta) SetIndex(index uint64) {
q.Index = index
}
// SetConsistencyLevel is needed to implement the structs.QueryMetaCompat interface
// Copied from agent/agentpb/common.go
func (q *QueryMeta) SetConsistencyLevel(consistencyLevel string) {
q.ConsistencyLevel = consistencyLevel
}

View File

@ -203,18 +203,6 @@ func (q QueryOptions) TokenSecret() string {
return q.Token return q.Token
} }
func (q QueryOptions) GetMinQueryIndex() uint64 {
return q.MinQueryIndex
}
func (q QueryOptions) GetMaxQueryTime() time.Duration {
return q.MaxQueryTime
}
func (q QueryOptions) GetRequireConsistent() bool {
return q.RequireConsistent
}
type WriteRequest struct { type WriteRequest struct {
// Token is the ACL token ID. If not provided, the 'anonymous' // Token is the ACL token ID. If not provided, the 'anonymous'
// token is assumed for backwards compatibility. // token is assumed for backwards compatibility.
@ -254,22 +242,6 @@ type QueryMeta struct {
ConsistencyLevel string ConsistencyLevel string
} }
func (q *QueryMeta) SetLastContact(lastContact time.Duration) {
q.LastContact = lastContact
}
func (q *QueryMeta) SetKnownLeader(knownLeader bool) {
q.KnownLeader = knownLeader
}
func (q *QueryMeta) GetIndex() uint64 {
return q.Index
}
func (q *QueryMeta) SetIndex(index uint64) {
q.Index = index
}
// RegisterRequest is used for the Catalog.Register endpoint // RegisterRequest is used for the Catalog.Register endpoint
// to register a node as providing a service. If no service // to register a node as providing a service. If no service
// is provided, the node is registered. // is provided, the node is registered.

2
vendor/modules.txt vendored
View File

@ -121,9 +121,9 @@ github.com/gogo/googleapis/google/rpc
github.com/gogo/googleapis/google/api github.com/gogo/googleapis/google/api
# github.com/gogo/protobuf v1.2.1 # github.com/gogo/protobuf v1.2.1
github.com/gogo/protobuf/gogoproto github.com/gogo/protobuf/gogoproto
github.com/gogo/protobuf/types
github.com/gogo/protobuf/jsonpb github.com/gogo/protobuf/jsonpb
github.com/gogo/protobuf/proto github.com/gogo/protobuf/proto
github.com/gogo/protobuf/types
github.com/gogo/protobuf/protoc-gen-gogo/descriptor github.com/gogo/protobuf/protoc-gen-gogo/descriptor
github.com/gogo/protobuf/sortkeys github.com/gogo/protobuf/sortkeys
# github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b # github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b