2023-04-10 15:36:59 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
2022-06-07 14:18:19 +00:00
|
|
|
package structs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/md5"
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
// The CheckMode of a Nomad check is either Healthiness or Readiness.
|
|
|
|
type CheckMode string
|
|
|
|
|
|
|
|
const (
|
|
|
|
// A Healthiness check is useful in the context of ensuring a service
|
|
|
|
// is capable of performing its duties. This is an indicator that a check's
|
|
|
|
// on_update configuration is set to "check_result", implying that Deployments
|
|
|
|
// will not move forward while the check is failing.
|
|
|
|
Healthiness CheckMode = "healthiness"
|
|
|
|
|
2022-07-21 14:54:27 +00:00
|
|
|
// A Readiness check is useful in the context of ensuring a service
|
2022-06-07 14:18:19 +00:00
|
|
|
// should be performing its duties (regardless of healthiness). This is an
|
|
|
|
// indicator that the check's on_update configuration is set to "ignore",
|
|
|
|
// implying that Deployments will move forward regardless if the check is
|
|
|
|
// failing.
|
|
|
|
Readiness CheckMode = "readiness"
|
|
|
|
)
|
|
|
|
|
|
|
|
// GetCheckMode determines whether the check is readiness or healthiness.
|
|
|
|
func GetCheckMode(c *ServiceCheck) CheckMode {
|
2022-07-21 18:09:47 +00:00
|
|
|
if c != nil && c.OnUpdate == OnUpdateIgnore {
|
2022-06-07 14:18:19 +00:00
|
|
|
return Readiness
|
|
|
|
}
|
|
|
|
return Healthiness
|
|
|
|
}
|
|
|
|
|
|
|
|
// An CheckID is unique to a check.
|
|
|
|
type CheckID string
|
|
|
|
|
|
|
|
// A CheckQueryResult represents the outcome of a single execution of a Nomad service
|
|
|
|
// check. It records the result, the output, and when the execution took place.
|
|
|
|
// Advanced check math (e.g. success_before_passing) are left to the calling
|
|
|
|
// context.
|
|
|
|
type CheckQueryResult struct {
|
|
|
|
ID CheckID
|
|
|
|
Mode CheckMode
|
|
|
|
Status CheckStatus
|
|
|
|
StatusCode int `json:",omitempty"`
|
|
|
|
Output string
|
|
|
|
Timestamp int64
|
|
|
|
|
|
|
|
// check coordinates
|
|
|
|
Group string
|
|
|
|
Task string `json:",omitempty"`
|
|
|
|
Service string
|
|
|
|
Check string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *CheckQueryResult) String() string {
|
|
|
|
return fmt.Sprintf("(%s %s %s %v)", r.ID, r.Mode, r.Status, r.Timestamp)
|
|
|
|
}
|
|
|
|
|
|
|
|
// A CheckStatus is the result of executing a check. The status of a query is
|
|
|
|
// ternary - success, failure, or pending (not yet executed). Deployments treat
|
|
|
|
// pending and failure as the same - a deployment does not continue until a check
|
|
|
|
// is passing (unless on_update=ignore).
|
|
|
|
type CheckStatus string
|
|
|
|
|
|
|
|
const (
|
|
|
|
CheckSuccess CheckStatus = "success"
|
|
|
|
CheckFailure CheckStatus = "failure"
|
|
|
|
CheckPending CheckStatus = "pending"
|
|
|
|
)
|
|
|
|
|
|
|
|
// NomadCheckID returns an ID unique to the nomad service check.
|
|
|
|
//
|
|
|
|
// Checks of group-level services have no task.
|
|
|
|
func NomadCheckID(allocID, group string, c *ServiceCheck) CheckID {
|
|
|
|
sum := md5.New()
|
|
|
|
hashString(sum, allocID)
|
|
|
|
hashString(sum, group)
|
|
|
|
hashString(sum, c.TaskName)
|
|
|
|
hashString(sum, c.Name)
|
|
|
|
hashString(sum, c.Type)
|
|
|
|
hashString(sum, c.PortLabel)
|
|
|
|
hashString(sum, c.OnUpdate)
|
|
|
|
hashString(sum, c.AddressMode)
|
|
|
|
hashDuration(sum, c.Interval)
|
|
|
|
hashDuration(sum, c.Timeout)
|
|
|
|
hashString(sum, c.Protocol)
|
|
|
|
hashString(sum, c.Path)
|
|
|
|
hashString(sum, c.Method)
|
|
|
|
h := sum.Sum(nil)
|
|
|
|
return CheckID(fmt.Sprintf("%x", h))
|
|
|
|
}
|