Skip to content
This repository has been archived by the owner on Oct 14, 2024. It is now read-only.

feat(k8s): Asset scan support #864

Merged
merged 17 commits into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,13 @@ $(FIXGOMODULES):
fix: bin/golangci-lint $(FIXGOMODULES) ## Fix linter errors in Go source code

.PHONY: e2e
e2e: docker-apiserver docker-cli docker-orchestrator docker-ui docker-ui-backend ## Run end-to-end test suite
e2e: docker-apiserver docker-cli docker-orchestrator docker-ui docker-ui-backend docker-cr-discovery-server ## Run end-to-end test suite
export VMCLARITY_E2E_APISERVER_IMAGE=$(VMCLARITY_APISERVER_IMAGE) \
VMCLARITY_E2E_ORCHESTRATOR_IMAGE=$(VMCLARITY_ORCHESTRATOR_IMAGE) \
VMCLARITY_E2E_UI_IMAGE=$(VMCLARITY_UI_IMAGE) \
VMCLARITY_E2E_UIBACKEND_IMAGE=$(VMCLARITY_UIBACKEND_IMAGE) \
VMCLARITY_E2E_SCANNER_IMAGE=$(VMCLARITY_SCANNER_IMAGE) && \
VMCLARITY_E2E_SCANNER_IMAGE=$(VMCLARITY_SCANNER_IMAGE) \
VMCLARITY_E2E_CR_DISCOVERY_SERVER_IMAGE=$(VMCLARITY_CR_DISCOVERY_SERVER_IMAGE) && \
cd e2e && \
go test -v -failfast -test.v -test.paniconexit0 -timeout 2h -ginkgo.v .

Expand Down
20 changes: 10 additions & 10 deletions api/models/containerimageinfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,30 +61,30 @@ func (c ContainerImageInfo) Merge(target ContainerImageInfo) (ContainerImageInfo
// as it is likely to be more accurate to the real size not taking into
// account deduplication in the CRI etc. The sizes are normally within
// a few kilobytes of each other.
size, err := CoalesceComparable(*c.Size, *target.Size)
size, err := CoalesceComparable(ValueOrZero(c.Size), ValueOrZero(target.Size))
if err != nil {
if *c.Size > *target.Size {
size = *c.Size
if ValueOrZero(c.Size) > ValueOrZero(target.Size) {
size = ValueOrZero(c.Size)
} else {
size = *target.Size
size = ValueOrZero(target.Size)
}
}

os, err := CoalesceComparable(*c.Os, *target.Os)
os, err := CoalesceComparable(ValueOrZero(c.Os), ValueOrZero(target.Os))
if err != nil {
return c, fmt.Errorf("failed to merge Os field: %w", err)
}

architecture, err := CoalesceComparable(*c.Architecture, *target.Architecture)
architecture, err := CoalesceComparable(ValueOrZero(c.Architecture), ValueOrZero(target.Architecture))
if err != nil {
return c, fmt.Errorf("failed to merge Architecture field: %w", err)
}

labels := UnionSlices(*c.Labels, *target.Labels)
labels := UnionSlices(ValueOrZero(c.Labels), ValueOrZero(target.Labels))

repoDigests := UnionSlices(*c.RepoDigests, *target.RepoDigests)
repoDigests := UnionSlices(ValueOrZero(c.RepoDigests), ValueOrZero(target.RepoDigests))

repoTags := UnionSlices(*c.RepoTags, *target.RepoTags)
repoTags := UnionSlices(ValueOrZero(c.RepoTags), ValueOrZero(target.RepoTags))

return ContainerImageInfo{
ImageID: id,
Expand All @@ -102,7 +102,7 @@ const nilString = "nil"
func (c ContainerImageInfo) String() string {
size := nilString
if c.Size != nil {
size = strconv.Itoa(*c.Size)
size = strconv.FormatInt(*c.Size, 10)
}

labels := nilString
Expand Down
2 changes: 1 addition & 1 deletion api/models/models.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

42 changes: 42 additions & 0 deletions api/models/tag.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package models

func MapToTags(tags map[string]string) *[]Tag {
ret := make([]Tag, 0, len(tags))
for key, val := range tags {
ret = append(ret, Tag{
Key: key,
Value: val,
})
}
return &ret
}

func MergeTags(left, right *[]Tag) *[]Tag {
if left == nil && right == nil {
return nil
}

merged := &[]Tag{}
if left == nil || len(*left) == 0 {
*merged = *right

return merged
}

if right == nil || len(*right) == 0 {
*merged = *left

return merged
}

m := map[string]string{}
for _, tag := range *left {
m[tag.Key] = tag.Value
}

for _, tag := range *right {
m[tag.Key] = tag.Value
}

return MapToTags(m)
}
119 changes: 119 additions & 0 deletions api/models/tag_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package models

import "testing"

//nolint:staticcheck
func TestLoader(t *testing.T) {
tests := []struct {
Name string
Left *[]Tag
Right *[]Tag

Expected map[string]string
}{
{
Name: "Both nil",
Left: nil,
Right: nil,
Expected: nil,
},
{
Name: "Left nil",
Left: nil,
Right: &[]Tag{
{
Key: "key1",
Value: "right",
},
{
Key: "key2",
Value: "right",
},
},
Expected: map[string]string{
"key1": "right",
"key2": "right",
},
},
{
Name: "Right nil",
Left: &[]Tag{
{
Key: "key1",
Value: "left",
},
{
Key: "key2",
Value: "left",
},
},
Right: nil,
Expected: map[string]string{
"key1": "left",
"key2": "left",
},
},
{
Name: "Merge",
Left: &[]Tag{
{
Key: "key1",
Value: "left",
},
{
Key: "key2",
Value: "left",
},
},
Right: &[]Tag{
{
Key: "key2",
Value: "right",
},
{
Key: "key3",
Value: "right",
},
},
Expected: map[string]string{
"key1": "left",
"key2": "right",
"key3": "right",
},
},
}

for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
merged := MergeTags(test.Left, test.Right)

if merged == nil && test.Expected == nil {
return
}

if merged == nil && test.Expected != nil {
t.Errorf("unexpected result: left=%v, expected=%v", test.Left, test.Expected)
}

m := map[string]string{}
for _, tag := range *merged {
m[tag.Key] = tag.Value
}

if len(m) != len(test.Expected) {
t.Errorf("unexpected length of the result: actual=%d, expected=%d", len(m), len(test.Expected))
}

for k, v := range test.Expected {
vv, ok := m[k]
if !ok {
t.Errorf("missing key from merged result. key=%s", k)
}

if v != vv {
t.Errorf("mismatch in values for key. key=%s expected=%s actual=%s", k, v, vv)
}
}
})
}
}
10 changes: 10 additions & 0 deletions api/models/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,13 @@ func UnionSlices[T comparable](inputs ...[]T) []T {
}
return result
}

// ValueOrZero returns the value that the pointer ptr pointers to. It returns
// the zero value if ptr is nil.
func ValueOrZero[T any](ptr *T) T {
var t T
if ptr != nil {
t = *ptr
}
return t
}
1 change: 1 addition & 0 deletions api/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2293,6 +2293,7 @@ components:
type: string
size:
type: integer
format: int64
required:
- objectType
- imageID
Expand Down
Loading
Loading