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

Show SBOMs in interactive pane #1349

Merged
merged 2 commits into from
Jan 24, 2022
Merged
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
6 changes: 5 additions & 1 deletion internal/termui/dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,5 +204,9 @@ func info(buildpackInfo dist.BuildpackInfo) string {
return buildpackInfo.Description
}

return buildpackInfo.Homepage
if buildpackInfo.Homepage != "" {
return buildpackInfo.Homepage
}

return "-"
}
5 changes: 4 additions & 1 deletion internal/termui/detect.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,10 @@ func (d *Detect) find(buildpackID, buildpackVersion string) dist.BuildpackInfo {
}
}

return dist.BuildpackInfo{}
return dist.BuildpackInfo{
ID: buildpackID,
Version: buildpackVersion,
}
}

func detectStatusTV() *tview.TextView {
Expand Down
70 changes: 51 additions & 19 deletions internal/termui/dive.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@ type Dive struct {
menuTable *tview.Table
fileExplorerTable *tview.Table
buildpackInfo []dist.BuildpackInfo
selectedBuildpack dist.BuildpackInfo
buildpacksTreeMap map[string]*tview.TreeNode
escHandler func()
}

func NewDive(app app, buildpackInfo []dist.BuildpackInfo, selectedBuildpack dist.BuildpackInfo, nodes map[string]*tview.TreeNode, escHandler func()) *Dive {
menu := initMenu(buildpackInfo)
menu := initMenu(buildpackInfo, nodes)
fileExplorerTable := initFileExplorer()

screen := tview.NewFlex().
Expand Down Expand Up @@ -53,33 +52,51 @@ func NewDive(app app, buildpackInfo []dist.BuildpackInfo, selectedBuildpack dist
}

func (d *Dive) handle() {
selectionFunc := func(nodeKey string) func(row, column int) {
return func(row, column int) {
node := d.fileExplorerTable.GetCell(row, 3).GetReference().(*tview.TreeNode)

if !node.GetReference().(*tar.Header).FileInfo().IsDir() {
return
}

if node.IsExpanded() {
node.Collapse()
} else {
node.Expand()
}

d.loadFileExplorerData(nodeKey)
}
}

d.menuTable.SetSelectionChangedFunc(func(row, column int) {
// protect from panic
if row < 0 {
return
}

d.selectedBuildpack = d.buildpackInfo[row-4]

d.loadFileExplorerData()
// if SBOM
if row == d.menuTable.GetRowCount()-1 {
nodeKey := "layers/sbom"

d.fileExplorerTable.ScrollToBeginning()
})
d.loadFileExplorerData(nodeKey)

d.fileExplorerTable.SetSelectedFunc(func(row, column int) {
node := d.fileExplorerTable.GetCell(row, 3).GetReference().(*tview.TreeNode)
d.fileExplorerTable.ScrollToBeginning()

if !node.GetReference().(*tar.Header).FileInfo().IsDir() {
d.fileExplorerTable.SetSelectedFunc(selectionFunc(nodeKey))
return
}

if node.IsExpanded() {
node.Collapse()
} else {
node.Expand()
}
// if buildpack
selectedBuildpack := d.buildpackInfo[row-4]
nodeKey := "layers/" + strings.ReplaceAll(selectedBuildpack.ID, "/", "_")

d.loadFileExplorerData(nodeKey)

d.fileExplorerTable.ScrollToBeginning()

d.loadFileExplorerData()
d.fileExplorerTable.SetSelectedFunc(selectionFunc(nodeKey))
})

d.menuTable.SetDoneFunc(func(key tcell.Key) {
Expand Down Expand Up @@ -109,10 +126,10 @@ func (d *Dive) handle() {
})
}

func (d *Dive) loadFileExplorerData() {
func (d *Dive) loadFileExplorerData(nodeKey string) {
// Configure tree
root := tview.NewTreeNode("[::b]Filetree[::-]")
for _, child := range d.buildpacksTreeMap["layers/"+strings.ReplaceAll(d.selectedBuildpack.ID, "/", "_")].GetChildren() {
for _, child := range d.buildpacksTreeMap[nodeKey].GetChildren() {
root.AddChild(child)
}

Expand Down Expand Up @@ -203,7 +220,7 @@ func (d *Dive) loadFileExplorerData() {
})
}

func initMenu(buildpackInfos []dist.BuildpackInfo) *tview.Table {
func initMenu(buildpackInfos []dist.BuildpackInfo, nodes map[string]*tview.TreeNode) *tview.Table {
style := tcell.StyleDefault.
Foreground(tcell.ColorMediumTurquoise).
Background(tcell.ColorDarkSlateGray).
Expand Down Expand Up @@ -240,6 +257,21 @@ func initMenu(buildpackInfos []dist.BuildpackInfo) *tview.Table {
tview.NewTableCell("EXPORT").
SetTextColor(tcell.ColorDarkGray).
SetSelectable(false))

// set spacing
i++
i++
sbomTextColor := tcell.ColorMediumTurquoise
sbomSelectable := true
if _, ok := nodes["layers/sbom"]; !ok {
sbomTextColor = tcell.ColorDarkGray
sbomSelectable = false
}

table.SetCell(i, 0,
tview.NewTableCell("SBOM").
SetTextColor(sbomTextColor).
SetSelectable(sbomSelectable))
return table
}

Expand Down
12 changes: 12 additions & 0 deletions internal/termui/dive_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,5 +61,17 @@ func testDive(t *testing.T, when spec.G, it spec.S) {
h.AssertContains(t, screen.fileExplorerTable.GetCell(2, 1).Text, "501:20")
h.AssertContains(t, screen.fileExplorerTable.GetCell(2, 2).Text, "14 B ")
h.AssertContains(t, screen.fileExplorerTable.GetCell(2, 3).Text, " └── some-file-2.txt")

// select SBOM
lastRow := screen.menuTable.GetRowCount() - 1
screen.menuTable.Select(lastRow, 0)
h.AssertContains(t, screen.fileExplorerTable.GetCell(1, 0).Text, "drwxr-xr-x")
h.AssertContains(t, screen.fileExplorerTable.GetCell(1, 1).Text, "501:20")
h.AssertContains(t, screen.fileExplorerTable.GetCell(1, 2).Text, "- ")
h.AssertContainsMatch(t, screen.fileExplorerTable.GetCell(1, 3).Text, "└── .*launch")
h.AssertContains(t, screen.fileExplorerTable.GetCell(2, 0).Text, "-rw-r--r--")
h.AssertContains(t, screen.fileExplorerTable.GetCell(2, 1).Text, "501:20")
h.AssertContains(t, screen.fileExplorerTable.GetCell(2, 2).Text, "32 B ")
h.AssertContains(t, screen.fileExplorerTable.GetCell(2, 3).Text, " └── sbom.cdx.json")
})
}
Binary file modified internal/termui/testdata/fake-layers.tar
Binary file not shown.
2 changes: 2 additions & 0 deletions internal/termui/testdata/generate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
dir=$(cd $(dirname $0) && pwd)
mkdir -p $dir/layers/some_buildpack-1
mkdir -p $dir/layers/some_buildpack-2/some-dir
mkdir -p $dir/layers/sbom/launch

echo -n "some-content-1" > $dir/layers/some_buildpack-1/some-file-1.txt
echo -n "some-content-2" > $dir/layers/some_buildpack-2/some-dir/some-file-2.txt
echo -n '{"content": "some-sbom-content"}' > $dir/layers/sbom/launch/sbom.cdx.json

tar cvf $dir/fake-layers.tar layers
rm -rf $dir/layers
2 changes: 1 addition & 1 deletion pkg/client/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ func (c *Client) Build(ctx context.Context, opts BuildOptions) error {
GID: opts.GroupID,
PreviousImage: opts.PreviousImage,
Interactive: opts.Interactive,
Termui: termui.NewTermui(imageRef.Name(), bldr, runImageName),
Termui: termui.NewTermui(imageRef.Name(), ephemeralBuilder, runImageName),
}

lifecycleVersion := ephemeralBuilder.LifecycleDescriptor().Info.Version
Expand Down