Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

render: add alpha support for filtering #1231

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
42 changes: 35 additions & 7 deletions alpha/action/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,18 @@ type Render struct {
AllowedRefMask RefType
Migrate bool
ImageRefTemplate *template.Template
Filter declcfg.CatalogFilter

skipSqliteDeprecationLog bool
}

func (r Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) {
func nullLogger() *logrus.Entry {
logger := logrus.New()
logger.SetOutput(io.Discard)
return logrus.NewEntry(logger)
}

func (r *Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) {
if r.skipSqliteDeprecationLog {
// exhaust once with a no-op function.
logDeprecationMessage.Do(func() {})
Expand Down Expand Up @@ -97,10 +104,18 @@ func (r Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) {
cfgs = append(cfgs, *cfg)
}

return combineConfigs(cfgs), nil
cfg := combineConfigs(cfgs)
if r.Filter != nil {
var err error
cfg, err = r.Filter.FilterCatalog(ctx, cfg)
if err != nil {
return nil, fmt.Errorf("filter catalog: %v", err)
}
}
return cfg, nil
}

func (r Render) createRegistry() (*containerdregistry.Registry, error) {
func (r *Render) createRegistry() (*containerdregistry.Registry, error) {
cacheDir, err := os.MkdirTemp("", "render-registry-")
if err != nil {
return nil, fmt.Errorf("create tempdir: %v", err)
Expand All @@ -120,7 +135,7 @@ func (r Render) createRegistry() (*containerdregistry.Registry, error) {
return reg, nil
}

func (r Render) renderReference(ctx context.Context, ref string) (*declcfg.DeclarativeConfig, error) {
func (r *Render) renderReference(ctx context.Context, ref string) (*declcfg.DeclarativeConfig, error) {
stat, err := os.Stat(ref)
if err != nil {
return r.imageToDeclcfg(ctx, ref)
Expand All @@ -142,7 +157,7 @@ func (r Render) renderReference(ctx context.Context, ref string) (*declcfg.Decla
if !r.AllowedRefMask.Allowed(RefDCDir) {
return nil, fmt.Errorf("cannot render declarative config directory: %w", ErrNotAllowed)
}
return declcfg.LoadFS(ctx, os.DirFS(ref))
return r.renderFBCDirectory(ctx, ref)
}
// The only supported file type is an sqlite DB file,
// since declarative configs will be in a directory.
Expand All @@ -161,7 +176,7 @@ func (r Render) renderReference(ctx context.Context, ref string) (*declcfg.Decla
return sqliteToDeclcfg(ctx, db)
}

func (r Render) imageToDeclcfg(ctx context.Context, imageRef string) (*declcfg.DeclarativeConfig, error) {
func (r *Render) imageToDeclcfg(ctx context.Context, imageRef string) (*declcfg.DeclarativeConfig, error) {
ref := image.SimpleReference(imageRef)
if err := r.Registry.Pull(ctx, ref); err != nil {
return nil, err
Expand Down Expand Up @@ -197,7 +212,7 @@ func (r Render) imageToDeclcfg(ctx context.Context, imageRef string) (*declcfg.D
if !r.AllowedRefMask.Allowed(RefDCImage) {
return nil, fmt.Errorf("cannot render declarative config image: %w", ErrNotAllowed)
}
cfg, err = declcfg.LoadFS(ctx, os.DirFS(filepath.Join(tmpDir, configsDir)))
cfg, err = r.renderFBCDirectory(ctx, filepath.Join(tmpDir, configsDir))
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -230,6 +245,19 @@ func (r Render) imageToDeclcfg(ctx context.Context, imageRef string) (*declcfg.D
return cfg, nil
}

func (r *Render) renderFBCDirectory(ctx context.Context, dir string) (*declcfg.DeclarativeConfig, error) {
// If a filterer is provided that can tell us which meta objects to keep, we
// can optimize FBC loading and post-filtering by ignoring meta objects that
// we know we won't need to keep.
opts := []declcfg.LoadOption{}
if r.Filter != nil {
if mf, ok := r.Filter.(declcfg.MetaFilter); ok {
opts = append(opts, declcfg.WithMetaFilter(mf))
}
}
return declcfg.LoadFS(ctx, os.DirFS(dir), opts...)
}

// checkDBFile returns an error if ref is not an sqlite3 database.
func checkDBFile(ref string) error {
typ, err := filetype.MatchFile(ref)
Expand Down
Loading
Loading