95 lines
2.4 KiB
Go
95 lines
2.4 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/roboll/helmfile/helmexec"
|
|
"github.com/roboll/helmfile/pkg/app"
|
|
"github.com/roboll/helmfile/state"
|
|
"github.com/urfave/cli"
|
|
"go.uber.org/zap"
|
|
"strings"
|
|
)
|
|
|
|
func VisitAllDesiredStates(c *cli.Context, converge func(*state.HelmState, helmexec.Interface, app.Context) (bool, []error)) error {
|
|
a, fileOrDir, err := InitAppEntry(c, false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ctx := app.NewContext()
|
|
|
|
convergeWithHelmBinary := func(st *state.HelmState, helm helmexec.Interface) (bool, []error) {
|
|
if c.GlobalString("helm-binary") != "" {
|
|
helm.SetHelmBinary(c.GlobalString("helm-binary"))
|
|
}
|
|
return converge(st, helm, ctx)
|
|
}
|
|
|
|
err = a.VisitDesiredStates(fileOrDir, a.Selectors, convergeWithHelmBinary)
|
|
|
|
return toCliError(err)
|
|
}
|
|
|
|
func InitAppEntry(c *cli.Context, reverse bool) (*app.App, string, error) {
|
|
if c.NArg() > 0 {
|
|
cli.ShowAppHelp(c)
|
|
return nil, "", fmt.Errorf("err: extraneous arguments: %s", strings.Join(c.Args(), ", "))
|
|
}
|
|
|
|
fileOrDir := c.GlobalString("file")
|
|
kubeContext := c.GlobalString("kube-context")
|
|
namespace := c.GlobalString("namespace")
|
|
selectors := c.GlobalStringSlice("selector")
|
|
logger := c.App.Metadata["logger"].(*zap.SugaredLogger)
|
|
|
|
env := c.GlobalString("environment")
|
|
if env == "" {
|
|
env = state.DefaultEnv
|
|
}
|
|
|
|
app := app.Init(&app.App{
|
|
KubeContext: kubeContext,
|
|
Logger: logger,
|
|
Reverse: reverse,
|
|
Env: env,
|
|
Namespace: namespace,
|
|
Selectors: selectors,
|
|
})
|
|
|
|
return app, fileOrDir, nil
|
|
}
|
|
|
|
func FindAndIterateOverDesiredStatesUsingFlagsWithReverse(c *cli.Context, reverse bool, converge func(*state.HelmState, helmexec.Interface, app.Context) []error) error {
|
|
a, fileOrDir, err := InitAppEntry(c, reverse)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ctx := app.NewContext()
|
|
|
|
convergeWithHelmBinary := func(st *state.HelmState, helm helmexec.Interface) []error {
|
|
if c.GlobalString("helm-binary") != "" {
|
|
helm.SetHelmBinary(c.GlobalString("helm-binary"))
|
|
}
|
|
return converge(st, helm, ctx)
|
|
}
|
|
|
|
err = a.VisitDesiredStatesWithReleasesFiltered(fileOrDir, convergeWithHelmBinary)
|
|
|
|
return toCliError(err)
|
|
}
|
|
|
|
func toCliError(err error) error {
|
|
if err != nil {
|
|
switch e := err.(type) {
|
|
case *app.NoMatchingHelmfileError:
|
|
return cli.NewExitError(e.Error(), 2)
|
|
case *app.Error:
|
|
return cli.NewExitError(e.Error(), e.Code())
|
|
default:
|
|
panic(fmt.Errorf("BUG: please file an github issue for this unhandled error: %T: %v", e, e))
|
|
}
|
|
}
|
|
return err
|
|
}
|