remove logger passed as dependency, small Cmd refactor

This commit is contained in:
Milos Pejanovic 2021-03-31 17:24:45 +02:00
parent edad11ed7e
commit aa07735b74
18 changed files with 82 additions and 190 deletions

2
.gitignore vendored
View File

@ -121,7 +121,7 @@ modules.xml
.history
.todo
.output
.squadron
bin

View File

@ -3,10 +3,10 @@ package squadron
import (
"fmt"
"github.com/sirupsen/logrus"
"gopkg.in/yaml.v3"
"github.com/foomo/squadron/util"
"github.com/sirupsen/logrus"
)
type Build struct {
@ -29,30 +29,32 @@ type Build struct {
// ------------------------------------------------------------------------------------------------
func (b *Build) Exists() (bool, error) {
return util.NewDockerCommand(logrus.NewEntry(logrus.StandardLogger())).ImageExists(b.Image, b.Tag)
logrus.Infof("checking image exists for %s:%s", b.Image, b.Tag)
return util.NewDockerCommand().ImageExists(b.Image, b.Tag)
}
// Build ...
func (b *Build) Build() error {
cmd := util.NewDockerCommand(logrus.NewEntry(logrus.StandardLogger()))
cmd.Option("-t", fmt.Sprintf("%s:%s", b.Image, b.Tag))
cmd.Option("--file", b.Dockerfile)
cmd.ListOption("--build-arg", b.Args)
cmd.ListOption("--label", b.Labels)
cmd.ListOption("--cache-from", b.CacheFrom)
cmd.Option("--network", b.Network)
cmd.Option("--target", b.Target)
cmd.Option("--shm-size", b.ShmSize)
cmd.ListOption("--add-host", b.ExtraHosts)
cmd.Option("--isolation", b.Isolation)
logrus.Infof("running docker build for %q", b.Context)
cmd := util.NewDockerCommand()
cmd.Args("-t", fmt.Sprintf("%s:%s", b.Image, b.Tag)).
Args("--file", b.Dockerfile).
ListArg("--build-arg", b.Args).
ListArg("--label", b.Labels).
ListArg("--cache-from", b.CacheFrom).
Args("--network", b.Network).
Args("--target", b.Target).
Args("--shm-size", b.ShmSize).
ListArg("--add-host", b.ExtraHosts).
Args("--isolation", b.Isolation)
_, err := cmd.Build(b.Context)
return err
}
// Push ...
func (b *Build) Push() error {
cmd := util.NewDockerCommand(logrus.NewEntry(logrus.StandardLogger()))
_, err := cmd.Push(b.Image, b.Tag)
logrus.Infof("running docker push for %s:%s", b.Image, b.Tag)
_, err := util.NewDockerCommand().Push(b.Image, b.Tag)
return err
}

View File

@ -1,7 +1,6 @@
package actions
import (
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/foomo/squadron"
@ -18,13 +17,13 @@ var (
Example: " squadron build frontend backend",
Args: cobra.MinimumNArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
return build(log, args, cwd, flagFiles, flagPush)
return build(args, cwd, flagFiles, flagPush)
},
}
)
func build(l *logrus.Entry, args []string, cwd string, files []string, push bool) error {
sq, err := squadron.New(l, cwd, "", files)
func build(args []string, cwd string, files []string, push bool) error {
sq, err := squadron.New(cwd, "", files)
if err != nil {
return err
}

View File

@ -3,7 +3,6 @@ package actions
import (
"fmt"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/foomo/squadron"
@ -16,13 +15,13 @@ var (
Example: " squadron config --file squadron.yaml --file squadron.override.yaml",
Args: cobra.MinimumNArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
return config(log, cwd, flagFiles)
return config(cwd, flagFiles)
},
}
)
func config(l *logrus.Entry, cwd string, files []string) error {
sq, err := squadron.New(l, cwd, "", files)
func config(cwd string, files []string) error {
sq, err := squadron.New(cwd, "", files)
if err != nil {
return err
}

View File

@ -1,7 +1,6 @@
package actions
import (
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/foomo/squadron"
@ -18,13 +17,13 @@ var (
Example: " squadron down --namespace demo",
Args: cobra.MinimumNArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
return down(log, args, cwd, flagNamespace)
return down(args, cwd, flagNamespace)
},
}
)
func down(l *logrus.Entry, args []string, cwd, namespace string) error {
sq, err := squadron.New(l, cwd, namespace, nil)
func down(args []string, cwd, namespace string) error {
sq, err := squadron.New(cwd, namespace, nil)
if err != nil {
return err
}

View File

@ -1,7 +1,6 @@
package actions
import (
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/foomo/squadron"
@ -14,13 +13,13 @@ var (
Example: " squadron generate fronted backend",
Args: cobra.MinimumNArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
return generate(log, cwd, flagFiles)
return generate(cwd, flagFiles)
},
}
)
func generate(l *logrus.Entry, cwd string, files []string) error {
sq, err := squadron.New(l, cwd, "", files)
func generate(cwd string, files []string) error {
sq, err := squadron.New(cwd, "", files)
if err != nil {
return err
}

View File

@ -16,7 +16,10 @@ var (
rootCmd = &cobra.Command{
Use: "squadron",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
log = newLogger(flagVerbose)
logrus.SetLevel(logrus.InfoLevel)
if flagVerbose {
logrus.SetLevel(logrus.TraceLevel)
}
var err error
if cmd.Name() == "help" || cmd.Name() == "init" || cmd.Name() == "version" {
return nil
@ -29,7 +32,6 @@ var (
},
}
log *logrus.Entry
cwd string
flagVerbose bool
flagNamespace string
@ -46,20 +48,11 @@ func init() {
}
func Execute() {
log := logrus.New()
if err := rootCmd.Execute(); err != nil {
log.Fatal(err)
logrus.Fatal(err)
}
}
func newLogger(verbose bool) *logrus.Entry {
logger := logrus.New()
if verbose {
logger.SetLevel(logrus.TraceLevel)
}
return logrus.NewEntry(logger)
}
// parseExtraArgs ...
func parseExtraArgs(args []string) (out []string, extraArgs []string) {
for i, arg := range args {

View File

@ -3,7 +3,6 @@ package actions
import (
"fmt"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/foomo/squadron"
@ -20,13 +19,13 @@ var (
Example: " squadron template",
Args: cobra.MinimumNArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
return template(log, args, cwd, flagNamespace, flagFiles)
return template(args, cwd, flagNamespace, flagFiles)
},
}
)
func template(l *logrus.Entry, args []string, cwd, namespace string, files []string) error {
sq, err := squadron.New(l, cwd, namespace, files)
func template(args []string, cwd, namespace string, files []string) error {
sq, err := squadron.New(cwd, namespace, files)
if err != nil {
return err
}

View File

@ -1,7 +1,6 @@
package actions
import (
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/foomo/squadron"
@ -20,13 +19,13 @@ var (
Example: " squadron up frontend backend --namespace demo --build --push -- --dry-run",
Args: cobra.MinimumNArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
return up(log, args, cwd, flagNamespace, flagBuild, flagPush, flagFiles)
return up(args, cwd, flagNamespace, flagBuild, flagPush, flagFiles)
},
}
)
func up(l *logrus.Entry, args []string, cwd, namespace string, build, push bool, files []string) error {
sq, err := squadron.New(l, cwd, namespace, files)
func up(args []string, cwd, namespace string, build, push bool, files []string) error {
sq, err := squadron.New(cwd, namespace, files)
if err != nil {
return err
}

View File

@ -6,10 +6,10 @@ import (
"path"
"path/filepath"
"github.com/sirupsen/logrus"
"gopkg.in/yaml.v3"
"github.com/foomo/squadron/util"
"github.com/sirupsen/logrus"
)
const (
@ -32,13 +32,11 @@ type Squadron struct {
name string
basePath string
namespace string
l *logrus.Entry
c Configuration
}
func New(l *logrus.Entry, basePath, namespace string, files []string) (*Squadron, error) {
func New(basePath, namespace string, files []string) (*Squadron, error) {
sq := Squadron{
l: l,
basePath: basePath,
namespace: namespace,
c: Configuration{},
@ -69,59 +67,44 @@ func (sq Squadron) GetConfigYAML() ([]byte, error) {
}
func (sq Squadron) Generate(units map[string]Unit) error {
// cleanup old files
logrus.Infof("recreating chart output dir %q", sq.chartPath())
if err := sq.cleanupOutput(sq.chartPath()); err != nil {
return err
}
// generate Chart.yaml and values.yaml
logrus.Infof("generating chart %q files in %q", sq.name, sq.chartPath())
if err := sq.generateChart(units, sq.chartPath(), sq.name, sq.c.Version); err != nil {
return err
}
// run helm dependency upgrade
cmd := util.NewHelmCommand(sq.l)
_, err := cmd.UpdateDependency(sq.name, sq.chartPath())
if err != nil {
return err
}
return nil
logrus.Infof("running helm dependency update for chart: %v", sq.chartPath())
_, err := util.NewHelmCommand().UpdateDependency(sq.name, sq.chartPath())
return err
}
func (sq Squadron) Package() error {
cmd := util.NewHelmCommand(sq.l)
_, err := cmd.Package(sq.name, sq.chartPath(), sq.basePath)
logrus.Infof("running helm package for chart: %v", sq.chartPath())
_, err := util.NewHelmCommand().Package(sq.name, sq.chartPath(), sq.basePath)
return err
}
func (sq Squadron) Down(helmArgs []string) error {
cmd := util.NewHelmCommand(sq.l)
cmd.Args("uninstall", sq.name)
cmd.Args("--namespace", sq.namespace)
// use extra args
cmd.Args(helmArgs...)
// run
_, err := cmd.Run()
logrus.Infof("running helm uninstall for chart: %v", sq.chartPath())
_, err := util.NewHelmCommand().Args("uninstall", sq.name).
Args("--namespace", sq.namespace).Args(helmArgs...).Run()
return err
}
func (sq Squadron) Up(helmArgs []string) error {
cmd := util.NewHelmCommand(sq.l)
cmd.Args("upgrade", sq.name, sq.chartPath(), "--install")
cmd.Args("--namespace", sq.namespace)
// use extra args
cmd.Args(helmArgs...)
// run
_, err := cmd.Run()
logrus.Infof("running helm install for chart: %v", sq.chartPath())
_, err := util.NewHelmCommand().
Args("upgrade", sq.name, sq.chartPath(), "--install").
Args("--namespace", sq.namespace).Args(helmArgs...).Run()
return err
}
func (sq Squadron) Template(helmArgs []string) (string, error) {
cmd := util.NewHelmCommand(sq.l)
cmd.Args("template", sq.name, sq.chartPath())
cmd.Args("--namespace", sq.namespace)
// use extra args
cmd.Args(helmArgs...)
// run
return cmd.Run()
logrus.Infof("running helm template for chart: %v", sq.chartPath())
return util.NewHelmCommand().Args("template", sq.name, sq.chartPath()).
Args("--namespace", sq.namespace).Args(helmArgs...).Run()
}
func (sq Squadron) chartPath() string {
@ -130,13 +113,10 @@ func (sq Squadron) chartPath() string {
func (sq Squadron) cleanupOutput(chartPath string) error {
if _, err := os.Stat(chartPath); err == nil {
sq.l.Infof("removing dir: %q", chartPath)
if err := os.RemoveAll(chartPath); err != nil {
sq.l.Warnf("could not delete chart output directory: %q", err)
logrus.Warnf("could not delete chart output directory: %q", err)
}
}
sq.l.Printf("creating dir: %q", chartPath)
if _, err := os.Stat(chartPath); os.IsNotExist(err) {
if err := os.MkdirAll(chartPath, 0744); err != nil {
return fmt.Errorf("could not create chart output directory: %w", err)
@ -146,7 +126,6 @@ func (sq Squadron) cleanupOutput(chartPath string) error {
}
func (sq Squadron) generateChart(units map[string]Unit, chartPath, chartName, version string) error {
sq.l.Printf("generating chart %q files in %q", chartName, chartPath)
chart := newChart(chartName, version)
values := map[string]interface{}{}
if sq.GetGlobal() != nil {

View File

@ -1,43 +0,0 @@
name: test
version: "1.0"
prefix: storefinder # optional
squadron:
nats:
chart:
name: nats
version: 0.7.5
repository: https://nats-io.github.io/k8s/helm/charts/
values:
foo:
{{ print .PWD "/example/squadron/charts/example/Chart.yaml" | yaml | indent 8 }}
nameOverride: nats
natsbox:
enabled: false
frontend:
chart: "{{ .PWD }}/example/squadron/charts/example"
builds:
buildFirst:
image: registry.your-company.com/path/to/image
tag: {{ env "TAG" | base64 }}
context: "{{ .PWD }}/example/squadron/application/"
values:
image: "{{ .Squadron.frontend.builds.buildFirst.image }}:{{ .Squadron.frontend.builds.buildFirst.tag }}"
service:
ports:
- {{ default .Squadron.frontend.builds.buildFirst "isolation" 80 }}
# squadron up -n storefinder storefinder = helm upgrage --install --create-namespace -n storefinder storefinder
# squadron down -n storefinder storefinder = helm uninstall storefinder -n storefinder
# squadron up -n storefinder storefinder storefinder-frontend --push
# squadron build ..
# squadron generate .. --tgz
# (squadron init ..)
# squadron config {-f (merging optional)} -> prints out the config
# squadron version
# squadron help

View File

@ -5,7 +5,7 @@ import (
"testing"
"github.com/foomo/squadron"
"github.com/foomo/squadron/tests/utils"
testutils "github.com/foomo/squadron/tests/utils"
"github.com/foomo/squadron/util"
)
@ -51,7 +51,7 @@ func testConfigSnapshot(t *testing.T, configs []string, snapshot string) {
var cwd string
testutils.Must(t, util.ValidatePath(".", &cwd))
sq, err := squadron.New(testutils.Log(), cwd, "", configs)
sq, err := squadron.New(cwd, "", configs)
testutils.Must(t, err, "failed to init squadron")
cf, err := sq.GetConfigYAML()

View File

@ -1,11 +0,0 @@
package testutils
import (
"github.com/sirupsen/logrus"
"github.com/sirupsen/logrus/hooks/test"
)
func Log() *logrus.Entry {
testLogger, _ := test.NewNullLogger()
return logrus.NewEntry(testLogger)
}

View File

@ -11,7 +11,6 @@ import (
)
type Cmd struct {
l *logrus.Entry
// cmd *exec.Cmd
command []string
cwd string
@ -26,9 +25,8 @@ type Cmd struct {
postEndFunc func() error
}
func NewCommand(l *logrus.Entry, name string) *Cmd {
func NewCommand(name string) *Cmd {
return &Cmd{
l: l,
command: []string{name},
wait: true,
env: os.Environ(),
@ -49,6 +47,13 @@ func (c *Cmd) Args(args ...string) *Cmd {
return c
}
func (c *Cmd) ListArg(name string, v []string) *Cmd {
for _, i := range v {
c.command = append(c.command, name, i)
}
return c
}
func (c *Cmd) Cwd(path string) *Cmd {
c.cwd = path
return c
@ -111,11 +116,11 @@ func (c *Cmd) Run() (string, error) {
if c.cwd != "" {
cmd.Dir = c.cwd
}
c.l.Tracef("executing %q", cmd.String())
logrus.Tracef("executing %q", cmd.String())
combinedBuf := new(bytes.Buffer)
traceWriter := c.l.WriterLevel(logrus.TraceLevel)
warnWriter := c.l.WriterLevel(logrus.WarnLevel)
traceWriter := logrus.New().WriterLevel(logrus.TraceLevel)
warnWriter := logrus.New().WriterLevel(logrus.WarnLevel)
c.stdoutWriters = append(c.stdoutWriters, combinedBuf, traceWriter)
c.stderrWriters = append(c.stderrWriters, combinedBuf, warnWriter)

View File

@ -2,8 +2,6 @@ package util
import (
"fmt"
"github.com/sirupsen/logrus"
)
type DockerCmd struct {
@ -11,37 +9,19 @@ type DockerCmd struct {
Options []string
}
func NewDockerCommand(l *logrus.Entry) *DockerCmd {
return &DockerCmd{*NewCommand(l, "docker"), []string{}}
}
func (c *DockerCmd) Option(name, v string) *Cmd {
if v == "" {
return &c.Cmd
}
c.Options = append(c.Options, name, v)
return &c.Cmd
}
func (c *DockerCmd) ListOption(name string, v []string) *Cmd {
for _, i := range v {
c.Options = append(c.Options, name, i)
}
return &c.Cmd
func NewDockerCommand() *DockerCmd {
return &DockerCmd{*NewCommand("docker"), []string{}}
}
func (c *DockerCmd) Build(workDir string) (string, error) {
c.l.Infof("Running docker build for %q", workDir)
return c.Cwd(workDir).Args("build", ".").Args(c.Options...).Run()
}
func (c *DockerCmd) Push(image, tag string, options ...string) (string, error) {
c.l.Infof("Running docker push for %s:%s", image, tag)
return c.Args("push", fmt.Sprintf("%s:%s", image, tag)).Args(options...).Run()
}
func (c *DockerCmd) ImageExists(image, tag string) (bool, error) {
c.l.Infof("Checking image exists for %s:%s", image, tag)
ret, err := c.Args("images", "--quiet", fmt.Sprintf("%s:%s", image, tag)).Run()
return ret != "", err
}

View File

@ -3,16 +3,14 @@ package util
import (
"path/filepath"
"strings"
"github.com/sirupsen/logrus"
)
type GoCmd struct {
Cmd
}
func NewGoCommand(l *logrus.Entry) *GoCmd {
return &GoCmd{*NewCommand(l, "go")}
func NewGoCommand() *GoCmd {
return &GoCmd{*NewCommand("go")}
}
func (c GoCmd) Build(workDir, output, input string, flags ...string) *Cmd {

View File

@ -1,21 +1,17 @@
package util
import "github.com/sirupsen/logrus"
type HelmCmd struct {
Cmd
}
func NewHelmCommand(l *logrus.Entry) *HelmCmd {
return &HelmCmd{*NewCommand(l, "helm")}
func NewHelmCommand() *HelmCmd {
return &HelmCmd{*NewCommand("helm")}
}
func (c HelmCmd) UpdateDependency(chart, chartPath string) (string, error) {
c.l.Infof("Running helm dependency update for chart: %v", chart)
return c.Base().Args("dependency", "update", chartPath).Run()
}
func (c HelmCmd) Package(chart, chartPath, destPath string) (string, error) {
c.l.Infof("Running helm package for chart: %v", chart)
return c.Base().Args("package", chartPath, "--destination", destPath).Run()
}

View File

@ -6,7 +6,6 @@ import (
"os"
"strings"
"github.com/sirupsen/logrus"
v1 "k8s.io/api/apps/v1"
)
@ -14,8 +13,8 @@ type KubeCmd struct {
Cmd
}
func NewKubeCommand(l *logrus.Entry) *KubeCmd {
return &KubeCmd{*NewCommand(l, "kubectl")}
func NewKubeCommand() *KubeCmd {
return &KubeCmd{*NewCommand("kubectl")}
}
func (c KubeCmd) RollbackDeployment(deployment string) *Cmd {