Skip to content

Commit bc16c51

Browse files
committed
fix: use v5 restart helper when upgrading v1beta11 schemas
Signed-off-by: Russell Centanni <[email protected]>
1 parent fd90d46 commit bc16c51

File tree

16 files changed

+584
-14
lines changed

16 files changed

+584
-14
lines changed

e2e/e2e_suite_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
_ "github.com/loft-sh/devspace/e2e/tests/pullsecret"
2626
_ "github.com/loft-sh/devspace/e2e/tests/render"
2727
_ "github.com/loft-sh/devspace/e2e/tests/replacepods"
28+
_ "github.com/loft-sh/devspace/e2e/tests/restarthelper"
2829
_ "github.com/loft-sh/devspace/e2e/tests/ssh"
2930
_ "github.com/loft-sh/devspace/e2e/tests/sync"
3031
_ "github.com/loft-sh/devspace/e2e/tests/terminal"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package restarthelper
2+
3+
import "github.com/onsi/ginkgo/v2"
4+
5+
// DevSpaceDescribe annotates the test with the label.
6+
func DevSpaceDescribe(text string, body func()) bool {
7+
return ginkgo.Describe("[restarthelper] "+text, body)
8+
}
Lines changed: 381 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,381 @@
1+
package restarthelper
2+
3+
import (
4+
"bufio"
5+
"context"
6+
"github.com/loft-sh/devspace/cmd"
7+
"github.com/loft-sh/devspace/cmd/flags"
8+
"github.com/loft-sh/devspace/e2e/framework"
9+
"github.com/loft-sh/devspace/e2e/kube"
10+
"github.com/loft-sh/devspace/pkg/util/factory"
11+
logpkg "github.com/loft-sh/devspace/pkg/util/log"
12+
scanner2 "github.com/loft-sh/devspace/pkg/util/scanner"
13+
"github.com/onsi/ginkgo/v2"
14+
"github.com/onsi/gomega"
15+
"github.com/sirupsen/logrus"
16+
"os"
17+
"strings"
18+
"time"
19+
)
20+
21+
var _ = DevSpaceDescribe("restarthelper", func() {
22+
initialDir, err := os.Getwd()
23+
if err != nil {
24+
panic(err)
25+
}
26+
27+
// create a new factory
28+
var (
29+
f factory.Factory
30+
kubeClient *kube.KubeHelper
31+
specTimeout = ginkgo.SpecTimeout(30 * time.Second)
32+
)
33+
34+
ginkgo.BeforeEach(func() {
35+
f = framework.NewDefaultFactory()
36+
37+
kubeClient, err = kube.NewKubeHelper()
38+
framework.ExpectNoError(err)
39+
})
40+
41+
ginkgo.It("should inject legacy restart helper after v1beta11 schema upgrade and start container", func(ctx context.Context) {
42+
tempDir, err := framework.CopyToTempDir("tests/restarthelper/testdata/v5")
43+
framework.ExpectNoError(err)
44+
defer framework.CleanupTempDir(initialDir, tempDir)
45+
46+
ns, err := kubeClient.CreateNamespace("restarthelper")
47+
framework.ExpectNoError(err)
48+
defer framework.ExpectDeleteNamespace(kubeClient, ns)
49+
50+
// create a new dev command and start it
51+
done := make(chan error)
52+
cancelCtx, cancel := context.WithCancel(ctx)
53+
defer cancel()
54+
55+
reader, writer, err := os.Pipe()
56+
framework.ExpectNoError(err)
57+
58+
//output := &bytes.Buffer{}
59+
log := logpkg.NewStreamLogger(writer, writer, logrus.DebugLevel)
60+
61+
go func() {
62+
devCmd := &cmd.RunPipelineCmd{
63+
GlobalFlags: &flags.GlobalFlags{
64+
NoWarn: true,
65+
Namespace: ns,
66+
},
67+
Pipeline: "dev",
68+
SkipPush: true,
69+
Ctx: cancelCtx,
70+
Log: log,
71+
}
72+
err = devCmd.RunDefault(f)
73+
if err != nil {
74+
f.GetLog().Errorf("error: %v", err)
75+
}
76+
done <- err
77+
}()
78+
79+
scanner := bufio.NewScanner(reader)
80+
scanner.Split(scanner2.ScanLines)
81+
82+
waitSeen := false
83+
waitCount := 0
84+
waitMax := 3
85+
waitingMessage := "(Still waiting...)"
86+
startedMessage := "Started with legacy restart helper"
87+
startedSeen := false
88+
89+
for scanner.Scan() {
90+
text := scanner.Text()
91+
hasStartedMessage := strings.HasSuffix(text, startedMessage)
92+
if hasStartedMessage {
93+
startedSeen = true
94+
break
95+
}
96+
97+
hasWaitingMessage := strings.HasSuffix(text, waitingMessage)
98+
if hasWaitingMessage {
99+
if !waitSeen {
100+
waitSeen = true
101+
}
102+
103+
if waitSeen {
104+
waitCount++
105+
}
106+
}
107+
108+
if waitSeen && !hasWaitingMessage {
109+
break
110+
}
111+
112+
if waitCount > waitMax {
113+
break
114+
}
115+
}
116+
117+
cancel()
118+
<-done
119+
120+
gomega.Expect(waitCount).Should(gomega.BeNumerically("<", waitMax), "restart helper is waiting longer than expected")
121+
gomega.Expect(startedSeen).Should(gomega.BeTrue(), "container should have started")
122+
}, specTimeout)
123+
124+
ginkgo.It("should automatically inject restart helper and start container", func(ctx context.Context) {
125+
tempDir, err := framework.CopyToTempDir("tests/restarthelper/testdata/v6")
126+
framework.ExpectNoError(err)
127+
defer framework.CleanupTempDir(initialDir, tempDir)
128+
129+
ns, err := kubeClient.CreateNamespace("restarthelper")
130+
framework.ExpectNoError(err)
131+
defer framework.ExpectDeleteNamespace(kubeClient, ns)
132+
133+
// create a new dev command and start it
134+
done := make(chan error)
135+
cancelCtx, cancel := context.WithCancel(ctx)
136+
defer cancel()
137+
138+
reader, writer, err := os.Pipe()
139+
framework.ExpectNoError(err)
140+
141+
//output := &bytes.Buffer{}
142+
log := logpkg.NewStreamLogger(writer, writer, logrus.DebugLevel)
143+
144+
go func() {
145+
devCmd := &cmd.RunPipelineCmd{
146+
GlobalFlags: &flags.GlobalFlags{
147+
NoWarn: true,
148+
Namespace: ns,
149+
},
150+
Pipeline: "dev",
151+
SkipPush: true,
152+
Ctx: cancelCtx,
153+
Log: log,
154+
}
155+
err = devCmd.RunDefault(f)
156+
if err != nil {
157+
f.GetLog().Errorf("error: %v", err)
158+
}
159+
done <- err
160+
}()
161+
162+
scanner := bufio.NewScanner(reader)
163+
scanner.Split(scanner2.ScanLines)
164+
165+
waitSeen := false
166+
waitCount := 0
167+
waitMax := 3
168+
waitingMessage := "(Still waiting...)"
169+
startedMessage := "Started with restart helper"
170+
startedSeen := false
171+
172+
for scanner.Scan() {
173+
text := scanner.Text()
174+
hasStartedMessage := strings.HasSuffix(text, startedMessage)
175+
if hasStartedMessage {
176+
startedSeen = true
177+
break
178+
}
179+
180+
hasWaitingMessage := strings.HasSuffix(text, waitingMessage)
181+
if hasWaitingMessage {
182+
if !waitSeen {
183+
waitSeen = true
184+
}
185+
186+
if waitSeen {
187+
waitCount++
188+
}
189+
}
190+
191+
if waitSeen && !hasWaitingMessage {
192+
break
193+
}
194+
195+
if waitCount > waitMax {
196+
break
197+
}
198+
}
199+
200+
cancel()
201+
<-done
202+
203+
gomega.Expect(waitCount).Should(gomega.BeNumerically("<", waitMax), "restart helper is waiting longer than expected")
204+
gomega.Expect(startedSeen).Should(gomega.BeTrue(), "container should have started")
205+
}, specTimeout)
206+
207+
ginkgo.It("should manually inject restart helper and automatically override with current restart helper", func(ctx context.Context) {
208+
tempDir, err := framework.CopyToTempDir("tests/restarthelper/testdata/v6-inject-restart-helper")
209+
framework.ExpectNoError(err)
210+
defer framework.CleanupTempDir(initialDir, tempDir)
211+
212+
ns, err := kubeClient.CreateNamespace("restarthelper")
213+
framework.ExpectNoError(err)
214+
defer framework.ExpectDeleteNamespace(kubeClient, ns)
215+
216+
// create a new dev command and start it
217+
done := make(chan error)
218+
cancelCtx, cancel := context.WithCancel(ctx)
219+
defer cancel()
220+
221+
reader, writer, err := os.Pipe()
222+
framework.ExpectNoError(err)
223+
224+
//output := &bytes.Buffer{}
225+
log := logpkg.NewStreamLogger(writer, writer, logrus.DebugLevel)
226+
227+
go func() {
228+
devCmd := &cmd.RunPipelineCmd{
229+
GlobalFlags: &flags.GlobalFlags{
230+
NoWarn: true,
231+
Namespace: ns,
232+
},
233+
Pipeline: "dev",
234+
SkipPush: true,
235+
Ctx: cancelCtx,
236+
Log: log,
237+
}
238+
err = devCmd.RunDefault(f)
239+
if err != nil {
240+
f.GetLog().Errorf("error: %v", err)
241+
}
242+
done <- err
243+
}()
244+
245+
scanner := bufio.NewScanner(reader)
246+
scanner.Split(scanner2.ScanLines)
247+
248+
waitSeen := false
249+
waitCount := 0
250+
waitMax := 3
251+
waitingMessage := "(Still waiting...)"
252+
startedMessage := "Started with restart helper"
253+
startedSeen := false
254+
legacyStartedMessage := "Started with restart helper"
255+
legacyStartedSeen := false
256+
257+
for scanner.Scan() {
258+
text := scanner.Text()
259+
hasStartedMessage := strings.HasSuffix(text, startedMessage)
260+
if hasStartedMessage {
261+
startedSeen = true
262+
break
263+
}
264+
265+
hasLegacyStartedMessage := strings.HasSuffix(text, legacyStartedMessage)
266+
if hasLegacyStartedMessage {
267+
legacyStartedSeen = true
268+
break
269+
}
270+
271+
hasWaitingMessage := strings.HasSuffix(text, waitingMessage)
272+
if hasWaitingMessage {
273+
if !waitSeen {
274+
waitSeen = true
275+
}
276+
277+
if waitSeen {
278+
waitCount++
279+
}
280+
}
281+
282+
if waitSeen && !hasWaitingMessage {
283+
break
284+
}
285+
286+
if waitCount > waitMax {
287+
break
288+
}
289+
}
290+
291+
cancel()
292+
<-done
293+
294+
gomega.Expect(waitCount).Should(gomega.BeNumerically("<", waitMax), "restart helper is waiting longer than expected")
295+
gomega.Expect(startedSeen).Should(gomega.BeTrue(), "container should have started")
296+
gomega.Expect(legacyStartedSeen).Should(gomega.BeFalse(), "container should not have started with legacy helper")
297+
}, specTimeout)
298+
299+
ginkgo.It("should manually inject restart helper and require manual start", func(ctx context.Context) {
300+
tempDir, err := framework.CopyToTempDir("tests/restarthelper/testdata/v6-manual-start")
301+
framework.ExpectNoError(err)
302+
defer framework.CleanupTempDir(initialDir, tempDir)
303+
304+
ns, err := kubeClient.CreateNamespace("restarthelper")
305+
framework.ExpectNoError(err)
306+
defer framework.ExpectDeleteNamespace(kubeClient, ns)
307+
308+
// create a new dev command and start it
309+
done := make(chan error)
310+
cancelCtx, cancel := context.WithCancel(ctx)
311+
defer cancel()
312+
313+
reader, writer, err := os.Pipe()
314+
framework.ExpectNoError(err)
315+
316+
//output := &bytes.Buffer{}
317+
log := logpkg.NewStreamLogger(writer, writer, logrus.DebugLevel)
318+
319+
go func() {
320+
devCmd := &cmd.RunPipelineCmd{
321+
GlobalFlags: &flags.GlobalFlags{
322+
NoWarn: true,
323+
Namespace: ns,
324+
},
325+
Pipeline: "dev",
326+
SkipPush: true,
327+
Ctx: cancelCtx,
328+
Log: log,
329+
}
330+
err = devCmd.RunDefault(f)
331+
if err != nil {
332+
f.GetLog().Errorf("error: %v", err)
333+
}
334+
done <- err
335+
}()
336+
337+
scanner := bufio.NewScanner(reader)
338+
scanner.Split(scanner2.ScanLines)
339+
340+
waitSeen := false
341+
waitCount := 0
342+
waitMax := 3
343+
waitingMessage := "(Still waiting...)"
344+
startedMessage := "Started manually"
345+
startedSeen := false
346+
347+
for scanner.Scan() {
348+
text := scanner.Text()
349+
hasStartedMessage := strings.HasSuffix(text, startedMessage)
350+
if hasStartedMessage {
351+
startedSeen = true
352+
break
353+
}
354+
355+
hasWaitingMessage := strings.HasSuffix(text, waitingMessage)
356+
if hasWaitingMessage {
357+
if !waitSeen {
358+
waitSeen = true
359+
}
360+
361+
if waitSeen {
362+
waitCount++
363+
}
364+
}
365+
366+
if waitSeen && !hasWaitingMessage {
367+
break
368+
}
369+
370+
if waitCount > waitMax {
371+
break
372+
}
373+
}
374+
375+
cancel()
376+
<-done
377+
378+
gomega.Expect(waitCount).Should(gomega.BeNumerically("<", waitMax), "restart helper is waiting longer than expected")
379+
gomega.Expect(startedSeen).Should(gomega.BeTrue(), "container should have started")
380+
}, specTimeout)
381+
})

0 commit comments

Comments
 (0)