1 package integration
2
3 import (
4 "context"
5 "fmt"
6 "io"
7 "log"
8 "os"
9 "slices"
10 "strings"
11 "testing"
12
13 "github.com/google/go-containerregistry/pkg/registry"
14 "github.com/stretchr/testify/assert"
15
16 "edge-infra.dev/pkg/f8n/warehouse/packagelock"
17 "edge-infra.dev/pkg/f8n/warehouse/pallet"
18 "edge-infra.dev/pkg/f8n/warehouse/release"
19 "edge-infra.dev/test/f2"
20 "edge-infra.dev/test/f2/x/warehouse"
21 )
22
23 var f f2.Framework
24 var err error
25 var (
26 reg *warehouse.Registry
27 host string
28 hostRepo string
29 ver01911 = "0.19.11"
30 ver02019 = "0.20.19"
31 ver0214 = "0.21.4"
32
33
34 ver0214Minor = "0.21"
35
36 edgeInfraRepo = release.Repository{
37 Repo: release.GCPRepository{
38 Location: "us-east1",
39 Project: "ret-edge-pltf-infra",
40 RepoName: "warehouse",
41 },
42 }
43 localWarehouseRepo release.Repository
44
45 releaser01911 release.Releaser
46 releaser02019 release.Releaser
47 releaser0214 release.Releaser
48 smallEnvironment release.Environment
49 badEnvironment release.Environment
50
51 release0214ExpectedTags = []string{ver0214, ver0214Minor, "latest"}
52 smallEnvironmentLock = packagelock.PackageLock{
53 Packages: []packagelock.LockPackage{
54 {
55 Name: "descheduler",
56 Versions: []packagelock.Version{
57 {
58 Tags: []string{ver0214, ver0214Minor, "latest"},
59 },
60 },
61 },
62 {
63 Name: "store",
64 Versions: []packagelock.Version{
65 {
66 Tags: []string{ver0214, ver0214Minor, "latest"},
67 },
68 },
69 },
70 {
71 Name: "data-sync",
72 Versions: []packagelock.Version{
73 {
74 Tags: []string{ver0214, ver0214Minor, "latest"},
75 },
76 },
77 },
78 },
79 }
80
81 release01911 release.EdgeRelease
82 release02019 release.EdgeRelease
83 release0214 release.EdgeRelease
84 )
85
86 func TestMain(m *testing.M) {
87 l := log.New(io.Discard, "", 0)
88 f = f2.New(context.Background(), f2.WithExtensions(
89 warehouse.New(registry.Logger(l)),
90 )).Component("registry").
91 Setup(func(ctx f2.Context) (f2.Context, error) {
92 reg, err = warehouse.FromContext(ctx)
93 if err != nil {
94 return ctx, err
95 }
96 urlPts := strings.Split(reg.URL, "/")
97 host = urlPts[0]
98 hostRepo = urlPts[1]
99 localWarehouseRepo = release.Repository{
100 Repo: release.RawRepository{
101 RawRegistry: host,
102 RepoName: hostRepo,
103 },
104 }
105 return ctx, nil
106 }).
107 Component("releasers and environment").
108 Setup(func(ctx f2.Context) (f2.Context, error) {
109 releaser01911 = release.Releaser{
110 CurrentVersion: ver01911,
111 SourceRepository: edgeInfraRepo,
112 DestinationRepository: localWarehouseRepo,
113 PalletNames: []string{
114 "descheduler",
115 "store",
116 },
117 }
118
119 releaser02019 = release.Releaser{
120 CurrentVersion: ver02019,
121 SourceRepository: edgeInfraRepo,
122 DestinationRepository: localWarehouseRepo,
123 PalletNames: []string{
124 "descheduler",
125 "store",
126 "data-sync",
127 },
128 }
129
130 releaser0214 = release.Releaser{
131 CurrentVersion: ver0214,
132 SourceRepository: edgeInfraRepo,
133 DestinationRepository: localWarehouseRepo,
134 PalletNames: []string{
135 "descheduler",
136 "store",
137 "data-sync",
138 },
139 }
140
141 smallEnvironment = release.Environment{
142 SourceRepository: localWarehouseRepo,
143 CurrentVersion: ver0214,
144 }
145
146 badEnvironment = release.Environment{
147 SourceRepository: localWarehouseRepo,
148 CurrentVersion: "0.0.0",
149 }
150 return ctx, nil
151 })
152
153 os.Exit(f.Run(m))
154 }
155
156 func TestBuildReleases(t *testing.T) {
157 ft := f2.NewFeature("build 0.20.19 release subset").
158 Setup("build releases from edge-infra", func(ctx f2.Context, t *testing.T) f2.Context {
159 release01911, err = releaser01911.BuildRelease(ctx.Context, pallet.BuildInfo{})
160 if err != nil {
161 t.Fatal(err)
162 }
163 release02019, err = releaser02019.BuildRelease(ctx.Context, pallet.BuildInfo{})
164 if err != nil {
165 t.Fatal(err)
166 }
167 release0214, err = releaser0214.BuildRelease(ctx.Context, pallet.BuildInfo{})
168 if err != nil {
169 t.Fatal(err)
170 }
171 return ctx
172 }).
173 Test("test expected pallets in releases", func(ctx f2.Context, t *testing.T) f2.Context {
174 for _, pall := range release01911.Pallets {
175 foundName := slices.Contains(releaser01911.PalletNames, pall.Name())
176 assert.True(t, foundName)
177 }
178 for _, pall := range release02019.Pallets {
179 foundName := slices.Contains(releaser02019.PalletNames, pall.Name())
180 assert.True(t, foundName)
181 }
182 for _, pall := range release0214.Pallets {
183 foundName := slices.Contains(releaser0214.PalletNames, pall.Name())
184 assert.True(t, foundName)
185 }
186 return ctx
187 }).
188 Test("test release metadata version is accurate", func(ctx f2.Context, t *testing.T) f2.Context {
189 assert.Equal(t, releaser01911.CurrentVersion, release01911.Metadata.Version)
190 assert.Equal(t, releaser02019.CurrentVersion, release02019.Metadata.Version)
191 assert.Equal(t, releaser0214.CurrentVersion, release0214.Metadata.Version)
192 return ctx
193 }).
194 Feature()
195 f.Test(t, ft)
196 }
197
198 func TestPushRelease(t *testing.T) {
199 ft := f2.NewFeature("test push release functionality").
200 Setup("push release to integration repo", func(ctx f2.Context, _ *testing.T) f2.Context {
201 err = releaser01911.Push(ctx, release01911)
202 assert.NoError(t, err)
203 err = releaser02019.Push(ctx, release02019)
204 assert.NoError(t, err)
205 err = releaser0214.Push(ctx, release0214)
206 assert.NoError(t, err)
207 return ctx
208 }).
209 Feature()
210 f.Test(t, ft)
211 }
212
213 func TestPullReleases(t *testing.T) {
214 ft := f2.NewFeature("pull releases from live repositories").
215 Setup("pull releases", func(ctx f2.Context, t *testing.T) f2.Context {
216 releases, err := smallEnvironment.PullReleases()
217 if err != nil {
218 t.Fatal(err)
219 }
220 assert.Len(t, releases, 1)
221 release0214 = releases[0]
222 return ctx
223 }).
224 Test("ensure release is present", func(ctx f2.Context, t *testing.T) f2.Context {
225 assert.Equal(t, release0214.Metadata.Version, ver0214)
226 return ctx
227 }).
228 Feature()
229 f.Test(t, ft)
230 }
231
232 func TestErrorOnMissingRelease(t *testing.T) {
233 ft := f2.NewFeature("attempt to pull a release that does not exist").
234 Test("ensure missing release errors", func(ctx f2.Context, t *testing.T) f2.Context {
235 releases, err := badEnvironment.PullReleases()
236 assert.Nil(t, releases)
237 assert.Error(t, err)
238 return ctx
239 }).
240 Feature()
241 f.Test(t, ft)
242 }
243
244 func TestLockSmallEnvironment(t *testing.T) {
245 var pl packagelock.PackageLock
246 ft := f2.NewFeature("lock a small environment's releases").
247 Setup("lock pulled releases", func(ctx f2.Context, _ *testing.T) f2.Context {
248 pl, err = smallEnvironment.LockReleases([]release.EdgeRelease{release0214})
249 fmt.Println("integration pl", pl)
250 return ctx
251 }).
252 Test("check pl tags match expected", func(ctx f2.Context, _ *testing.T) f2.Context {
253 packageCount := len(smallEnvironmentLock.Packages)
254 assert.Len(t, pl.Packages, len(smallEnvironmentLock.Packages))
255 for _, lp := range pl.Packages {
256 assert.Len(t, lp.Versions, 1)
257 for _, exLp := range smallEnvironmentLock.Packages {
258 assert.Len(t, lp.Versions, len(exLp.Versions))
259 assert.Equal(t, lp.Versions[0].Tags, release0214ExpectedTags)
260 }
261 packageCount--
262 }
263 assert.Equal(t, packageCount, 0)
264 return ctx
265 }).
266 Feature()
267 f.Test(t, ft)
268 }
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
View as plain text