Skip to content
This repository was archived by the owner on Nov 3, 2023. It is now read-only.

Enhance version command #89

Merged
merged 3 commits into from
Sep 13, 2021
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
21 changes: 17 additions & 4 deletions integration/common/basesuites.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package common

import (
"bytes"
"context"
"fmt"
"path"
Expand Down Expand Up @@ -36,7 +37,7 @@ func (s *BaseSuite) SetupSuite() {
},
s.CreateFlags...,
)
err := RunBuildkit("create", args)
err := RunBuildkit("create", args, RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder create failed", s.Name)
}

Expand All @@ -49,7 +50,7 @@ func (s *BaseSuite) TearDownSuite() {
logrus.Infof("%s: Removing builder", s.Name)
err := RunBuildkit("rm", []string{
s.Name,
})
}, RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder rm failed", s.Name)
configMapClient := s.ClientSet.CoreV1().ConfigMaps(s.Namespace)
_, err = configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
Expand All @@ -76,7 +77,7 @@ func (s *BaseSuite) TestSimpleBuild() {
"--tag", imageName,
dir,
)
err = RunBuild(args)
err = RunBuild(args, RunBuildStreams{})
if isRootlessCreate(s.CreateFlags) {
require.Error(s.T(), err)
require.Contains(s.T(), err.Error(), "please specify")
Expand Down Expand Up @@ -116,7 +117,19 @@ func (s *BaseSuite) TestLocalOutputTarBuild() {
fmt.Sprintf("--output=type=tar,dest=%s", path.Join(dir, "out.tar")),
dir,
)
err = RunBuild(args)
err = RunBuild(args, RunBuildStreams{})
require.NoError(s.T(), err, "build failed")
// TODO - consider inspecting the out.tar for validity...
}

func (s *BaseSuite) TestLs() {
buf := &bytes.Buffer{}
err := RunBuildkit("ls", []string{}, RunBuildStreams{Out: buf})
require.NoError(s.T(), err, "%s: ls failed", s.Name)
lines := buf.String()
require.Contains(s.T(), lines, s.Name)

err = RunBuildkit("ls", []string{"dummy"}, RunBuildStreams{})
require.Error(s.T(), err)
require.Contains(s.T(), err.Error(), "requires exactly")
}
35 changes: 31 additions & 4 deletions integration/common/runners.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package common

import (
"io"
"os"

"github.com/sirupsen/logrus"
Expand All @@ -15,32 +16,58 @@ import (
_ "github.com/vmware-tanzu/buildkit-cli-for-kubectl/pkg/driver/kubernetes"
)

func RunBuild(args []string) error {
// RunBuildStreams can override in/out/err streams if the output needs to be evaluated
// if unset, stdin/stdout/stderr will be used
type RunBuildStreams struct {
In io.Reader
Out io.Writer
Err io.Writer
}

func RunBuild(args []string, streams RunBuildStreams) error {
flags := pflag.NewFlagSet("kubectl-build", pflag.ExitOnError)
pflag.CommandLine = flags
finalArgs := append(
[]string{"--kubeconfig", os.Getenv("TEST_KUBECONFIG")},
args...,
)
if streams.In == nil {
streams.In = os.Stdin
}
if streams.Out == nil {
streams.Out = os.Stdout
}
if streams.Err == nil {
streams.Err = os.Stderr
}

// TODO do we want to capture the output someplace else?
root := commands.NewRootBuildCmd(genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr})
root := commands.NewRootBuildCmd(genericclioptions.IOStreams{In: streams.In, Out: streams.Out, ErrOut: streams.Err})
root.SetArgs(finalArgs)
logrus.Infof("Build: %v", finalArgs)

return root.Execute()
}

func RunBuildkit(command string, args []string) error {
func RunBuildkit(command string, args []string, streams RunBuildStreams) error {
flags := pflag.NewFlagSet("kubectl-buildkit", pflag.ExitOnError)
pflag.CommandLine = flags
finalArgs := append(
[]string{command, "--kubeconfig", os.Getenv("TEST_KUBECONFIG")},
args...,
)
logrus.Infof("CMD: %v", finalArgs)
if streams.In == nil {
streams.In = os.Stdin
}
if streams.Out == nil {
streams.Out = os.Stdout
}
if streams.Err == nil {
streams.Err = os.Stderr
}

root := commands.NewRootCmd(genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr})
root := commands.NewRootCmd(genericclioptions.IOStreams{In: streams.In, Out: streams.Out, ErrOut: streams.Err})
root.SetArgs(finalArgs)

return root.Execute()
Expand Down
16 changes: 8 additions & 8 deletions integration/suites/configmap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func (s *configMapSuite) TestDefaultCreate() {
},
s.CreateFlags...,
)
err := common.RunBuildkit("create", args)
err := common.RunBuildkit("create", args, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder create failed", s.Name)
cfg, err := s.configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
require.NoError(s.T(), err, "%s: fetch configmap failed", s.Name)
Expand All @@ -78,7 +78,7 @@ func (s *configMapSuite) TestDefaultCreate() {
logrus.Infof("%s: Removing builder", s.Name)
err = common.RunBuildkit("rm", []string{
s.Name,
})
}, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder rm failed", s.Name)
_, err = s.configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
require.Error(s.T(), err, "config map wasn't cleaned up")
Expand All @@ -98,7 +98,7 @@ func (s *configMapSuite) TestPreExistingConfigDefaultCreate() {
},
s.CreateFlags...,
)
err = common.RunBuildkit("create", args)
err = common.RunBuildkit("create", args, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder create failed", s.Name)
cfg, err := s.configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
require.NoError(s.T(), err, "%s: fetch configmap failed", s.Name)
Expand All @@ -112,7 +112,7 @@ func (s *configMapSuite) TestPreExistingConfigDefaultCreate() {
logrus.Infof("%s: Removing builder", s.Name)
err = common.RunBuildkit("rm", []string{
s.Name,
})
}, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder rm failed", s.Name)
_, err = s.configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
// TODO if we preserve pre-existing configmaps this will need to be refined.
Expand All @@ -137,7 +137,7 @@ func (s *configMapSuite) TestCustomCreate() {
},
s.CreateFlags...,
)
err = common.RunBuildkit("create", args)
err = common.RunBuildkit("create", args, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder create failed", s.Name)
cfg, err := s.configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
require.NoError(s.T(), err, "%s: fetch configmap failed", s.Name)
Expand All @@ -152,7 +152,7 @@ func (s *configMapSuite) TestCustomCreate() {
logrus.Infof("%s: Removing builder", s.Name)
err = common.RunBuildkit("rm", []string{
s.Name,
})
}, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder rm failed", s.Name)
_, err = s.configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
require.Error(s.T(), err, "config map wasn't cleaned up")
Expand All @@ -179,7 +179,7 @@ func (s *configMapSuite) TestPreExistingWithCustomCreate() {
},
s.CreateFlags...,
)
err = common.RunBuildkit("create", args)
err = common.RunBuildkit("create", args, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder create failed", s.Name)
cfg, err := s.configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
require.NoError(s.T(), err, "%s: fetch configmap failed", s.Name)
Expand All @@ -195,7 +195,7 @@ func (s *configMapSuite) TestPreExistingWithCustomCreate() {
logrus.Infof("%s: Removing builder", s.Name)
err = common.RunBuildkit("rm", []string{
s.Name,
})
}, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder rm failed", s.Name)
_, err = s.configMapClient.Get(context.Background(), s.Name, metav1.GetOptions{})
require.Error(s.T(), err, "config map wasn't cleaned up")
Expand Down
13 changes: 13 additions & 0 deletions integration/suites/default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,28 @@
package suites

import (
"bytes"
"strings"
"testing"

"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"

"github.com/vmware-tanzu/buildkit-cli-for-kubectl/integration/common"
)

type DefaultSuite struct{ common.BaseSuite }

func (s *DefaultSuite) TestVersion() {
buf := &bytes.Buffer{}
err := common.RunBuildkit("version", []string{}, common.RunBuildStreams{Out: buf})
require.NoError(s.T(), err, "%s: builder version failed", s.Name)
lines := strings.Split(strings.TrimSpace(buf.String()), "\n")
require.Len(s.T(), lines, 2)
require.Contains(s.T(), lines[0], "Client:")
require.Contains(s.T(), lines[1], "buildkitd")
}

func TestDefaultSuite(t *testing.T) {
common.Skipper(t)
t.Parallel()
Expand Down
29 changes: 21 additions & 8 deletions integration/suites/localregistry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package suites

import (
"bytes"
"context"
"fmt"
"path/filepath"
Expand Down Expand Up @@ -236,7 +237,7 @@ func (s *localRegistrySuite) SetupSuite() {
},
s.CreateFlags...,
)
err = common.RunBuildkit("create", args)
err = common.RunBuildkit("create", args, common.RunBuildStreams{})
require.NoError(s.T(), err, "%s: builder creation failed", s.Name)
}

Expand Down Expand Up @@ -267,7 +268,7 @@ func (s *localRegistrySuite) TearDownSuite() {
logrus.Infof("%s: Removing builder", s.Name)
err = common.RunBuildkit("rm", []string{
s.Name,
})
}, common.RunBuildStreams{})
if err != nil {
logrus.Warnf("failed to clean up builder %s", err)
}
Expand All @@ -288,7 +289,7 @@ func (s *localRegistrySuite) TestBuildWithPush() {
"--tag", imageName,
dir,
}
err = common.RunBuild(args)
err = common.RunBuild(args, common.RunBuildStreams{})
require.NoError(s.T(), err, "build failed")
// Note, we can't run the image we just built since it was pushed to the local registry, which isn't ~directly visible to the runtime
}
Expand Down Expand Up @@ -318,14 +319,14 @@ func (s *localRegistrySuite) TestBuildWithCacheScenarios() {
"--cache-to", "type=registry,ref=" + cacheName,
dir,
}
err = common.RunBuild(args)
err = common.RunBuild(args, common.RunBuildStreams{})
require.NoError(s.T(), err, "cache-to only build failed")

// Now do another build with cache-to and cache-from
args = append(args,
"--cache-from", "type=registry,ref="+cacheName,
)
err = common.RunBuild(args)
err = common.RunBuild(args, common.RunBuildStreams{})
require.NoError(s.T(), err, "cache-to/from build failed")

// Do a build with inline caching
Expand All @@ -337,7 +338,7 @@ func (s *localRegistrySuite) TestBuildWithCacheScenarios() {
"--cache-from", "type=registry,ref=" + cacheName,
dir,
}
err = common.RunBuild(args)
err = common.RunBuild(args, common.RunBuildStreams{})
require.NoError(s.T(), err, "inline cache build failed")

// Note, we can't run the image we just built since it was pushed to the local registry, which isn't ~directly visible to the runtime
Expand All @@ -354,7 +355,7 @@ func (s *localRegistrySuite) TestBuildPushWithoutTag() {
"--push",
dir,
}
err = common.RunBuild(args)
err = common.RunBuild(args, common.RunBuildStreams{})
require.Error(s.T(), err)
require.Contains(s.T(), err.Error(), "tag is needed when pushing to registry")
}
Expand Down Expand Up @@ -402,12 +403,24 @@ func main() {
"--platform", "linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,windows/amd64",
dir,
}
err = common.RunBuild(args)
err = common.RunBuild(args, common.RunBuildStreams{})
require.NoError(s.T(), err, "cross-compile multi-arch build failed")

// TODO - need to poke at the resulting image to make sure it was actually correctly created...
}

func (s *localRegistrySuite) TestVersion() {
buf := &bytes.Buffer{}
err := common.RunBuildkit("version", []string{
"--builder", s.Name,
}, common.RunBuildStreams{Out: buf})
require.NoError(s.T(), err, "%s: builder version failed", s.Name)
lines := strings.Split(strings.TrimSpace(buf.String()), "\n")
require.Len(s.T(), lines, 2)
require.Contains(s.T(), lines[0], "Client:")
require.Contains(s.T(), lines[1], "buildkitd")
}

func TestLocalRegistrySuite(t *testing.T) {
common.Skipper(t)
// TODO this testcase should be safe to run parallel, but I'm seeing failures in CI that look
Expand Down
2 changes: 1 addition & 1 deletion integration/suites/parallel_default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (s *parallelDefaultSuite) TestParallelDefaultBuilds() {
"--tag", imageName,
dirs[i],
}
err := common.RunBuild(args)
err := common.RunBuild(args, common.RunBuildStreams{})
if err != nil {
errors[i] = err
return
Expand Down
2 changes: 1 addition & 1 deletion integration/suites/rootless_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func (s *rootlessSuite) TestBuildWithoutPush() {
"--tag", imageName,
dir,
}
err = common.RunBuild(args)
err = common.RunBuild(args, common.RunBuildStreams{})
require.Error(s.T(), err)
require.Contains(s.T(), err.Error(), "please specify --push")
}
Expand Down
3 changes: 1 addition & 2 deletions pkg/cmd/ls.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package commands

import (
"fmt"
"os"
"strings"
"text/tabwriter"

Expand Down Expand Up @@ -35,7 +34,7 @@ func runLs(streams genericclioptions.IOStreams, in lsOptions) error {
builders = append(builders, b...)
}

w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0)
w := tabwriter.NewWriter(streams.Out, 0, 0, 1, ' ', 0)
fmt.Fprintf(w, "NAME\tNODE\tDRIVER\tSTATUS\tPLATFORMS\n")

for _, b := range builders {
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func addCommands(cmd *cobra.Command, streams genericclioptions.IOStreams) {
//stopCmd(streams, opts),
//installCmd(streams),
//uninstallCmd(streams),
versionCmd(streams),
versionCmd(streams, opts),
//pruneCmd(streams, opts),
//duCmd(streams, opts),
//imagetoolscmd.RootCmd(streams),
Expand Down
Loading