Skip to content

Commit 2dfbcb8

Browse files
weltekialexellis
authored andcommitted
Use golang-middleware function for sleep function
Convert the sleep function to use the golang-middleware template and of-watchdog instead of the deprecated go template. Signed-off-by: Han Verstraete (OpenFaaS Ltd) <han@openfaas.com>
1 parent 6b7588a commit 2dfbcb8

File tree

3 files changed

+52
-24
lines changed

3 files changed

+52
-24
lines changed

sleep/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module handler/function
2+
3+
go 1.18

sleep/handler.go

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,58 +4,85 @@ import (
44
"fmt"
55
"log"
66
"math/rand"
7+
"net/http"
78
"os"
89
"time"
910
)
1011

11-
var r *rand.Rand
12+
var (
13+
random *rand.Rand
14+
defaultDuration time.Duration = time.Second * 2
15+
)
1216

1317
func init() {
18+
random = rand.New(rand.NewSource(time.Now().Unix()))
1419

15-
r = rand.New(rand.NewSource(time.Now().Unix()))
20+
if val, ok := os.LookupEnv("sleep_duration"); ok && len(val) > 0 {
21+
var err error
22+
defaultDuration, err = time.ParseDuration(val)
23+
if err != nil {
24+
log.Fatalf("Error parsing sleep_duration environment variable: %v", err)
25+
}
26+
}
1627
}
1728

1829
// Handle a serverless request
1930
// 1. When no headers are given, sleep for the environment variable: sleep_duration.
2031
// 2. When an X-Sleep header is given, sleep for that amount of time.
2132
// 3. When the X-Min-Sleep and X-Max-Sleep headers are given, sleep for a random amount
2233
// of time between those two figures
23-
func Handle(req []byte) string {
24-
25-
if v := os.Getenv("Http_Path"); v == "/_/ready" {
26-
return "ok"
27-
}
28-
29-
if minV, ok := os.LookupEnv("Http_X_Min_Sleep"); ok && len(minV) > 0 {
30-
if maxV, ok := os.LookupEnv("Http_X_Max_Sleep"); ok && len(maxV) > 0 {
31-
minSleep, _ := time.ParseDuration(minV)
32-
maxSleep, _ := time.ParseDuration(maxV)
34+
func Handle(w http.ResponseWriter, r *http.Request) {
35+
if minV := r.Header.Get("X-Min-Sleep"); len(minV) > 0 {
36+
if maxV := r.Header.Get("X-Max-Sleep"); len(maxV) > 0 {
37+
minSleep, err := time.ParseDuration(minV)
38+
if err != nil {
39+
log.Printf("Error parsing X-Min-Sleep header: %v", err)
40+
w.WriteHeader(http.StatusBadRequest)
41+
fmt.Fprintf(w, "Error parsing X-Min-Sleep header: %v", err)
42+
return
43+
}
44+
maxSleep, err := time.ParseDuration(maxV)
45+
if err != nil {
46+
log.Printf("Error parsing X-Max-Sleep header: %v", err)
47+
w.WriteHeader(http.StatusBadRequest)
48+
fmt.Fprintf(w, "Error parsing X-Max-Sleep header: %v", err)
49+
return
50+
}
3351

3452
minMs := minSleep.Milliseconds()
3553
maxMs := maxSleep.Milliseconds()
3654

37-
randMs := r.Int63n(maxMs-minMs) + minMs
55+
randMs := random.Int63n(maxMs-minMs) + minMs
3856

3957
sleepDuration, _ := time.ParseDuration(fmt.Sprintf("%dms", randMs))
4058

4159
log.Printf("Start sleep for: %fs\n", sleepDuration.Seconds())
4260
time.Sleep(sleepDuration)
4361
log.Printf("Sleep done for: %fs\n", sleepDuration.Seconds())
44-
return fmt.Sprintf("Slept for: %fs", sleepDuration.Seconds())
62+
63+
w.WriteHeader(http.StatusOK)
64+
fmt.Fprintf(w, "Slept for: %fs", sleepDuration.Seconds())
65+
return
4566
}
4667
}
4768

48-
sleepDuration := time.Second * 2
69+
sleepDuration := defaultDuration
4970

50-
if val, ok := os.LookupEnv("Http_X_Sleep"); ok && len(val) > 0 {
51-
sleepDuration, _ = time.ParseDuration(val)
52-
} else if val, ok := os.LookupEnv("sleep_duration"); ok && len(val) > 0 {
53-
sleepDuration, _ = time.ParseDuration(val)
71+
var err error
72+
if val := r.Header.Get("X-Sleep"); len(val) > 0 {
73+
sleepDuration, err = time.ParseDuration(val)
74+
if err != nil {
75+
log.Printf("Error parsing X-Sleep header: %v", err)
76+
w.WriteHeader(http.StatusBadRequest)
77+
fmt.Fprintf(w, "Error parsing X-Sleep header: %v", err)
78+
return
79+
}
5480
}
5581

5682
log.Printf("Start sleep for: %fs\n", sleepDuration.Seconds())
5783
time.Sleep(sleepDuration)
5884
log.Printf("Sleep done for: %fs\n", sleepDuration.Seconds())
5985

60-
return fmt.Sprintf("Slept for: %fs", sleepDuration.Seconds())
86+
w.WriteHeader(http.StatusOK)
87+
fmt.Fprintf(w, "Slept for: %fs", sleepDuration.Seconds())
6188
}

stack.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,11 @@ functions:
6969
com.openfaas.ui.ext: "mp4"
7070

7171
sleep:
72-
lang: go
72+
lang: golang-middleware
7373
handler: ./sleep
7474
image: ${SERVER:-ghcr.io}/${OWNER:-openfaas}/sleep:${TAG:-latest}
7575
environment:
7676
sleep_duration: 2s
77-
combine_output: false
7877

7978
haveibeenpwned:
8079
lang: go
@@ -100,13 +99,12 @@ functions:
10099
lang: golang-middleware
101100
handler: ./markdown
102101
image: ${SERVER:-ghcr.io}/${OWNER:-openfaas}/markdown-fn:${TAG:-latest}
103-
102+
104103
nvidia-smi:
105104
lang: dockerfile
106105
handler: ./nvidia-smi
107106
image: ${SERVER:-ghcr.io}/${OWNER:-openfaas}/nvidia-smi:${TAG:-latest}
108107

109-
110108
configuration:
111109
templates:
112110
- name: golang-middleware

0 commit comments

Comments
 (0)