mirror of https://github.com/hashicorp/consul
Merge pull request #13388 from deblasis/feature/health-checks_windows_service
Feature: Health checks windows servicekisunji/fix-golden
commit
3d2dffff16
|
@ -0,0 +1 @@
|
|||
agent: windows service health check
|
|
@ -270,6 +270,9 @@ type Agent struct {
|
|||
// checkAliases maps the check ID to an associated Alias checks
|
||||
checkAliases map[structs.CheckID]*checks.CheckAlias
|
||||
|
||||
// checkOSServices maps the check ID to an associated OS Service check
|
||||
checkOSServices map[structs.CheckID]*checks.CheckOSService
|
||||
|
||||
// exposedPorts tracks listener ports for checks exposed through a proxy
|
||||
exposedPorts map[string]int
|
||||
|
||||
|
@ -279,6 +282,9 @@ type Agent struct {
|
|||
// dockerClient is the client for performing docker health checks.
|
||||
dockerClient *checks.DockerClient
|
||||
|
||||
// osServiceClient is the client for performing OS service checks.
|
||||
osServiceClient *checks.OSServiceClient
|
||||
|
||||
// eventCh is used to receive user events
|
||||
eventCh chan serf.UserEvent
|
||||
|
||||
|
@ -422,6 +428,7 @@ func New(bd BaseDeps) (*Agent, error) {
|
|||
checkGRPCs: make(map[structs.CheckID]*checks.CheckGRPC),
|
||||
checkDockers: make(map[structs.CheckID]*checks.CheckDocker),
|
||||
checkAliases: make(map[structs.CheckID]*checks.CheckAlias),
|
||||
checkOSServices: make(map[structs.CheckID]*checks.CheckOSService),
|
||||
eventCh: make(chan serf.UserEvent, 1024),
|
||||
eventBuf: make([]*UserEvent, 256),
|
||||
joinLANNotifier: &systemd.Notifier{},
|
||||
|
@ -3028,12 +3035,45 @@ func (a *Agent) addCheck(check *structs.HealthCheck, chkType *structs.CheckType,
|
|||
Client: a.dockerClient,
|
||||
StatusHandler: statusHandler,
|
||||
}
|
||||
if prev := a.checkDockers[cid]; prev != nil {
|
||||
prev.Stop()
|
||||
}
|
||||
dockerCheck.Start()
|
||||
a.checkDockers[cid] = dockerCheck
|
||||
|
||||
case chkType.IsOSService():
|
||||
if existing, ok := a.checkOSServices[cid]; ok {
|
||||
existing.Stop()
|
||||
delete(a.checkOSServices, cid)
|
||||
}
|
||||
if chkType.Interval < checks.MinInterval {
|
||||
a.logger.Warn("check has interval below minimum",
|
||||
"check", cid.String(),
|
||||
"minimum_interval", checks.MinInterval,
|
||||
)
|
||||
chkType.Interval = checks.MinInterval
|
||||
}
|
||||
|
||||
if a.osServiceClient == nil {
|
||||
ossp, err := checks.NewOSServiceClient()
|
||||
if err != nil {
|
||||
a.logger.Error("error creating OS Service client", "error", err)
|
||||
return err
|
||||
}
|
||||
a.logger.Debug("created OS Service client")
|
||||
a.osServiceClient = ossp
|
||||
}
|
||||
|
||||
osServiceCheck := &checks.CheckOSService{
|
||||
CheckID: cid,
|
||||
ServiceID: sid,
|
||||
OSService: chkType.OSService,
|
||||
Timeout: chkType.Timeout,
|
||||
Interval: chkType.Interval,
|
||||
Logger: a.logger,
|
||||
Client: a.osServiceClient,
|
||||
StatusHandler: statusHandler,
|
||||
}
|
||||
osServiceCheck.Start()
|
||||
a.checkOSServices[cid] = osServiceCheck
|
||||
|
||||
case chkType.IsMonitor():
|
||||
if existing, ok := a.checkMonitors[cid]; ok {
|
||||
existing.Stop()
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"bufio"
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
|
@ -1047,6 +1048,125 @@ func (c *CheckGRPC) Stop() {
|
|||
}
|
||||
}
|
||||
|
||||
type CheckOSService struct {
|
||||
CheckID structs.CheckID
|
||||
ServiceID structs.ServiceID
|
||||
OSService string
|
||||
Interval time.Duration
|
||||
Timeout time.Duration
|
||||
Logger hclog.Logger
|
||||
StatusHandler *StatusHandler
|
||||
Client *OSServiceClient
|
||||
|
||||
stop bool
|
||||
stopCh chan struct{}
|
||||
stopLock sync.Mutex
|
||||
stopWg sync.WaitGroup
|
||||
}
|
||||
|
||||
func (c *CheckOSService) CheckType() structs.CheckType {
|
||||
return structs.CheckType{
|
||||
CheckID: c.CheckID.ID,
|
||||
OSService: c.OSService,
|
||||
Interval: c.Interval,
|
||||
Timeout: c.Timeout,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CheckOSService) Start() {
|
||||
c.stopLock.Lock()
|
||||
defer c.stopLock.Unlock()
|
||||
c.stop = false
|
||||
c.stopCh = make(chan struct{})
|
||||
c.stopWg.Add(1)
|
||||
go c.run()
|
||||
}
|
||||
|
||||
func (c *CheckOSService) Stop() {
|
||||
c.stopLock.Lock()
|
||||
defer c.stopLock.Unlock()
|
||||
if !c.stop {
|
||||
c.stop = true
|
||||
close(c.stopCh)
|
||||
}
|
||||
|
||||
// Wait for the c.run() goroutine to complete before returning.
|
||||
c.stopWg.Wait()
|
||||
}
|
||||
|
||||
func (c *CheckOSService) run() {
|
||||
defer c.stopWg.Done()
|
||||
// Get the randomized initial pause time
|
||||
initialPauseTime := lib.RandomStagger(c.Interval)
|
||||
next := time.After(initialPauseTime)
|
||||
for {
|
||||
select {
|
||||
case <-next:
|
||||
c.check()
|
||||
next = time.After(c.Interval)
|
||||
case <-c.stopCh:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CheckOSService) doCheck() (string, error) {
|
||||
err := c.Client.Check(c.OSService)
|
||||
if err == nil {
|
||||
return api.HealthPassing, nil
|
||||
}
|
||||
if errors.Is(err, ErrOSServiceStatusCritical) {
|
||||
return api.HealthCritical, err
|
||||
}
|
||||
|
||||
return api.HealthWarning, err
|
||||
}
|
||||
|
||||
func (c *CheckOSService) check() {
|
||||
var out string
|
||||
var status string
|
||||
var err error
|
||||
|
||||
waitCh := make(chan error, 1)
|
||||
go func() {
|
||||
status, err = c.doCheck()
|
||||
waitCh <- err
|
||||
}()
|
||||
|
||||
timeout := 30 * time.Second
|
||||
if c.Timeout > 0 {
|
||||
timeout = c.Timeout
|
||||
}
|
||||
select {
|
||||
case <-time.After(timeout):
|
||||
msg := fmt.Sprintf("Timed out (%s) running check", timeout.String())
|
||||
c.Logger.Warn("Timed out running check",
|
||||
"check", c.CheckID.String(),
|
||||
"timeout", timeout.String(),
|
||||
)
|
||||
|
||||
c.StatusHandler.updateCheck(c.CheckID, api.HealthCritical, msg)
|
||||
|
||||
// Now wait for the process to exit so we never start another
|
||||
// instance concurrently.
|
||||
<-waitCh
|
||||
return
|
||||
|
||||
case err = <-waitCh:
|
||||
// The process returned before the timeout, proceed normally
|
||||
}
|
||||
|
||||
out = fmt.Sprintf("Service \"%s\" is healthy", c.OSService)
|
||||
if err != nil {
|
||||
c.Logger.Debug("Check failed",
|
||||
"check", c.CheckID.String(),
|
||||
"error", err,
|
||||
)
|
||||
out = err.Error()
|
||||
}
|
||||
c.StatusHandler.updateCheck(c.CheckID, status, out)
|
||||
}
|
||||
|
||||
// StatusHandler keep tracks of successive error/success counts and ensures
|
||||
// that status can be set to critical/passing only once the successive number of event
|
||||
// reaches the given threshold.
|
||||
|
|
|
@ -0,0 +1,270 @@
|
|||
//go:build windows
|
||||
// +build windows
|
||||
|
||||
package checks
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/consul/agent/mock"
|
||||
"github.com/hashicorp/consul/agent/structs"
|
||||
"github.com/hashicorp/consul/api"
|
||||
"github.com/hashicorp/consul/sdk/testutil"
|
||||
"golang.org/x/sys/windows"
|
||||
"golang.org/x/sys/windows/svc"
|
||||
)
|
||||
|
||||
func TestCheck_OSService(t *testing.T) {
|
||||
type args struct {
|
||||
returnsOpenSCManagerError error
|
||||
returnsOpenServiceError error
|
||||
returnsServiceQueryError error
|
||||
returnsServiceCloseError error
|
||||
returnsSCMgrDisconnectError error
|
||||
returnsServiceState svc.State
|
||||
}
|
||||
tests := []struct {
|
||||
desc string
|
||||
args args
|
||||
state string
|
||||
}{
|
||||
//healthy
|
||||
{"should pass for healthy service", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.Running,
|
||||
}, api.HealthPassing},
|
||||
{"should pass for healthy service even when there's an error closing the service handle", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: errors.New("error while closing the service handle"),
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.Running,
|
||||
}, api.HealthPassing},
|
||||
{"should pass for healthy service even when there's an error disconnecting from SCManager", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: errors.New("error while disconnecting from service manager"),
|
||||
returnsServiceState: svc.Running,
|
||||
}, api.HealthPassing},
|
||||
|
||||
// // warning
|
||||
{"should be in warning state for any state that's not Running, Paused or Stopped", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.StartPending,
|
||||
}, api.HealthWarning},
|
||||
{"should be in warning state when we cannot connect to the service manager", args{
|
||||
returnsOpenSCManagerError: errors.New("cannot connect to service manager"),
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.Running,
|
||||
}, api.HealthWarning},
|
||||
{"should be in warning state when we cannot open the service", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: errors.New("service testService does not exist"),
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.Running,
|
||||
}, api.HealthWarning},
|
||||
{"should be in warning state when we cannot query the service state", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: errors.New("cannot query testService state"),
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.Running,
|
||||
}, api.HealthWarning},
|
||||
{"should be in warning state for for any state that's not Running, Paused or Stopped when there's an error closing the service handle", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: errors.New("error while closing the service handle"),
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.StartPending,
|
||||
}, api.HealthWarning},
|
||||
{"should be in warning state for for any state that's not Running, Paused or Stopped when there's an error disconnecting from SCManager", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: errors.New("error while disconnecting from service manager"),
|
||||
returnsServiceState: svc.StartPending,
|
||||
}, api.HealthWarning},
|
||||
|
||||
// critical
|
||||
{"should fail for paused service", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.Paused,
|
||||
}, api.HealthCritical},
|
||||
{"should fail for stopped service", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.Stopped,
|
||||
}, api.HealthCritical},
|
||||
{"should fail for stopped service even when there's an error closing the service handle", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: errors.New("error while closing the service handle"),
|
||||
returnsSCMgrDisconnectError: nil,
|
||||
returnsServiceState: svc.Stopped,
|
||||
}, api.HealthCritical},
|
||||
{"should fail for stopped service even when there's an error disconnecting from SCManager", args{
|
||||
returnsOpenSCManagerError: nil,
|
||||
returnsOpenServiceError: nil,
|
||||
returnsServiceQueryError: nil,
|
||||
returnsServiceCloseError: nil,
|
||||
returnsSCMgrDisconnectError: errors.New("error while disconnecting from service manager"),
|
||||
returnsServiceState: svc.Stopped,
|
||||
}, api.HealthCritical},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.desc, func(t *testing.T) {
|
||||
old := win
|
||||
defer func() { win = old }()
|
||||
win = fakeWindowsOS{
|
||||
returnsOpenSCManagerError: tt.args.returnsOpenSCManagerError,
|
||||
returnsOpenServiceError: tt.args.returnsOpenServiceError,
|
||||
returnsServiceQueryError: tt.args.returnsServiceQueryError,
|
||||
returnsServiceCloseError: tt.args.returnsServiceCloseError,
|
||||
returnsSCMgrDisconnectError: tt.args.returnsSCMgrDisconnectError,
|
||||
returnsServiceState: tt.args.returnsServiceState,
|
||||
}
|
||||
c, err := NewOSServiceClient()
|
||||
if (tt.args.returnsOpenSCManagerError != nil && err == nil) || (tt.args.returnsOpenSCManagerError == nil && err != nil) {
|
||||
t.Errorf("FAIL: %s. Expected error on OpenSCManager %v , but err == %v", tt.desc, tt.args.returnsOpenSCManagerError, err)
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
notif, upd := mock.NewNotifyChan()
|
||||
logger := testutil.Logger(t)
|
||||
statusHandler := NewStatusHandler(notif, logger, 0, 0, 0)
|
||||
id := structs.NewCheckID("chk", nil)
|
||||
|
||||
check := &CheckOSService{
|
||||
CheckID: id,
|
||||
OSService: "testService",
|
||||
Interval: 25 * time.Millisecond,
|
||||
Client: c,
|
||||
Logger: logger,
|
||||
StatusHandler: statusHandler,
|
||||
}
|
||||
check.Start()
|
||||
defer check.Stop()
|
||||
|
||||
<-upd // wait for update
|
||||
|
||||
if got, want := notif.State(id), tt.state; got != want {
|
||||
t.Fatalf("got status %q want %q", got, want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
validSCManagerHandle = windows.Handle(1)
|
||||
validOpenServiceHandle = windows.Handle(2)
|
||||
)
|
||||
|
||||
type fakeWindowsOS struct {
|
||||
returnsOpenSCManagerError error
|
||||
returnsOpenServiceError error
|
||||
returnsServiceQueryError error
|
||||
returnsServiceCloseError error
|
||||
returnsSCMgrDisconnectError error
|
||||
returnsServiceState svc.State
|
||||
}
|
||||
|
||||
func (f fakeWindowsOS) OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle windows.Handle, err error) {
|
||||
if f.returnsOpenSCManagerError != nil {
|
||||
return windows.InvalidHandle, f.returnsOpenSCManagerError
|
||||
}
|
||||
return validSCManagerHandle, nil
|
||||
}
|
||||
func (f fakeWindowsOS) OpenService(mgr windows.Handle, serviceName *uint16, access uint32) (handle windows.Handle, err error) {
|
||||
if f.returnsOpenServiceError != nil {
|
||||
return windows.InvalidHandle, f.returnsOpenServiceError
|
||||
}
|
||||
return validOpenServiceHandle, nil
|
||||
}
|
||||
|
||||
func (f fakeWindowsOS) getWindowsSvcMgr(h windows.Handle) windowsSvcMgr {
|
||||
return &fakeWindowsSvcMgr{
|
||||
Handle: h,
|
||||
returnsDisconnectError: f.returnsSCMgrDisconnectError,
|
||||
}
|
||||
}
|
||||
func (fakeWindowsOS) getWindowsSvcMgrHandle(sm windowsSvcMgr) windows.Handle {
|
||||
return sm.(*fakeWindowsSvcMgr).Handle
|
||||
}
|
||||
|
||||
func (f fakeWindowsOS) getWindowsSvc(name string, h windows.Handle) windowsSvc {
|
||||
return &fakeWindowsSvc{
|
||||
Name: name,
|
||||
Handle: h,
|
||||
returnsCloseError: f.returnsServiceCloseError,
|
||||
returnsServiceQueryError: f.returnsServiceQueryError,
|
||||
returnsServiceState: f.returnsServiceState,
|
||||
}
|
||||
}
|
||||
|
||||
type fakeWindowsSvcMgr struct {
|
||||
Handle windows.Handle
|
||||
|
||||
returnsDisconnectError error
|
||||
}
|
||||
|
||||
func (f fakeWindowsSvcMgr) Disconnect() error { return f.returnsDisconnectError }
|
||||
|
||||
type fakeWindowsSvc struct {
|
||||
Handle windows.Handle
|
||||
Name string
|
||||
|
||||
returnsServiceQueryError error
|
||||
returnsCloseError error
|
||||
returnsServiceState svc.State
|
||||
}
|
||||
|
||||
func (f fakeWindowsSvc) Close() error { return f.returnsCloseError }
|
||||
func (f fakeWindowsSvc) Query() (svc.Status, error) {
|
||||
if f.returnsServiceQueryError != nil {
|
||||
return svc.Status{}, f.returnsServiceQueryError
|
||||
}
|
||||
return svc.Status{State: f.returnsServiceState}, nil
|
||||
}
|
||||
|
||||
func boolPointer(b bool) *bool {
|
||||
return &b
|
||||
}
|
||||
|
||||
func boolVal(v *bool) bool {
|
||||
if v == nil {
|
||||
return false
|
||||
}
|
||||
return *v
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package checks
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
const (
|
||||
errOSServiceStatusCritical = "OS Service unhealthy"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrOSServiceStatusCritical = errors.New(errOSServiceStatusCritical)
|
||||
)
|
|
@ -0,0 +1,17 @@
|
|||
//go:build !windows
|
||||
// +build !windows
|
||||
|
||||
package checks
|
||||
|
||||
import "fmt"
|
||||
|
||||
type OSServiceClient struct {
|
||||
}
|
||||
|
||||
func NewOSServiceClient() (*OSServiceClient, error) {
|
||||
return nil, fmt.Errorf("not implemented")
|
||||
}
|
||||
|
||||
func (client *OSServiceClient) Check(serviceName string) error {
|
||||
return fmt.Errorf("not implemented")
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
//go:build windows
|
||||
// +build windows
|
||||
|
||||
package checks
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"syscall"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
"golang.org/x/sys/windows/svc"
|
||||
"golang.org/x/sys/windows/svc/mgr"
|
||||
)
|
||||
|
||||
var (
|
||||
win windowsSystem = windowsOS{}
|
||||
)
|
||||
|
||||
type OSServiceClient struct{}
|
||||
|
||||
func NewOSServiceClient() (*OSServiceClient, error) {
|
||||
return &OSServiceClient{}, nil
|
||||
}
|
||||
|
||||
func (client *OSServiceClient) Check(serviceName string) (err error) {
|
||||
h, err := windows.OpenSCManager(nil, nil, windows.SC_MANAGER_CONNECT)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to connect to Windows service manager: %w", err)
|
||||
}
|
||||
|
||||
m := win.getWindowsSvcMgr(h)
|
||||
defer m.Disconnect()
|
||||
|
||||
svcNamePtr, err := syscall.UTF16PtrFromString(serviceName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("service name must not contain NUL bytes: %w", err)
|
||||
}
|
||||
svcHandle, err := win.OpenService(win.getWindowsSvcMgrHandle(m), svcNamePtr, windows.SC_MANAGER_ENUMERATE_SERVICE)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error accessing service: %w", err)
|
||||
}
|
||||
service := win.getWindowsSvc(serviceName, svcHandle)
|
||||
defer service.Close()
|
||||
|
||||
status, err := service.Query()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error querying service status: %w", err)
|
||||
}
|
||||
|
||||
switch status.State {
|
||||
case svc.Running:
|
||||
return nil
|
||||
case svc.Paused, svc.Stopped:
|
||||
err = fmt.Errorf("service status: %v - %w", svcStateString(status.State), ErrOSServiceStatusCritical)
|
||||
default:
|
||||
err = fmt.Errorf("service status: %v", svcStateString(status.State))
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
type windowsOS struct{}
|
||||
|
||||
func (windowsOS) OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle windows.Handle, err error) {
|
||||
return windows.OpenSCManager(machineName, databaseName, access)
|
||||
}
|
||||
func (windowsOS) OpenService(mgr windows.Handle, serviceName *uint16, access uint32) (handle windows.Handle, err error) {
|
||||
return windows.OpenService(mgr, serviceName, access)
|
||||
}
|
||||
|
||||
func (windowsOS) getWindowsSvcMgr(h windows.Handle) windowsSvcMgr { return &mgr.Mgr{Handle: h} }
|
||||
func (windowsOS) getWindowsSvcMgrHandle(sm windowsSvcMgr) windows.Handle {
|
||||
return sm.(*mgr.Mgr).Handle
|
||||
}
|
||||
|
||||
func (windowsOS) getWindowsSvc(name string, h windows.Handle) windowsSvc {
|
||||
return &mgr.Service{Name: name, Handle: h}
|
||||
}
|
||||
|
||||
type windowsSystem interface {
|
||||
OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle windows.Handle, err error)
|
||||
OpenService(mgr windows.Handle, serviceName *uint16, access uint32) (handle windows.Handle, err error)
|
||||
|
||||
getWindowsSvcMgr(h windows.Handle) windowsSvcMgr
|
||||
getWindowsSvcMgrHandle(sm windowsSvcMgr) windows.Handle
|
||||
getWindowsSvc(name string, h windows.Handle) windowsSvc
|
||||
}
|
||||
|
||||
type windowsSvcMgr interface {
|
||||
Disconnect() error
|
||||
}
|
||||
|
||||
type windowsSvc interface {
|
||||
Close() error
|
||||
Query() (svc.Status, error)
|
||||
}
|
||||
|
||||
// svcStateString converts svc.State (uint32) to human readable string
|
||||
//
|
||||
// source: https://pkg.go.dev/golang.org/x/sys/windows/svc#pkg-constants
|
||||
func svcStateString(state svc.State) string {
|
||||
switch state {
|
||||
case svc.State(windows.SERVICE_STOPPED):
|
||||
return "Stopped"
|
||||
case svc.State(windows.SERVICE_START_PENDING):
|
||||
return "StartPending"
|
||||
case svc.State(windows.SERVICE_STOP_PENDING):
|
||||
return "StopPending"
|
||||
case svc.State(windows.SERVICE_RUNNING):
|
||||
return "Running"
|
||||
case svc.State(windows.SERVICE_CONTINUE_PENDING):
|
||||
return "ContinuePending"
|
||||
case svc.State(windows.SERVICE_PAUSE_PENDING):
|
||||
return "PausePending"
|
||||
case svc.State(windows.SERVICE_PAUSED):
|
||||
return "Paused"
|
||||
default:
|
||||
//if not handled we return the underlying uint32
|
||||
return fmt.Sprintf("%d", state)
|
||||
}
|
||||
}
|
|
@ -1580,6 +1580,7 @@ func (b *builder) checkVal(v *CheckDefinition) *structs.CheckDefinition {
|
|||
FailuresBeforeWarning: intValWithDefault(v.FailuresBeforeWarning, intVal(v.FailuresBeforeCritical)),
|
||||
H2PING: stringVal(v.H2PING),
|
||||
H2PingUseTLS: H2PingUseTLSVal,
|
||||
OSService: stringVal(v.OSService),
|
||||
DeregisterCriticalServiceAfter: b.durationVal(fmt.Sprintf("check[%s].deregister_critical_service_after", id), v.DeregisterCriticalServiceAfter),
|
||||
OutputMaxSize: intValWithDefault(v.OutputMaxSize, checks.DefaultBufSize),
|
||||
EnterpriseMeta: v.EnterpriseMeta.ToStructs(),
|
||||
|
|
|
@ -423,6 +423,7 @@ type CheckDefinition struct {
|
|||
TTL *string `mapstructure:"ttl"`
|
||||
H2PING *string `mapstructure:"h2ping"`
|
||||
H2PingUseTLS *bool `mapstructure:"h2ping_use_tls"`
|
||||
OSService *string `mapstructure:"os_service"`
|
||||
SuccessBeforePassing *int `mapstructure:"success_before_passing"`
|
||||
FailuresBeforeWarning *int `mapstructure:"failures_before_warning"`
|
||||
FailuresBeforeCritical *int `mapstructure:"failures_before_critical"`
|
||||
|
|
|
@ -441,6 +441,7 @@ type RuntimeConfig struct {
|
|||
// tls_skip_verify = (true|false)
|
||||
// timeout = "duration"
|
||||
// ttl = "duration"
|
||||
// os_service = string
|
||||
// success_before_passing = int
|
||||
// failures_before_warning = int
|
||||
// failures_before_critical = int
|
||||
|
|
|
@ -2455,6 +2455,40 @@ func TestLoad_IntegrationWithFlags(t *testing.T) {
|
|||
rt.DataDir = dataDir
|
||||
},
|
||||
})
|
||||
run(t, testCase{
|
||||
desc: "os_service check no interval",
|
||||
args: []string{
|
||||
`-data-dir=` + dataDir,
|
||||
},
|
||||
json: []string{
|
||||
`{ "check": { "name": "a", "os_service": "foo" } }`,
|
||||
},
|
||||
hcl: []string{
|
||||
`check = { name = "a", os_service = "foo" }`,
|
||||
},
|
||||
expectedErr: `Interval must be > 0 for Script, HTTP, H2PING, TCP, UDP or OSService checks`,
|
||||
})
|
||||
run(t, testCase{
|
||||
desc: "os_service check",
|
||||
args: []string{
|
||||
`-data-dir=` + dataDir,
|
||||
},
|
||||
json: []string{
|
||||
`{ "check": { "name": "a", "os_service": "foo", "interval": "30s" } }`,
|
||||
},
|
||||
hcl: []string{
|
||||
`check = { name = "a", os_service = "foo", interval = "30s" }`,
|
||||
},
|
||||
expected: func(rt *RuntimeConfig) {
|
||||
rt.Checks = []*structs.CheckDefinition{
|
||||
{Name: "a",
|
||||
OSService: "foo",
|
||||
Interval: 30 * time.Second,
|
||||
OutputMaxSize: checks.DefaultBufSize,
|
||||
},
|
||||
}
|
||||
rt.DataDir = dataDir
|
||||
}})
|
||||
run(t, testCase{
|
||||
desc: "multiple service files",
|
||||
args: []string{
|
||||
|
@ -5855,6 +5889,7 @@ func TestLoad_FullConfig(t *testing.T) {
|
|||
TCP: "RJQND605",
|
||||
H2PING: "9N1cSb5B",
|
||||
H2PingUseTLS: false,
|
||||
OSService: "aAjE6m9Z",
|
||||
Interval: 22164 * time.Second,
|
||||
OutputMaxSize: checks.DefaultBufSize,
|
||||
DockerContainerID: "ipgdFtjd",
|
||||
|
@ -5884,6 +5919,7 @@ func TestLoad_FullConfig(t *testing.T) {
|
|||
TCP: "4jG5casb",
|
||||
H2PING: "HCHU7gEb",
|
||||
H2PingUseTLS: false,
|
||||
OSService: "aqq95BhP",
|
||||
Interval: 28767 * time.Second,
|
||||
DockerContainerID: "THW6u7rL",
|
||||
Shell: "C1Zt3Zwh",
|
||||
|
@ -5912,6 +5948,7 @@ func TestLoad_FullConfig(t *testing.T) {
|
|||
TCP: "JY6fTTcw",
|
||||
H2PING: "rQ8eyCSF",
|
||||
H2PingUseTLS: false,
|
||||
OSService: "aZaCAXww",
|
||||
Interval: 18714 * time.Second,
|
||||
DockerContainerID: "qF66POS9",
|
||||
Shell: "sOnDy228",
|
||||
|
@ -6135,6 +6172,7 @@ func TestLoad_FullConfig(t *testing.T) {
|
|||
TCP: "ICbxkpSF",
|
||||
H2PING: "7s7BbMyb",
|
||||
H2PingUseTLS: false,
|
||||
OSService: "amfeO5if",
|
||||
Interval: 24392 * time.Second,
|
||||
DockerContainerID: "ZKXr68Yb",
|
||||
Shell: "CEfzx0Fo",
|
||||
|
@ -6187,6 +6225,7 @@ func TestLoad_FullConfig(t *testing.T) {
|
|||
TCP: "MN3oA9D2",
|
||||
H2PING: "OV6Q2XEg",
|
||||
H2PingUseTLS: false,
|
||||
OSService: "GTti9hCA",
|
||||
Interval: 32718 * time.Second,
|
||||
DockerContainerID: "cU15LMet",
|
||||
Shell: "nEz9qz2l",
|
||||
|
@ -6332,6 +6371,7 @@ func TestLoad_FullConfig(t *testing.T) {
|
|||
TCP: "bNnNfx2A",
|
||||
H2PING: "qC1pidiW",
|
||||
H2PingUseTLS: false,
|
||||
OSService: "ZA99e9Ka",
|
||||
Interval: 22224 * time.Second,
|
||||
DockerContainerID: "ipgdFtjd",
|
||||
Shell: "omVZq7Sz",
|
||||
|
@ -6358,6 +6398,7 @@ func TestLoad_FullConfig(t *testing.T) {
|
|||
TCP: "FfvCwlqH",
|
||||
H2PING: "spI3muI3",
|
||||
H2PingUseTLS: false,
|
||||
OSService: "GAaO6Mpr",
|
||||
Interval: 12356 * time.Second,
|
||||
DockerContainerID: "HBndBU6R",
|
||||
Shell: "hVI33JjA",
|
||||
|
@ -6384,6 +6425,7 @@ func TestLoad_FullConfig(t *testing.T) {
|
|||
TCP: "fjiLFqVd",
|
||||
H2PING: "5NbNWhan",
|
||||
H2PingUseTLS: false,
|
||||
OSService: "RAa85Dv8",
|
||||
Interval: 23926 * time.Second,
|
||||
DockerContainerID: "dO5TtRHk",
|
||||
Shell: "e6q2ttES",
|
||||
|
|
|
@ -110,6 +110,7 @@
|
|||
"Notes": "",
|
||||
"OutputMaxSize": 4096,
|
||||
"ScriptArgs": [],
|
||||
"OSService": "",
|
||||
"ServiceID": "",
|
||||
"Shell": "",
|
||||
"Status": "",
|
||||
|
@ -334,6 +335,7 @@
|
|||
"Shell": "",
|
||||
"Status": "",
|
||||
"SuccessBeforePassing": 0,
|
||||
"OSService": "",
|
||||
"TCP": "",
|
||||
"TLSServerName": "",
|
||||
"TLSSkipVerify": false,
|
||||
|
|
|
@ -119,6 +119,7 @@ check = {
|
|||
output_max_size = 4096
|
||||
docker_container_id = "qF66POS9"
|
||||
shell = "sOnDy228"
|
||||
os_service = "aZaCAXww"
|
||||
tls_server_name = "7BdnzBYk"
|
||||
tls_skip_verify = true
|
||||
timeout = "5954s"
|
||||
|
@ -148,6 +149,7 @@ checks = [
|
|||
output_max_size = 4096
|
||||
docker_container_id = "ipgdFtjd"
|
||||
shell = "qAeOYy0M"
|
||||
os_service = "aAjE6m9Z"
|
||||
tls_server_name = "bdeb5f6a"
|
||||
tls_skip_verify = true
|
||||
timeout = "1813s"
|
||||
|
@ -176,6 +178,7 @@ checks = [
|
|||
output_max_size = 4096
|
||||
docker_container_id = "THW6u7rL"
|
||||
shell = "C1Zt3Zwh"
|
||||
os_service = "aqq95BhP"
|
||||
tls_server_name = "6adc3bfb"
|
||||
tls_skip_verify = true
|
||||
timeout = "18506s"
|
||||
|
@ -412,6 +415,7 @@ service = {
|
|||
interval = "23926s"
|
||||
docker_container_id = "dO5TtRHk"
|
||||
shell = "e6q2ttES"
|
||||
os_service = "RAa85Dv8"
|
||||
tls_server_name = "ECSHk8WF"
|
||||
tls_skip_verify = true
|
||||
timeout = "38483s"
|
||||
|
@ -439,6 +443,7 @@ service = {
|
|||
output_max_size = 4096
|
||||
docker_container_id = "ipgdFtjd"
|
||||
shell = "omVZq7Sz"
|
||||
os_service = "ZA99e9Ka"
|
||||
tls_server_name = "axw5QPL5"
|
||||
tls_skip_verify = true
|
||||
timeout = "18913s"
|
||||
|
@ -465,6 +470,7 @@ service = {
|
|||
output_max_size = 4096
|
||||
docker_container_id = "HBndBU6R"
|
||||
shell = "hVI33JjA"
|
||||
os_service = "GAaO6Mpr"
|
||||
tls_server_name = "7uwWOnUS"
|
||||
tls_skip_verify = true
|
||||
timeout = "38282s"
|
||||
|
@ -505,6 +511,7 @@ services = [
|
|||
output_max_size = 4096
|
||||
docker_container_id = "ZKXr68Yb"
|
||||
shell = "CEfzx0Fo"
|
||||
os_service = "amfeO5if"
|
||||
tls_server_name = "4f191d4F"
|
||||
tls_skip_verify = true
|
||||
timeout = "38333s"
|
||||
|
@ -548,6 +555,7 @@ services = [
|
|||
output_max_size = 4096
|
||||
docker_container_id = "cU15LMet"
|
||||
shell = "nEz9qz2l"
|
||||
os_service = "GTti9hCA"
|
||||
tls_server_name = "f43ouY7a"
|
||||
tls_skip_verify = true
|
||||
timeout = "34738s"
|
||||
|
|
|
@ -120,6 +120,7 @@
|
|||
"interval": "18714s",
|
||||
"docker_container_id": "qF66POS9",
|
||||
"shell": "sOnDy228",
|
||||
"os_service": "aZaCAXww",
|
||||
"tls_server_name": "7BdnzBYk",
|
||||
"tls_skip_verify": true,
|
||||
"timeout": "5954s",
|
||||
|
@ -149,6 +150,7 @@
|
|||
"output_max_size": 4096,
|
||||
"docker_container_id": "ipgdFtjd",
|
||||
"shell": "qAeOYy0M",
|
||||
"os_service": "aAjE6m9Z",
|
||||
"tls_server_name": "bdeb5f6a",
|
||||
"tls_skip_verify": true,
|
||||
"timeout": "1813s",
|
||||
|
@ -177,6 +179,7 @@
|
|||
"output_max_size": 4096,
|
||||
"docker_container_id": "THW6u7rL",
|
||||
"shell": "C1Zt3Zwh",
|
||||
"os_service": "aqq95BhP",
|
||||
"tls_server_name": "6adc3bfb",
|
||||
"tls_skip_verify": true,
|
||||
"timeout": "18506s",
|
||||
|
@ -409,6 +412,7 @@
|
|||
"output_max_size": 4096,
|
||||
"docker_container_id": "dO5TtRHk",
|
||||
"shell": "e6q2ttES",
|
||||
"os_service": "RAa85Dv8",
|
||||
"tls_server_name": "ECSHk8WF",
|
||||
"tls_skip_verify": true,
|
||||
"timeout": "38483s",
|
||||
|
@ -436,6 +440,7 @@
|
|||
"output_max_size": 4096,
|
||||
"docker_container_id": "ipgdFtjd",
|
||||
"shell": "omVZq7Sz",
|
||||
"os_service": "ZA99e9Ka",
|
||||
"tls_server_name": "axw5QPL5",
|
||||
"tls_skip_verify": true,
|
||||
"timeout": "18913s",
|
||||
|
@ -462,6 +467,7 @@
|
|||
"output_max_size": 4096,
|
||||
"docker_container_id": "HBndBU6R",
|
||||
"shell": "hVI33JjA",
|
||||
"os_service": "GAaO6Mpr",
|
||||
"tls_server_name": "7uwWOnUS",
|
||||
"tls_skip_verify": true,
|
||||
"timeout": "38282s",
|
||||
|
@ -502,6 +508,7 @@
|
|||
"output_max_size": 4096,
|
||||
"docker_container_id": "ZKXr68Yb",
|
||||
"shell": "CEfzx0Fo",
|
||||
"os_service": "amfeO5if",
|
||||
"tls_server_name": "4f191d4F",
|
||||
"tls_skip_verify": true,
|
||||
"timeout": "38333s",
|
||||
|
@ -545,6 +552,7 @@
|
|||
"output_max_size": 4096,
|
||||
"docker_container_id": "cU15LMet",
|
||||
"shell": "nEz9qz2l",
|
||||
"os_service": "GTti9hCA",
|
||||
"tls_server_name": "f43ouY7a",
|
||||
"tls_skip_verify": true,
|
||||
"timeout": "34738s",
|
||||
|
|
|
@ -39,6 +39,7 @@ type CheckDefinition struct {
|
|||
Shell string
|
||||
GRPC string
|
||||
GRPCUseTLS bool
|
||||
OSService string
|
||||
TLSServerName string
|
||||
TLSSkipVerify bool
|
||||
AliasNode string
|
||||
|
@ -220,6 +221,7 @@ func (c *CheckDefinition) CheckType() *CheckType {
|
|||
Interval: c.Interval,
|
||||
DockerContainerID: c.DockerContainerID,
|
||||
Shell: c.Shell,
|
||||
OSService: c.OSService,
|
||||
TLSServerName: c.TLSServerName,
|
||||
TLSSkipVerify: c.TLSSkipVerify,
|
||||
Timeout: c.Timeout,
|
||||
|
|
|
@ -90,6 +90,7 @@ func TestCheckDefinitionToCheckType(t *testing.T) {
|
|||
Interval: 1 * time.Second,
|
||||
DockerContainerID: "abc123",
|
||||
Shell: "/bin/ksh",
|
||||
OSService: "myco-svctype-svcname-001",
|
||||
TLSSkipVerify: true,
|
||||
Timeout: 2 * time.Second,
|
||||
TTL: 3 * time.Second,
|
||||
|
@ -108,6 +109,7 @@ func TestCheckDefinitionToCheckType(t *testing.T) {
|
|||
Interval: 1 * time.Second,
|
||||
DockerContainerID: "abc123",
|
||||
Shell: "/bin/ksh",
|
||||
OSService: "myco-svctype-svcname-001",
|
||||
TLSSkipVerify: true,
|
||||
Timeout: 2 * time.Second,
|
||||
TTL: 3 * time.Second,
|
||||
|
|
|
@ -47,6 +47,7 @@ type CheckType struct {
|
|||
Shell string
|
||||
GRPC string
|
||||
GRPCUseTLS bool
|
||||
OSService string
|
||||
TLSServerName string
|
||||
TLSSkipVerify bool
|
||||
Timeout time.Duration
|
||||
|
@ -180,13 +181,13 @@ func (t *CheckType) UnmarshalJSON(data []byte) (err error) {
|
|||
|
||||
// Validate returns an error message if the check is invalid
|
||||
func (c *CheckType) Validate() error {
|
||||
intervalCheck := c.IsScript() || c.HTTP != "" || c.TCP != "" || c.UDP != "" || c.GRPC != "" || c.H2PING != ""
|
||||
intervalCheck := c.IsScript() || c.HTTP != "" || c.TCP != "" || c.UDP != "" || c.GRPC != "" || c.H2PING != "" || c.OSService != ""
|
||||
|
||||
if c.Interval > 0 && c.TTL > 0 {
|
||||
return fmt.Errorf("Interval and TTL cannot both be specified")
|
||||
}
|
||||
if intervalCheck && c.Interval <= 0 {
|
||||
return fmt.Errorf("Interval must be > 0 for Script, HTTP, H2PING, TCP or UDP checks")
|
||||
return fmt.Errorf("Interval must be > 0 for Script, HTTP, H2PING, TCP, UDP or OSService checks")
|
||||
}
|
||||
if intervalCheck && c.IsAlias() {
|
||||
return fmt.Errorf("Interval cannot be set for Alias checks")
|
||||
|
@ -261,6 +262,11 @@ func (c *CheckType) IsH2PING() bool {
|
|||
return c.H2PING != "" && c.Interval > 0
|
||||
}
|
||||
|
||||
// IsOSService checks if this is a WindowsService/systemd type
|
||||
func (c *CheckType) IsOSService() bool {
|
||||
return c.OSService != "" && c.Interval > 0
|
||||
}
|
||||
|
||||
func (c *CheckType) Type() string {
|
||||
switch {
|
||||
case c.IsGRPC():
|
||||
|
@ -281,6 +287,8 @@ func (c *CheckType) Type() string {
|
|||
return "script"
|
||||
case c.IsH2PING():
|
||||
return "h2ping"
|
||||
case c.IsOSService():
|
||||
return "os_service"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
|
|
|
@ -1793,6 +1793,7 @@ type HealthCheckDefinition struct {
|
|||
TCP string `json:",omitempty"`
|
||||
UDP string `json:",omitempty"`
|
||||
H2PING string `json:",omitempty"`
|
||||
OSService string `json:",omitempty"`
|
||||
H2PingUseTLS bool `json:",omitempty"`
|
||||
Interval time.Duration `json:",omitempty"`
|
||||
OutputMaxSize uint `json:",omitempty"`
|
||||
|
@ -1944,6 +1945,7 @@ func (c *HealthCheck) CheckType() *CheckType {
|
|||
TCP: c.Definition.TCP,
|
||||
UDP: c.Definition.UDP,
|
||||
H2PING: c.Definition.H2PING,
|
||||
OSService: c.Definition.OSService,
|
||||
H2PingUseTLS: c.Definition.H2PingUseTLS,
|
||||
Interval: c.Definition.Interval,
|
||||
DockerContainerID: c.Definition.DockerContainerID,
|
||||
|
|
|
@ -312,6 +312,7 @@ func (s *HTTPHandlers) convertOps(resp http.ResponseWriter, req *http.Request) (
|
|||
TCP: check.Definition.TCP,
|
||||
GRPC: check.Definition.GRPC,
|
||||
GRPCUseTLS: check.Definition.GRPCUseTLS,
|
||||
OSService: check.Definition.OSService,
|
||||
Interval: interval,
|
||||
Timeout: timeout,
|
||||
DeregisterCriticalServiceAfter: deregisterCriticalServiceAfter,
|
||||
|
|
|
@ -66,6 +66,7 @@ type HealthCheckDefinition struct {
|
|||
TCP string
|
||||
UDP string
|
||||
GRPC string
|
||||
OSService string
|
||||
GRPCUseTLS bool
|
||||
IntervalDuration time.Duration `json:"-"`
|
||||
TimeoutDuration time.Duration `json:"-"`
|
||||
|
|
|
@ -29,6 +29,7 @@ func CheckTypeToStructs(s *CheckType, t *structs.CheckType) {
|
|||
t.Shell = s.Shell
|
||||
t.GRPC = s.GRPC
|
||||
t.GRPCUseTLS = s.GRPCUseTLS
|
||||
t.OSService = s.OSService
|
||||
t.TLSServerName = s.TLSServerName
|
||||
t.TLSSkipVerify = s.TLSSkipVerify
|
||||
t.Timeout = structs.DurationFromProto(s.Timeout)
|
||||
|
@ -66,6 +67,7 @@ func CheckTypeFromStructs(t *structs.CheckType, s *CheckType) {
|
|||
s.Shell = t.Shell
|
||||
s.GRPC = t.GRPC
|
||||
s.GRPCUseTLS = t.GRPCUseTLS
|
||||
s.OSService = t.OSService
|
||||
s.TLSServerName = t.TLSServerName
|
||||
s.TLSSkipVerify = t.TLSSkipVerify
|
||||
s.Timeout = structs.DurationToProto(t.Timeout)
|
||||
|
@ -142,6 +144,7 @@ func HealthCheckDefinitionToStructs(s *HealthCheckDefinition, t *structs.HealthC
|
|||
t.TCP = s.TCP
|
||||
t.UDP = s.UDP
|
||||
t.H2PING = s.H2PING
|
||||
t.OSService = s.OSService
|
||||
t.H2PingUseTLS = s.H2PingUseTLS
|
||||
t.Interval = structs.DurationFromProto(s.Interval)
|
||||
t.OutputMaxSize = uint(s.OutputMaxSize)
|
||||
|
@ -170,6 +173,7 @@ func HealthCheckDefinitionFromStructs(t *structs.HealthCheckDefinition, s *Healt
|
|||
s.TCP = t.TCP
|
||||
s.UDP = t.UDP
|
||||
s.H2PING = t.H2PING
|
||||
s.OSService = t.OSService
|
||||
s.H2PingUseTLS = t.H2PingUseTLS
|
||||
s.Interval = structs.DurationToProto(t.Interval)
|
||||
s.OutputMaxSize = uint32(t.OutputMaxSize)
|
||||
|
|
|
@ -277,6 +277,7 @@ type HealthCheckDefinition struct {
|
|||
DisableRedirects bool `protobuf:"varint,22,opt,name=DisableRedirects,proto3" json:"DisableRedirects,omitempty"`
|
||||
TCP string `protobuf:"bytes,5,opt,name=TCP,proto3" json:"TCP,omitempty"`
|
||||
UDP string `protobuf:"bytes,23,opt,name=UDP,proto3" json:"UDP,omitempty"`
|
||||
OSService string `protobuf:"bytes,24,opt,name=OSService,proto3" json:"OSService,omitempty"`
|
||||
// mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
|
||||
Interval *durationpb.Duration `protobuf:"bytes,6,opt,name=Interval,proto3" json:"Interval,omitempty"`
|
||||
// mog: func-to=uint func-from=uint32
|
||||
|
@ -393,6 +394,13 @@ func (x *HealthCheckDefinition) GetUDP() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
func (x *HealthCheckDefinition) GetOSService() string {
|
||||
if x != nil {
|
||||
return x.OSService
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *HealthCheckDefinition) GetInterval() *durationpb.Duration {
|
||||
if x != nil {
|
||||
return x.Interval
|
||||
|
@ -522,6 +530,7 @@ type CheckType struct {
|
|||
DisableRedirects bool `protobuf:"varint,31,opt,name=DisableRedirects,proto3" json:"DisableRedirects,omitempty"`
|
||||
TCP string `protobuf:"bytes,8,opt,name=TCP,proto3" json:"TCP,omitempty"`
|
||||
UDP string `protobuf:"bytes,32,opt,name=UDP,proto3" json:"UDP,omitempty"`
|
||||
OSService string `protobuf:"bytes,33,opt,name=OSService,proto3" json:"OSService,omitempty"`
|
||||
// mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
|
||||
Interval *durationpb.Duration `protobuf:"bytes,9,opt,name=Interval,proto3" json:"Interval,omitempty"`
|
||||
AliasNode string `protobuf:"bytes,10,opt,name=AliasNode,proto3" json:"AliasNode,omitempty"`
|
||||
|
@ -672,6 +681,13 @@ func (x *CheckType) GetUDP() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
func (x *CheckType) GetOSService() string {
|
||||
if x != nil {
|
||||
return x.OSService
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *CheckType) GetInterval() *durationpb.Duration {
|
||||
if x != nil {
|
||||
return x.Interval
|
||||
|
@ -865,7 +881,7 @@ var file_proto_pbservice_healthcheck_proto_rawDesc = []byte{
|
|||
0x4e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x65, 0x65, 0x72,
|
||||
0x4e, 0x61, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61,
|
||||
0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03,
|
||||
0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xf4, 0x07, 0x0a, 0x15, 0x48, 0x65,
|
||||
0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x92, 0x08, 0x0a, 0x15, 0x48, 0x65,
|
||||
0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x65,
|
||||
|
@ -886,149 +902,152 @@ var file_proto_pbservice_healthcheck_proto_rawDesc = []byte{
|
|||
0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
|
||||
0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x43, 0x50,
|
||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x54, 0x43, 0x50, 0x12, 0x10, 0x0a, 0x03, 0x55,
|
||||
0x44, 0x50, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x44, 0x50, 0x12, 0x35, 0x0a,
|
||||
0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||
0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
|
||||
0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65,
|
||||
0x72, 0x76, 0x61, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x61,
|
||||
0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4f, 0x75, 0x74,
|
||||
0x70, 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x54, 0x69,
|
||||
0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,
|
||||
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,
|
||||
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12,
|
||||
0x61, 0x0a, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69,
|
||||
0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65,
|
||||
0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
|
||||
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x52, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72,
|
||||
0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x66, 0x74,
|
||||
0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73,
|
||||
0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72,
|
||||
0x67, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74,
|
||||
0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x44,
|
||||
0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44,
|
||||
0x12, 0x14, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47,
|
||||
0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x12, 0x22,
|
||||
0x0a, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x18, 0x15,
|
||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54,
|
||||
0x4c, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55, 0x73,
|
||||
0x65, 0x54, 0x4c, 0x53, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x47, 0x52, 0x50, 0x43,
|
||||
0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e,
|
||||
0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73,
|
||||
0x4e, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72,
|
||||
0x76, 0x69, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, 0x69, 0x61,
|
||||
0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18,
|
||||
0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
|
||||
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
||||
0x52, 0x03, 0x54, 0x54, 0x4c, 0x1a, 0x69, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45,
|
||||
0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
||||
0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
|
||||
0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72,
|
||||
0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
|
||||
0x22, 0x96, 0x0a, 0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18,
|
||||
0x0a, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65,
|
||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06,
|
||||
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74,
|
||||
0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63,
|
||||
0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a,
|
||||
0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x54,
|
||||
0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x50,
|
||||
0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38,
|
||||
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
||||
0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
|
||||
0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x48, 0x65, 0x61,
|
||||
0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72,
|
||||
0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79,
|
||||
0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2a, 0x0a, 0x10,
|
||||
0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73,
|
||||
0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52,
|
||||
0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x18,
|
||||
0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x54, 0x43, 0x50, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x44,
|
||||
0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x44, 0x50, 0x12, 0x35, 0x0a, 0x08,
|
||||
0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
|
||||
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
|
||||
0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72,
|
||||
0x76, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64, 0x65,
|
||||
0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64,
|
||||
0x65, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
|
||||
0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65,
|
||||
0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43,
|
||||
0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
|
||||
0x72, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x0d, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x32, 0x50,
|
||||
0x49, 0x4e, 0x47, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e,
|
||||
0x47, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c,
|
||||
0x53, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55,
|
||||
0x73, 0x65, 0x54, 0x4c, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x18, 0x0e, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x52, 0x50,
|
||||
0x43, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x47,
|
||||
0x52, 0x50, 0x43, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53,
|
||||
0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12,
|
||||
0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79,
|
||||
0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56,
|
||||
0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x33, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
|
||||
0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
|
||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
|
||||
0x6e, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54,
|
||||
0x4c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
|
||||
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x75, 0x63, 0x63, 0x65,
|
||||
0x73, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18,
|
||||
0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x65,
|
||||
0x66, 0x6f, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x46,
|
||||
0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x57, 0x61, 0x72,
|
||||
0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x46, 0x61, 0x69, 0x6c,
|
||||
0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e,
|
||||
0x67, 0x12, 0x36, 0x0a, 0x16, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66,
|
||||
0x6f, 0x72, 0x65, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28,
|
||||
0x05, 0x52, 0x16, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72,
|
||||
0x65, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f,
|
||||
0x78, 0x79, 0x48, 0x54, 0x54, 0x50, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72,
|
||||
0x6f, 0x78, 0x79, 0x48, 0x54, 0x54, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79,
|
||||
0x47, 0x52, 0x50, 0x43, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x78,
|
||||
0x79, 0x47, 0x52, 0x50, 0x43, 0x12, 0x61, 0x0a, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73,
|
||||
0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69,
|
||||
0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
|
||||
0x44, 0x50, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x44, 0x50, 0x12, 0x1c, 0x0a,
|
||||
0x09, 0x4f, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x09, 0x4f, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49,
|
||||
0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
|
||||
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
|
||||
0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69,
|
||||
0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76,
|
||||
0x69, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70,
|
||||
0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52,
|
||||
0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x69,
|
||||
0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,
|
||||
0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
|
||||
0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e,
|
||||
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
||||
0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69,
|
||||
0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05,
|
||||
0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x8e, 0x02, 0x0a, 0x25, 0x63, 0x6f,
|
||||
0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
|
||||
0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76,
|
||||
0x69, 0x63, 0x65, 0x42, 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b,
|
||||
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
||||
0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f,
|
||||
0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72,
|
||||
0x76, 0x69, 0x63, 0x65, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x21, 0x48, 0x61,
|
||||
0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49,
|
||||
0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xca,
|
||||
0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73,
|
||||
0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76,
|
||||
0x61, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53,
|
||||
0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75,
|
||||
0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65,
|
||||
0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
|
||||
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x61, 0x0a,
|
||||
0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74, 0x69,
|
||||
0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18,
|
||||
0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
|
||||
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
||||
0x52, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x69, 0x74,
|
||||
0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72,
|
||||
0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x18, 0x0a,
|
||||
0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73,
|
||||
0x12, 0x2c, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,
|
||||
0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x44, 0x6f, 0x63,
|
||||
0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12, 0x14,
|
||||
0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x53,
|
||||
0x68, 0x65, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x18, 0x14,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x12, 0x22, 0x0a, 0x0c,
|
||||
0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x18, 0x15, 0x20, 0x01,
|
||||
0x28, 0x08, 0x52, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53,
|
||||
0x12, 0x12, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
|
||||
0x47, 0x52, 0x50, 0x43, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55, 0x73, 0x65, 0x54,
|
||||
0x4c, 0x53, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55, 0x73,
|
||||
0x65, 0x54, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64,
|
||||
0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f,
|
||||
0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69,
|
||||
0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53,
|
||||
0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18, 0x11, 0x20,
|
||||
0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03,
|
||||
0x54, 0x54, 0x4c, 0x1a, 0x69, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74,
|
||||
0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
||||
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e,
|
||||
0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61,
|
||||
0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4,
|
||||
0x0a, 0x0a, 0x09, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07,
|
||||
0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43,
|
||||
0x68, 0x65, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74,
|
||||
0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74,
|
||||
0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x69,
|
||||
0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x63,
|
||||
0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50,
|
||||
0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x54, 0x54, 0x50, 0x12, 0x50, 0x0a, 0x06,
|
||||
0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68,
|
||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
||||
0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
|
||||
0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65,
|
||||
0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x16,
|
||||
0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
|
||||
0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x1a,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x44, 0x69,
|
||||
0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x18, 0x1f,
|
||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64,
|
||||
0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x18, 0x08, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x03, 0x54, 0x43, 0x50, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x18,
|
||||
0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x44, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53,
|
||||
0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f,
|
||||
0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65,
|
||||
0x72, 0x76, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
|
||||
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
|
||||
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12,
|
||||
0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x09, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a,
|
||||
0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
|
||||
0x65, 0x12, 0x2c, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61,
|
||||
0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x44, 0x6f,
|
||||
0x63, 0x6b, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x44, 0x12,
|
||||
0x14, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
|
||||
0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x18,
|
||||
0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x48, 0x32, 0x50, 0x49, 0x4e, 0x47, 0x12, 0x22, 0x0a,
|
||||
0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c, 0x53, 0x18, 0x1e, 0x20,
|
||||
0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x32, 0x50, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x54, 0x4c,
|
||||
0x53, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x04, 0x47, 0x52, 0x50, 0x43, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55, 0x73, 0x65,
|
||||
0x54, 0x4c, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x47, 0x52, 0x50, 0x43, 0x55,
|
||||
0x73, 0x65, 0x54, 0x4c, 0x53, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x65, 0x72, 0x76,
|
||||
0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x54, 0x4c,
|
||||
0x53, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x54,
|
||||
0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x10, 0x20, 0x01,
|
||||
0x28, 0x08, 0x52, 0x0d, 0x54, 0x4c, 0x53, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66,
|
||||
0x79, 0x12, 0x33, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x11, 0x20, 0x01,
|
||||
0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x54,
|
||||
0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18, 0x12, 0x20,
|
||||
0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03,
|
||||
0x54, 0x54, 0x4c, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x65,
|
||||
0x66, 0x6f, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28,
|
||||
0x05, 0x52, 0x14, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65,
|
||||
0x50, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x46, 0x61, 0x69, 0x6c, 0x75,
|
||||
0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67,
|
||||
0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73,
|
||||
0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x36, 0x0a,
|
||||
0x16, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x43,
|
||||
0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x46,
|
||||
0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x43, 0x72, 0x69,
|
||||
0x74, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x48, 0x54,
|
||||
0x54, 0x50, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x48,
|
||||
0x54, 0x54, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x52, 0x50, 0x43,
|
||||
0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x47, 0x52, 0x50,
|
||||
0x43, 0x12, 0x61, 0x0a, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43,
|
||||
0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x66,
|
||||
0x74, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
|
||||
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1e, 0x44, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
|
||||
0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41,
|
||||
0x66, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4d, 0x61,
|
||||
0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x4f, 0x75, 0x74,
|
||||
0x70, 0x75, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x69, 0x0a, 0x0b, 0x48, 0x65,
|
||||
0x61, 0x64, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76,
|
||||
0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x68, 0x61, 0x73,
|
||||
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e,
|
||||
0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x48,
|
||||
0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
|
||||
0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x8e, 0x02, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61,
|
||||
0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69,
|
||||
0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42,
|
||||
0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
|
||||
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||
0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
|
||||
0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x53, 0xaa, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63,
|
||||
0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72,
|
||||
0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xca, 0x02, 0x21, 0x48, 0x61,
|
||||
0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49,
|
||||
0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0xe2,
|
||||
0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73,
|
||||
0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x53, 0x65, 0x72, 0x76,
|
||||
0x69, 0x63, 0x65, 0xe2, 0x02, 0x2d, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c,
|
||||
0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c,
|
||||
0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,
|
||||
0x61, 0x74, 0x61, 0xea, 0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a,
|
||||
0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
|
||||
0x6c, 0x3a, 0x3a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x33,
|
||||
0x69, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,
|
||||
0x02, 0x24, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e,
|
||||
0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x53,
|
||||
0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
|
|
@ -64,6 +64,7 @@ message HealthCheckDefinition {
|
|||
bool DisableRedirects = 22;
|
||||
string TCP = 5;
|
||||
string UDP = 23;
|
||||
string OSService = 24;
|
||||
// mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
|
||||
google.protobuf.Duration Interval = 6;
|
||||
|
||||
|
@ -114,6 +115,7 @@ message CheckType {
|
|||
bool DisableRedirects = 31;
|
||||
string TCP = 8;
|
||||
string UDP = 32;
|
||||
string OSService = 33;
|
||||
// mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
|
||||
google.protobuf.Duration Interval = 9;
|
||||
|
||||
|
|
|
@ -245,6 +245,8 @@ The check sends datagrams to the value specified at the interval specified in th
|
|||
If the datagram is sent successfully or a timeout is returned, the check is set to the `passing` state.
|
||||
The check is logged as `critical` if the datagram is sent unsuccessfully.
|
||||
|
||||
- `OSService` `(string: "")` - Specifies the identifier of an OS-level service to check. You can specify either `Windows Services` on Windows or `SystemD` services on Unix.
|
||||
|
||||
- `TTL` `(duration: 10s)` - Specifies this is a TTL check, and the TTL endpoint
|
||||
must be used periodically to update the state of the check. If the check is not
|
||||
set to passing within the specified duration, then the check will be set to the failed state.
|
||||
|
|
|
@ -410,6 +410,43 @@ check = {
|
|||
|
||||
</CodeTabs>
|
||||
|
||||
### OSService check
|
||||
|
||||
OSService checks periodically direct the Consul agent to monitor the health of a service running on
|
||||
the host operating system as either a Windows service (Windows) or a SystemD service (Unix).
|
||||
The check is logged as `healthy` if the service is running.
|
||||
If it is stopped or not running, the status is `critical`. All other results set
|
||||
the status to `warning`, which indicates that the check is not reliable because an issue is preventing the check from determining the health of the service.
|
||||
|
||||
The following service definition file snippet is an example
|
||||
of an OSService check definition:
|
||||
|
||||
<CodeTabs heading="OSService Check">
|
||||
|
||||
```hcl
|
||||
check = {
|
||||
id = "myco-svctype-svcname-001"
|
||||
name = "svcname-001 Windows Service Health"
|
||||
service_id = "flash_pnl_1"
|
||||
os_service = "myco-svctype-svcname-001"
|
||||
interval = "10s"
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"check": {
|
||||
"id": "myco-svctype-svcname-001",
|
||||
"name": "svcname-001 Windows Service Health",
|
||||
"service_id": "flash_pnl_1",
|
||||
"os_service": "myco-svctype-svcname-001",
|
||||
"interval": "10s"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</CodeTabs>
|
||||
|
||||
### Time to live (TTL) check ((#ttl))
|
||||
|
||||
TTL checks retain their last known state for the specified `ttl` duration.
|
||||
|
@ -690,7 +727,7 @@ For a complete list of all check options, refer to the
|
|||
- `name` `(string: <required>)` - Specifies the name of the check.
|
||||
|
||||
- `id` `(string: "")` - Specifies a unique ID for this check on this node.
|
||||
|
||||
|
||||
If unspecified, Consul defines the check id by:
|
||||
- If the check definition is embedded within a service definition file,
|
||||
a unique check id is auto-generated.
|
||||
|
@ -719,10 +756,10 @@ For a complete list of all check options, refer to the
|
|||
- `status` `(string: "")` - Specifies the initial status of the health check as
|
||||
"critical" (default), "warning", or "passing". For more details, refer to
|
||||
the [initial health check status](#initial-health-check-status) section.
|
||||
|
||||
|
||||
-> **Health defaults to critical:** If health status it not initially specified,
|
||||
it defaults to "critical" to protect against including a service
|
||||
in discovery results before it is ready.
|
||||
in discovery results before it is ready.
|
||||
|
||||
- `deregister_critical_service_after` `(string: "")` - If specified,
|
||||
the associated service and all its checks are deregistered
|
||||
|
@ -936,4 +973,4 @@ checks = [
|
|||
}
|
||||
```
|
||||
|
||||
</CodeTabs>
|
||||
</CodeTabs>
|
|
@ -185,6 +185,7 @@ Defines the Consul checks for the service. Each `check` object may contain the f
|
|||
| `method` | `string` | optional | Specifies the HTTP method to be used for an HTTP check. When no value is specified, `GET` is used. |
|
||||
| `name` | `string` | optional | The name of the check. |
|
||||
| `notes` | `string` | optional | Specifies arbitrary information for humans. This is not used by Consul internally. |
|
||||
| `os_service` | `string` | optional | Specifies the name of a service on which to perform an [OS service check](/docs/discovery/checks#osservice-check). The check runs according the frequency specified in the `interval` parameter. |
|
||||
| `status` | `string` | optional | Specifies the initial status the health check. Must be one of `passing`, `warning`, `critical`, `maintenance`, or `null`. |
|
||||
| `successBeforePassing` | `integer` | optional | Specifies the number of consecutive successful results required before check status transitions to passing. |
|
||||
| `tcp` | `string` | optional | Specifies this is a TCP check. Must be an IP/hostname plus port to which a TCP connection is made every `interval`. |
|
||||
|
|
Loading…
Reference in New Issue