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

Commit

Permalink
Merge pull request #89 from dhiltgen/better_version
Browse files Browse the repository at this point in the history
Enhance version command
  • Loading branch information
dhiltgen committed Sep 13, 2021
2 parents d32c446 + 11ec9d4 commit 3cdb096
Show file tree
Hide file tree
Showing 13 changed files with 206 additions and 35 deletions.
21 changes: 17 additions & 4 deletions integration/common/basesuites.go
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
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
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
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
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
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
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
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
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

0 comments on commit 3cdb096

Please sign in to comment.