k9s/internal/dao/img_scan.go

66 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
}