Adding new verbose flag

This allow us to output the progress of the installation / upgrade
with a bit more detail.
This is particular useful in combination with the wait flag, as it
outputs the progress into the console.

Signed-off-by: Soren Mathiasen <smo@tradeshift.com>
pull/9323/head
Soren Mathiasen 5 years ago
parent 46d80f68c1
commit 74abded5b8
No known key found for this signature in database
GPG Key ID: 9B0D4DFDB7B1412F

@ -53,6 +53,12 @@ func debug(format string, v ...interface{}) {
}
}
func verbose(format string, v ...interface{}) {
if settings.Verbose {
format = fmt.Sprintf("%s\n", format)
fmt.Fprintf(os.Stdout, format, v...)
}
}
func warning(format string, v ...interface{}) {
format = fmt.Sprintf("WARNING: %s\n", format)
fmt.Fprintf(os.Stderr, format, v...)
@ -69,7 +75,11 @@ func main() {
// run when each command's execute method is called
cobra.OnInitialize(func() {
helmDriver := os.Getenv("HELM_DRIVER")
if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), helmDriver, debug); err != nil {
logger := debug
if settings.Verbose {
logger = verbose
}
if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), helmDriver, logger); err != nil {
log.Fatal(err)
}
if helmDriver == "memory" {

@ -15,5 +15,6 @@ HELM_PLUGINS
HELM_REGISTRY_CONFIG
HELM_REPOSITORY_CACHE
HELM_REPOSITORY_CONFIG
HELM_VERBOSE
:4
Completion ended with directive: ShellCompDirectiveNoFileComp

@ -53,6 +53,6 @@ func (h *History) Run(name string) ([]*release.Release, error) {
return nil, errors.Errorf("release name is invalid: %s", name)
}
h.cfg.Log("getting history for release %s", name)
h.cfg.Log("Getting history for release %s", name)
return h.cfg.Releases.History(name)
}

@ -81,7 +81,7 @@ func (r *Rollback) Run(name string) error {
}
if !r.DryRun {
r.cfg.Log("updating status for rolled back release for %s", name)
r.cfg.Log("Updating status for rolled back release for %s", name)
if err := r.cfg.Releases.Update(targetRelease); err != nil {
return err
}

@ -120,7 +120,7 @@ func (u *Upgrade) Run(name string, chart *chart.Chart, vals map[string]interface
if err := chartutil.ValidateReleaseName(name); err != nil {
return nil, errors.Errorf("release name is invalid: %s", name)
}
u.cfg.Log("preparing upgrade for %s", name)
u.cfg.Log("Preparing upgrade for %s", name)
currentRelease, upgradedRelease, err := u.prepareUpgrade(name, chart, vals)
if err != nil {
return nil, err
@ -128,14 +128,14 @@ func (u *Upgrade) Run(name string, chart *chart.Chart, vals map[string]interface
u.cfg.Releases.MaxHistory = u.MaxHistory
u.cfg.Log("performing update for %s", name)
u.cfg.Log("Performing update for %s", name)
res, err := u.performUpgrade(currentRelease, upgradedRelease)
if err != nil {
return res, err
}
if !u.DryRun {
u.cfg.Log("updating status for upgraded release for %s", name)
u.cfg.Log("Updating status for upgraded release for %s", name)
if err := u.cfg.Releases.Update(upgradedRelease); err != nil {
return res, err
}
@ -300,7 +300,7 @@ func (u *Upgrade) performUpgrade(originalRelease, upgradedRelease *release.Relea
return upgradedRelease, nil
}
u.cfg.Log("creating upgraded release for %s", upgradedRelease.Name)
u.cfg.Log("Creating upgraded release for %s", upgradedRelease.Name)
if err := u.cfg.Releases.Create(upgradedRelease); err != nil {
return nil, err
}

@ -58,6 +58,8 @@ type EnvSettings struct {
KubeCaFile string
// Debug indicates whether or not Helm is running in Debug mode.
Debug bool
// Verbose indicates whether or not Helm is running in Verbose mode.
Verbose bool
// RegistryConfig is the path to the registry config file.
RegistryConfig string
// RepositoryConfig is the path to the repositories file.
@ -86,7 +88,7 @@ func New() *EnvSettings {
RepositoryCache: envOr("HELM_REPOSITORY_CACHE", helmpath.CachePath("repository")),
}
env.Debug, _ = strconv.ParseBool(os.Getenv("HELM_DEBUG"))
env.Verbose, _ = strconv.ParseBool(os.Getenv("HELM_VERBOSE"))
// bind to kubernetes config flags
env.config = &genericclioptions.ConfigFlags{
Namespace: &env.namespace,
@ -111,7 +113,8 @@ func (s *EnvSettings) AddFlags(fs *pflag.FlagSet) {
fs.StringArrayVar(&s.KubeAsGroups, "kube-as-group", s.KubeAsGroups, "group to impersonate for the operation, this flag can be repeated to specify multiple groups.")
fs.StringVar(&s.KubeAPIServer, "kube-apiserver", s.KubeAPIServer, "the address and the port for the Kubernetes API server")
fs.StringVar(&s.KubeCaFile, "kube-ca-file", s.KubeCaFile, "the certificate authority file for the Kubernetes API server connection")
fs.BoolVar(&s.Debug, "debug", s.Debug, "enable verbose output")
fs.BoolVar(&s.Debug, "debug", s.Debug, "enable debug output")
fs.BoolVar(&s.Verbose, "verbose", s.Verbose, "enable verbose output")
fs.StringVar(&s.RegistryConfig, "registry-config", s.RegistryConfig, "path to the registry config file")
fs.StringVar(&s.RepositoryConfig, "repository-config", s.RepositoryConfig, "path to the file containing repository names and URLs")
fs.StringVar(&s.RepositoryCache, "repository-cache", s.RepositoryCache, "path to the file containing cached repository indexes")
@ -151,6 +154,7 @@ func (s *EnvSettings) EnvVars() map[string]string {
"HELM_CONFIG_HOME": helmpath.ConfigPath(""),
"HELM_DATA_HOME": helmpath.DataPath(""),
"HELM_DEBUG": fmt.Sprint(s.Debug),
"HELM_VERBOSE": fmt.Sprint(s.Verbose),
"HELM_PLUGINS": s.PluginsDirectory,
"HELM_REGISTRY_CONFIG": s.RegistryConfig,
"HELM_REPOSITORY_CACHE": s.RepositoryCache,

@ -36,6 +36,7 @@ func TestEnvSettings(t *testing.T) {
// expected values
ns, kcontext string
debug bool
verbose bool
maxhistory int
kAsUser string
kAsGroups []string
@ -48,9 +49,10 @@ func TestEnvSettings(t *testing.T) {
},
{
name: "with flags set",
args: "--debug --namespace=myns --kube-as-user=poro --kube-as-group=admins --kube-as-group=teatime --kube-as-group=snackeaters --kube-ca-file=/tmp/ca.crt",
args: "--debug --verbose --namespace=myns --kube-as-user=poro --kube-as-group=admins --kube-as-group=teatime --kube-as-group=snackeaters --kube-ca-file=/tmp/ca.crt",
ns: "myns",
debug: true,
verbose: true,
maxhistory: defaultMaxHistory,
kAsUser: "poro",
kAsGroups: []string{"admins", "teatime", "snackeaters"},
@ -96,6 +98,9 @@ func TestEnvSettings(t *testing.T) {
if settings.Debug != tt.debug {
t.Errorf("expected debug %t, got %t", tt.debug, settings.Debug)
}
if settings.Verbose != tt.verbose {
t.Errorf("expected verbose %t, got %t", tt.verbose, settings.Verbose)
}
if settings.Namespace() != tt.ns {
t.Errorf("expected namespace %q, got %q", tt.ns, settings.Namespace())
}

@ -88,7 +88,7 @@ func New(getter genericclioptions.RESTClientGetter) *Client {
}
}
var nopLogger = func(_ string, _ ...interface{}) {}
var nopLogger = func(s string, i ...interface{}) {}
// getKubeClient get or create a new KubernetesClientSet
func (c *Client) getKubeClient() (*kubernetes.Clientset, error) {
@ -198,7 +198,7 @@ func (c *Client) Update(original, target ResourceList, force bool) (*Result, err
updateErrors := []string{}
res := &Result{}
c.Log("checking %d resources for changes", len(target))
c.Log("Checking %d resources for changes", len(target))
err := target.Visit(func(info *resource.Info, err error) error {
if err != nil {
return err
@ -219,7 +219,12 @@ func (c *Client) Update(original, target ResourceList, force bool) (*Result, err
}
kind := info.Mapping.GroupVersionKind.Kind
if info.Namespace == "" {
// Cluster wide resource doesn't have a namespace defined
c.Log("Created a new %s called %q\n", kind, info.Name)
} else {
c.Log("Created a new %s called %q in %s\n", kind, info.Name, info.Namespace)
}
return nil
}

@ -50,7 +50,8 @@ type waiter struct {
// waitForResources polls to get the current status of all pods, PVCs, Services and
// Jobs(optional) until all are ready or a timeout is reached
func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool) error {
w.log("beginning wait for %d resources with timeout of %v", len(created), w.timeout)
w.log("Beginning wait for %d resources with timeout of %v", len(created), w.timeout)
return wait.Poll(2*time.Second, w.timeout, func() (bool, error) {
for _, v := range created {

Loading…
Cancel
Save