Backport of connect: deployments should wait for Connect sidecar checks into release/1.6.x #19365
Co-authored-by: Tim Gross <tgross@hashicorp.com>
This commit is contained in:
parent
e1a6a4c42f
commit
a8c0b2ebb5
|
@ -0,0 +1,3 @@
|
|||
```release-note:bug
|
||||
connect: Fixed a bug where deployments would not wait for Connect sidecar task health checks to pass
|
||||
```
|
|
@ -575,6 +575,8 @@ func evaluateConsulChecks(services []*structs.Service, registrations *servicereg
|
|||
}
|
||||
}
|
||||
|
||||
// The sidecar service and checks are created when the service is
|
||||
// registered, not on job registration, so they won't appear in the jobspec.
|
||||
if !maps.Equal(expChecks, regChecks) {
|
||||
return false
|
||||
}
|
||||
|
@ -595,6 +597,21 @@ func evaluateConsulChecks(services []*structs.Service, registrations *servicereg
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check the health of Connect sidecars, so we don't accidentally
|
||||
// mark an allocation healthy before min_healthy_time. These don't
|
||||
// currently support on_update.
|
||||
if service.SidecarService != nil {
|
||||
for _, check := range service.SidecarChecks {
|
||||
switch check.Status {
|
||||
case api.HealthWarning:
|
||||
return false
|
||||
case api.HealthCritical:
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1466,6 +1466,42 @@ func TestTracker_evaluateConsulChecks(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "failing sidecar checks only",
|
||||
exp: false,
|
||||
tg: &structs.TaskGroup{
|
||||
Services: []*structs.Service{{
|
||||
Name: "group-s1",
|
||||
Checks: []*structs.ServiceCheck{
|
||||
{Name: "c1"},
|
||||
},
|
||||
}},
|
||||
},
|
||||
registrations: &serviceregistration.AllocRegistration{
|
||||
Tasks: map[string]*serviceregistration.ServiceRegistrations{
|
||||
"group": {
|
||||
Services: map[string]*serviceregistration.ServiceRegistration{
|
||||
"abc123": {
|
||||
ServiceID: "abc123",
|
||||
Checks: []*consulapi.AgentCheck{
|
||||
{
|
||||
Name: "c1",
|
||||
Status: consulapi.HealthPassing,
|
||||
},
|
||||
},
|
||||
SidecarService: &consulapi.AgentService{},
|
||||
SidecarChecks: []*consulapi.AgentCheck{
|
||||
{
|
||||
Name: "sidecar-check",
|
||||
Status: consulapi.HealthCritical,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
|
|
|
@ -144,6 +144,12 @@ type ServiceRegistration struct {
|
|||
|
||||
// Checks is the status of the registered checks.
|
||||
Checks []*api.AgentCheck
|
||||
|
||||
// SidecarService is the AgentService registered in Consul for any Connect sidecar
|
||||
SidecarService *api.AgentService
|
||||
|
||||
// SidecarChecks is the status of the registered checks for any Connect sidecar
|
||||
SidecarChecks []*api.AgentCheck
|
||||
}
|
||||
|
||||
func (s *ServiceRegistration) copy() *ServiceRegistration {
|
||||
|
|
|
@ -1489,6 +1489,15 @@ func (c *ServiceClient) AllocRegistrations(allocID string) (*serviceregistration
|
|||
sreg.Checks = append(sreg.Checks, check)
|
||||
}
|
||||
}
|
||||
|
||||
if sidecarService := getNomadSidecar(serviceID, services); sidecarService != nil {
|
||||
sreg.SidecarService = sidecarService
|
||||
for _, check := range checks {
|
||||
if check.ServiceID == sidecarService.ID {
|
||||
sreg.SidecarChecks = append(sreg.SidecarChecks, check)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue