// makeCheck creates a Consul Check Registration struct func (c *ConsulService) makeCheck(service *structs.Service, check *structs.ServiceCheck, ip string, port int) *consul.AgentCheckRegistration { if check.Name == "" { check.Name = fmt.Sprintf("service: %s check", service.Name) } check.Id = check.Hash(service.Id) cr := &consul.AgentCheckRegistration{ ID: check.Id, Name: check.Name, ServiceID: service.Id, } cr.Interval = check.Interval.String() cr.Timeout = check.Timeout.String() switch check.Type { case structs.ServiceCheckHTTP: if check.Protocol == "" { check.Protocol = "http" } url := url.URL{ Scheme: check.Protocol, Host: fmt.Sprintf("%s:%d", ip, port), Path: check.Path, } cr.HTTP = url.String() case structs.ServiceCheckTCP: cr.TCP = fmt.Sprintf("%s:%d", ip, port) case structs.ServiceCheckScript: cr.Script = check.Script // TODO This needs to include the path of the alloc dir and based on driver types } return cr }
// createCheckReg creates a Check that can be registered with Nomad. It also // creates a Nomad check for the check types that it can handle. func (c *Syncer) createCheckReg(check *structs.ServiceCheck, service *consul.AgentServiceRegistration) (*consul.AgentCheckRegistration, error) { chkReg := consul.AgentCheckRegistration{ ID: check.Hash(service.ID), Name: check.Name, ServiceID: service.ID, } chkReg.Timeout = check.Timeout.String() chkReg.Interval = check.Interval.String() switch check.Type { case structs.ServiceCheckHTTP: if check.Protocol == "" { check.Protocol = "http" } url := url.URL{ Scheme: check.Protocol, Host: fmt.Sprintf("%s:%d", service.Address, service.Port), Path: check.Path, } chkReg.HTTP = url.String() case structs.ServiceCheckTCP: chkReg.TCP = fmt.Sprintf("%s:%d", service.Address, service.Port) case structs.ServiceCheckScript: chkReg.TTL = (check.Interval + ttlCheckBuffer).String() default: return nil, fmt.Errorf("check type %+q not valid", check.Type) } return &chkReg, nil }
func TestConsul_ModifyCheck(t *testing.T) { apiClient := &mockConsulApiClient{} c := newConsulService() c.client = apiClient task := newTask() var checks []*structs.ServiceCheck s1 := structs.Service{ Name: "example-cache-redis", Tags: []string{"global"}, PortLabel: "db", Checks: checks, } task.Services = append(task.Services, &s1) c.Register(task, mock.Alloc()) check1 := structs.ServiceCheck{ Name: "alive", Type: "tcp", Interval: 10 * time.Second, Timeout: 5 * time.Second, } s1.Checks = append(s1.Checks, &check1) c.performSync() if apiClient.checkRegisterCallCount != 1 { t.Fatalf("Expected number of check registrations: %v, Actual: %v", 1, apiClient.checkRegisterCallCount) } check1.Timeout = 2 * time.Second c.performSync() if apiClient.checkRegisterCallCount != 2 { t.Fatalf("Expected number of check registrations: %v, Actual: %v", 2, apiClient.checkRegisterCallCount) } }
// createCheckReg creates a Check that can be registered with Nomad. It also // creates a Nomad check for the check types that it can handle. func (c *Syncer) createCheckReg(check *structs.ServiceCheck, serviceReg *consul.AgentServiceRegistration) (*consul.AgentCheckRegistration, error) { chkReg := consul.AgentCheckRegistration{ ID: check.Hash(serviceReg.ID), Name: check.Name, ServiceID: serviceReg.ID, } chkReg.Timeout = check.Timeout.String() chkReg.Interval = check.Interval.String() host, port := serviceReg.Address, serviceReg.Port if check.PortLabel != "" { host, port = c.addrFinder(check.PortLabel) } switch check.Type { case structs.ServiceCheckHTTP: if check.Protocol == "" { check.Protocol = "http" } base := url.URL{ Scheme: check.Protocol, Host: net.JoinHostPort(host, strconv.Itoa(port)), } relative, err := url.Parse(check.Path) if err != nil { return nil, err } url := base.ResolveReference(relative) chkReg.HTTP = url.String() case structs.ServiceCheckTCP: chkReg.TCP = net.JoinHostPort(host, strconv.Itoa(port)) case structs.ServiceCheckScript: chkReg.TTL = (check.Interval + ttlCheckBuffer).String() default: return nil, fmt.Errorf("check type %+q not valid", check.Type) } chkReg.Status = check.InitialStatus return &chkReg, nil }