Skip to content

Commit e5709f9

Browse files
committed
MINOR: consul: add support for health check policy
1 parent 62dadaa commit e5709f9

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

discovery/consul_service_discovery_instance.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ func (c *consulInstance) updateServices() error {
170170
func (c *consulInstance) convertToServers(nodes []*serviceEntry) []configuration.ServiceServer {
171171
servers := make([]configuration.ServiceServer, 0)
172172
for _, node := range nodes {
173+
if !c.validateHealthChecks(node) {
174+
continue
175+
}
173176
if node.Service.Address != "" {
174177
servers = append(servers, configuration.ServiceServer{
175178
Address: node.Service.Address,
@@ -185,6 +188,61 @@ func (c *consulInstance) convertToServers(nodes []*serviceEntry) []configuration
185188
return servers
186189
}
187190

191+
func (c *consulInstance) validateHealthChecks(node *serviceEntry) bool {
192+
switch *c.params.HealthCheckPolicy {
193+
case models.ConsulHealthCheckPolicyAny:
194+
return c.validateHealthChecksAny(node)
195+
case models.ConsulHealthCheckPolicyAll:
196+
return c.validateHealthChecksAll(node)
197+
case models.ConsulHealthCheckPolicyMin:
198+
return c.validateHealthChecksMin(node)
199+
case models.ConsulHealthCheckPolicyNone:
200+
return true
201+
default:
202+
return true
203+
}
204+
}
205+
206+
func (c *consulInstance) validateHealthChecksAny(node *serviceEntry) bool {
207+
if node.Checks == nil || len(node.Checks) == 0 {
208+
return false
209+
}
210+
211+
for _, check := range node.Checks {
212+
if check.Status == "passing" {
213+
return true
214+
}
215+
}
216+
return false
217+
}
218+
219+
func (c *consulInstance) validateHealthChecksAll(node *serviceEntry) bool {
220+
if node.Checks == nil || len(node.Checks) == 0 {
221+
return false
222+
}
223+
224+
for _, check := range node.Checks {
225+
if check.Status != "passing" {
226+
return false
227+
}
228+
}
229+
return true
230+
}
231+
232+
func (c *consulInstance) validateHealthChecksMin(node *serviceEntry) bool {
233+
if node.Checks == nil || len(node.Checks) == 0 {
234+
return false
235+
}
236+
237+
passing := 0
238+
for _, check := range node.Checks {
239+
if check.Status == "passing" {
240+
passing++
241+
}
242+
}
243+
return passing >= int(c.params.HealthCheckPolicyMin)
244+
}
245+
188246
func (c *consulInstance) hasServiceChanged(service string, index uint64) bool {
189247
prevIndex, ok := c.prevIndexes[service]
190248
if !ok {
@@ -313,6 +371,9 @@ type serviceEntry struct {
313371
Address string
314372
Port int
315373
}
374+
Checks []*struct {
375+
Status string
376+
}
316377
}
317378

318379
type queryParams struct {

handlers/consul.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ func (c *CreateConsulHandlerImpl) Handle(params service_discovery.CreateConsulPa
6464
return service_discovery.NewCreateConsulDefault(int(*e.Code)).WithPayload(e)
6565
}
6666
setFilters(params.Data)
67+
if *params.Data.HealthCheckPolicy == models.ConsulHealthCheckPolicyMin && params.Data.HealthCheckPolicyMin <= 0 {
68+
e := &models.Error{
69+
Message: misc.StringP("health_check_policy_min is required for 'min' health_check_policy"),
70+
Code: misc.Int64P(int(misc.ErrHTTPBadRequest)),
71+
}
72+
return service_discovery.NewCreateConsulDefault(int(*e.Code)).WithPayload(e)
73+
}
6774
err := c.Discovery.AddNode("consul", *params.Data.ID, params.Data)
6875
if err != nil {
6976
e := misc.HandleError(err)
@@ -134,6 +141,13 @@ func (c *ReplaceConsulHandlerImpl) Handle(params service_discovery.ReplaceConsul
134141
return service_discovery.NewReplaceConsulDefault(int(*e.Code)).WithPayload(e)
135142
}
136143
setFilters(params.Data)
144+
if *params.Data.HealthCheckPolicy == models.ConsulHealthCheckPolicyMin && params.Data.HealthCheckPolicyMin <= 0 {
145+
e := &models.Error{
146+
Message: misc.StringP("health_check_policy_min is required for 'min' health_check_policy"),
147+
Code: misc.Int64P(int(misc.ErrHTTPBadRequest)),
148+
}
149+
return service_discovery.NewCreateConsulDefault(int(*e.Code)).WithPayload(e)
150+
}
137151
err := c.Discovery.UpdateNode("consul", *params.Data.ID, params.Data)
138152
if err != nil {
139153
e := misc.HandleError(err)

0 commit comments

Comments
 (0)