Skip to content

Commit

Permalink
fix: ensure inspected image list is machine readable (#734)
Browse files Browse the repository at this point in the history
  • Loading branch information
UncleGedd authored Jun 28, 2024
1 parent 4aafbeb commit 6603907
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 15 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ node_modules
checksums.txt
*.tape
tmp/
out.txt
9 changes: 3 additions & 6 deletions src/pkg/bundle/inspect.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ package bundle
import (
"context"
"fmt"
"io"
"os"
"path/filepath"
"strings"
Expand All @@ -22,7 +21,6 @@ import (
zarfUtils "github.com/defenseunicorns/zarf/src/pkg/utils"
"github.com/defenseunicorns/zarf/src/pkg/zoci"
zarfTypes "github.com/defenseunicorns/zarf/src/types"
"github.com/fatih/color"
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/pterm/pterm"
)
Expand Down Expand Up @@ -95,12 +93,11 @@ func (b *Bundle) listImages() error {
return err
}

formattedImgs := pterm.Color(color.FgHiMagenta).Sprintf(strings.Join(imgs, "\n"))
formattedImgs := strings.Join(imgs, "\n")

// print to stdout to enable users to easily grab the output
// (and stderr for backwards compatibility)
pterm.SetDefaultOutput(io.MultiWriter(os.Stderr, os.Stdout))
pterm.Printfln("\n%s\n", formattedImgs)
pterm.SetDefaultOutput(os.Stdout)
pterm.Printfln("%s\n", formattedImgs)
return nil
}

Expand Down
38 changes: 29 additions & 9 deletions src/test/e2e/bundle_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package test
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
Expand Down Expand Up @@ -660,21 +661,40 @@ func TestListImages(t *testing.T) {

t.Run("list images on bundle YAML only", func(t *testing.T) {
cmd := strings.Split(fmt.Sprintf("inspect %s --list-images --insecure", filepath.Join(bundleDir, config.BundleYAML)), " ")
stdout, stderr, err := e2e.UDS(cmd...)
stdout, _, err := e2e.UDS(cmd...)
require.NoError(t, err)
require.Contains(t, stderr, "library/registry")
require.Contains(t, stderr, "ghcr.io/defenseunicorns/zarf/agent")
require.Contains(t, stderr, "nginx")
require.Contains(t, stderr, "quay.io/prometheus/node-exporter")
require.Contains(t, stdout, "library/registry")
require.Contains(t, stdout, "ghcr.io/defenseunicorns/zarf/agent")
require.Contains(t, stdout, "nginx")
require.Contains(t, stdout, "quay.io/prometheus/node-exporter")

// ensure non-req'd components got filtered
require.NotContains(t, stderr, "grafana")
require.NotContains(t, stderr, "gitea")
require.NotContains(t, stderr, "kiwix")
require.NotContains(t, stderr, "podinfo")
require.NotContains(t, stdout, "grafana")
require.NotContains(t, stdout, "gitea")
require.NotContains(t, stdout, "kiwix")
require.NotContains(t, stdout, "podinfo")
})

t.Run("list images outputted to a file", func(t *testing.T) {
args := strings.Split(fmt.Sprintf("inspect %s --list-images --insecure", filepath.Join(bundleDir, config.BundleYAML)), " ")
cmd := exec.Command(e2e.UDSBinPath, args...)

// open the out file for writing, and redirect the cmd output to that file
filename := "./out.txt"
outfile, err := os.Create(filename)
require.NoError(t, err)
defer outfile.Close()
defer os.Remove(filename)

cmd.Stdout = outfile

err = cmd.Run()
require.NoError(t, err)

// read in the file and check its contents
contents, err := os.ReadFile(filename)
require.NoError(t, err)
require.NotContains(t, string(contents), "\u001B") // ensure no color-related bytes
require.Contains(t, string(contents), "library/registry")
})
}

0 comments on commit 6603907

Please sign in to comment.