@@ -3,28 +3,26 @@ package suite
3
3
import (
4
4
"context"
5
5
"errors"
6
+ "fmt"
6
7
"net/http"
7
- "os/exec"
8
8
"strings"
9
9
"time"
10
10
11
11
. "github.com/onsi/ginkgo/v2"
12
12
. "github.com/onsi/gomega"
13
+ v1 "k8s.io/api/batch/v1"
13
14
coordination "k8s.io/api/coordination/v1"
14
15
core "k8s.io/api/core/v1"
15
16
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16
17
"k8s.io/apimachinery/pkg/types"
17
18
"k8s.io/apimachinery/pkg/util/wait"
18
19
"sigs.k8s.io/controller-runtime/pkg/client"
20
+ "sigs.k8s.io/yaml"
19
21
20
22
"github.com/nginxinc/nginx-gateway-fabric/tests/framework"
21
23
)
22
24
23
25
const (
24
- // FIXME(bjee19): Find an automated way to keep the version updated here similar to dependabot.
25
- // https://github.com/nginxinc/nginx-gateway-fabric/issues/1665
26
- debugImage = "busybox:1.28"
27
-
28
26
teaURL = "https://cafe.example.com/tea"
29
27
coffeeURL = "http://cafe.example.com/coffee"
30
28
nginxContainerName = "nginx"
@@ -72,8 +70,7 @@ var _ = Describe("Graceful Recovery test", Ordered, Label("nfr", "graceful-recov
72
70
leaseName , err := getLeaderElectionLeaseHolderName ()
73
71
Expect (err ).ToNot (HaveOccurred ())
74
72
75
- output , err := restartNGFProcess ()
76
- Expect (err ).ToNot (HaveOccurred (), string (output ))
73
+ restartNGFProcess ()
77
74
78
75
checkContainerLogsForErrors (podNames [0 ])
79
76
@@ -104,8 +101,7 @@ var _ = Describe("Graceful Recovery test", Ordered, Label("nfr", "graceful-recov
104
101
leaseName , err := getLeaderElectionLeaseHolderName ()
105
102
Expect (err ).ToNot (HaveOccurred ())
106
103
107
- output , err := restartNginxContainer ()
108
- Expect (err ).ToNot (HaveOccurred (), string (output ))
104
+ restartNginxContainer ()
109
105
110
106
checkContainerLogsForErrors (podNames [0 ])
111
107
@@ -129,64 +125,40 @@ var _ = Describe("Graceful Recovery test", Ordered, Label("nfr", "graceful-recov
129
125
})
130
126
})
131
127
132
- func restartNginxContainer () ([] byte , error ) {
128
+ func restartNginxContainer () {
133
129
podNames , err := framework .GetReadyNGFPodNames (k8sClient , ngfNamespace , releaseName , timeoutConfig .GetTimeout )
134
130
Expect (err ).ToNot (HaveOccurred ())
135
131
Expect (podNames ).ToNot (BeEmpty ())
136
132
137
133
restartCount , err := getContainerRestartCount (nginxContainerName , podNames [0 ])
138
134
Expect (err ).ToNot (HaveOccurred ())
139
135
140
- output , err := exec .Command ( // nolint:gosec
141
- "kubectl" ,
142
- "exec" ,
143
- "-n" ,
144
- ngfNamespace ,
145
- podNames [0 ],
146
- "--container" ,
147
- "nginx" ,
148
- "--" ,
149
- "sh" ,
150
- "-c" ,
151
- "$(PID=$(pgrep -f \" [n]ginx: master process\" ) && kill -9 $PID)" ).CombinedOutput ()
152
- if err != nil {
153
- return output , err
154
- }
136
+ job , err := runNodeDebuggerJob (podNames [0 ], "PID=$(pgrep -f \" [n]ginx: master process\" ) && kill -9 $PID" )
137
+ Expect (err ).ToNot (HaveOccurred ())
155
138
156
139
err = waitForContainerRestart (podNames [0 ], nginxContainerName , restartCount )
157
140
Expect (err ).ToNot (HaveOccurred ())
158
141
159
- return nil , nil
142
+ err = resourceManager .Delete ([]client.Object {job })
143
+ Expect (err ).ToNot (HaveOccurred ())
160
144
}
161
145
162
- func restartNGFProcess () ([] byte , error ) {
146
+ func restartNGFProcess () {
163
147
podNames , err := framework .GetReadyNGFPodNames (k8sClient , ngfNamespace , releaseName , timeoutConfig .GetTimeout )
164
148
Expect (err ).ToNot (HaveOccurred ())
165
149
Expect (podNames ).ToNot (BeEmpty ())
166
150
167
151
restartCount , err := getContainerRestartCount (ngfContainerName , podNames [0 ])
168
152
Expect (err ).ToNot (HaveOccurred ())
169
153
170
- output , err := exec .Command ( // nolint:gosec
171
- "kubectl" ,
172
- "debug" ,
173
- "-n" ,
174
- ngfNamespace ,
175
- podNames [0 ],
176
- "--image=" + debugImage ,
177
- "--target=nginx-gateway" ,
178
- "--" ,
179
- "sh" ,
180
- "-c" ,
181
- "$(PID=$(pgrep -f \" /[u]sr/bin/gateway\" ) && kill -9 $PID)" ).CombinedOutput ()
182
- if err != nil {
183
- return output , err
184
- }
154
+ job , err := runNodeDebuggerJob (podNames [0 ], "PID=$(pgrep -f \" /[u]sr/bin/gateway\" ) && kill -9 $PID" )
155
+ Expect (err ).ToNot (HaveOccurred ())
185
156
186
157
err = waitForContainerRestart (podNames [0 ], ngfContainerName , restartCount )
187
158
Expect (err ).ToNot (HaveOccurred ())
188
159
189
- return nil , nil
160
+ err = resourceManager .Delete ([]client.Object {job })
161
+ Expect (err ).ToNot (HaveOccurred ())
190
162
}
191
163
192
164
func waitForContainerRestart (ngfPodName string , containerName string , currentRestartCount int ) error {
@@ -355,3 +327,34 @@ func getContainerRestartCount(containerName, ngfPodName string) (int, error) {
355
327
356
328
return restartCount , nil
357
329
}
330
+
331
+ func runNodeDebuggerJob (ngfPodName , jobScript string ) (* v1.Job , error ) {
332
+ ctx , cancel := context .WithTimeout (context .Background (), timeoutConfig .GetTimeout )
333
+ defer cancel ()
334
+
335
+ var ngfPod core.Pod
336
+ if err := k8sClient .Get (ctx , types.NamespacedName {Namespace : ngfNamespace , Name : ngfPodName }, & ngfPod ); err != nil {
337
+ return nil , errors .New ("could not retrieve ngfPod" )
338
+ }
339
+
340
+ b , err := resourceManager .GetFileContents ("graceful-recovery/node-debugger-job.yaml" )
341
+ if err != nil {
342
+ return nil , errors .New ("error processing node debugger job file" )
343
+ }
344
+
345
+ job := & v1.Job {}
346
+ _ = v1 .AddToScheme (resourceManager .K8sClient .Scheme ())
347
+ if err = yaml .Unmarshal (b .Bytes (), job ); err != nil {
348
+ return nil , errors .New ("error with yaml unmarshal" )
349
+ }
350
+
351
+ job .Spec .Template .Spec .NodeSelector ["kubernetes.io/hostname" ] = ngfPod .Spec .NodeName
352
+ job .Spec .Template .Spec .Containers [0 ].Args = []string {jobScript }
353
+ job .Namespace = ngfNamespace
354
+
355
+ if err = resourceManager .Apply ([]client.Object {job }); err != nil {
356
+ return nil , fmt .Errorf ("errored in applying job: %w" , err )
357
+ }
358
+
359
+ return job , nil
360
+ }
0 commit comments