github.com/sl1pm4t/consul@v1.4.5-0.20190325224627-74c31c540f9c/agent/structs/txn.go (about) 1 package structs 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/hashicorp/consul/api" 8 multierror "github.com/hashicorp/go-multierror" 9 ) 10 11 // TxnKVOp is used to define a single operation on the KVS inside a 12 // transaction. 13 type TxnKVOp struct { 14 Verb api.KVOp 15 DirEnt DirEntry 16 } 17 18 // TxnKVResult is used to define the result of a single operation on the KVS 19 // inside a transaction. 20 type TxnKVResult *DirEntry 21 22 // TxnNodeOp is used to define a single operation on a node in the catalog inside 23 // a transaction. 24 type TxnNodeOp struct { 25 Verb api.NodeOp 26 Node Node 27 } 28 29 // TxnNodeResult is used to define the result of a single operation on a node 30 // in the catalog inside a transaction. 31 type TxnNodeResult *Node 32 33 // TxnServiceOp is used to define a single operation on a service in the catalog inside 34 // a transaction. 35 type TxnServiceOp struct { 36 Verb api.ServiceOp 37 Node string 38 Service NodeService 39 } 40 41 // TxnServiceResult is used to define the result of a single operation on a service 42 // in the catalog inside a transaction. 43 type TxnServiceResult *NodeService 44 45 // TxnCheckOp is used to define a single operation on a health check inside a 46 // transaction. 47 type TxnCheckOp struct { 48 Verb api.CheckOp 49 Check HealthCheck 50 } 51 52 // TxnCheckResult is used to define the result of a single operation on a health 53 // check inside a transaction. 54 type TxnCheckResult *HealthCheck 55 56 // TxnKVOp is used to define a single operation on an Intention inside a 57 // transaction. 58 type TxnIntentionOp IntentionRequest 59 60 // TxnOp is used to define a single operation inside a transaction. Only one 61 // of the types should be filled out per entry. 62 type TxnOp struct { 63 KV *TxnKVOp 64 Intention *TxnIntentionOp 65 Node *TxnNodeOp 66 Service *TxnServiceOp 67 Check *TxnCheckOp 68 } 69 70 // TxnOps is a list of operations within a transaction. 71 type TxnOps []*TxnOp 72 73 // TxnRequest is used to apply multiple operations to the state store in a 74 // single transaction 75 type TxnRequest struct { 76 Datacenter string 77 Ops TxnOps 78 WriteRequest 79 } 80 81 func (r *TxnRequest) RequestDatacenter() string { 82 return r.Datacenter 83 } 84 85 // TxnReadRequest is used as a fast path for read-only transactions that don't 86 // modify the state store. 87 type TxnReadRequest struct { 88 Datacenter string 89 Ops TxnOps 90 QueryOptions 91 } 92 93 func (r *TxnReadRequest) RequestDatacenter() string { 94 return r.Datacenter 95 } 96 97 // TxnError is used to return information about an error for a specific 98 // operation. 99 type TxnError struct { 100 OpIndex int 101 What string 102 } 103 104 // Error returns the string representation of an atomic error. 105 func (e TxnError) Error() string { 106 return fmt.Sprintf("op %d: %s", e.OpIndex, e.What) 107 } 108 109 // TxnErrors is a list of TxnError entries. 110 type TxnErrors []*TxnError 111 112 // TxnResult is used to define the result of a given operation inside a 113 // transaction. Only one of the types should be filled out per entry. 114 type TxnResult struct { 115 KV TxnKVResult `json:",omitempty"` 116 Node TxnNodeResult `json:",omitempty"` 117 Service TxnServiceResult `json:",omitempty"` 118 Check TxnCheckResult `json:",omitempty"` 119 } 120 121 // TxnResults is a list of TxnResult entries. 122 type TxnResults []*TxnResult 123 124 // TxnResponse is the structure returned by a TxnRequest. 125 type TxnResponse struct { 126 Results TxnResults 127 Errors TxnErrors 128 } 129 130 // Error returns an aggregate of all errors in this TxnResponse. 131 func (r TxnResponse) Error() error { 132 var errs error 133 for _, err := range r.Errors { 134 errs = multierror.Append(errs, errors.New(err.Error())) 135 } 136 return errs 137 } 138 139 // TxnReadResponse is the structure returned by a TxnReadRequest. 140 type TxnReadResponse struct { 141 TxnResponse 142 QueryMeta 143 }