|
|
|
@ -8,8 +8,11 @@ import (
|
|
|
|
|
"reflect" |
|
|
|
|
"strings" |
|
|
|
|
"testing" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/api" |
|
|
|
|
"github.com/hashicorp/consul/testrpc" |
|
|
|
|
"github.com/pascaldekloe/goe/verify" |
|
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/agent/structs" |
|
|
|
|
) |
|
|
|
@ -400,3 +403,124 @@ func TestTxnEndpoint_KV_Actions(t *testing.T) {
|
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestTxnEndpoint_UpdateCheck(t *testing.T) { |
|
|
|
|
t.Parallel() |
|
|
|
|
a := NewTestAgent(t, t.Name(), "") |
|
|
|
|
defer a.Shutdown() |
|
|
|
|
testrpc.WaitForTestAgent(t, a.RPC, "dc1") |
|
|
|
|
|
|
|
|
|
// Make sure the fields of a check are handled correctly when both creating and updating.
|
|
|
|
|
buf := bytes.NewBuffer([]byte(fmt.Sprintf(` |
|
|
|
|
[ |
|
|
|
|
{ |
|
|
|
|
"Check": { |
|
|
|
|
"Verb": "set", |
|
|
|
|
"Check": { |
|
|
|
|
"Node": "%s", |
|
|
|
|
"CheckID": "nodecheck", |
|
|
|
|
"Name": "Node http check", |
|
|
|
|
"Status": "critical", |
|
|
|
|
"Notes": "Http based health check", |
|
|
|
|
"Output": "", |
|
|
|
|
"ServiceID": "", |
|
|
|
|
"ServiceName": "", |
|
|
|
|
"Definition": { |
|
|
|
|
"Interval": "6s", |
|
|
|
|
"Timeout": "6s", |
|
|
|
|
"DeregisterCriticalServiceAfter": "6s", |
|
|
|
|
"HTTP": "http://localhost:8000", |
|
|
|
|
"TLSSkipVerify": true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"Check": { |
|
|
|
|
"Verb": "set", |
|
|
|
|
"Check": { |
|
|
|
|
"Node": "%s", |
|
|
|
|
"CheckID": "nodecheck", |
|
|
|
|
"Name": "Node http check", |
|
|
|
|
"Status": "passing", |
|
|
|
|
"Notes": "Http based health check", |
|
|
|
|
"Output": "success", |
|
|
|
|
"ServiceID": "", |
|
|
|
|
"ServiceName": "", |
|
|
|
|
"Definition": { |
|
|
|
|
"Interval": "10s", |
|
|
|
|
"Timeout": "10s", |
|
|
|
|
"DeregisterCriticalServiceAfter": "15m", |
|
|
|
|
"HTTP": "http://localhost:9000", |
|
|
|
|
"TLSSkipVerify": false |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
] |
|
|
|
|
`, a.config.NodeName, a.config.NodeName))) |
|
|
|
|
req, _ := http.NewRequest("PUT", "/v1/txn", buf) |
|
|
|
|
resp := httptest.NewRecorder() |
|
|
|
|
obj, err := a.srv.Txn(resp, req) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatalf("err: %v", err) |
|
|
|
|
} |
|
|
|
|
if resp.Code != 200 { |
|
|
|
|
t.Fatalf("expected 200, got %d", resp.Code) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
txnResp, ok := obj.(structs.TxnResponse) |
|
|
|
|
if !ok { |
|
|
|
|
t.Fatalf("bad type: %T", obj) |
|
|
|
|
} |
|
|
|
|
if len(txnResp.Results) != 2 { |
|
|
|
|
t.Fatalf("bad: %v", txnResp) |
|
|
|
|
} |
|
|
|
|
index := txnResp.Results[0].Check.ModifyIndex |
|
|
|
|
expected := structs.TxnResponse{ |
|
|
|
|
Results: structs.TxnResults{ |
|
|
|
|
&structs.TxnResult{ |
|
|
|
|
Check: &structs.HealthCheck{ |
|
|
|
|
Node: a.config.NodeName, |
|
|
|
|
CheckID: "nodecheck", |
|
|
|
|
Name: "Node http check", |
|
|
|
|
Status: api.HealthCritical, |
|
|
|
|
Notes: "Http based health check", |
|
|
|
|
Definition: structs.HealthCheckDefinition{ |
|
|
|
|
Interval: 6 * time.Second, |
|
|
|
|
Timeout: 6 * time.Second, |
|
|
|
|
DeregisterCriticalServiceAfter: 6 * time.Second, |
|
|
|
|
HTTP: "http://localhost:8000", |
|
|
|
|
TLSSkipVerify: true, |
|
|
|
|
}, |
|
|
|
|
RaftIndex: structs.RaftIndex{ |
|
|
|
|
CreateIndex: index, |
|
|
|
|
ModifyIndex: index, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
&structs.TxnResult{ |
|
|
|
|
Check: &structs.HealthCheck{ |
|
|
|
|
Node: a.config.NodeName, |
|
|
|
|
CheckID: "nodecheck", |
|
|
|
|
Name: "Node http check", |
|
|
|
|
Status: api.HealthPassing, |
|
|
|
|
Notes: "Http based health check", |
|
|
|
|
Output: "success", |
|
|
|
|
Definition: structs.HealthCheckDefinition{ |
|
|
|
|
Interval: 10 * time.Second, |
|
|
|
|
Timeout: 10 * time.Second, |
|
|
|
|
DeregisterCriticalServiceAfter: 15 * time.Minute, |
|
|
|
|
HTTP: "http://localhost:9000", |
|
|
|
|
TLSSkipVerify: false, |
|
|
|
|
}, |
|
|
|
|
RaftIndex: structs.RaftIndex{ |
|
|
|
|
CreateIndex: index, |
|
|
|
|
ModifyIndex: index, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
verify.Values(t, "", txnResp, expected) |
|
|
|
|
} |
|
|
|
|