github.com/outbrain/consul@v1.4.5/agent/structs/check_type.go (about)

     1  package structs
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"time"
     7  
     8  	"github.com/hashicorp/consul/types"
     9  )
    10  
    11  // CheckType is used to create either the CheckMonitor or the CheckTTL.
    12  // The following types are supported: Script, HTTP, TCP, Docker, TTL, GRPC, Alias. Script,
    13  // HTTP, Docker, TCP and GRPC all require Interval. Only one of the types may
    14  // to be provided: TTL or Script/Interval or HTTP/Interval or TCP/Interval or
    15  // Docker/Interval or GRPC/Interval or AliasService.
    16  type CheckType struct {
    17  	// fields already embedded in CheckDefinition
    18  	// Note: CheckType.CheckID == CheckDefinition.ID
    19  
    20  	CheckID types.CheckID
    21  	Name    string
    22  	Status  string
    23  	Notes   string
    24  
    25  	// fields copied to CheckDefinition
    26  	// Update CheckDefinition when adding fields here
    27  
    28  	ScriptArgs        []string
    29  	HTTP              string
    30  	Header            map[string][]string
    31  	Method            string
    32  	TCP               string
    33  	Interval          time.Duration
    34  	AliasNode         string
    35  	AliasService      string
    36  	DockerContainerID string
    37  	Shell             string
    38  	GRPC              string
    39  	GRPCUseTLS        bool
    40  	TLSSkipVerify     bool
    41  	Timeout           time.Duration
    42  	TTL               time.Duration
    43  
    44  	// DeregisterCriticalServiceAfter, if >0, will cause the associated
    45  	// service, if any, to be deregistered if this check is critical for
    46  	// longer than this duration.
    47  	DeregisterCriticalServiceAfter time.Duration
    48  }
    49  type CheckTypes []*CheckType
    50  
    51  // Validate returns an error message if the check is invalid
    52  func (c *CheckType) Validate() error {
    53  	intervalCheck := c.IsScript() || c.HTTP != "" || c.TCP != "" || c.GRPC != ""
    54  
    55  	if c.Interval > 0 && c.TTL > 0 {
    56  		return fmt.Errorf("Interval and TTL cannot both be specified")
    57  	}
    58  	if intervalCheck && c.Interval <= 0 {
    59  		return fmt.Errorf("Interval must be > 0 for Script, HTTP, or TCP checks")
    60  	}
    61  	if intervalCheck && c.IsAlias() {
    62  		return fmt.Errorf("Interval cannot be set for Alias checks")
    63  	}
    64  	if c.IsAlias() && c.TTL > 0 {
    65  		return fmt.Errorf("TTL must be not be set for Alias checks")
    66  	}
    67  	if !intervalCheck && !c.IsAlias() && c.TTL <= 0 {
    68  		return fmt.Errorf("TTL must be > 0 for TTL checks")
    69  	}
    70  	return nil
    71  }
    72  
    73  // Empty checks if the CheckType has no fields defined. Empty checks parsed from json configs are filtered out
    74  func (c *CheckType) Empty() bool {
    75  	return reflect.DeepEqual(c, &CheckType{})
    76  }
    77  
    78  // IsAlias checks if this is an alias check.
    79  func (c *CheckType) IsAlias() bool {
    80  	return c.AliasNode != "" || c.AliasService != ""
    81  }
    82  
    83  // IsScript checks if this is a check that execs some kind of script.
    84  func (c *CheckType) IsScript() bool {
    85  	return len(c.ScriptArgs) > 0
    86  }
    87  
    88  // IsTTL checks if this is a TTL type
    89  func (c *CheckType) IsTTL() bool {
    90  	return c.TTL > 0
    91  }
    92  
    93  // IsMonitor checks if this is a Monitor type
    94  func (c *CheckType) IsMonitor() bool {
    95  	return c.IsScript() && c.DockerContainerID == "" && c.Interval > 0
    96  }
    97  
    98  // IsHTTP checks if this is a HTTP type
    99  func (c *CheckType) IsHTTP() bool {
   100  	return c.HTTP != "" && c.Interval > 0
   101  }
   102  
   103  // IsTCP checks if this is a TCP type
   104  func (c *CheckType) IsTCP() bool {
   105  	return c.TCP != "" && c.Interval > 0
   106  }
   107  
   108  // IsDocker returns true when checking a docker container.
   109  func (c *CheckType) IsDocker() bool {
   110  	return c.IsScript() && c.DockerContainerID != "" && c.Interval > 0
   111  }
   112  
   113  // IsGRPC checks if this is a GRPC type
   114  func (c *CheckType) IsGRPC() bool {
   115  	return c.GRPC != "" && c.Interval > 0
   116  }