// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1

syntax = "proto3";

package hashicorp.consul.internal.service;

import "google/protobuf/duration.proto";
import "private/pbcommon/common.proto";

// HealthCheck represents a single check on a given node
//
// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.HealthCheck
// output=healthcheck.gen.go
// name=Structs
message HealthCheck {
  string Node = 1;
  // mog: func-to=CheckIDType func-from=string
  string CheckID = 2;
  string Name = 3;
  string Status = 4; // The current check status
  string Notes = 5; // Additional notes with the status
  string Output = 6; // Holds output of script runs
  string ServiceID = 7; // optional associated service
  string ServiceName = 8; // optional service name
  repeated string ServiceTags = 9; // optional service tags
  string Type = 12; // Check type: http/ttl/tcp/etc

  HealthCheckDefinition Definition = 10;

  // mog: func-to=RaftIndexToStructs func-from=NewRaftIndexFromStructs
  common.RaftIndex RaftIndex = 11;

  // mog: func-to=EnterpriseMetaToStructs func-from=NewEnterpriseMetaFromStructs
  common.EnterpriseMeta EnterpriseMeta = 13;

  // mog: func-to=int func-from=int32
  int32 ExposedPort = 14;

  string Interval = 15;
  string Timeout = 16;
  string PeerName = 17;
}

message HeaderValue {
  repeated string Value = 1;
}

// HealthCheckDefinition of a single HealthCheck.
//
// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.HealthCheckDefinition
// output=healthcheck.gen.go
// name=Structs
message HealthCheckDefinition {
  string HTTP = 1;
  string TLSServerName = 19;
  bool TLSSkipVerify = 2;

  // mog: func-to=MapHeadersToStructs func-from=NewMapHeadersFromStructs
  map<string, HeaderValue> Header = 3;
  string Method = 4;
  string Body = 18;
  bool DisableRedirects = 22;
  string TCP = 5;
  bool TCPUseTLS = 25;
  string UDP = 23;
  string OSService = 24;
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration Interval = 6;

  // mog: func-to=uint func-from=uint32
  uint32 OutputMaxSize = 9;
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration Timeout = 7;
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration DeregisterCriticalServiceAfter = 8;
  repeated string ScriptArgs = 10;
  string DockerContainerID = 11;
  string Shell = 12;
  string H2PING = 20;
  bool H2PingUseTLS = 21;
  string GRPC = 13;
  bool GRPCUseTLS = 14;
  string AliasNode = 15;
  string AliasService = 16;
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration TTL = 17;
  string SessionName = 26;
}

// CheckType is used to create either the CheckMonitor or the CheckTTL.
// The following types are supported: Script, HTTP, TCP, Docker, TTL, GRPC,
// Alias. Script, H2PING,
// HTTP, Docker, TCP, H2PING and GRPC all require Interval. Only one of the types may
// to be provided: TTL or Script/Interval or HTTP/Interval or TCP/Interval or
// Docker/Interval or GRPC/Interval or H2PING/Interval or AliasService.
//
// mog annotation:
//
// target=github.com/hashicorp/consul/agent/structs.CheckType
// output=healthcheck.gen.go
// name=Structs
message CheckType {
  // mog: func-to=CheckIDType func-from=string
  string CheckID = 1;
  string Name = 2;
  string Status = 3;
  string Notes = 4;

  repeated string ScriptArgs = 5;
  string HTTP = 6;
  // mog: func-to=MapHeadersToStructs func-from=NewMapHeadersFromStructs
  map<string, HeaderValue> Header = 20;
  string Method = 7;
  string Body = 26;
  bool DisableRedirects = 31;
  string TCP = 8;
  bool TCPUseTLS = 34;
  string UDP = 32;
  string OSService = 33;
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration Interval = 9;

  string AliasNode = 10;
  string AliasService = 11;
  string DockerContainerID = 12;
  string Shell = 13;
  string H2PING = 28;
  bool H2PingUseTLS = 30;
  string GRPC = 14;
  bool GRPCUseTLS = 15;
  string TLSServerName = 27;
  bool TLSSkipVerify = 16;

  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration Timeout = 17;
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration TTL = 18;

  // mog: func-to=int func-from=int32
  int32 SuccessBeforePassing = 21;
  // mog: func-to=int func-from=int32
  int32 FailuresBeforeWarning = 29;
  // mog: func-to=int func-from=int32
  int32 FailuresBeforeCritical = 22;

  // Definition fields used when exposing checks through a proxy
  string ProxyHTTP = 23;
  string ProxyGRPC = 24;

  // DeregisterCriticalServiceAfter, if >0, will cause the associated
  // service, if any, to be deregistered if this check is critical for
  // longer than this duration.
  // mog: func-to=structs.DurationFromProto func-from=structs.DurationToProto
  google.protobuf.Duration DeregisterCriticalServiceAfter = 19;

  // mog: func-to=int func-from=int32
  int32 OutputMaxSize = 25;

  // The session name of the session, which is associated with the common parent node of the session and this check.
  // This association helps in managing the session and its related state of the checks.
  // e.g. if the session is deleted/invalidated the state of this check shall be marked critical.
  string SessionName = 35;
}
