ipt-loadbalancer/pkg/healthcheck/tcp/tcp.go
2023-11-14 00:40:07 +01:00

59 lines
1.3 KiB
Go

// Package tcp implements a simple TCP health-check
package tcp
import (
"fmt"
"net"
"time"
"git.luzifer.io/luzifer/ipt-loadbalancer/pkg/config"
"git.luzifer.io/luzifer/ipt-loadbalancer/pkg/healthcheck/common"
"github.com/Luzifer/go_helpers/v2/fieldcollection"
)
const (
settingPort = "port"
settingTimeout = "timeout"
)
type (
// Check represents the TCP check
Check struct{}
)
var defTimeout = time.Second
// New returns a new TCP check
func New() Check { return Check{} }
// Check executes the check
func (c Check) Check(settings *fieldcollection.FieldCollection, target config.Target) error {
conn, err := net.DialTimeout(
"tcp",
fmt.Sprintf("%s:%d", target.Addr, settings.MustInt64(settingPort, c.intToInt64Ptr(target.Port))),
settings.MustDuration(settingTimeout, &defTimeout),
)
if err != nil {
return fmt.Errorf("dialing tcp: %w", err)
}
if err = conn.Close(); err != nil {
return fmt.Errorf("closing connection: %w", err)
}
return nil
}
// Help returns the set of settings used in the check
func (Check) Help() (help []common.SettingHelp) {
return []common.SettingHelp{
{Name: settingPort, Default: "target-port", Description: "Port to send the request to"},
{Name: settingTimeout, Default: defTimeout, Description: "Timeout for the connect"},
}
}
func (Check) intToInt64Ptr(i int) *int64 {
i64 := int64(i)
return &i64
}