c04773963b
In certain container set ups, it's useful to optionally have lnd just shutdown if it detects that its certs are expired, as assuming there's a hypervisor to restart the container/pod, then upon restart, lnd will have fully up to date certs.
97 lines
2.7 KiB
Go
97 lines
2.7 KiB
Go
package lncfg
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
// MinHealthCheckInterval is the minimum interval we allow between
|
|
// health checks.
|
|
MinHealthCheckInterval = time.Minute
|
|
|
|
// MinHealthCheckTimeout is the minimum timeout we allow for health
|
|
// check calls.
|
|
MinHealthCheckTimeout = time.Second
|
|
|
|
// MinHealthCheckBackoff is the minimum back off we allow between health
|
|
// check retries.
|
|
MinHealthCheckBackoff = time.Second
|
|
)
|
|
|
|
// HealthCheckConfig contains the configuration for the different health checks
|
|
// the lnd runs.
|
|
type HealthCheckConfig struct {
|
|
ChainCheck *CheckConfig `group:"chainbackend" namespace:"chainbackend"`
|
|
|
|
DiskCheck *DiskCheckConfig `group:"diskspace" namespace:"diskspace"`
|
|
|
|
TLSCheck *CheckConfig `group:"tls" namespace:"tls"`
|
|
}
|
|
|
|
// Validate checks the values configured for our health checks.
|
|
func (h *HealthCheckConfig) Validate() error {
|
|
if err := h.ChainCheck.validate("chain backend"); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := h.DiskCheck.validate("disk space"); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := h.TLSCheck.validate("tls"); err != nil {
|
|
return err
|
|
}
|
|
|
|
if h.DiskCheck.RequiredRemaining < 0 ||
|
|
h.DiskCheck.RequiredRemaining >= 1 {
|
|
|
|
return errors.New("disk required ratio must be in [0:1)")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type CheckConfig struct {
|
|
Interval time.Duration `long:"interval" description:"How often to run a health check."`
|
|
|
|
Attempts int `long:"attempts" description:"The number of calls we will make for the check before failing. Set this value to 0 to disable a check."`
|
|
|
|
Timeout time.Duration `long:"timeout" description:"The amount of time we allow the health check to take before failing due to timeout."`
|
|
|
|
Backoff time.Duration `long:"backoff" description:"The amount of time to back-off between failed health checks."`
|
|
}
|
|
|
|
// validate checks the values in a health check config entry if it is enabled.
|
|
func (c *CheckConfig) validate(name string) error {
|
|
if c.Attempts == 0 {
|
|
return nil
|
|
}
|
|
|
|
if c.Backoff < MinHealthCheckBackoff {
|
|
return fmt.Errorf("%v backoff: %v below minimum: %v", name,
|
|
c.Backoff, MinHealthCheckBackoff)
|
|
}
|
|
|
|
if c.Timeout < MinHealthCheckTimeout {
|
|
return fmt.Errorf("%v timeout: %v below minimum: %v", name,
|
|
c.Timeout, MinHealthCheckTimeout)
|
|
}
|
|
|
|
if c.Interval < MinHealthCheckInterval {
|
|
return fmt.Errorf("%v interval: %v below minimum: %v", name,
|
|
c.Interval, MinHealthCheckInterval)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// DiskCheckConfig contains configuration for ensuring that our node has
|
|
// sufficient disk space.
|
|
type DiskCheckConfig struct {
|
|
RequiredRemaining float64 `long:"diskrequired" description:"The minimum ratio of free disk space to total capacity that we allow before shutting lnd down safely."`
|
|
|
|
*CheckConfig
|
|
}
|