Skip to content

Commit

Permalink
fix(helm): properly handle multiple archived dependencies
Browse files Browse the repository at this point in the history
Signed-off-by: nikpivkin <nikita.pivkin@smartforce.io>
  • Loading branch information
nikpivkin committed Oct 23, 2024
1 parent 9514148 commit 6f3e8f4
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 1 deletion.
13 changes: 12 additions & 1 deletion pkg/iac/scanners/helm/parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"io/fs"
"path"
"path/filepath"
"regexp"
"sort"
Expand Down Expand Up @@ -95,7 +96,7 @@ func (p *Parser) ParseFS(ctx context.Context, target fs.FS, path string) error {
return nil
}

if detection.IsArchive(path) {
if detection.IsArchive(path) && !isDependencyChartArchive(p.workingFS, path) {
tarFS, err := p.addTarToFS(path)
if errors.Is(err, errSkipFS) {
// an unpacked Chart already exists
Expand Down Expand Up @@ -123,6 +124,16 @@ func (p *Parser) ParseFS(ctx context.Context, target fs.FS, path string) error {
return nil
}

func isDependencyChartArchive(fsys fs.FS, archivePath string) bool {
parent := path.Dir(archivePath)
if !strings.HasSuffix(parent, "charts") {
return false
}

_, err := fs.Stat(fsys, path.Join(parent, "..", "Chart.yaml"))
return err == nil
}

func (p *Parser) addPaths(paths ...string) error {
for _, path := range paths {
if _, err := fs.Stat(p.workingFS, path); err != nil {
Expand Down
15 changes: 15 additions & 0 deletions pkg/iac/scanners/helm/parser/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,19 @@ func TestParseFS(t *testing.T) {
}
assert.Equal(t, expectedFiles, p.filepaths)
})

t.Run("chart with multiple archived deps", func(t *testing.T) {
p, err := New(".")
require.NoError(t, err)

fsys := os.DirFS(filepath.Join("testdata", "multiple-archived-deps"))
require.NoError(t, p.ParseFS(context.TODO(), fsys, "."))

expectedFiles := []string{
"Chart.yaml",
"charts/common-2.26.0.tgz",
"charts/opentelemetry-collector-0.108.0.tgz",
}
assert.Equal(t, expectedFiles, p.filepaths)
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: v2
appVersion: "1.1"
description: Test Chart
name: y-chart
version: 1.0.0
kubeVersion: ">=1.21"

dependencies:
- name: common
repository: https://charts.bitnami.com/bitnami
version: 2.26.0
- name: opentelemetry-collector
version: 0.108.0
repository: https://open-telemetry.github.io/opentelemetry-helm-charts
Binary file not shown.
Binary file not shown.

0 comments on commit 6f3e8f4

Please sign in to comment.