2013-12-19 20:03:57 +00:00
|
|
|
package structs
|
2013-12-11 22:04:44 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
2014-02-05 18:21:31 +00:00
|
|
|
"time"
|
2014-08-08 22:32:43 +00:00
|
|
|
|
|
|
|
"github.com/hashicorp/consul/acl"
|
2014-10-18 01:26:19 +00:00
|
|
|
"github.com/hashicorp/go-msgpack/codec"
|
2013-12-11 22:04:44 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2013-12-19 23:08:55 +00:00
|
|
|
ErrNoLeader = fmt.Errorf("No cluster leader")
|
|
|
|
ErrNoDCPath = fmt.Errorf("No path to datacenter")
|
|
|
|
ErrNoServers = fmt.Errorf("No known Consul servers")
|
2013-12-11 22:04:44 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type MessageType uint8
|
|
|
|
|
2015-08-25 01:10:23 +00:00
|
|
|
// RaftIndex is used to track the index used while creating
|
2015-08-22 19:44:33 +00:00
|
|
|
// or modifying a given struct type.
|
2015-08-25 01:10:23 +00:00
|
|
|
type RaftIndex struct {
|
2015-08-22 19:44:33 +00:00
|
|
|
CreateIndex uint64
|
|
|
|
ModifyIndex uint64
|
|
|
|
}
|
|
|
|
|
2013-12-11 22:04:44 +00:00
|
|
|
const (
|
|
|
|
RegisterRequestType MessageType = iota
|
|
|
|
DeregisterRequestType
|
2014-03-31 20:41:43 +00:00
|
|
|
KVSRequestType
|
2014-05-16 02:22:31 +00:00
|
|
|
SessionRequestType
|
2014-08-05 23:43:57 +00:00
|
|
|
ACLRequestType
|
2014-12-15 23:26:46 +00:00
|
|
|
TombstoneRequestType
|
2013-12-11 22:04:44 +00:00
|
|
|
)
|
|
|
|
|
2015-05-06 02:44:21 +00:00
|
|
|
const (
|
|
|
|
// IgnoreUnknownTypeFlag is set along with a MessageType
|
|
|
|
// to indicate that the message type can be safely ignored
|
|
|
|
// if it is not recognized. This is for future proofing, so
|
|
|
|
// that new commands can be added in a way that won't cause
|
|
|
|
// old servers to crash when the FSM attempts to process them.
|
|
|
|
IgnoreUnknownTypeFlag MessageType = 128
|
|
|
|
)
|
|
|
|
|
2014-01-08 19:21:29 +00:00
|
|
|
const (
|
2014-05-21 19:45:12 +00:00
|
|
|
// HealthAny is special, and is used as a wild card,
|
|
|
|
// not as a specific state.
|
|
|
|
HealthAny = "any"
|
2014-01-08 19:21:29 +00:00
|
|
|
HealthUnknown = "unknown"
|
|
|
|
HealthPassing = "passing"
|
|
|
|
HealthWarning = "warning"
|
|
|
|
HealthCritical = "critical"
|
|
|
|
)
|
|
|
|
|
2015-04-12 00:53:48 +00:00
|
|
|
func ValidStatus(s string) bool {
|
2015-04-13 20:46:01 +00:00
|
|
|
return s == HealthPassing ||
|
2015-04-12 00:53:48 +00:00
|
|
|
s == HealthWarning ||
|
|
|
|
s == HealthCritical
|
|
|
|
}
|
|
|
|
|
2014-08-05 23:43:57 +00:00
|
|
|
const (
|
|
|
|
// Client tokens have rules applied
|
|
|
|
ACLTypeClient = "client"
|
|
|
|
|
|
|
|
// Management tokens have an always allow policy.
|
|
|
|
// They are used for token management.
|
|
|
|
ACLTypeManagement = "management"
|
|
|
|
)
|
|
|
|
|
2014-05-19 19:50:29 +00:00
|
|
|
const (
|
|
|
|
// MaxLockDelay provides a maximum LockDelay value for
|
|
|
|
// a session. Any value above this will not be respected.
|
|
|
|
MaxLockDelay = 60 * time.Second
|
|
|
|
)
|
|
|
|
|
2014-04-19 00:14:00 +00:00
|
|
|
// RPCInfo is used to describe common information about query
|
|
|
|
type RPCInfo interface {
|
|
|
|
RequestDatacenter() string
|
|
|
|
IsRead() bool
|
|
|
|
AllowStaleRead() bool
|
2014-08-05 22:48:28 +00:00
|
|
|
ACLToken() string
|
2014-04-19 00:14:00 +00:00
|
|
|
}
|
|
|
|
|
2014-04-21 18:31:15 +00:00
|
|
|
// QueryOptions is used to specify various flags for read queries
|
|
|
|
type QueryOptions struct {
|
2014-08-05 22:48:28 +00:00
|
|
|
// Token is the ACL token ID. If not provided, the 'anonymous'
|
|
|
|
// token is assumed for backwards compatibility.
|
|
|
|
Token string
|
|
|
|
|
2014-04-21 18:31:15 +00:00
|
|
|
// If set, wait until query exceeds given index. Must be provided
|
|
|
|
// with MaxQueryTime.
|
2014-02-05 18:21:31 +00:00
|
|
|
MinQueryIndex uint64
|
|
|
|
|
2014-04-21 18:31:15 +00:00
|
|
|
// Provided with MinQueryIndex to wait for change.
|
2014-02-05 18:21:31 +00:00
|
|
|
MaxQueryTime time.Duration
|
|
|
|
|
2014-04-18 23:46:51 +00:00
|
|
|
// If set, any follower can service the request. Results
|
|
|
|
// may be arbitrarily stale.
|
|
|
|
AllowStale bool
|
|
|
|
|
|
|
|
// If set, the leader must verify leadership prior to
|
|
|
|
// servicing the request. Prevents a stale read.
|
|
|
|
RequireConsistent bool
|
|
|
|
}
|
|
|
|
|
2014-04-19 00:14:00 +00:00
|
|
|
// QueryOption only applies to reads, so always true
|
|
|
|
func (q QueryOptions) IsRead() bool {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (q QueryOptions) AllowStaleRead() bool {
|
|
|
|
return q.AllowStale
|
|
|
|
}
|
|
|
|
|
2014-08-05 22:48:28 +00:00
|
|
|
func (q QueryOptions) ACLToken() string {
|
|
|
|
return q.Token
|
|
|
|
}
|
|
|
|
|
|
|
|
type WriteRequest struct {
|
|
|
|
// Token is the ACL token ID. If not provided, the 'anonymous'
|
|
|
|
// token is assumed for backwards compatibility.
|
|
|
|
Token string
|
|
|
|
}
|
2014-04-19 00:14:00 +00:00
|
|
|
|
|
|
|
// WriteRequest only applies to writes, always false
|
|
|
|
func (w WriteRequest) IsRead() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w WriteRequest) AllowStaleRead() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2014-08-05 22:48:28 +00:00
|
|
|
func (w WriteRequest) ACLToken() string {
|
|
|
|
return w.Token
|
|
|
|
}
|
|
|
|
|
2014-04-18 23:46:51 +00:00
|
|
|
// QueryMeta allows a query response to include potentially
|
|
|
|
// useful metadata about a query
|
|
|
|
type QueryMeta struct {
|
2014-04-21 18:13:36 +00:00
|
|
|
// This is the index associated with the read
|
|
|
|
Index uint64
|
|
|
|
|
2014-04-18 23:46:51 +00:00
|
|
|
// If AllowStale is used, this is time elapsed since
|
|
|
|
// last contact between the follower and leader. This
|
|
|
|
// can be used to gauge staleness.
|
|
|
|
LastContact time.Duration
|
|
|
|
|
|
|
|
// Used to indicate if there is a known leader node
|
|
|
|
KnownLeader bool
|
|
|
|
}
|
|
|
|
|
2013-12-11 22:04:44 +00:00
|
|
|
// RegisterRequest is used for the Catalog.Register endpoint
|
|
|
|
// to register a node as providing a service. If no service
|
|
|
|
// is provided, the node is registered.
|
|
|
|
type RegisterRequest struct {
|
2014-01-08 21:39:40 +00:00
|
|
|
Datacenter string
|
|
|
|
Node string
|
|
|
|
Address string
|
|
|
|
Service *NodeService
|
|
|
|
Check *HealthCheck
|
2015-01-14 01:52:17 +00:00
|
|
|
Checks HealthChecks
|
2014-04-19 00:14:00 +00:00
|
|
|
WriteRequest
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *RegisterRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
2013-12-11 22:04:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// DeregisterRequest is used for the Catalog.Deregister endpoint
|
|
|
|
// to deregister a node as providing a service. If no service is
|
|
|
|
// provided the entire node is deregistered.
|
|
|
|
type DeregisterRequest struct {
|
2014-01-06 22:18:38 +00:00
|
|
|
Datacenter string
|
|
|
|
Node string
|
|
|
|
ServiceID string
|
2014-01-08 21:39:40 +00:00
|
|
|
CheckID string
|
2014-04-19 00:14:00 +00:00
|
|
|
WriteRequest
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *DeregisterRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
2013-12-11 22:04:44 +00:00
|
|
|
}
|
|
|
|
|
2014-02-05 18:21:31 +00:00
|
|
|
// DCSpecificRequest is used to query about a specific DC
|
|
|
|
type DCSpecificRequest struct {
|
|
|
|
Datacenter string
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryOptions
|
2014-02-05 18:21:31 +00:00
|
|
|
}
|
|
|
|
|
2014-04-19 00:14:00 +00:00
|
|
|
func (r *DCSpecificRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-01-08 22:43:36 +00:00
|
|
|
// ServiceSpecificRequest is used to query about a specific node
|
|
|
|
type ServiceSpecificRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
ServiceName string
|
|
|
|
ServiceTag string
|
|
|
|
TagFilter bool // Controls tag filtering
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryOptions
|
2014-01-08 22:43:36 +00:00
|
|
|
}
|
|
|
|
|
2014-04-19 00:14:00 +00:00
|
|
|
func (r *ServiceSpecificRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-01-08 22:43:36 +00:00
|
|
|
// NodeSpecificRequest is used to request the information about a single node
|
|
|
|
type NodeSpecificRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
Node string
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryOptions
|
2014-01-08 22:43:36 +00:00
|
|
|
}
|
|
|
|
|
2014-04-19 00:14:00 +00:00
|
|
|
func (r *NodeSpecificRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-01-08 22:43:36 +00:00
|
|
|
// ChecksInStateRequest is used to query for nodes in a state
|
|
|
|
type ChecksInStateRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
State string
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryOptions
|
2014-01-08 22:43:36 +00:00
|
|
|
}
|
|
|
|
|
2014-04-19 00:14:00 +00:00
|
|
|
func (r *ChecksInStateRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2013-12-12 18:48:36 +00:00
|
|
|
// Used to return information about a node
|
|
|
|
type Node struct {
|
|
|
|
Node string
|
|
|
|
Address string
|
2015-08-22 19:44:33 +00:00
|
|
|
|
2015-08-25 01:10:23 +00:00
|
|
|
RaftIndex
|
2013-12-12 18:48:36 +00:00
|
|
|
}
|
2015-08-25 01:10:23 +00:00
|
|
|
type Nodes []*Node
|
2013-12-12 18:48:36 +00:00
|
|
|
|
2013-12-12 19:07:14 +00:00
|
|
|
// Used to return information about a provided services.
|
|
|
|
// Maps service name to available tags
|
|
|
|
type Services map[string][]string
|
|
|
|
|
2013-12-12 19:37:19 +00:00
|
|
|
// ServiceNode represents a node that is part of a service
|
|
|
|
type ServiceNode struct {
|
2015-01-02 21:10:05 +00:00
|
|
|
Node string
|
|
|
|
Address string
|
|
|
|
ServiceID string
|
|
|
|
ServiceName string
|
|
|
|
ServiceTags []string
|
|
|
|
ServiceAddress string
|
|
|
|
ServicePort int
|
2015-08-23 21:17:48 +00:00
|
|
|
|
2015-08-25 01:10:23 +00:00
|
|
|
RaftIndex
|
2013-12-12 19:37:19 +00:00
|
|
|
}
|
2015-08-25 01:10:23 +00:00
|
|
|
type ServiceNodes []*ServiceNode
|
2013-12-12 19:37:19 +00:00
|
|
|
|
2013-12-12 19:46:25 +00:00
|
|
|
// NodeService is a service provided by a node
|
|
|
|
type NodeService struct {
|
2015-09-11 15:35:29 +00:00
|
|
|
ID string
|
|
|
|
Service string
|
|
|
|
Tags []string
|
|
|
|
Address string
|
|
|
|
Port int
|
|
|
|
EnableTagOverride bool
|
2015-08-22 20:21:38 +00:00
|
|
|
|
|
|
|
RaftIndex
|
2013-12-12 19:46:25 +00:00
|
|
|
}
|
2015-08-22 20:21:38 +00:00
|
|
|
|
2014-01-03 01:29:39 +00:00
|
|
|
type NodeServices struct {
|
2015-08-25 01:10:23 +00:00
|
|
|
Node *Node
|
2014-01-08 18:29:29 +00:00
|
|
|
Services map[string]*NodeService
|
2014-01-03 01:29:39 +00:00
|
|
|
}
|
2013-12-12 19:46:25 +00:00
|
|
|
|
2014-01-08 19:21:29 +00:00
|
|
|
// HealthCheck represents a single check on a given node
|
|
|
|
type HealthCheck struct {
|
|
|
|
Node string
|
|
|
|
CheckID string // Unique per-node ID
|
|
|
|
Name string // Check name
|
|
|
|
Status string // The current check status
|
|
|
|
Notes string // Additional notes with the status
|
2014-04-21 23:20:22 +00:00
|
|
|
Output string // Holds output of script runs
|
2014-01-08 19:21:29 +00:00
|
|
|
ServiceID string // optional associated service
|
|
|
|
ServiceName string // optional service name
|
2015-08-25 05:32:18 +00:00
|
|
|
|
|
|
|
RaftIndex
|
2014-01-08 19:21:29 +00:00
|
|
|
}
|
2014-01-08 19:35:27 +00:00
|
|
|
type HealthChecks []*HealthCheck
|
2014-01-08 19:21:29 +00:00
|
|
|
|
2014-01-08 22:58:53 +00:00
|
|
|
// CheckServiceNode is used to provide the node, it's service
|
2014-01-08 22:43:36 +00:00
|
|
|
// definition, as well as a HealthCheck that is associated
|
2014-01-08 22:58:53 +00:00
|
|
|
type CheckServiceNode struct {
|
2015-09-01 04:04:25 +00:00
|
|
|
Node *Node
|
|
|
|
Service *NodeService
|
2014-01-08 22:58:53 +00:00
|
|
|
Checks HealthChecks
|
2014-01-08 21:52:09 +00:00
|
|
|
}
|
2014-01-08 22:58:53 +00:00
|
|
|
type CheckServiceNodes []CheckServiceNode
|
2014-01-08 21:52:09 +00:00
|
|
|
|
2014-04-27 19:49:20 +00:00
|
|
|
// NodeInfo is used to dump all associated information about
|
|
|
|
// a node. This is currently used for the UI only, as it is
|
|
|
|
// rather expensive to generate.
|
|
|
|
type NodeInfo struct {
|
|
|
|
Node string
|
|
|
|
Address string
|
|
|
|
Services []*NodeService
|
|
|
|
Checks []*HealthCheck
|
|
|
|
}
|
|
|
|
|
|
|
|
// NodeDump is used to dump all the nodes with all their
|
|
|
|
// associated data. This is currently used for the UI only,
|
|
|
|
// as it is rather expensive to generate.
|
|
|
|
type NodeDump []*NodeInfo
|
|
|
|
|
2014-02-05 18:44:28 +00:00
|
|
|
type IndexedNodes struct {
|
|
|
|
Nodes Nodes
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryMeta
|
2014-02-05 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type IndexedServices struct {
|
2014-02-05 22:27:24 +00:00
|
|
|
Services Services
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryMeta
|
2014-02-05 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type IndexedServiceNodes struct {
|
|
|
|
ServiceNodes ServiceNodes
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryMeta
|
2014-02-05 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type IndexedNodeServices struct {
|
|
|
|
NodeServices *NodeServices
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryMeta
|
2014-02-05 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type IndexedHealthChecks struct {
|
|
|
|
HealthChecks HealthChecks
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryMeta
|
2014-02-05 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
2014-02-05 21:30:18 +00:00
|
|
|
type IndexedCheckServiceNodes struct {
|
|
|
|
Nodes CheckServiceNodes
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryMeta
|
2014-02-05 21:30:18 +00:00
|
|
|
}
|
|
|
|
|
2014-04-27 19:56:06 +00:00
|
|
|
type IndexedNodeDump struct {
|
|
|
|
Dump NodeDump
|
|
|
|
QueryMeta
|
|
|
|
}
|
|
|
|
|
2014-03-31 18:47:10 +00:00
|
|
|
// DirEntry is used to represent a directory entry. This is
|
|
|
|
// used for values in our Key-Value store.
|
|
|
|
type DirEntry struct {
|
2015-09-01 23:33:52 +00:00
|
|
|
LockIndex uint64
|
|
|
|
Key string
|
|
|
|
Flags uint64
|
|
|
|
Value []byte
|
|
|
|
Session string `json:",omitempty"`
|
|
|
|
|
|
|
|
RaftIndex
|
2014-03-31 18:47:10 +00:00
|
|
|
}
|
|
|
|
type DirEntries []*DirEntry
|
|
|
|
|
|
|
|
type KVSOp string
|
|
|
|
|
|
|
|
const (
|
2014-03-31 19:13:40 +00:00
|
|
|
KVSSet KVSOp = "set"
|
|
|
|
KVSDelete = "delete"
|
2015-01-09 01:08:17 +00:00
|
|
|
KVSDeleteCAS = "delete-cas" // Delete with check-and-set
|
2014-03-31 19:13:40 +00:00
|
|
|
KVSDeleteTree = "delete-tree"
|
2014-05-15 21:56:58 +00:00
|
|
|
KVSCAS = "cas" // Check-and-set
|
|
|
|
KVSLock = "lock" // Lock a key
|
|
|
|
KVSUnlock = "unlock" // Unlock a key
|
2014-03-31 18:47:10 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// KVSRequest is used to operate on the Key-Value store
|
|
|
|
type KVSRequest struct {
|
2014-03-31 21:13:03 +00:00
|
|
|
Datacenter string
|
|
|
|
Op KVSOp // Which operation are we performing
|
|
|
|
DirEnt DirEntry // Which directory entry
|
2014-04-19 00:14:00 +00:00
|
|
|
WriteRequest
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *KVSRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
2014-03-31 18:47:10 +00:00
|
|
|
}
|
|
|
|
|
2014-03-31 23:00:23 +00:00
|
|
|
// KeyRequest is used to request a key, or key prefix
|
|
|
|
type KeyRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
Key string
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryOptions
|
2014-03-31 23:00:23 +00:00
|
|
|
}
|
|
|
|
|
2014-04-19 00:14:00 +00:00
|
|
|
func (r *KeyRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-04-28 23:33:54 +00:00
|
|
|
// KeyListRequest is used to list keys
|
|
|
|
type KeyListRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
Prefix string
|
|
|
|
Seperator string
|
|
|
|
QueryOptions
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *KeyListRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-03-31 23:00:23 +00:00
|
|
|
type IndexedDirEntries struct {
|
|
|
|
Entries DirEntries
|
2014-04-18 23:46:51 +00:00
|
|
|
QueryMeta
|
2014-03-31 23:00:23 +00:00
|
|
|
}
|
|
|
|
|
2014-04-28 23:33:54 +00:00
|
|
|
type IndexedKeyList struct {
|
|
|
|
Keys []string
|
|
|
|
QueryMeta
|
|
|
|
}
|
|
|
|
|
2014-11-20 02:11:41 +00:00
|
|
|
type SessionBehavior string
|
|
|
|
|
|
|
|
const (
|
|
|
|
SessionKeysRelease SessionBehavior = "release"
|
|
|
|
SessionKeysDelete = "delete"
|
|
|
|
)
|
|
|
|
|
2014-11-25 16:06:14 +00:00
|
|
|
const (
|
|
|
|
SessionTTLMax = 3600 * time.Second
|
|
|
|
SessionTTLMultiplier = 2
|
|
|
|
)
|
|
|
|
|
2014-05-08 22:01:02 +00:00
|
|
|
// Session is used to represent an open session in the KV store.
|
|
|
|
// This issued to associate node checks with acquired locks.
|
|
|
|
type Session struct {
|
2014-05-19 19:50:29 +00:00
|
|
|
CreateIndex uint64
|
2014-05-08 23:54:04 +00:00
|
|
|
ID string
|
2014-06-09 18:42:28 +00:00
|
|
|
Name string
|
2014-05-08 23:54:04 +00:00
|
|
|
Node string
|
|
|
|
Checks []string
|
2014-05-19 19:50:29 +00:00
|
|
|
LockDelay time.Duration
|
2014-11-20 02:11:41 +00:00
|
|
|
Behavior SessionBehavior // What to do when session is invalidated
|
2014-11-25 16:06:14 +00:00
|
|
|
TTL string
|
2014-05-08 22:01:02 +00:00
|
|
|
}
|
2014-05-16 21:36:14 +00:00
|
|
|
type Sessions []*Session
|
2014-05-08 22:01:02 +00:00
|
|
|
|
2014-05-16 02:22:31 +00:00
|
|
|
type SessionOp string
|
|
|
|
|
|
|
|
const (
|
|
|
|
SessionCreate SessionOp = "create"
|
|
|
|
SessionDestroy = "destroy"
|
|
|
|
)
|
|
|
|
|
|
|
|
// SessionRequest is used to operate on sessions
|
|
|
|
type SessionRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
Op SessionOp // Which operation are we performing
|
|
|
|
Session Session // Which session
|
|
|
|
WriteRequest
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *SessionRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-05-16 22:49:17 +00:00
|
|
|
// SessionSpecificRequest is used to request a session by ID
|
|
|
|
type SessionSpecificRequest struct {
|
2014-05-16 21:36:14 +00:00
|
|
|
Datacenter string
|
|
|
|
Session string
|
|
|
|
QueryOptions
|
|
|
|
}
|
|
|
|
|
2014-05-16 22:49:17 +00:00
|
|
|
func (r *SessionSpecificRequest) RequestDatacenter() string {
|
2014-05-16 21:36:14 +00:00
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
|
|
|
type IndexedSessions struct {
|
|
|
|
Sessions Sessions
|
|
|
|
QueryMeta
|
|
|
|
}
|
|
|
|
|
2014-08-05 22:48:28 +00:00
|
|
|
// ACL is used to represent a token and it's rules
|
|
|
|
type ACL struct {
|
|
|
|
CreateIndex uint64
|
|
|
|
ModifyIndex uint64
|
|
|
|
ID string
|
|
|
|
Name string
|
|
|
|
Type string
|
|
|
|
Rules string
|
|
|
|
}
|
|
|
|
type ACLs []*ACL
|
|
|
|
|
|
|
|
type ACLOp string
|
|
|
|
|
|
|
|
const (
|
2014-08-11 21:54:18 +00:00
|
|
|
ACLSet ACLOp = "set"
|
2014-10-09 19:28:07 +00:00
|
|
|
ACLForceSet = "force-set" // Deprecated, left to backwards compatibility
|
2014-08-11 21:54:18 +00:00
|
|
|
ACLDelete = "delete"
|
2014-08-05 22:48:28 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// ACLRequest is used to create, update or delete an ACL
|
|
|
|
type ACLRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
Op ACLOp
|
|
|
|
ACL ACL
|
|
|
|
WriteRequest
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *ACLRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
|
|
|
// ACLSpecificRequest is used to request an ACL by ID
|
|
|
|
type ACLSpecificRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
ACL string
|
|
|
|
QueryOptions
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *ACLSpecificRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-08-08 23:55:47 +00:00
|
|
|
// ACLPolicyRequest is used to request an ACL by ID, conditionally
|
|
|
|
// filtering on an ID
|
|
|
|
type ACLPolicyRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
ACL string
|
|
|
|
ETag string
|
|
|
|
QueryOptions
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *ACLPolicyRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-08-05 22:48:28 +00:00
|
|
|
type IndexedACLs struct {
|
|
|
|
ACLs ACLs
|
|
|
|
QueryMeta
|
|
|
|
}
|
|
|
|
|
2014-08-08 22:32:43 +00:00
|
|
|
type ACLPolicy struct {
|
2014-08-08 23:55:47 +00:00
|
|
|
ETag string
|
2014-08-12 17:54:56 +00:00
|
|
|
Parent string
|
2014-08-08 22:32:43 +00:00
|
|
|
Policy *acl.Policy
|
|
|
|
TTL time.Duration
|
|
|
|
QueryMeta
|
|
|
|
}
|
|
|
|
|
2014-08-28 22:00:49 +00:00
|
|
|
// EventFireRequest is used to ask a server to fire
|
|
|
|
// a Serf event. It is a bit odd, since it doesn't depend on
|
|
|
|
// the catalog or leader. Any node can respond, so it's not quite
|
|
|
|
// like a standard write request. This is used only internally.
|
|
|
|
type EventFireRequest struct {
|
|
|
|
Datacenter string
|
|
|
|
Name string
|
|
|
|
Payload []byte
|
|
|
|
|
|
|
|
// Not using WriteRequest so that any server can process
|
|
|
|
// the request. It is a bit unusual...
|
|
|
|
QueryOptions
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *EventFireRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
|
|
|
// EventFireResponse is used to respond to a fire request.
|
|
|
|
type EventFireResponse struct {
|
|
|
|
QueryMeta
|
|
|
|
}
|
|
|
|
|
2014-12-15 23:26:46 +00:00
|
|
|
type TombstoneOp string
|
|
|
|
|
|
|
|
const (
|
|
|
|
TombstoneReap TombstoneOp = "reap"
|
|
|
|
)
|
|
|
|
|
|
|
|
// TombstoneRequest is used to trigger a reaping of the tombstones
|
|
|
|
type TombstoneRequest struct {
|
2014-12-15 23:01:04 +00:00
|
|
|
Datacenter string
|
2014-12-15 23:26:46 +00:00
|
|
|
Op TombstoneOp
|
2014-12-15 23:01:04 +00:00
|
|
|
ReapIndex uint64
|
|
|
|
WriteRequest
|
|
|
|
}
|
|
|
|
|
2014-12-15 23:26:46 +00:00
|
|
|
func (r *TombstoneRequest) RequestDatacenter() string {
|
2014-12-15 23:01:04 +00:00
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-06-08 21:02:42 +00:00
|
|
|
// msgpackHandle is a shared handle for encoding/decoding of structs
|
|
|
|
var msgpackHandle = &codec.MsgpackHandle{}
|
2014-06-07 07:59:27 +00:00
|
|
|
|
2013-12-11 22:04:44 +00:00
|
|
|
// Decode is used to decode a MsgPack encoded object
|
|
|
|
func Decode(buf []byte, out interface{}) error {
|
2014-06-08 21:02:42 +00:00
|
|
|
return codec.NewDecoder(bytes.NewReader(buf), msgpackHandle).Decode(out)
|
2013-12-11 22:04:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Encode is used to encode a MsgPack object with type prefix
|
|
|
|
func Encode(t MessageType, msg interface{}) ([]byte, error) {
|
2014-06-08 21:02:42 +00:00
|
|
|
var buf bytes.Buffer
|
2013-12-11 22:04:44 +00:00
|
|
|
buf.WriteByte(uint8(t))
|
2014-06-08 21:02:42 +00:00
|
|
|
err := codec.NewEncoder(&buf, msgpackHandle).Encode(msg)
|
2013-12-11 22:04:44 +00:00
|
|
|
return buf.Bytes(), err
|
|
|
|
}
|
2014-09-24 23:39:14 +00:00
|
|
|
|
2014-10-02 06:09:00 +00:00
|
|
|
// CompoundResponse is an interface for gathering multiple responses. It is
|
|
|
|
// used in cross-datacenter RPC calls where more than 1 datacenter is
|
|
|
|
// expected to reply.
|
|
|
|
type CompoundResponse interface {
|
|
|
|
// Add adds a new response to the compound response
|
|
|
|
Add(interface{})
|
|
|
|
|
|
|
|
// New returns an empty response object which can be passed around by
|
|
|
|
// reference, and then passed to Add() later on.
|
|
|
|
New() interface{}
|
|
|
|
}
|
|
|
|
|
2014-10-03 00:10:54 +00:00
|
|
|
type KeyringOp string
|
|
|
|
|
|
|
|
const (
|
|
|
|
KeyringList KeyringOp = "list"
|
|
|
|
KeyringInstall = "install"
|
|
|
|
KeyringUse = "use"
|
|
|
|
KeyringRemove = "remove"
|
|
|
|
)
|
|
|
|
|
2014-09-24 23:39:14 +00:00
|
|
|
// KeyringRequest encapsulates a request to modify an encryption keyring.
|
|
|
|
// It can be used for install, remove, or use key type operations.
|
|
|
|
type KeyringRequest struct {
|
2014-10-03 00:10:54 +00:00
|
|
|
Operation KeyringOp
|
2014-10-02 06:09:00 +00:00
|
|
|
Key string
|
|
|
|
Datacenter string
|
|
|
|
Forwarded bool
|
2014-09-24 23:39:14 +00:00
|
|
|
QueryOptions
|
|
|
|
}
|
|
|
|
|
2014-10-02 06:09:00 +00:00
|
|
|
func (r *KeyringRequest) RequestDatacenter() string {
|
|
|
|
return r.Datacenter
|
|
|
|
}
|
|
|
|
|
2014-09-24 23:39:14 +00:00
|
|
|
// KeyringResponse is a unified key response and can be used for install,
|
|
|
|
// remove, use, as well as listing key queries.
|
|
|
|
type KeyringResponse struct {
|
2014-09-28 19:35:51 +00:00
|
|
|
WAN bool
|
2014-09-25 01:30:34 +00:00
|
|
|
Datacenter string
|
|
|
|
Messages map[string]string
|
|
|
|
Keys map[string]int
|
|
|
|
NumNodes int
|
2014-09-28 19:35:51 +00:00
|
|
|
Error string
|
2014-09-25 01:30:34 +00:00
|
|
|
}
|
|
|
|
|
2014-09-30 22:31:07 +00:00
|
|
|
// KeyringResponses holds multiple responses to keyring queries. Each
|
|
|
|
// datacenter replies independently, and KeyringResponses is used as a
|
|
|
|
// container for the set of all responses.
|
2014-09-25 01:30:34 +00:00
|
|
|
type KeyringResponses struct {
|
|
|
|
Responses []*KeyringResponse
|
2014-09-28 19:35:51 +00:00
|
|
|
QueryMeta
|
2014-09-24 23:39:14 +00:00
|
|
|
}
|
2014-10-02 06:09:00 +00:00
|
|
|
|
|
|
|
func (r *KeyringResponses) Add(v interface{}) {
|
|
|
|
val := v.(*KeyringResponses)
|
|
|
|
r.Responses = append(r.Responses, val.Responses...)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *KeyringResponses) New() interface{} {
|
|
|
|
return new(KeyringResponses)
|
|
|
|
}
|