Skip to content

Commit 3f57376

Browse files
authored
feat: add liveness and readiness probe (#205)
* add liveness and readiness probe * add comment * handle wireguard state with probe * decrease period second
1 parent 0cf89fa commit 3f57376

File tree

3 files changed

+65
-9
lines changed

3 files changed

+65
-9
lines changed

cmd/agent/main.go

+36-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ package main
33
import (
44
"flag"
55
"fmt"
6+
"log"
7+
"net/http"
8+
"os"
9+
610
"github.com/go-logr/stdr"
711
"github.com/jodevsa/wireguard-operator/internal/iptables"
812
"github.com/jodevsa/wireguard-operator/pkg/agent"
913
"github.com/jodevsa/wireguard-operator/pkg/wireguard"
10-
"log"
11-
"os"
1214
)
1315

1416
func main() {
@@ -98,6 +100,36 @@ func main() {
98100

99101
defer close()
100102

101-
// Block main goroutine forever.
102-
<-make(chan struct{})
103+
httpLog := log.WithName("http")
104+
105+
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
106+
state, _, err := agent.GetDesiredState(configFilePath)
107+
108+
if err != nil {
109+
httpLog.Error(err, "agent is not ready as it cannot get server state")
110+
w.WriteHeader(http.StatusServiceUnavailable)
111+
return
112+
}
113+
114+
err = agent.IsStateValid(state)
115+
116+
if err != nil {
117+
httpLog.Error(err, "agent is not ready as server state not valid")
118+
w.WriteHeader(http.StatusServiceUnavailable)
119+
return
120+
}
121+
122+
err = wg.Sync(state)
123+
124+
if err != nil {
125+
httpLog.Error(err, "agent is not ready as it cannot sync wireguard")
126+
w.WriteHeader(http.StatusServiceUnavailable)
127+
return
128+
}
129+
130+
httpLog.Info("agent is ready")
131+
132+
w.WriteHeader(http.StatusOK)
133+
})
134+
http.ListenAndServe(":8080", nil)
103135
}

pkg/agent/agent.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import (
55
"encoding/hex"
66
"encoding/json"
77
"fmt"
8-
"github.com/go-logr/logr"
98
"os"
109
"path/filepath"
1110

11+
"github.com/go-logr/logr"
12+
1213
"github.com/fsnotify/fsnotify"
1314
"github.com/jodevsa/wireguard-operator/pkg/api/v1alpha1"
1415
)
@@ -19,7 +20,7 @@ type State struct {
1920
Peers []v1alpha1.WireguardPeer
2021
}
2122

22-
func isStateValid(state State) error {
23+
func IsStateValid(state State) error {
2324

2425
if state.ServerPrivateKey == "" {
2526
return fmt.Errorf("server private key is not defined")
@@ -66,7 +67,7 @@ func OnStateChange(path string, logger logr.Logger, onFileChange func(State)) (f
6667
state, hash, err := GetDesiredState(path)
6768

6869
if err == nil {
69-
err := isStateValid(state)
70+
err := IsStateValid(state)
7071

7172
if err != nil {
7273
logger.Error(err, "State is not valid")
@@ -100,7 +101,7 @@ func OnStateChange(path string, logger logr.Logger, onFileChange func(State)) (f
100101
logger.V(9).Info("State content changed", "oldHash", hash, "newHash", newHash)
101102
hash = newHash
102103

103-
err = isStateValid(state)
104+
err = IsStateValid(state)
104105

105106
if err != nil {
106107
logger.Error(err, "State is not valid")

pkg/controllers/wireguard_controller.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import (
4444
// WireguardReconciler reconciles a Wireguard object
4545

4646
const port = 51820
47+
const httpPort = 8080
4748

4849
const metricsPort = 9586
4950

@@ -795,12 +796,34 @@ func (r *WireguardReconciler) deploymentForWireguard(m *v1alpha1.Wireguard) *app
795796
ContainerPort: port,
796797
Name: "wireguard",
797798
Protocol: corev1.ProtocolUDP,
798-
}},
799+
},
800+
{
801+
ContainerPort: port,
802+
Name: "http",
803+
Protocol: corev1.ProtocolTCP,
804+
},
805+
},
799806
EnvFrom: []corev1.EnvFromSource{{
800807
ConfigMapRef: &corev1.ConfigMapEnvSource{
801808
LocalObjectReference: corev1.LocalObjectReference{Name: m.Name + "-config"},
802809
},
803810
}},
811+
ReadinessProbe: &corev1.Probe{
812+
ProbeHandler: corev1.ProbeHandler{
813+
HTTPGet: &corev1.HTTPGetAction{
814+
Port: intstr.FromInt(httpPort),
815+
Path: "/health",
816+
},
817+
},
818+
},
819+
LivenessProbe: &corev1.Probe{
820+
PeriodSeconds: 5,
821+
ProbeHandler: corev1.ProbeHandler{
822+
TCPSocket: &corev1.TCPSocketAction{
823+
Port: intstr.FromInt(httpPort),
824+
},
825+
},
826+
},
804827
VolumeMounts: []corev1.VolumeMount{
805828
{
806829
Name: "socket",

0 commit comments

Comments
 (0)