mirror of https://github.com/status-im/consul.git
agent: move structs into consul/structs pkg
* CheckDefinition * ServiceDefinition * CheckType
This commit is contained in:
parent
4273fb8444
commit
c49a15d0f3
|
@ -1342,6 +1342,13 @@ func (a *Agent) reapServices() {
|
|||
|
||||
}
|
||||
|
||||
// persistedService is used to wrap a service definition and bundle it
|
||||
// with an ACL token so we can restore both at a later agent start.
|
||||
type persistedService struct {
|
||||
Token string
|
||||
Service *structs.NodeService
|
||||
}
|
||||
|
||||
// persistService saves a service definition to a JSON file in the data dir
|
||||
func (a *Agent) persistService(service *structs.NodeService) error {
|
||||
svcPath := filepath.Join(a.config.DataDir, servicesDir, stringHash(service.ID))
|
||||
|
@ -1368,7 +1375,7 @@ func (a *Agent) purgeService(serviceID string) error {
|
|||
}
|
||||
|
||||
// persistCheck saves a check definition to the local agent's state directory
|
||||
func (a *Agent) persistCheck(check *structs.HealthCheck, chkType *CheckType) error {
|
||||
func (a *Agent) persistCheck(check *structs.HealthCheck, chkType *structs.CheckType) error {
|
||||
checkPath := filepath.Join(a.config.DataDir, checksDir, checkIDHash(check.CheckID))
|
||||
|
||||
// Create the persisted check
|
||||
|
@ -1426,7 +1433,7 @@ func writeFileAtomic(path string, contents []byte) error {
|
|||
// AddService is used to add a service entry.
|
||||
// This entry is persistent and the agent will make a best effort to
|
||||
// ensure it is registered
|
||||
func (a *Agent) AddService(service *structs.NodeService, chkTypes CheckTypes, persist bool, token string) error {
|
||||
func (a *Agent) AddService(service *structs.NodeService, chkTypes []*structs.CheckType, persist bool, token string) error {
|
||||
if service.Service == "" {
|
||||
return fmt.Errorf("Service name missing")
|
||||
}
|
||||
|
@ -1552,7 +1559,7 @@ func (a *Agent) RemoveService(serviceID string, persist bool) error {
|
|||
// This entry is persistent and the agent will make a best effort to
|
||||
// ensure it is registered. The Check may include a CheckType which
|
||||
// is used to automatically update the check status
|
||||
func (a *Agent) AddCheck(check *structs.HealthCheck, chkType *CheckType, persist bool, token string) error {
|
||||
func (a *Agent) AddCheck(check *structs.HealthCheck, chkType *structs.CheckType, persist bool, token string) error {
|
||||
if check.CheckID == "" {
|
||||
return fmt.Errorf("CheckID missing")
|
||||
}
|
||||
|
|
|
@ -230,7 +230,7 @@ func (s *HTTPServer) syncChanges() {
|
|||
const invalidCheckMessage = "Must provide TTL or Script/DockerContainerID/HTTP/TCP and Interval"
|
||||
|
||||
func (s *HTTPServer) AgentRegisterCheck(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
|
||||
var args CheckDefinition
|
||||
var args structs.CheckDefinition
|
||||
// Fixup the type decode of TTL or Interval.
|
||||
decodeCB := func(raw interface{}) error {
|
||||
return FixupCheckType(raw)
|
||||
|
@ -412,7 +412,7 @@ func (s *HTTPServer) AgentCheckUpdate(resp http.ResponseWriter, req *http.Reques
|
|||
}
|
||||
|
||||
func (s *HTTPServer) AgentRegisterService(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
|
||||
var args ServiceDefinition
|
||||
var args structs.ServiceDefinition
|
||||
// Fixup the type decode of TTL or Interval if a check if provided.
|
||||
decodeCB := func(raw interface{}) error {
|
||||
rawMap, ok := raw.(map[string]interface{})
|
||||
|
|
|
@ -234,8 +234,8 @@ func TestAgent_Reload(t *testing.T) {
|
|||
t.Parallel()
|
||||
cfg := TestConfig()
|
||||
cfg.ACLEnforceVersion8 = Bool(false)
|
||||
cfg.Services = []*ServiceDefinition{
|
||||
&ServiceDefinition{Name: "redis"},
|
||||
cfg.Services = []*structs.ServiceDefinition{
|
||||
&structs.ServiceDefinition{Name: "redis"},
|
||||
}
|
||||
a := NewTestAgent(t.Name(), cfg)
|
||||
defer a.Shutdown()
|
||||
|
@ -246,8 +246,8 @@ func TestAgent_Reload(t *testing.T) {
|
|||
|
||||
cfg2 := TestConfig()
|
||||
cfg2.ACLEnforceVersion8 = Bool(false)
|
||||
cfg2.Services = []*ServiceDefinition{
|
||||
&ServiceDefinition{Name: "redis-reloaded"},
|
||||
cfg2.Services = []*structs.ServiceDefinition{
|
||||
&structs.ServiceDefinition{Name: "redis-reloaded"},
|
||||
}
|
||||
|
||||
ok, err := a.ReloadConfig(cfg2)
|
||||
|
@ -580,7 +580,7 @@ func TestAgent_RegisterCheck(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
// Register node
|
||||
args := &CheckDefinition{
|
||||
args := &structs.CheckDefinition{
|
||||
Name: "test",
|
||||
TTL: 15 * time.Second,
|
||||
}
|
||||
|
@ -621,7 +621,7 @@ func TestAgent_RegisterCheck_Passing(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
// Register node
|
||||
args := &CheckDefinition{
|
||||
args := &structs.CheckDefinition{
|
||||
Name: "test",
|
||||
TTL: 15 * time.Second,
|
||||
Status: api.HealthPassing,
|
||||
|
@ -657,7 +657,7 @@ func TestAgent_RegisterCheck_BadStatus(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
// Register node
|
||||
args := &CheckDefinition{
|
||||
args := &structs.CheckDefinition{
|
||||
Name: "test",
|
||||
TTL: 15 * time.Second,
|
||||
Status: "fluffy",
|
||||
|
@ -677,7 +677,7 @@ func TestAgent_RegisterCheck_ACLDeny(t *testing.T) {
|
|||
a := NewTestAgent(t.Name(), TestACLConfig())
|
||||
defer a.Shutdown()
|
||||
|
||||
args := &CheckDefinition{
|
||||
args := &structs.CheckDefinition{
|
||||
Name: "test",
|
||||
TTL: 15 * time.Second,
|
||||
}
|
||||
|
@ -754,7 +754,7 @@ func TestAgent_PassCheck(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
chk := &structs.HealthCheck{Name: "test", CheckID: "test"}
|
||||
chkType := &CheckType{TTL: 15 * time.Second}
|
||||
chkType := &structs.CheckType{TTL: 15 * time.Second}
|
||||
if err := a.AddCheck(chk, chkType, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
@ -781,7 +781,7 @@ func TestAgent_PassCheck_ACLDeny(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
chk := &structs.HealthCheck{Name: "test", CheckID: "test"}
|
||||
chkType := &CheckType{TTL: 15 * time.Second}
|
||||
chkType := &structs.CheckType{TTL: 15 * time.Second}
|
||||
if err := a.AddCheck(chk, chkType, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
@ -807,7 +807,7 @@ func TestAgent_WarnCheck(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
chk := &structs.HealthCheck{Name: "test", CheckID: "test"}
|
||||
chkType := &CheckType{TTL: 15 * time.Second}
|
||||
chkType := &structs.CheckType{TTL: 15 * time.Second}
|
||||
if err := a.AddCheck(chk, chkType, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
@ -834,7 +834,7 @@ func TestAgent_WarnCheck_ACLDeny(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
chk := &structs.HealthCheck{Name: "test", CheckID: "test"}
|
||||
chkType := &CheckType{TTL: 15 * time.Second}
|
||||
chkType := &structs.CheckType{TTL: 15 * time.Second}
|
||||
if err := a.AddCheck(chk, chkType, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
@ -860,7 +860,7 @@ func TestAgent_FailCheck(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
chk := &structs.HealthCheck{Name: "test", CheckID: "test"}
|
||||
chkType := &CheckType{TTL: 15 * time.Second}
|
||||
chkType := &structs.CheckType{TTL: 15 * time.Second}
|
||||
if err := a.AddCheck(chk, chkType, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
@ -887,7 +887,7 @@ func TestAgent_FailCheck_ACLDeny(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
chk := &structs.HealthCheck{Name: "test", CheckID: "test"}
|
||||
chkType := &CheckType{TTL: 15 * time.Second}
|
||||
chkType := &structs.CheckType{TTL: 15 * time.Second}
|
||||
if err := a.AddCheck(chk, chkType, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
@ -913,7 +913,7 @@ func TestAgent_UpdateCheck(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
chk := &structs.HealthCheck{Name: "test", CheckID: "test"}
|
||||
chkType := &CheckType{TTL: 15 * time.Second}
|
||||
chkType := &structs.CheckType{TTL: 15 * time.Second}
|
||||
if err := a.AddCheck(chk, chkType, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
@ -1012,7 +1012,7 @@ func TestAgent_UpdateCheck_ACLDeny(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
chk := &structs.HealthCheck{Name: "test", CheckID: "test"}
|
||||
chkType := &CheckType{TTL: 15 * time.Second}
|
||||
chkType := &structs.CheckType{TTL: 15 * time.Second}
|
||||
if err := a.AddCheck(chk, chkType, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
@ -1039,18 +1039,18 @@ func TestAgent_RegisterService(t *testing.T) {
|
|||
a := NewTestAgent(t.Name(), nil)
|
||||
defer a.Shutdown()
|
||||
|
||||
args := &ServiceDefinition{
|
||||
args := &structs.ServiceDefinition{
|
||||
Name: "test",
|
||||
Tags: []string{"master"},
|
||||
Port: 8000,
|
||||
Check: CheckType{
|
||||
Check: structs.CheckType{
|
||||
TTL: 15 * time.Second,
|
||||
},
|
||||
Checks: CheckTypes{
|
||||
&CheckType{
|
||||
Checks: []*structs.CheckType{
|
||||
&structs.CheckType{
|
||||
TTL: 20 * time.Second,
|
||||
},
|
||||
&CheckType{
|
||||
&structs.CheckType{
|
||||
TTL: 30 * time.Second,
|
||||
},
|
||||
},
|
||||
|
@ -1091,18 +1091,18 @@ func TestAgent_RegisterService_ACLDeny(t *testing.T) {
|
|||
a := NewTestAgent(t.Name(), TestACLConfig())
|
||||
defer a.Shutdown()
|
||||
|
||||
args := &ServiceDefinition{
|
||||
args := &structs.ServiceDefinition{
|
||||
Name: "test",
|
||||
Tags: []string{"master"},
|
||||
Port: 8000,
|
||||
Check: CheckType{
|
||||
Check: structs.CheckType{
|
||||
TTL: 15 * time.Second,
|
||||
},
|
||||
Checks: CheckTypes{
|
||||
&CheckType{
|
||||
Checks: []*structs.CheckType{
|
||||
&structs.CheckType{
|
||||
TTL: 20 * time.Second,
|
||||
},
|
||||
&CheckType{
|
||||
&structs.CheckType{
|
||||
TTL: 30 * time.Second,
|
||||
},
|
||||
},
|
||||
|
@ -1130,7 +1130,7 @@ func TestAgent_RegisterService_InvalidAddress(t *testing.T) {
|
|||
|
||||
for _, addr := range []string{"0.0.0.0", "::", "[::]"} {
|
||||
t.Run("addr "+addr, func(t *testing.T) {
|
||||
args := &ServiceDefinition{
|
||||
args := &structs.ServiceDefinition{
|
||||
Name: "test",
|
||||
Address: addr,
|
||||
Port: 8000,
|
||||
|
@ -1475,10 +1475,10 @@ func TestAgent_RegisterCheck_Service(t *testing.T) {
|
|||
a := NewTestAgent(t.Name(), nil)
|
||||
defer a.Shutdown()
|
||||
|
||||
args := &ServiceDefinition{
|
||||
args := &structs.ServiceDefinition{
|
||||
Name: "memcache",
|
||||
Port: 8000,
|
||||
Check: CheckType{
|
||||
Check: structs.CheckType{
|
||||
TTL: 15 * time.Second,
|
||||
},
|
||||
}
|
||||
|
@ -1490,7 +1490,7 @@ func TestAgent_RegisterCheck_Service(t *testing.T) {
|
|||
}
|
||||
|
||||
// Now register an additional check
|
||||
checkArgs := &CheckDefinition{
|
||||
checkArgs := &structs.CheckDefinition{
|
||||
Name: "memcache_check2",
|
||||
ServiceID: "memcache",
|
||||
TTL: 15 * time.Second,
|
||||
|
|
|
@ -336,7 +336,7 @@ func TestAgent_AddService(t *testing.T) {
|
|||
tests := []struct {
|
||||
desc string
|
||||
srv *structs.NodeService
|
||||
chkTypes CheckTypes
|
||||
chkTypes []*structs.CheckType
|
||||
healthChks map[string]*structs.HealthCheck
|
||||
}{
|
||||
{
|
||||
|
@ -347,8 +347,8 @@ func TestAgent_AddService(t *testing.T) {
|
|||
Tags: []string{"tag1"},
|
||||
Port: 8100,
|
||||
},
|
||||
CheckTypes{
|
||||
&CheckType{
|
||||
[]*structs.CheckType{
|
||||
&structs.CheckType{
|
||||
CheckID: "check1",
|
||||
Name: "name1",
|
||||
TTL: time.Minute,
|
||||
|
@ -375,22 +375,22 @@ func TestAgent_AddService(t *testing.T) {
|
|||
Tags: []string{"tag2"},
|
||||
Port: 8200,
|
||||
},
|
||||
CheckTypes{
|
||||
&CheckType{
|
||||
[]*structs.CheckType{
|
||||
&structs.CheckType{
|
||||
CheckID: "check1",
|
||||
Name: "name1",
|
||||
TTL: time.Minute,
|
||||
Notes: "note1",
|
||||
},
|
||||
&CheckType{
|
||||
&structs.CheckType{
|
||||
CheckID: "check-noname",
|
||||
TTL: time.Minute,
|
||||
},
|
||||
&CheckType{
|
||||
&structs.CheckType{
|
||||
Name: "check-noid",
|
||||
TTL: time.Minute,
|
||||
},
|
||||
&CheckType{
|
||||
&structs.CheckType{
|
||||
TTL: time.Minute,
|
||||
},
|
||||
},
|
||||
|
@ -499,14 +499,14 @@ func TestAgent_RemoveService(t *testing.T) {
|
|||
Service: "memcache",
|
||||
Port: 8000,
|
||||
}
|
||||
chkTypes := CheckTypes{&CheckType{TTL: time.Minute}}
|
||||
chkTypes := []*structs.CheckType{&structs.CheckType{TTL: time.Minute}}
|
||||
|
||||
if err := a.AddService(srv, chkTypes, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
||||
// Add a check after the fact with a specific check ID
|
||||
check := &CheckDefinition{
|
||||
check := &structs.CheckDefinition{
|
||||
ID: "check2",
|
||||
Name: "check2",
|
||||
ServiceID: "memcache",
|
||||
|
@ -535,9 +535,9 @@ func TestAgent_RemoveService(t *testing.T) {
|
|||
Service: "redis",
|
||||
Port: 8000,
|
||||
}
|
||||
chkTypes := CheckTypes{
|
||||
&CheckType{TTL: time.Minute},
|
||||
&CheckType{TTL: 30 * time.Second},
|
||||
chkTypes := []*structs.CheckType{
|
||||
&structs.CheckType{TTL: time.Minute},
|
||||
&structs.CheckType{TTL: 30 * time.Second},
|
||||
}
|
||||
if err := a.AddService(srv, chkTypes, false, ""); err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
|
@ -579,13 +579,13 @@ func TestAgent_RemoveServiceRemovesAllChecks(t *testing.T) {
|
|||
defer a.Shutdown()
|
||||
|
||||
svc := &structs.NodeService{ID: "redis", Service: "redis", Port: 8000}
|
||||
chk1 := &CheckType{CheckID: "chk1", Name: "chk1", TTL: time.Minute}
|
||||
chk2 := &CheckType{CheckID: "chk2", Name: "chk2", TTL: 2 * time.Minute}
|
||||
chk1 := &structs.CheckType{CheckID: "chk1", Name: "chk1", TTL: time.Minute}
|
||||
chk2 := &structs.CheckType{CheckID: "chk2", Name: "chk2", TTL: 2 * time.Minute}
|
||||
hchk1 := &structs.HealthCheck{Node: "node1", CheckID: "chk1", Name: "chk1", Status: "critical", ServiceID: "redis", ServiceName: "redis"}
|
||||
hchk2 := &structs.HealthCheck{Node: "node1", CheckID: "chk2", Name: "chk2", Status: "critical", ServiceID: "redis", ServiceName: "redis"}
|
||||
|
||||
// register service with chk1
|
||||
if err := a.AddService(svc, CheckTypes{chk1}, false, ""); err != nil {
|
||||
if err := a.AddService(svc, []*structs.CheckType{chk1}, false, ""); err != nil {
|
||||
t.Fatal("Failed to register service", err)
|
||||
}
|
||||
|
||||
|
@ -595,7 +595,7 @@ func TestAgent_RemoveServiceRemovesAllChecks(t *testing.T) {
|
|||
}
|
||||
|
||||
// update the service with chk2
|
||||
if err := a.AddService(svc, CheckTypes{chk2}, false, ""); err != nil {
|
||||
if err := a.AddService(svc, []*structs.CheckType{chk2}, false, ""); err != nil {
|
||||
t.Fatal("Failed to update service", err)
|
||||
}
|
||||
|
||||
|
@ -632,7 +632,7 @@ func TestAgent_AddCheck(t *testing.T) {
|
|||
Name: "memory util",
|
||||
Status: api.HealthCritical,
|
||||
}
|
||||
chk := &CheckType{
|
||||
chk := &structs.CheckType{
|
||||
Script: "exit 0",
|
||||
Interval: 15 * time.Second,
|
||||
}
|
||||
|
@ -669,7 +669,7 @@ func TestAgent_AddCheck_StartPassing(t *testing.T) {
|
|||
Name: "memory util",
|
||||
Status: api.HealthPassing,
|
||||
}
|
||||
chk := &CheckType{
|
||||
chk := &structs.CheckType{
|
||||
Script: "exit 0",
|
||||
Interval: 15 * time.Second,
|
||||
}
|
||||
|
@ -706,7 +706,7 @@ func TestAgent_AddCheck_MinInterval(t *testing.T) {
|
|||
Name: "memory util",
|
||||
Status: api.HealthCritical,
|
||||
}
|
||||
chk := &CheckType{
|
||||
chk := &structs.CheckType{
|
||||
Script: "exit 0",
|
||||
Interval: time.Microsecond,
|
||||
}
|
||||
|
@ -739,7 +739,7 @@ func TestAgent_AddCheck_MissingService(t *testing.T) {
|
|||
Name: "baz check 1",
|
||||
ServiceID: "baz",
|
||||
}
|
||||
chk := &CheckType{
|
||||
chk := &structs.CheckType{
|
||||
Script: "exit 0",
|
||||
Interval: time.Microsecond,
|
||||
}
|
||||
|
@ -770,7 +770,7 @@ func TestAgent_AddCheck_RestoreState(t *testing.T) {
|
|||
CheckID: "baz",
|
||||
Name: "baz check 1",
|
||||
}
|
||||
chk := &CheckType{
|
||||
chk := &structs.CheckType{
|
||||
TTL: time.Minute,
|
||||
}
|
||||
err = a.AddCheck(health, chk, false, "")
|
||||
|
@ -813,7 +813,7 @@ func TestAgent_RemoveCheck(t *testing.T) {
|
|||
Name: "memory util",
|
||||
Status: api.HealthCritical,
|
||||
}
|
||||
chk := &CheckType{
|
||||
chk := &structs.CheckType{
|
||||
Script: "exit 0",
|
||||
Interval: 15 * time.Second,
|
||||
}
|
||||
|
@ -849,7 +849,7 @@ func TestAgent_updateTTLCheck(t *testing.T) {
|
|||
Name: "memory util",
|
||||
Status: api.HealthCritical,
|
||||
}
|
||||
chk := &CheckType{
|
||||
chk := &structs.CheckType{
|
||||
TTL: 15 * time.Second,
|
||||
}
|
||||
|
||||
|
@ -1085,14 +1085,14 @@ func TestAgent_PurgeServiceOnDuplicate(t *testing.T) {
|
|||
|
||||
// Try bringing the agent back up with the service already
|
||||
// existing in the config
|
||||
svc2 := &ServiceDefinition{
|
||||
svc2 := &structs.ServiceDefinition{
|
||||
ID: "redis",
|
||||
Name: "redis",
|
||||
Tags: []string{"bar"},
|
||||
Port: 9000,
|
||||
}
|
||||
|
||||
cfg.Services = []*ServiceDefinition{svc2}
|
||||
cfg.Services = []*structs.ServiceDefinition{svc2}
|
||||
a2 := NewTestAgent(t.Name()+"-a2", cfg)
|
||||
defer a2.Shutdown()
|
||||
|
||||
|
@ -1124,7 +1124,7 @@ func TestAgent_PersistCheck(t *testing.T) {
|
|||
Name: "memory check",
|
||||
Status: api.HealthPassing,
|
||||
}
|
||||
chkType := &CheckType{
|
||||
chkType := &structs.CheckType{
|
||||
Script: "/bin/true",
|
||||
Interval: 10 * time.Second,
|
||||
}
|
||||
|
@ -1265,7 +1265,7 @@ func TestAgent_PurgeCheckOnDuplicate(t *testing.T) {
|
|||
a.Shutdown()
|
||||
|
||||
// Start again with the check registered in config
|
||||
check2 := &CheckDefinition{
|
||||
check2 := &structs.CheckDefinition{
|
||||
ID: "mem",
|
||||
Name: "memory check",
|
||||
Notes: "my cool notes",
|
||||
|
@ -1273,7 +1273,7 @@ func TestAgent_PurgeCheckOnDuplicate(t *testing.T) {
|
|||
Interval: 30 * time.Second,
|
||||
}
|
||||
|
||||
cfg.Checks = []*CheckDefinition{check2}
|
||||
cfg.Checks = []*structs.CheckDefinition{check2}
|
||||
a2 := NewTestAgent(t.Name()+"-a2", cfg)
|
||||
defer a2.Shutdown()
|
||||
|
||||
|
@ -1294,7 +1294,7 @@ func TestAgent_PurgeCheckOnDuplicate(t *testing.T) {
|
|||
func TestAgent_loadChecks_token(t *testing.T) {
|
||||
t.Parallel()
|
||||
cfg := TestConfig()
|
||||
cfg.Checks = append(cfg.Checks, &CheckDefinition{
|
||||
cfg.Checks = append(cfg.Checks, &structs.CheckDefinition{
|
||||
ID: "rabbitmq",
|
||||
Name: "rabbitmq",
|
||||
Token: "abc123",
|
||||
|
@ -1367,7 +1367,7 @@ func TestAgent_unloadChecks(t *testing.T) {
|
|||
func TestAgent_loadServices_token(t *testing.T) {
|
||||
t.Parallel()
|
||||
cfg := TestConfig()
|
||||
cfg.Services = append(cfg.Services, &ServiceDefinition{
|
||||
cfg.Services = append(cfg.Services, &structs.ServiceDefinition{
|
||||
ID: "rabbitmq",
|
||||
Name: "rabbitmq",
|
||||
Port: 5672,
|
||||
|
@ -1510,8 +1510,8 @@ func TestAgent_Service_Reap(t *testing.T) {
|
|||
Tags: []string{"foo"},
|
||||
Port: 8000,
|
||||
}
|
||||
chkTypes := CheckTypes{
|
||||
&CheckType{
|
||||
chkTypes := []*structs.CheckType{
|
||||
&structs.CheckType{
|
||||
Status: api.HealthPassing,
|
||||
TTL: 10 * time.Millisecond,
|
||||
DeregisterCriticalServiceAfter: 100 * time.Millisecond,
|
||||
|
@ -1584,8 +1584,8 @@ func TestAgent_Service_NoReap(t *testing.T) {
|
|||
Tags: []string{"foo"},
|
||||
Port: 8000,
|
||||
}
|
||||
chkTypes := CheckTypes{
|
||||
&CheckType{
|
||||
chkTypes := []*structs.CheckType{
|
||||
&structs.CheckType{
|
||||
Status: api.HealthPassing,
|
||||
TTL: 10 * time.Millisecond,
|
||||
},
|
||||
|
@ -1653,7 +1653,7 @@ func TestAgent_addCheck_restoresSnapshot(t *testing.T) {
|
|||
}
|
||||
|
||||
// Re-registering the service preserves the state of the check
|
||||
chkTypes := CheckTypes{&CheckType{TTL: 30 * time.Second}}
|
||||
chkTypes := []*structs.CheckType{&structs.CheckType{TTL: 30 * time.Second}}
|
||||
if err := a.AddService(svc, chkTypes, false, ""); err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
|
|
@ -38,72 +38,6 @@ const (
|
|||
UserAgent = "Consul Health Check"
|
||||
)
|
||||
|
||||
// CheckType is used to create either the CheckMonitor or the CheckTTL.
|
||||
// Five types are supported: Script, HTTP, TCP, Docker and TTL. Script, HTTP,
|
||||
// Docker and TCP all require Interval. Only one of the types may to be
|
||||
// provided: TTL or Script/Interval or HTTP/Interval or TCP/Interval or
|
||||
// Docker/Interval.
|
||||
type CheckType struct {
|
||||
// fields already embedded in CheckDefinition
|
||||
// Note: CheckType.CheckID == CheckDefinition.ID
|
||||
|
||||
CheckID types.CheckID
|
||||
Name string
|
||||
Status string
|
||||
Notes string
|
||||
|
||||
// fields copied to CheckDefinition
|
||||
// Update CheckDefinition when adding fields here
|
||||
|
||||
Script string
|
||||
HTTP string
|
||||
Header map[string][]string
|
||||
Method string
|
||||
TCP string
|
||||
Interval time.Duration
|
||||
DockerContainerID string
|
||||
Shell string
|
||||
TLSSkipVerify bool
|
||||
Timeout time.Duration
|
||||
TTL time.Duration
|
||||
|
||||
// DeregisterCriticalServiceAfter, if >0, will cause the associated
|
||||
// service, if any, to be deregistered if this check is critical for
|
||||
// longer than this duration.
|
||||
DeregisterCriticalServiceAfter time.Duration
|
||||
}
|
||||
type CheckTypes []*CheckType
|
||||
|
||||
// Valid checks if the CheckType is valid
|
||||
func (c *CheckType) Valid() bool {
|
||||
return c.IsTTL() || c.IsMonitor() || c.IsHTTP() || c.IsTCP() || c.IsDocker()
|
||||
}
|
||||
|
||||
// IsTTL checks if this is a TTL type
|
||||
func (c *CheckType) IsTTL() bool {
|
||||
return c.TTL != 0
|
||||
}
|
||||
|
||||
// IsMonitor checks if this is a Monitor type
|
||||
func (c *CheckType) IsMonitor() bool {
|
||||
return c.Script != "" && c.DockerContainerID == "" && c.Interval != 0
|
||||
}
|
||||
|
||||
// IsHTTP checks if this is a HTTP type
|
||||
func (c *CheckType) IsHTTP() bool {
|
||||
return c.HTTP != "" && c.Interval != 0
|
||||
}
|
||||
|
||||
// IsTCP checks if this is a TCP type
|
||||
func (c *CheckType) IsTCP() bool {
|
||||
return c.TCP != "" && c.Interval != 0
|
||||
}
|
||||
|
||||
// IsDocker returns true when checking a docker container.
|
||||
func (c *CheckType) IsDocker() bool {
|
||||
return c.DockerContainerID != "" && c.Script != "" && c.Interval != 0
|
||||
}
|
||||
|
||||
// CheckNotifier interface is used by the CheckMonitor
|
||||
// to notify when a check has a status update. The update
|
||||
// should take care to be idempotent.
|
||||
|
@ -324,7 +258,7 @@ func (c *CheckTTL) SetStatus(status, output string) {
|
|||
// so that it may be restored later on.
|
||||
type persistedCheck struct {
|
||||
Check *structs.HealthCheck
|
||||
ChkType *CheckType
|
||||
ChkType *structs.CheckType
|
||||
Token string
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/hashicorp/consul/agent/consul"
|
||||
"github.com/hashicorp/consul/agent/consul/structs"
|
||||
"github.com/hashicorp/consul/lib"
|
||||
"github.com/hashicorp/consul/tlsutil"
|
||||
"github.com/hashicorp/consul/types"
|
||||
|
@ -729,10 +730,10 @@ type Config struct {
|
|||
SyncCoordinateIntervalMin time.Duration `mapstructure:"-" json:"-"`
|
||||
|
||||
// Checks holds the provided check definitions
|
||||
Checks []*CheckDefinition `mapstructure:"-" json:"-"`
|
||||
Checks []*structs.CheckDefinition `mapstructure:"-" json:"-"`
|
||||
|
||||
// Services holds the provided service definitions
|
||||
Services []*ServiceDefinition `mapstructure:"-" json:"-"`
|
||||
Services []*structs.ServiceDefinition `mapstructure:"-" json:"-"`
|
||||
|
||||
// ConsulConfig can either be provided or a default one created
|
||||
ConsulConfig *consul.Config `mapstructure:"-" json:"-"`
|
||||
|
@ -1371,7 +1372,7 @@ func DecodeConfig(r io.Reader) (*Config, error) {
|
|||
}
|
||||
|
||||
// DecodeServiceDefinition is used to decode a service definition
|
||||
func DecodeServiceDefinition(raw interface{}) (*ServiceDefinition, error) {
|
||||
func DecodeServiceDefinition(raw interface{}) (*structs.ServiceDefinition, error) {
|
||||
rawMap, ok := raw.(map[string]interface{})
|
||||
if !ok {
|
||||
goto AFTER_FIX
|
||||
|
@ -1404,7 +1405,7 @@ func DecodeServiceDefinition(raw interface{}) (*ServiceDefinition, error) {
|
|||
}
|
||||
AFTER_FIX:
|
||||
var md mapstructure.Metadata
|
||||
var result ServiceDefinition
|
||||
var result structs.ServiceDefinition
|
||||
msdec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
||||
Metadata: &md,
|
||||
Result: &result,
|
||||
|
@ -1511,12 +1512,12 @@ func FixupCheckType(raw interface{}) error {
|
|||
}
|
||||
|
||||
// DecodeCheckDefinition is used to decode a check definition
|
||||
func DecodeCheckDefinition(raw interface{}) (*CheckDefinition, error) {
|
||||
func DecodeCheckDefinition(raw interface{}) (*structs.CheckDefinition, error) {
|
||||
if err := FixupCheckType(raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var md mapstructure.Metadata
|
||||
var result CheckDefinition
|
||||
var result structs.CheckDefinition
|
||||
msdec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
||||
Metadata: &md,
|
||||
Result: &result,
|
||||
|
|
|
@ -14,6 +14,7 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/consul/agent/consul/structs"
|
||||
"github.com/hashicorp/consul/testutil"
|
||||
"github.com/pascaldekloe/goe/verify"
|
||||
)
|
||||
|
@ -742,8 +743,8 @@ func TestDecodeConfig(t *testing.T) {
|
|||
}
|
||||
}`,
|
||||
c: &Config{
|
||||
Services: []*ServiceDefinition{
|
||||
&ServiceDefinition{
|
||||
Services: []*structs.ServiceDefinition{
|
||||
&structs.ServiceDefinition{
|
||||
ID: "a",
|
||||
Name: "b",
|
||||
Tags: []string{"c", "d"},
|
||||
|
@ -751,7 +752,7 @@ func TestDecodeConfig(t *testing.T) {
|
|||
Port: 123,
|
||||
Token: "f",
|
||||
EnableTagOverride: true,
|
||||
Check: CheckType{
|
||||
Check: structs.CheckType{
|
||||
CheckID: "g",
|
||||
Name: "h",
|
||||
Status: "i",
|
||||
|
@ -825,8 +826,8 @@ func TestDecodeConfig(t *testing.T) {
|
|||
}
|
||||
}`,
|
||||
c: &Config{
|
||||
Services: []*ServiceDefinition{
|
||||
&ServiceDefinition{
|
||||
Services: []*structs.ServiceDefinition{
|
||||
&structs.ServiceDefinition{
|
||||
ID: "a",
|
||||
Name: "b",
|
||||
Tags: []string{"c", "d"},
|
||||
|
@ -834,7 +835,7 @@ func TestDecodeConfig(t *testing.T) {
|
|||
Port: 123,
|
||||
Token: "f",
|
||||
EnableTagOverride: true,
|
||||
Checks: CheckTypes{
|
||||
Checks: []*structs.CheckType{
|
||||
{
|
||||
CheckID: "g",
|
||||
Name: "h",
|
||||
|
@ -937,8 +938,8 @@ func TestDecodeConfig(t *testing.T) {
|
|||
]
|
||||
}`,
|
||||
c: &Config{
|
||||
Services: []*ServiceDefinition{
|
||||
&ServiceDefinition{
|
||||
Services: []*structs.ServiceDefinition{
|
||||
&structs.ServiceDefinition{
|
||||
ID: "a",
|
||||
Name: "b",
|
||||
Tags: []string{"c", "d"},
|
||||
|
@ -946,7 +947,7 @@ func TestDecodeConfig(t *testing.T) {
|
|||
Port: 123,
|
||||
Token: "f",
|
||||
EnableTagOverride: true,
|
||||
Check: CheckType{
|
||||
Check: structs.CheckType{
|
||||
CheckID: "g",
|
||||
Name: "h",
|
||||
Status: "i",
|
||||
|
@ -965,7 +966,7 @@ func TestDecodeConfig(t *testing.T) {
|
|||
DeregisterCriticalServiceAfter: 5 * time.Second,
|
||||
},
|
||||
},
|
||||
&ServiceDefinition{
|
||||
&structs.ServiceDefinition{
|
||||
ID: "aa",
|
||||
Name: "bb",
|
||||
Tags: []string{"cc", "dd"},
|
||||
|
@ -973,7 +974,7 @@ func TestDecodeConfig(t *testing.T) {
|
|||
Port: 246,
|
||||
Token: "ff",
|
||||
EnableTagOverride: false,
|
||||
Check: CheckType{
|
||||
Check: structs.CheckType{
|
||||
CheckID: "gg",
|
||||
Name: "hh",
|
||||
Status: "ii",
|
||||
|
@ -1021,8 +1022,8 @@ func TestDecodeConfig(t *testing.T) {
|
|||
}
|
||||
}`,
|
||||
c: &Config{
|
||||
Checks: []*CheckDefinition{
|
||||
&CheckDefinition{
|
||||
Checks: []*structs.CheckDefinition{
|
||||
&structs.CheckDefinition{
|
||||
ID: "a",
|
||||
Name: "b",
|
||||
Notes: "c",
|
||||
|
@ -1092,8 +1093,8 @@ func TestDecodeConfig(t *testing.T) {
|
|||
]
|
||||
}`,
|
||||
c: &Config{
|
||||
Checks: []*CheckDefinition{
|
||||
&CheckDefinition{
|
||||
Checks: []*structs.CheckDefinition{
|
||||
&structs.CheckDefinition{
|
||||
ID: "a",
|
||||
Name: "b",
|
||||
Notes: "c",
|
||||
|
@ -1113,7 +1114,7 @@ func TestDecodeConfig(t *testing.T) {
|
|||
TTL: 4 * time.Second,
|
||||
DeregisterCriticalServiceAfter: 5 * time.Second,
|
||||
},
|
||||
&CheckDefinition{
|
||||
&structs.CheckDefinition{
|
||||
ID: "aa",
|
||||
Name: "bb",
|
||||
Notes: "cc",
|
||||
|
@ -1336,8 +1337,8 @@ func TestMergeConfig(t *testing.T) {
|
|||
CertFile: "test/cert.pem",
|
||||
KeyFile: "test/key.pem",
|
||||
TLSMinVersion: "tls12",
|
||||
Checks: []*CheckDefinition{nil},
|
||||
Services: []*ServiceDefinition{nil},
|
||||
Checks: []*structs.CheckDefinition{nil},
|
||||
Services: []*structs.ServiceDefinition{nil},
|
||||
StartJoin: []string{"1.1.1.1"},
|
||||
StartJoinWan: []string{"1.1.1.1"},
|
||||
EnableUI: true,
|
||||
|
@ -1502,7 +1503,7 @@ func TestUnixSockets(t *testing.T) {
|
|||
|
||||
func TestCheckDefinitionToCheckType(t *testing.T) {
|
||||
t.Parallel()
|
||||
got := &CheckDefinition{
|
||||
got := &structs.CheckDefinition{
|
||||
ID: "id",
|
||||
Name: "name",
|
||||
Status: "green",
|
||||
|
@ -1521,7 +1522,7 @@ func TestCheckDefinitionToCheckType(t *testing.T) {
|
|||
TTL: 3 * time.Second,
|
||||
DeregisterCriticalServiceAfter: 4 * time.Second,
|
||||
}
|
||||
want := &CheckType{
|
||||
want := &structs.CheckType{
|
||||
CheckID: "id",
|
||||
Name: "name",
|
||||
Status: "green",
|
||||
|
|
|
@ -1,51 +1,12 @@
|
|||
package agent
|
||||
package structs
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/consul/agent/consul/structs"
|
||||
"github.com/hashicorp/consul/api"
|
||||
"github.com/hashicorp/consul/types"
|
||||
)
|
||||
|
||||
// ServiceDefinition is used to JSON decode the Service definitions
|
||||
type ServiceDefinition struct {
|
||||
ID string
|
||||
Name string
|
||||
Tags []string
|
||||
Address string
|
||||
Port int
|
||||
Check CheckType
|
||||
Checks CheckTypes
|
||||
Token string
|
||||
EnableTagOverride bool
|
||||
}
|
||||
|
||||
func (s *ServiceDefinition) NodeService() *structs.NodeService {
|
||||
ns := &structs.NodeService{
|
||||
ID: s.ID,
|
||||
Service: s.Name,
|
||||
Tags: s.Tags,
|
||||
Address: s.Address,
|
||||
Port: s.Port,
|
||||
EnableTagOverride: s.EnableTagOverride,
|
||||
}
|
||||
if ns.ID == "" && ns.Service != "" {
|
||||
ns.ID = ns.Service
|
||||
}
|
||||
return ns
|
||||
}
|
||||
|
||||
func (s *ServiceDefinition) CheckTypes() (checks CheckTypes) {
|
||||
s.Checks = append(s.Checks, &s.Check)
|
||||
for _, check := range s.Checks {
|
||||
if check.Valid() {
|
||||
checks = append(checks, check)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// CheckDefinition is used to JSON decode the Check definitions
|
||||
type CheckDefinition struct {
|
||||
ID types.CheckID
|
||||
|
@ -74,8 +35,8 @@ type CheckDefinition struct {
|
|||
DeregisterCriticalServiceAfter time.Duration
|
||||
}
|
||||
|
||||
func (c *CheckDefinition) HealthCheck(node string) *structs.HealthCheck {
|
||||
health := &structs.HealthCheck{
|
||||
func (c *CheckDefinition) HealthCheck(node string) *HealthCheck {
|
||||
health := &HealthCheck{
|
||||
Node: node,
|
||||
CheckID: c.ID,
|
||||
Name: c.Name,
|
||||
|
@ -110,10 +71,3 @@ func (c *CheckDefinition) CheckType() *CheckType {
|
|||
Notes: c.Notes,
|
||||
}
|
||||
}
|
||||
|
||||
// persistedService is used to wrap a service definition and bundle it
|
||||
// with an ACL token so we can restore both at a later agent start.
|
||||
type persistedService struct {
|
||||
Token string
|
||||
Service *structs.NodeService
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package structs
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/consul/api"
|
||||
)
|
||||
|
||||
func TestAgentStructs_HealthCheck(t *testing.T) {
|
||||
t.Parallel()
|
||||
def := CheckDefinition{}
|
||||
check := def.HealthCheck("node1")
|
||||
|
||||
// Health checks default to critical state
|
||||
if check.Status != api.HealthCritical {
|
||||
t.Fatalf("bad: %v", check.Status)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
package structs
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/consul/types"
|
||||
)
|
||||
|
||||
// CheckType is used to create either the CheckMonitor or the CheckTTL.
|
||||
// Five types are supported: Script, HTTP, TCP, Docker and TTL. Script, HTTP,
|
||||
// Docker and TCP all require Interval. Only one of the types may to be
|
||||
// provided: TTL or Script/Interval or HTTP/Interval or TCP/Interval or
|
||||
// Docker/Interval.
|
||||
type CheckType struct {
|
||||
// fields already embedded in CheckDefinition
|
||||
// Note: CheckType.CheckID == CheckDefinition.ID
|
||||
|
||||
CheckID types.CheckID
|
||||
Name string
|
||||
Status string
|
||||
Notes string
|
||||
|
||||
// fields copied to CheckDefinition
|
||||
// Update CheckDefinition when adding fields here
|
||||
|
||||
Script string
|
||||
HTTP string
|
||||
Header map[string][]string
|
||||
Method string
|
||||
TCP string
|
||||
Interval time.Duration
|
||||
DockerContainerID string
|
||||
Shell string
|
||||
TLSSkipVerify bool
|
||||
Timeout time.Duration
|
||||
TTL time.Duration
|
||||
|
||||
// DeregisterCriticalServiceAfter, if >0, will cause the associated
|
||||
// service, if any, to be deregistered if this check is critical for
|
||||
// longer than this duration.
|
||||
DeregisterCriticalServiceAfter time.Duration
|
||||
}
|
||||
type CheckTypes []*CheckType
|
||||
|
||||
// Valid checks if the CheckType is valid
|
||||
func (c *CheckType) Valid() bool {
|
||||
return c.IsTTL() || c.IsMonitor() || c.IsHTTP() || c.IsTCP() || c.IsDocker()
|
||||
}
|
||||
|
||||
// IsTTL checks if this is a TTL type
|
||||
func (c *CheckType) IsTTL() bool {
|
||||
return c.TTL != 0
|
||||
}
|
||||
|
||||
// IsMonitor checks if this is a Monitor type
|
||||
func (c *CheckType) IsMonitor() bool {
|
||||
return c.Script != "" && c.DockerContainerID == "" && c.Interval != 0
|
||||
}
|
||||
|
||||
// IsHTTP checks if this is a HTTP type
|
||||
func (c *CheckType) IsHTTP() bool {
|
||||
return c.HTTP != "" && c.Interval != 0
|
||||
}
|
||||
|
||||
// IsTCP checks if this is a TCP type
|
||||
func (c *CheckType) IsTCP() bool {
|
||||
return c.TCP != "" && c.Interval != 0
|
||||
}
|
||||
|
||||
// IsDocker returns true when checking a docker container.
|
||||
func (c *CheckType) IsDocker() bool {
|
||||
return c.DockerContainerID != "" && c.Script != "" && c.Interval != 0
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package structs
|
||||
|
||||
// ServiceDefinition is used to JSON decode the Service definitions
|
||||
type ServiceDefinition struct {
|
||||
ID string
|
||||
Name string
|
||||
Tags []string
|
||||
Address string
|
||||
Port int
|
||||
Check CheckType
|
||||
Checks CheckTypes
|
||||
Token string
|
||||
EnableTagOverride bool
|
||||
}
|
||||
|
||||
func (s *ServiceDefinition) NodeService() *NodeService {
|
||||
ns := &NodeService{
|
||||
ID: s.ID,
|
||||
Service: s.Name,
|
||||
Tags: s.Tags,
|
||||
Address: s.Address,
|
||||
Port: s.Port,
|
||||
EnableTagOverride: s.EnableTagOverride,
|
||||
}
|
||||
if ns.ID == "" && ns.Service != "" {
|
||||
ns.ID = ns.Service
|
||||
}
|
||||
return ns
|
||||
}
|
||||
|
||||
func (s *ServiceDefinition) CheckTypes() (checks CheckTypes) {
|
||||
s.Checks = append(s.Checks, &s.Check)
|
||||
for _, check := range s.Checks {
|
||||
if check.Valid() {
|
||||
checks = append(checks, check)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
|
@ -1,23 +1,10 @@
|
|||
package agent
|
||||
package structs
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/consul/api"
|
||||
)
|
||||
|
||||
func TestAgentStructs_HealthCheck(t *testing.T) {
|
||||
t.Parallel()
|
||||
def := CheckDefinition{}
|
||||
check := def.HealthCheck("node1")
|
||||
|
||||
// Health checks default to critical state
|
||||
if check.Status != api.HealthCritical {
|
||||
t.Fatalf("bad: %v", check.Status)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAgentStructs_CheckTypes(t *testing.T) {
|
||||
t.Parallel()
|
||||
svc := new(ServiceDefinition)
|
Loading…
Reference in New Issue