Skip to content

Commit 1cea71b

Browse files
authored
feat: check if cdk component is tainted (#1412)
* feat(GROW-2367): check if cdk component is tainted
1 parent 50ef881 commit 1cea71b

File tree

7 files changed

+230
-72
lines changed

7 files changed

+230
-72
lines changed

lwcomponent/api_info.go

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,34 @@ type ApiInfo interface {
88
Id() int32
99

1010
LatestVersion() *semver.Version
11+
12+
AllVersions() []*semver.Version
1113
}
1214

1315
type apiInfo struct {
14-
id int32
15-
name string
16-
version semver.Version
17-
desc string
18-
sizeKB int64
16+
id int32
17+
name string
18+
version semver.Version
19+
allVersions []*semver.Version
20+
desc string
21+
sizeKB int64
1922
}
2023

21-
func NewAPIInfo(id int32, name string, version *semver.Version, desc string, size int64) ApiInfo {
24+
func NewAPIInfo(
25+
id int32,
26+
name string,
27+
version *semver.Version,
28+
allVersions []*semver.Version,
29+
desc string,
30+
size int64,
31+
) ApiInfo {
2232
return &apiInfo{
23-
id: id,
24-
name: name,
25-
version: *version,
26-
desc: desc,
27-
sizeKB: size,
33+
id: id,
34+
name: name,
35+
version: *version,
36+
allVersions: allVersions,
37+
desc: desc,
38+
sizeKB: size,
2839
}
2940
}
3041

@@ -35,3 +46,7 @@ func (a *apiInfo) Id() int32 {
3546
func (a *apiInfo) LatestVersion() *semver.Version {
3647
return &a.version
3748
}
49+
50+
func (a *apiInfo) AllVersions() []*semver.Version {
51+
return a.allVersions
52+
}

lwcomponent/api_info_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import (
1010

1111
func TestApiInfoId(t *testing.T) {
1212
version, err := semver.NewVersion("1.1.1")
13+
allVersions := []*semver.Version{version}
1314
if err != nil {
1415
panic(err)
1516
}
1617

1718
var id int32 = 23
1819

19-
info := lwcomponent.NewAPIInfo(id, "test", version, "", 0)
20+
info := lwcomponent.NewAPIInfo(id, "test", version, allVersions, "", 0)
2021

2122
result := info.Id()
2223
assert.Equal(t, id, result)
@@ -26,11 +27,12 @@ func TestApiInfoLatestVersion(t *testing.T) {
2627
var expectedVer string = "1.2.3"
2728

2829
version, err := semver.NewVersion(expectedVer)
30+
allVersions := []*semver.Version{version}
2931
if err != nil {
3032
panic(err)
3133
}
3234

33-
info := lwcomponent.NewAPIInfo(1, "test", version, "", 0)
35+
info := lwcomponent.NewAPIInfo(1, "test", version, allVersions, "", 0)
3436

3537
result := info.LatestVersion()
3638
assert.Equal(t, expectedVer, result.String())

lwcomponent/catalog.go

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -77,24 +77,7 @@ func (c *Catalog) ListComponentVersions(component *CDKComponent) (versions []*se
7777
return
7878
}
7979

80-
response, err := c.client.V2.Components.ListComponentVersions(component.apiInfo.Id(), operatingSystem, architecture)
81-
if err != nil {
82-
return nil, err
83-
}
84-
85-
rawVersions := response.Data[0].Versions
86-
87-
versions = make([]*semver.Version, len(rawVersions))
88-
for idx, v := range rawVersions {
89-
ver, err := semver.NewVersion(v)
90-
if err != nil {
91-
return nil, err
92-
}
93-
94-
versions[idx] = ver
95-
}
96-
97-
return versions, nil
80+
return listComponentVersions(c.client, component.apiInfo.Id())
9881
}
9982

10083
func (c *Catalog) PrintComponents() [][]string {
@@ -265,7 +248,12 @@ func NewCatalog(client *api.Client, stageConstructor StageConstructor) (*Catalog
265248
return nil, errors.Wrap(err, fmt.Sprintf("component '%s' version '%s'", c.Name, c.Version))
266249
}
267250

268-
api := NewAPIInfo(c.Id, c.Name, ver, c.Description, c.Size)
251+
allVersions, err := listComponentVersions(client, c.Id)
252+
if err != nil {
253+
return nil, errors.Wrap(err, fmt.Sprintf("unable to fetch component '%s' versions", c.Name))
254+
}
255+
256+
api := NewAPIInfo(c.Id, c.Name, ver, allVersions, c.Description, c.Size)
269257

270258
host, found := localComponents[c.Name]
271259
if found {
@@ -309,6 +297,27 @@ func loadLocalComponents() (local map[string]HostInfo, err error) {
309297
return
310298
}
311299

300+
func listComponentVersions(client *api.Client, componentId int32) (versions []*semver.Version, err error) {
301+
response, err := client.V2.Components.ListComponentVersions(componentId, operatingSystem, architecture)
302+
if err != nil {
303+
return nil, err
304+
}
305+
306+
rawVersions := response.Data[0].Versions
307+
308+
versions = make([]*semver.Version, len(rawVersions))
309+
for idx, v := range rawVersions {
310+
ver, err := semver.NewVersion(v)
311+
if err != nil {
312+
return nil, err
313+
}
314+
315+
versions[idx] = ver
316+
}
317+
318+
return versions, nil
319+
}
320+
312321
// func isDevelopmentComponent(path string, name string) bool {
313322
// return file.FileExists(filepath.Join(path, name, DevelopmentFile))
314323
// }

lwcomponent/catalog_test.go

Lines changed: 116 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ func TestCatalogNewCatalog(t *testing.T) {
3333
fmt.Fprint(w, generateComponentsResponse(prefix, apiComponentCount))
3434
})
3535

36+
for i := 0; i < apiComponentCount; i++ {
37+
name := fmt.Sprintf("%s-%d", prefix, i)
38+
path := fmt.Sprintf("Components/%d", i)
39+
versions := []string{"1.0.0", "1.1.1", "3.0.1", "5.4.3"}
40+
41+
fakeServer.MockAPI(path, func(w http.ResponseWriter, r *http.Request) {
42+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
43+
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
44+
})
45+
}
46+
3647
client, _ := api.NewClient("catalog_test",
3748
api.WithToken("TOKEN"),
3849
api.WithURL(fakeServer.URL()),
@@ -55,6 +66,17 @@ func TestCatalogNewCatalog(t *testing.T) {
5566
fmt.Fprint(w, generateComponentsResponse(prefix, apiComponentCount))
5667
})
5768

69+
for i := 0; i < apiComponentCount; i++ {
70+
name := fmt.Sprintf("%s-%d", prefix, i)
71+
path := fmt.Sprintf("Components/%d", i)
72+
versions := []string{"1.0.0", "1.1.1", "3.0.1", "5.4.3"}
73+
74+
fakeServer.MockAPI(path, func(w http.ResponseWriter, r *http.Request) {
75+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
76+
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
77+
})
78+
}
79+
5880
client, _ := api.NewClient("catalog_test",
5981
api.WithToken("TOKEN"),
6082
api.WithURL(fakeServer.URL()),
@@ -109,13 +131,19 @@ func TestCatalogNewCatalog(t *testing.T) {
109131
fmt.Fprint(w, generateComponentsResponse(prefix, 1))
110132
})
111133

134+
name := fmt.Sprintf("%s-%d", prefix, 1)
135+
versions := []string{"1.0.0", "1.1.1", "3.0.1", "5.4.3"}
136+
137+
fakeServer.MockAPI("Components/0", func(w http.ResponseWriter, r *http.Request) {
138+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
139+
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
140+
})
141+
112142
client, _ := api.NewClient("catalog_test",
113143
api.WithToken("TOKEN"),
114144
api.WithURL(fakeServer.URL()),
115145
)
116146

117-
name := fmt.Sprintf("%s-%d", prefix, 1)
118-
119147
CreateLocalComponent(name, "invalid-version", false)
120148

121149
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
@@ -148,6 +176,17 @@ func TestCatalogComponentCount(t *testing.T) {
148176
fmt.Fprint(w, generateComponentsResponse(prefix, apiCount))
149177
})
150178

179+
for i := 0; i < apiCount; i++ {
180+
name := fmt.Sprintf("%s-%d", prefix, i)
181+
path := fmt.Sprintf("Components/%d", i)
182+
versions := []string{"1.0.0", "1.1.1", "3.0.1", "5.4.3"}
183+
184+
fakeServer.MockAPI(path, func(w http.ResponseWriter, r *http.Request) {
185+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
186+
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
187+
})
188+
}
189+
151190
client, _ := api.NewClient("catalog_test",
152191
api.WithToken("TOKEN"),
153192
api.WithURL(fakeServer.URL()),
@@ -238,6 +277,17 @@ func TestCatalogGetComponent(t *testing.T) {
238277
fmt.Fprint(w, generateComponentsResponse(prefix, count))
239278
})
240279

280+
for i := 0; i < count; i++ {
281+
name := fmt.Sprintf("%s-%d", prefix, i)
282+
path := fmt.Sprintf("Components/%d", i)
283+
versions := []string{"1.0.0", "1.1.1", "3.0.1", "5.4.3"}
284+
285+
fakeServer.MockAPI(path, func(w http.ResponseWriter, r *http.Request) {
286+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
287+
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
288+
})
289+
}
290+
241291
client, _ := api.NewClient("catalog_test",
242292
api.WithToken("TOKEN"),
243293
api.WithURL(fakeServer.URL()),
@@ -323,36 +373,33 @@ func TestCatalogGetComponent(t *testing.T) {
323373
}
324374

325375
func TestCatalogListComponentVersions(t *testing.T) {
326-
var (
327-
prefix = "testCatalogListComponentVersions"
328-
count = 4
329-
)
376+
prefix := "testCatalogListComponentVersions"
330377

331378
_, home := FakeHome()
332379
defer ResetHome(home)
333380

334-
fakeServer := lacework.MockServer()
335-
defer fakeServer.Close()
336-
337-
fakeServer.MockAPI("Components", func(w http.ResponseWriter, r *http.Request) {
338-
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
339-
fmt.Fprint(w, generateComponentsResponse(prefix, count))
340-
})
381+
t.Run("ok", func(t *testing.T) {
382+
fakeServer := lacework.MockServer()
383+
defer fakeServer.Close()
341384

342-
client, _ := api.NewClient("catalog_test",
343-
api.WithToken("TOKEN"),
344-
api.WithURL(fakeServer.URL()),
345-
)
385+
fakeServer.MockAPI("Components", func(w http.ResponseWriter, r *http.Request) {
386+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
387+
fmt.Fprint(w, generateComponentsResponse(prefix, 1))
388+
})
346389

347-
t.Run("ok", func(t *testing.T) {
348-
name := fmt.Sprintf("%s-%d", prefix, 1)
390+
name := fmt.Sprintf("%s-%d", prefix, 0)
349391
versions := []string{"0.1.0", "1.1.1", "3.0.1", "5.4.3"}
350392

351-
fakeServer.MockAPI("Components/1", func(w http.ResponseWriter, r *http.Request) {
393+
fakeServer.MockAPI("Components/0", func(w http.ResponseWriter, r *http.Request) {
352394
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
353395
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
354396
})
355397

398+
client, _ := api.NewClient("catalog_test",
399+
api.WithToken("TOKEN"),
400+
api.WithURL(fakeServer.URL()),
401+
)
402+
356403
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
357404
assert.NotNil(t, catalog)
358405
assert.Nil(t, err)
@@ -370,24 +417,29 @@ func TestCatalogListComponentVersions(t *testing.T) {
370417
})
371418

372419
t.Run("invalid semantic version", func(t *testing.T) {
373-
name := fmt.Sprintf("%s-%d", prefix, 2)
420+
fakeServer := lacework.MockServer()
421+
defer fakeServer.Close()
422+
423+
fakeServer.MockAPI("Components", func(w http.ResponseWriter, r *http.Request) {
424+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
425+
fmt.Fprint(w, generateComponentsResponse(prefix, 1))
426+
})
427+
428+
name := fmt.Sprintf("%s-%d", prefix, 0)
374429
versions := []string{"0.1.0", "1.invalid.1", "3.0.1", "5.4.3"}
375430

376-
fakeServer.MockAPI("Components/2", func(w http.ResponseWriter, r *http.Request) {
431+
fakeServer.MockAPI("Components/0", func(w http.ResponseWriter, r *http.Request) {
377432
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
378433
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
379434
})
380435

381-
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
382-
assert.NotNil(t, catalog)
383-
assert.Nil(t, err)
384-
385-
component, err := catalog.GetComponent(name)
386-
assert.NotNil(t, component)
387-
assert.Nil(t, err)
436+
client, _ := api.NewClient("catalog_test",
437+
api.WithToken("TOKEN"),
438+
api.WithURL(fakeServer.URL()),
439+
)
388440

389-
vers, err := catalog.ListComponentVersions(component)
390-
assert.Nil(t, vers)
441+
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
442+
assert.Nil(t, catalog)
391443
assert.NotNil(t, err)
392444
})
393445
}
@@ -421,6 +473,17 @@ func TestCatalogStage(t *testing.T) {
421473
}
422474
})
423475

476+
for i := 0; i < apiComponentCount; i++ {
477+
name := fmt.Sprintf("%s-%d", prefix, i)
478+
path := fmt.Sprintf("Components/%d", i)
479+
versions := []string{"1.0.0", "1.1.1", "3.0.1", "5.4.3"}
480+
481+
fakeServer.MockAPI(path, func(w http.ResponseWriter, r *http.Request) {
482+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
483+
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
484+
})
485+
}
486+
424487
client, _ := api.NewClient("catalog_test",
425488
api.WithToken("TOKEN"),
426489
api.WithURL(fakeServer.URL()),
@@ -569,6 +632,17 @@ func TestCatalogInstall(t *testing.T) {
569632
fmt.Fprint(w, generateComponentsResponse(prefix, apiComponentCount))
570633
})
571634

635+
for i := 0; i < apiComponentCount; i++ {
636+
name := fmt.Sprintf("%s-%d", prefix, i)
637+
path := fmt.Sprintf("Components/%d", i)
638+
versions := []string{"1.0.0", "1.1.1", "3.0.1", "5.4.3"}
639+
640+
fakeServer.MockAPI(path, func(w http.ResponseWriter, r *http.Request) {
641+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
642+
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
643+
})
644+
}
645+
572646
client, _ := api.NewClient("catalog_test",
573647
api.WithToken("TOKEN"),
574648
api.WithURL(fakeServer.URL()))
@@ -628,6 +702,17 @@ func TestCatalogDelete(t *testing.T) {
628702
fmt.Fprint(w, generateComponentsResponse(prefix, apiComponentCount))
629703
})
630704

705+
for i := 0; i < apiComponentCount; i++ {
706+
name := fmt.Sprintf("%s-%d", prefix, i)
707+
path := fmt.Sprintf("Components/%d", i)
708+
versions := []string{"1.0.0", "1.1.1", "3.0.1", "5.4.3"}
709+
710+
fakeServer.MockAPI(path, func(w http.ResponseWriter, r *http.Request) {
711+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
712+
fmt.Fprint(w, generateComponentVersionsResponse(name, versions))
713+
})
714+
}
715+
631716
client, _ := api.NewClient("catalog_test",
632717
api.WithToken("TOKEN"),
633718
api.WithURL(fakeServer.URL()))

0 commit comments

Comments
 (0)