1
0
mirror of https://github.com/juanfont/headscale.git synced 2025-08-14 13:51:01 +02:00

update health check implementation to allow for more checks to added over time

This commit is contained in:
Stavros Kois 2025-07-04 11:18:06 +03:00
parent 569459209a
commit 3f066c12bb
No known key found for this signature in database
GPG Key ID: 52FD8F5EE0A731BB
5 changed files with 128 additions and 198 deletions

View File

@ -1,8 +1,6 @@
package cli package cli
import ( import (
"fmt"
v1 "github.com/juanfont/headscale/gen/go/headscale/v1" v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -26,14 +24,6 @@ var healthCmd = &cobra.Command{
ErrorOutput(err, "Error checking health", output) ErrorOutput(err, "Error checking health", output)
} }
if response.Status == v1.HealthStatus_Pass { SuccessOutput(response, "", output)
SuccessOutput("Headscale server is healthy", "", output)
}
ErrorOutput(
fmt.Errorf("server health check failed: %s", response.Status),
"Headscale server is unhealthy",
output,
)
}, },
} }

View File

@ -22,52 +22,6 @@ const (
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
) )
type HealthStatus int32
const (
HealthStatus_Fail HealthStatus = 0
HealthStatus_Pass HealthStatus = 1
)
// Enum value maps for HealthStatus.
var (
HealthStatus_name = map[int32]string{
0: "Fail",
1: "Pass",
}
HealthStatus_value = map[string]int32{
"Fail": 0,
"Pass": 1,
}
)
func (x HealthStatus) Enum() *HealthStatus {
p := new(HealthStatus)
*p = x
return p
}
func (x HealthStatus) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (HealthStatus) Descriptor() protoreflect.EnumDescriptor {
return file_headscale_v1_headscale_proto_enumTypes[0].Descriptor()
}
func (HealthStatus) Type() protoreflect.EnumType {
return &file_headscale_v1_headscale_proto_enumTypes[0]
}
func (x HealthStatus) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use HealthStatus.Descriptor instead.
func (HealthStatus) EnumDescriptor() ([]byte, []int) {
return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{0}
}
type HealthRequest struct { type HealthRequest struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
@ -106,7 +60,7 @@ func (*HealthRequest) Descriptor() ([]byte, []int) {
type HealthResponse struct { type HealthResponse struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
Status HealthStatus `protobuf:"varint,1,opt,name=status,proto3,enum=headscale.v1.HealthStatus" json:"status,omitempty"` DbPing bool `protobuf:"varint,1,opt,name=db_ping,json=dbPing,proto3" json:"db_ping,omitempty"`
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
@ -141,11 +95,11 @@ func (*HealthResponse) Descriptor() ([]byte, []int) {
return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{1} return file_headscale_v1_headscale_proto_rawDescGZIP(), []int{1}
} }
func (x *HealthResponse) GetStatus() HealthStatus { func (x *HealthResponse) GetDbPing() bool {
if x != nil { if x != nil {
return x.Status return x.DbPing
} }
return HealthStatus_Fail return false
} }
var File_headscale_v1_headscale_proto protoreflect.FileDescriptor var File_headscale_v1_headscale_proto protoreflect.FileDescriptor
@ -153,12 +107,9 @@ var File_headscale_v1_headscale_proto protoreflect.FileDescriptor
const file_headscale_v1_headscale_proto_rawDesc = "" + const file_headscale_v1_headscale_proto_rawDesc = "" +
"\n" + "\n" +
"\x1cheadscale/v1/headscale.proto\x12\fheadscale.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17headscale/v1/user.proto\x1a\x1dheadscale/v1/preauthkey.proto\x1a\x17headscale/v1/node.proto\x1a\x19headscale/v1/apikey.proto\x1a\x19headscale/v1/policy.proto\"\x0f\n" + "\x1cheadscale/v1/headscale.proto\x12\fheadscale.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17headscale/v1/user.proto\x1a\x1dheadscale/v1/preauthkey.proto\x1a\x17headscale/v1/node.proto\x1a\x19headscale/v1/apikey.proto\x1a\x19headscale/v1/policy.proto\"\x0f\n" +
"\rHealthRequest\"D\n" + "\rHealthRequest\")\n" +
"\x0eHealthResponse\x122\n" + "\x0eHealthResponse\x12\x17\n" +
"\x06status\x18\x01 \x01(\x0e2\x1a.headscale.v1.HealthStatusR\x06status*\"\n" + "\adb_ping\x18\x01 \x01(\bR\x06dbPing2\x80\x17\n" +
"\fHealthStatus\x12\b\n" +
"\x04Fail\x10\x00\x12\b\n" +
"\x04Pass\x10\x012\x80\x17\n" +
"\x10HeadscaleService\x12h\n" + "\x10HeadscaleService\x12h\n" +
"\n" + "\n" +
"CreateUser\x12\x1f.headscale.v1.CreateUserRequest\x1a .headscale.v1.CreateUserResponse\"\x17\x82\xd3\xe4\x93\x02\x11:\x01*\"\f/api/v1/user\x12\x80\x01\n" + "CreateUser\x12\x1f.headscale.v1.CreateUserRequest\x1a .headscale.v1.CreateUserResponse\"\x17\x82\xd3\xe4\x93\x02\x11:\x01*\"\f/api/v1/user\x12\x80\x01\n" +
@ -204,118 +155,115 @@ func file_headscale_v1_headscale_proto_rawDescGZIP() []byte {
return file_headscale_v1_headscale_proto_rawDescData return file_headscale_v1_headscale_proto_rawDescData
} }
var file_headscale_v1_headscale_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_headscale_v1_headscale_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_headscale_v1_headscale_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_headscale_v1_headscale_proto_goTypes = []any{ var file_headscale_v1_headscale_proto_goTypes = []any{
(HealthStatus)(0), // 0: headscale.v1.HealthStatus (*HealthRequest)(nil), // 0: headscale.v1.HealthRequest
(*HealthRequest)(nil), // 1: headscale.v1.HealthRequest (*HealthResponse)(nil), // 1: headscale.v1.HealthResponse
(*HealthResponse)(nil), // 2: headscale.v1.HealthResponse (*CreateUserRequest)(nil), // 2: headscale.v1.CreateUserRequest
(*CreateUserRequest)(nil), // 3: headscale.v1.CreateUserRequest (*RenameUserRequest)(nil), // 3: headscale.v1.RenameUserRequest
(*RenameUserRequest)(nil), // 4: headscale.v1.RenameUserRequest (*DeleteUserRequest)(nil), // 4: headscale.v1.DeleteUserRequest
(*DeleteUserRequest)(nil), // 5: headscale.v1.DeleteUserRequest (*ListUsersRequest)(nil), // 5: headscale.v1.ListUsersRequest
(*ListUsersRequest)(nil), // 6: headscale.v1.ListUsersRequest (*CreatePreAuthKeyRequest)(nil), // 6: headscale.v1.CreatePreAuthKeyRequest
(*CreatePreAuthKeyRequest)(nil), // 7: headscale.v1.CreatePreAuthKeyRequest (*ExpirePreAuthKeyRequest)(nil), // 7: headscale.v1.ExpirePreAuthKeyRequest
(*ExpirePreAuthKeyRequest)(nil), // 8: headscale.v1.ExpirePreAuthKeyRequest (*ListPreAuthKeysRequest)(nil), // 8: headscale.v1.ListPreAuthKeysRequest
(*ListPreAuthKeysRequest)(nil), // 9: headscale.v1.ListPreAuthKeysRequest (*DebugCreateNodeRequest)(nil), // 9: headscale.v1.DebugCreateNodeRequest
(*DebugCreateNodeRequest)(nil), // 10: headscale.v1.DebugCreateNodeRequest (*GetNodeRequest)(nil), // 10: headscale.v1.GetNodeRequest
(*GetNodeRequest)(nil), // 11: headscale.v1.GetNodeRequest (*SetTagsRequest)(nil), // 11: headscale.v1.SetTagsRequest
(*SetTagsRequest)(nil), // 12: headscale.v1.SetTagsRequest (*SetApprovedRoutesRequest)(nil), // 12: headscale.v1.SetApprovedRoutesRequest
(*SetApprovedRoutesRequest)(nil), // 13: headscale.v1.SetApprovedRoutesRequest (*RegisterNodeRequest)(nil), // 13: headscale.v1.RegisterNodeRequest
(*RegisterNodeRequest)(nil), // 14: headscale.v1.RegisterNodeRequest (*DeleteNodeRequest)(nil), // 14: headscale.v1.DeleteNodeRequest
(*DeleteNodeRequest)(nil), // 15: headscale.v1.DeleteNodeRequest (*ExpireNodeRequest)(nil), // 15: headscale.v1.ExpireNodeRequest
(*ExpireNodeRequest)(nil), // 16: headscale.v1.ExpireNodeRequest (*RenameNodeRequest)(nil), // 16: headscale.v1.RenameNodeRequest
(*RenameNodeRequest)(nil), // 17: headscale.v1.RenameNodeRequest (*ListNodesRequest)(nil), // 17: headscale.v1.ListNodesRequest
(*ListNodesRequest)(nil), // 18: headscale.v1.ListNodesRequest (*MoveNodeRequest)(nil), // 18: headscale.v1.MoveNodeRequest
(*MoveNodeRequest)(nil), // 19: headscale.v1.MoveNodeRequest (*BackfillNodeIPsRequest)(nil), // 19: headscale.v1.BackfillNodeIPsRequest
(*BackfillNodeIPsRequest)(nil), // 20: headscale.v1.BackfillNodeIPsRequest (*CreateApiKeyRequest)(nil), // 20: headscale.v1.CreateApiKeyRequest
(*CreateApiKeyRequest)(nil), // 21: headscale.v1.CreateApiKeyRequest (*ExpireApiKeyRequest)(nil), // 21: headscale.v1.ExpireApiKeyRequest
(*ExpireApiKeyRequest)(nil), // 22: headscale.v1.ExpireApiKeyRequest (*ListApiKeysRequest)(nil), // 22: headscale.v1.ListApiKeysRequest
(*ListApiKeysRequest)(nil), // 23: headscale.v1.ListApiKeysRequest (*DeleteApiKeyRequest)(nil), // 23: headscale.v1.DeleteApiKeyRequest
(*DeleteApiKeyRequest)(nil), // 24: headscale.v1.DeleteApiKeyRequest (*GetPolicyRequest)(nil), // 24: headscale.v1.GetPolicyRequest
(*GetPolicyRequest)(nil), // 25: headscale.v1.GetPolicyRequest (*SetPolicyRequest)(nil), // 25: headscale.v1.SetPolicyRequest
(*SetPolicyRequest)(nil), // 26: headscale.v1.SetPolicyRequest (*CreateUserResponse)(nil), // 26: headscale.v1.CreateUserResponse
(*CreateUserResponse)(nil), // 27: headscale.v1.CreateUserResponse (*RenameUserResponse)(nil), // 27: headscale.v1.RenameUserResponse
(*RenameUserResponse)(nil), // 28: headscale.v1.RenameUserResponse (*DeleteUserResponse)(nil), // 28: headscale.v1.DeleteUserResponse
(*DeleteUserResponse)(nil), // 29: headscale.v1.DeleteUserResponse (*ListUsersResponse)(nil), // 29: headscale.v1.ListUsersResponse
(*ListUsersResponse)(nil), // 30: headscale.v1.ListUsersResponse (*CreatePreAuthKeyResponse)(nil), // 30: headscale.v1.CreatePreAuthKeyResponse
(*CreatePreAuthKeyResponse)(nil), // 31: headscale.v1.CreatePreAuthKeyResponse (*ExpirePreAuthKeyResponse)(nil), // 31: headscale.v1.ExpirePreAuthKeyResponse
(*ExpirePreAuthKeyResponse)(nil), // 32: headscale.v1.ExpirePreAuthKeyResponse (*ListPreAuthKeysResponse)(nil), // 32: headscale.v1.ListPreAuthKeysResponse
(*ListPreAuthKeysResponse)(nil), // 33: headscale.v1.ListPreAuthKeysResponse (*DebugCreateNodeResponse)(nil), // 33: headscale.v1.DebugCreateNodeResponse
(*DebugCreateNodeResponse)(nil), // 34: headscale.v1.DebugCreateNodeResponse (*GetNodeResponse)(nil), // 34: headscale.v1.GetNodeResponse
(*GetNodeResponse)(nil), // 35: headscale.v1.GetNodeResponse (*SetTagsResponse)(nil), // 35: headscale.v1.SetTagsResponse
(*SetTagsResponse)(nil), // 36: headscale.v1.SetTagsResponse (*SetApprovedRoutesResponse)(nil), // 36: headscale.v1.SetApprovedRoutesResponse
(*SetApprovedRoutesResponse)(nil), // 37: headscale.v1.SetApprovedRoutesResponse (*RegisterNodeResponse)(nil), // 37: headscale.v1.RegisterNodeResponse
(*RegisterNodeResponse)(nil), // 38: headscale.v1.RegisterNodeResponse (*DeleteNodeResponse)(nil), // 38: headscale.v1.DeleteNodeResponse
(*DeleteNodeResponse)(nil), // 39: headscale.v1.DeleteNodeResponse (*ExpireNodeResponse)(nil), // 39: headscale.v1.ExpireNodeResponse
(*ExpireNodeResponse)(nil), // 40: headscale.v1.ExpireNodeResponse (*RenameNodeResponse)(nil), // 40: headscale.v1.RenameNodeResponse
(*RenameNodeResponse)(nil), // 41: headscale.v1.RenameNodeResponse (*ListNodesResponse)(nil), // 41: headscale.v1.ListNodesResponse
(*ListNodesResponse)(nil), // 42: headscale.v1.ListNodesResponse (*MoveNodeResponse)(nil), // 42: headscale.v1.MoveNodeResponse
(*MoveNodeResponse)(nil), // 43: headscale.v1.MoveNodeResponse (*BackfillNodeIPsResponse)(nil), // 43: headscale.v1.BackfillNodeIPsResponse
(*BackfillNodeIPsResponse)(nil), // 44: headscale.v1.BackfillNodeIPsResponse (*CreateApiKeyResponse)(nil), // 44: headscale.v1.CreateApiKeyResponse
(*CreateApiKeyResponse)(nil), // 45: headscale.v1.CreateApiKeyResponse (*ExpireApiKeyResponse)(nil), // 45: headscale.v1.ExpireApiKeyResponse
(*ExpireApiKeyResponse)(nil), // 46: headscale.v1.ExpireApiKeyResponse (*ListApiKeysResponse)(nil), // 46: headscale.v1.ListApiKeysResponse
(*ListApiKeysResponse)(nil), // 47: headscale.v1.ListApiKeysResponse (*DeleteApiKeyResponse)(nil), // 47: headscale.v1.DeleteApiKeyResponse
(*DeleteApiKeyResponse)(nil), // 48: headscale.v1.DeleteApiKeyResponse (*GetPolicyResponse)(nil), // 48: headscale.v1.GetPolicyResponse
(*GetPolicyResponse)(nil), // 49: headscale.v1.GetPolicyResponse (*SetPolicyResponse)(nil), // 49: headscale.v1.SetPolicyResponse
(*SetPolicyResponse)(nil), // 50: headscale.v1.SetPolicyResponse
} }
var file_headscale_v1_headscale_proto_depIdxs = []int32{ var file_headscale_v1_headscale_proto_depIdxs = []int32{
0, // 0: headscale.v1.HealthResponse.status:type_name -> headscale.v1.HealthStatus 2, // 0: headscale.v1.HeadscaleService.CreateUser:input_type -> headscale.v1.CreateUserRequest
3, // 1: headscale.v1.HeadscaleService.CreateUser:input_type -> headscale.v1.CreateUserRequest 3, // 1: headscale.v1.HeadscaleService.RenameUser:input_type -> headscale.v1.RenameUserRequest
4, // 2: headscale.v1.HeadscaleService.RenameUser:input_type -> headscale.v1.RenameUserRequest 4, // 2: headscale.v1.HeadscaleService.DeleteUser:input_type -> headscale.v1.DeleteUserRequest
5, // 3: headscale.v1.HeadscaleService.DeleteUser:input_type -> headscale.v1.DeleteUserRequest 5, // 3: headscale.v1.HeadscaleService.ListUsers:input_type -> headscale.v1.ListUsersRequest
6, // 4: headscale.v1.HeadscaleService.ListUsers:input_type -> headscale.v1.ListUsersRequest 6, // 4: headscale.v1.HeadscaleService.CreatePreAuthKey:input_type -> headscale.v1.CreatePreAuthKeyRequest
7, // 5: headscale.v1.HeadscaleService.CreatePreAuthKey:input_type -> headscale.v1.CreatePreAuthKeyRequest 7, // 5: headscale.v1.HeadscaleService.ExpirePreAuthKey:input_type -> headscale.v1.ExpirePreAuthKeyRequest
8, // 6: headscale.v1.HeadscaleService.ExpirePreAuthKey:input_type -> headscale.v1.ExpirePreAuthKeyRequest 8, // 6: headscale.v1.HeadscaleService.ListPreAuthKeys:input_type -> headscale.v1.ListPreAuthKeysRequest
9, // 7: headscale.v1.HeadscaleService.ListPreAuthKeys:input_type -> headscale.v1.ListPreAuthKeysRequest 9, // 7: headscale.v1.HeadscaleService.DebugCreateNode:input_type -> headscale.v1.DebugCreateNodeRequest
10, // 8: headscale.v1.HeadscaleService.DebugCreateNode:input_type -> headscale.v1.DebugCreateNodeRequest 10, // 8: headscale.v1.HeadscaleService.GetNode:input_type -> headscale.v1.GetNodeRequest
11, // 9: headscale.v1.HeadscaleService.GetNode:input_type -> headscale.v1.GetNodeRequest 11, // 9: headscale.v1.HeadscaleService.SetTags:input_type -> headscale.v1.SetTagsRequest
12, // 10: headscale.v1.HeadscaleService.SetTags:input_type -> headscale.v1.SetTagsRequest 12, // 10: headscale.v1.HeadscaleService.SetApprovedRoutes:input_type -> headscale.v1.SetApprovedRoutesRequest
13, // 11: headscale.v1.HeadscaleService.SetApprovedRoutes:input_type -> headscale.v1.SetApprovedRoutesRequest 13, // 11: headscale.v1.HeadscaleService.RegisterNode:input_type -> headscale.v1.RegisterNodeRequest
14, // 12: headscale.v1.HeadscaleService.RegisterNode:input_type -> headscale.v1.RegisterNodeRequest 14, // 12: headscale.v1.HeadscaleService.DeleteNode:input_type -> headscale.v1.DeleteNodeRequest
15, // 13: headscale.v1.HeadscaleService.DeleteNode:input_type -> headscale.v1.DeleteNodeRequest 15, // 13: headscale.v1.HeadscaleService.ExpireNode:input_type -> headscale.v1.ExpireNodeRequest
16, // 14: headscale.v1.HeadscaleService.ExpireNode:input_type -> headscale.v1.ExpireNodeRequest 16, // 14: headscale.v1.HeadscaleService.RenameNode:input_type -> headscale.v1.RenameNodeRequest
17, // 15: headscale.v1.HeadscaleService.RenameNode:input_type -> headscale.v1.RenameNodeRequest 17, // 15: headscale.v1.HeadscaleService.ListNodes:input_type -> headscale.v1.ListNodesRequest
18, // 16: headscale.v1.HeadscaleService.ListNodes:input_type -> headscale.v1.ListNodesRequest 18, // 16: headscale.v1.HeadscaleService.MoveNode:input_type -> headscale.v1.MoveNodeRequest
19, // 17: headscale.v1.HeadscaleService.MoveNode:input_type -> headscale.v1.MoveNodeRequest 19, // 17: headscale.v1.HeadscaleService.BackfillNodeIPs:input_type -> headscale.v1.BackfillNodeIPsRequest
20, // 18: headscale.v1.HeadscaleService.BackfillNodeIPs:input_type -> headscale.v1.BackfillNodeIPsRequest 20, // 18: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest
21, // 19: headscale.v1.HeadscaleService.CreateApiKey:input_type -> headscale.v1.CreateApiKeyRequest 21, // 19: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest
22, // 20: headscale.v1.HeadscaleService.ExpireApiKey:input_type -> headscale.v1.ExpireApiKeyRequest 22, // 20: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest
23, // 21: headscale.v1.HeadscaleService.ListApiKeys:input_type -> headscale.v1.ListApiKeysRequest 23, // 21: headscale.v1.HeadscaleService.DeleteApiKey:input_type -> headscale.v1.DeleteApiKeyRequest
24, // 22: headscale.v1.HeadscaleService.DeleteApiKey:input_type -> headscale.v1.DeleteApiKeyRequest 24, // 22: headscale.v1.HeadscaleService.GetPolicy:input_type -> headscale.v1.GetPolicyRequest
25, // 23: headscale.v1.HeadscaleService.GetPolicy:input_type -> headscale.v1.GetPolicyRequest 25, // 23: headscale.v1.HeadscaleService.SetPolicy:input_type -> headscale.v1.SetPolicyRequest
26, // 24: headscale.v1.HeadscaleService.SetPolicy:input_type -> headscale.v1.SetPolicyRequest 0, // 24: headscale.v1.HeadscaleService.Health:input_type -> headscale.v1.HealthRequest
1, // 25: headscale.v1.HeadscaleService.Health:input_type -> headscale.v1.HealthRequest 26, // 25: headscale.v1.HeadscaleService.CreateUser:output_type -> headscale.v1.CreateUserResponse
27, // 26: headscale.v1.HeadscaleService.CreateUser:output_type -> headscale.v1.CreateUserResponse 27, // 26: headscale.v1.HeadscaleService.RenameUser:output_type -> headscale.v1.RenameUserResponse
28, // 27: headscale.v1.HeadscaleService.RenameUser:output_type -> headscale.v1.RenameUserResponse 28, // 27: headscale.v1.HeadscaleService.DeleteUser:output_type -> headscale.v1.DeleteUserResponse
29, // 28: headscale.v1.HeadscaleService.DeleteUser:output_type -> headscale.v1.DeleteUserResponse 29, // 28: headscale.v1.HeadscaleService.ListUsers:output_type -> headscale.v1.ListUsersResponse
30, // 29: headscale.v1.HeadscaleService.ListUsers:output_type -> headscale.v1.ListUsersResponse 30, // 29: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse
31, // 30: headscale.v1.HeadscaleService.CreatePreAuthKey:output_type -> headscale.v1.CreatePreAuthKeyResponse 31, // 30: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse
32, // 31: headscale.v1.HeadscaleService.ExpirePreAuthKey:output_type -> headscale.v1.ExpirePreAuthKeyResponse 32, // 31: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse
33, // 32: headscale.v1.HeadscaleService.ListPreAuthKeys:output_type -> headscale.v1.ListPreAuthKeysResponse 33, // 32: headscale.v1.HeadscaleService.DebugCreateNode:output_type -> headscale.v1.DebugCreateNodeResponse
34, // 33: headscale.v1.HeadscaleService.DebugCreateNode:output_type -> headscale.v1.DebugCreateNodeResponse 34, // 33: headscale.v1.HeadscaleService.GetNode:output_type -> headscale.v1.GetNodeResponse
35, // 34: headscale.v1.HeadscaleService.GetNode:output_type -> headscale.v1.GetNodeResponse 35, // 34: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse
36, // 35: headscale.v1.HeadscaleService.SetTags:output_type -> headscale.v1.SetTagsResponse 36, // 35: headscale.v1.HeadscaleService.SetApprovedRoutes:output_type -> headscale.v1.SetApprovedRoutesResponse
37, // 36: headscale.v1.HeadscaleService.SetApprovedRoutes:output_type -> headscale.v1.SetApprovedRoutesResponse 37, // 36: headscale.v1.HeadscaleService.RegisterNode:output_type -> headscale.v1.RegisterNodeResponse
38, // 37: headscale.v1.HeadscaleService.RegisterNode:output_type -> headscale.v1.RegisterNodeResponse 38, // 37: headscale.v1.HeadscaleService.DeleteNode:output_type -> headscale.v1.DeleteNodeResponse
39, // 38: headscale.v1.HeadscaleService.DeleteNode:output_type -> headscale.v1.DeleteNodeResponse 39, // 38: headscale.v1.HeadscaleService.ExpireNode:output_type -> headscale.v1.ExpireNodeResponse
40, // 39: headscale.v1.HeadscaleService.ExpireNode:output_type -> headscale.v1.ExpireNodeResponse 40, // 39: headscale.v1.HeadscaleService.RenameNode:output_type -> headscale.v1.RenameNodeResponse
41, // 40: headscale.v1.HeadscaleService.RenameNode:output_type -> headscale.v1.RenameNodeResponse 41, // 40: headscale.v1.HeadscaleService.ListNodes:output_type -> headscale.v1.ListNodesResponse
42, // 41: headscale.v1.HeadscaleService.ListNodes:output_type -> headscale.v1.ListNodesResponse 42, // 41: headscale.v1.HeadscaleService.MoveNode:output_type -> headscale.v1.MoveNodeResponse
43, // 42: headscale.v1.HeadscaleService.MoveNode:output_type -> headscale.v1.MoveNodeResponse 43, // 42: headscale.v1.HeadscaleService.BackfillNodeIPs:output_type -> headscale.v1.BackfillNodeIPsResponse
44, // 43: headscale.v1.HeadscaleService.BackfillNodeIPs:output_type -> headscale.v1.BackfillNodeIPsResponse 44, // 43: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse
45, // 44: headscale.v1.HeadscaleService.CreateApiKey:output_type -> headscale.v1.CreateApiKeyResponse 45, // 44: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse
46, // 45: headscale.v1.HeadscaleService.ExpireApiKey:output_type -> headscale.v1.ExpireApiKeyResponse 46, // 45: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse
47, // 46: headscale.v1.HeadscaleService.ListApiKeys:output_type -> headscale.v1.ListApiKeysResponse 47, // 46: headscale.v1.HeadscaleService.DeleteApiKey:output_type -> headscale.v1.DeleteApiKeyResponse
48, // 47: headscale.v1.HeadscaleService.DeleteApiKey:output_type -> headscale.v1.DeleteApiKeyResponse 48, // 47: headscale.v1.HeadscaleService.GetPolicy:output_type -> headscale.v1.GetPolicyResponse
49, // 48: headscale.v1.HeadscaleService.GetPolicy:output_type -> headscale.v1.GetPolicyResponse 49, // 48: headscale.v1.HeadscaleService.SetPolicy:output_type -> headscale.v1.SetPolicyResponse
50, // 49: headscale.v1.HeadscaleService.SetPolicy:output_type -> headscale.v1.SetPolicyResponse 1, // 49: headscale.v1.HeadscaleService.Health:output_type -> headscale.v1.HealthResponse
2, // 50: headscale.v1.HeadscaleService.Health:output_type -> headscale.v1.HealthResponse 25, // [25:50] is the sub-list for method output_type
26, // [26:51] is the sub-list for method output_type 0, // [0:25] is the sub-list for method input_type
1, // [1:26] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name
1, // [1:1] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee
1, // [1:1] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name
0, // [0:1] is the sub-list for field type_name
} }
func init() { file_headscale_v1_headscale_proto_init() } func init() { file_headscale_v1_headscale_proto_init() }
@ -333,14 +281,13 @@ func file_headscale_v1_headscale_proto_init() {
File: protoimpl.DescBuilder{ File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_headscale_v1_headscale_proto_rawDesc), len(file_headscale_v1_headscale_proto_rawDesc)), RawDescriptor: unsafe.Slice(unsafe.StringData(file_headscale_v1_headscale_proto_rawDesc), len(file_headscale_v1_headscale_proto_rawDesc)),
NumEnums: 1, NumEnums: 0,
NumMessages: 2, NumMessages: 2,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },
GoTypes: file_headscale_v1_headscale_proto_goTypes, GoTypes: file_headscale_v1_headscale_proto_goTypes,
DependencyIndexes: file_headscale_v1_headscale_proto_depIdxs, DependencyIndexes: file_headscale_v1_headscale_proto_depIdxs,
EnumInfos: file_headscale_v1_headscale_proto_enumTypes,
MessageInfos: file_headscale_v1_headscale_proto_msgTypes, MessageInfos: file_headscale_v1_headscale_proto_msgTypes,
}.Build() }.Build()
File_headscale_v1_headscale_proto = out.File File_headscale_v1_headscale_proto = out.File

View File

@ -1082,19 +1082,11 @@
"v1HealthResponse": { "v1HealthResponse": {
"type": "object", "type": "object",
"properties": { "properties": {
"status": { "dbPing": {
"$ref": "#/definitions/v1HealthStatus" "type": "boolean"
} }
} }
}, },
"v1HealthStatus": {
"type": "string",
"enum": [
"Fail",
"Pass"
],
"default": "Fail"
},
"v1ListApiKeysResponse": { "v1ListApiKeysResponse": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@ -823,14 +823,20 @@ func (api headscaleV1APIServer) Health(
ctx context.Context, ctx context.Context,
request *v1.HealthRequest, request *v1.HealthRequest,
) (*v1.HealthResponse, error) { ) (*v1.HealthResponse, error) {
var healthErr error
response := &v1.HealthResponse{}
if err := api.h.state.PingDB(ctx); err != nil { if err := api.h.state.PingDB(ctx); err != nil {
log.Error(). healthErr = fmt.Errorf("database ping failed: %w", err)
Err(err). } else {
Msg("Health check failed: database ping failed") response.DbPing = true
return &v1.HealthResponse{Status: v1.HealthStatus_Fail}, nil
} }
return &v1.HealthResponse{Status: v1.HealthStatus_Pass}, nil if healthErr != nil {
log.Error().Err(healthErr).Msg("Health check failed")
}
return response, healthErr
} }
func (api headscaleV1APIServer) mustEmbedUnimplementedHeadscaleServiceServer() {} func (api headscaleV1APIServer) mustEmbedUnimplementedHeadscaleServiceServer() {}

View File

@ -218,13 +218,8 @@ service HeadscaleService {
// } // }
} }
enum HealthStatus {
Fail = 0;
Pass = 1;
}
message HealthRequest {} message HealthRequest {}
message HealthResponse { message HealthResponse {
HealthStatus status = 1; bool db_ping = 1;
} }