consul: initial grpc implementation
Needs to be more like http.
This commit is contained in:
parent
944f1f9481
commit
382caec1e1
|
@ -286,6 +286,8 @@ type ServiceCheck struct {
|
|||
Header map[string][]string
|
||||
Method string
|
||||
CheckRestart *CheckRestart `mapstructure:"check_restart"`
|
||||
GRPC string
|
||||
GRPCUseTLS bool `mapstructure:"grpc_use_tls"`
|
||||
}
|
||||
|
||||
// The Service model represents a Consul service definition
|
||||
|
|
|
@ -1516,6 +1516,7 @@ func interpolateServices(taskEnv *env.TaskEnv, task *structs.Task) *structs.Task
|
|||
check.PortLabel = taskEnv.ReplaceEnv(check.PortLabel)
|
||||
check.InitialStatus = taskEnv.ReplaceEnv(check.InitialStatus)
|
||||
check.Method = taskEnv.ReplaceEnv(check.Method)
|
||||
check.GRPC = taskEnv.ReplaceEnv(check.GRPC)
|
||||
if len(check.Header) > 0 {
|
||||
header := make(map[string][]string, len(check.Header))
|
||||
for k, vs := range check.Header {
|
||||
|
|
|
@ -1094,12 +1094,22 @@ func createCheckReg(serviceID, checkID string, check *structs.ServiceCheck, host
|
|||
chkReg.HTTP = url.String()
|
||||
chkReg.Method = check.Method
|
||||
chkReg.Header = check.Header
|
||||
|
||||
case structs.ServiceCheckTCP:
|
||||
chkReg.TCP = net.JoinHostPort(host, strconv.Itoa(port))
|
||||
|
||||
case structs.ServiceCheckScript:
|
||||
chkReg.TTL = (check.Interval + ttlCheckBuffer).String()
|
||||
// As of Consul 1.0.0 setting TTL and Interval is a 400
|
||||
chkReg.Interval = ""
|
||||
|
||||
case structs.ServiceCheckGRPC:
|
||||
chkReg.GRPC = check.GRPC
|
||||
chkReg.GRPCUseTLS = check.GRPCUseTLS
|
||||
if check.TLSSkipVerify {
|
||||
chkReg.TLSSkipVerify = true
|
||||
}
|
||||
|
||||
default:
|
||||
return nil, fmt.Errorf("check type %+q not valid", check.Type)
|
||||
}
|
||||
|
|
|
@ -764,6 +764,8 @@ func ApiTaskToStructsTask(apiTask *api.Task, structsTask *structs.Task) {
|
|||
TLSSkipVerify: check.TLSSkipVerify,
|
||||
Header: check.Header,
|
||||
Method: check.Method,
|
||||
GRPC: check.GRPC,
|
||||
GRPCUseTLS: check.GRPCUseTLS,
|
||||
}
|
||||
if check.CheckRestart != nil {
|
||||
structsTask.Services[i].Checks[j].CheckRestart = &structs.CheckRestart{
|
||||
|
|
|
@ -1061,6 +1061,8 @@ func parseChecks(service *api.Service, checkObjs *ast.ObjectList) error {
|
|||
"method",
|
||||
"check_restart",
|
||||
"address_mode",
|
||||
"grpc",
|
||||
"grpc_use_tls",
|
||||
}
|
||||
if err := helper.CheckHCLKeys(co.Val, valid); err != nil {
|
||||
return multierror.Prefix(err, "check ->")
|
||||
|
|
|
@ -135,11 +135,13 @@ func TestParse(t *testing.T) {
|
|||
PortLabel: "http",
|
||||
Checks: []api.ServiceCheck{
|
||||
{
|
||||
Name: "check-name",
|
||||
Type: "tcp",
|
||||
PortLabel: "admin",
|
||||
Interval: 10 * time.Second,
|
||||
Timeout: 2 * time.Second,
|
||||
Name: "check-name",
|
||||
Type: "tcp",
|
||||
PortLabel: "admin",
|
||||
Interval: 10 * time.Second,
|
||||
Timeout: 2 * time.Second,
|
||||
GRPC: "localhost:12345/foo",
|
||||
GRPCUseTLS: true,
|
||||
CheckRestart: &api.CheckRestart{
|
||||
Limit: 3,
|
||||
Grace: helper.TimeToPtr(10 * time.Second),
|
||||
|
|
|
@ -102,11 +102,13 @@ job "binstore-storagelocker" {
|
|||
port = "http"
|
||||
|
||||
check {
|
||||
name = "check-name"
|
||||
type = "tcp"
|
||||
interval = "10s"
|
||||
timeout = "2s"
|
||||
port = "admin"
|
||||
name = "check-name"
|
||||
type = "tcp"
|
||||
interval = "10s"
|
||||
timeout = "2s"
|
||||
port = "admin"
|
||||
grpc = "localhost:12345/foo"
|
||||
grpc_use_tls = true
|
||||
|
||||
check_restart {
|
||||
limit = 3
|
||||
|
|
|
@ -3515,6 +3515,7 @@ const (
|
|||
ServiceCheckHTTP = "http"
|
||||
ServiceCheckTCP = "tcp"
|
||||
ServiceCheckScript = "script"
|
||||
ServiceCheckGRPC = "grpc"
|
||||
|
||||
// minCheckInterval is the minimum check interval permitted. Consul
|
||||
// currently has its MinInterval set to 1s. Mirror that here for
|
||||
|
@ -3544,6 +3545,8 @@ type ServiceCheck struct {
|
|||
Method string // HTTP Method to use (GET by default)
|
||||
Header map[string][]string // HTTP Headers for Consul to set when making HTTP checks
|
||||
CheckRestart *CheckRestart // If and when a task should be restarted based on checks
|
||||
GRPC string // Endpoint for GRPC checks
|
||||
GRPCUseTLS bool // Whether or not to use TLS for GRPC checks
|
||||
}
|
||||
|
||||
func (sc *ServiceCheck) Copy() *ServiceCheck {
|
||||
|
@ -3601,6 +3604,12 @@ func (sc *ServiceCheck) validate() error {
|
|||
if sc.Command == "" {
|
||||
return fmt.Errorf("script type must have a valid script path")
|
||||
}
|
||||
|
||||
case ServiceCheckGRPC:
|
||||
if sc.GRPC == "" {
|
||||
return fmt.Errorf("grpc type must have a valid endpoint")
|
||||
}
|
||||
|
||||
default:
|
||||
return fmt.Errorf(`invalid type (%+q), must be one of "http", "tcp", or "script" type`, sc.Type)
|
||||
}
|
||||
|
@ -3696,6 +3705,14 @@ func (sc *ServiceCheck) Hash(serviceID string) string {
|
|||
io.WriteString(h, sc.AddressMode)
|
||||
}
|
||||
|
||||
// Only include GRPC if set to maintain ID stability with Nomad <0.8.4
|
||||
if sc.GRPC != "" {
|
||||
io.WriteString(h, sc.GRPC)
|
||||
}
|
||||
if sc.GRPCUseTLS {
|
||||
io.WriteString(h, "true")
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%x", h.Sum(nil))
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue