68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
// SPDX-License-Identifier: Apache-2.0
|
|
// Copyright Authors of K9s
|
|
|
|
package dao
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/derailed/k9s/internal"
|
|
"github.com/derailed/k9s/internal/client"
|
|
"github.com/derailed/k9s/internal/render"
|
|
"github.com/derailed/k9s/internal/vul"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
)
|
|
|
|
var (
|
|
_ Accessor = (*ImageScan)(nil)
|
|
)
|
|
|
|
// ImageScan represents vulnerability scans.
|
|
type ImageScan struct {
|
|
NonResource
|
|
}
|
|
|
|
func (is *ImageScan) listImages(ctx context.Context, gvr client.GVR, path string) ([]string, error) {
|
|
res, err := AccessorFor(is.Factory, gvr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
s, ok := res.(ImageLister)
|
|
if !ok {
|
|
return nil, fmt.Errorf("resource %s is not image lister: %T", gvr, res)
|
|
}
|
|
|
|
return s.ListImages(ctx, path)
|
|
}
|
|
|
|
// List returns a collection of scans.
|
|
func (is *ImageScan) List(ctx context.Context, _ string) ([]runtime.Object, error) {
|
|
fqn, ok := ctx.Value(internal.KeyPath).(string)
|
|
if !ok {
|
|
return nil, fmt.Errorf("no context path for %q", is.gvr)
|
|
}
|
|
gvr, ok := ctx.Value(internal.KeyGVR).(client.GVR)
|
|
if !ok {
|
|
return nil, fmt.Errorf("no context gvr for %q", is.gvr)
|
|
}
|
|
|
|
ii, err := is.listImages(ctx, gvr, fqn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
res := make([]runtime.Object, 0, len(ii))
|
|
for _, img := range ii {
|
|
s, ok := vul.ImgScanner.GetScan(img)
|
|
if !ok {
|
|
continue
|
|
}
|
|
for _, r := range s.Table.Rows {
|
|
res = append(res, render.ImageScanRes{Image: img, Row: r})
|
|
}
|
|
}
|
|
|
|
return res, nil
|
|
}
|