Moving actionInit from cmd/helm/helm to pgk/action/action to make it easier to instantiate the configuration

Signed-off-by: Aaron Mell <amell@lumindigital.com>
pull/6341/head
Aaron Mell 5 years ago
parent 0141f9c806
commit 1ca2ab1d8d

@ -22,11 +22,9 @@ import (
"log" "log"
"os" "os"
"strings" "strings"
"sync"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/klog" "k8s.io/klog"
// Import to initialize client auth plugins. // Import to initialize client auth plugins.
@ -35,18 +33,13 @@ import (
"helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/action"
"helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/cli"
"helm.sh/helm/v3/pkg/gates" "helm.sh/helm/v3/pkg/gates"
"helm.sh/helm/v3/pkg/kube"
"helm.sh/helm/v3/pkg/storage"
"helm.sh/helm/v3/pkg/storage/driver"
) )
// FeatureGateOCI is the feature gate for checking if `helm chart` and `helm registry` commands should work // FeatureGateOCI is the feature gate for checking if `helm chart` and `helm registry` commands should work
const FeatureGateOCI = gates.Gate("HELM_EXPERIMENTAL_OCI") const FeatureGateOCI = gates.Gate("HELM_EXPERIMENTAL_OCI")
var ( var (
settings = cli.New() settings = cli.New()
config genericclioptions.RESTClientGetter
configOnce sync.Once
) )
func init() { func init() {
@ -71,13 +64,9 @@ func initKubeLogs() {
func main() { func main() {
initKubeLogs() initKubeLogs()
actionConfig := new(action.Configuration) actionConfig, err := action.InitActionConfig(settings, false, os.Getenv("HELM_DRIVER"), debug)
cmd := newRootCmd(actionConfig, os.Stdout, os.Args[1:])
// Initialize the rest of the actionConfig
initActionConfig(actionConfig, false)
if err := cmd.Execute(); err != nil { if err != nil {
debug("%+v", err) debug("%+v", err)
switch e := err.(type) { switch e := err.(type) {
case pluginError: case pluginError:
@ -86,62 +75,13 @@ func main() {
os.Exit(1) os.Exit(1)
} }
} }
}
func initActionConfig(actionConfig *action.Configuration, allNamespaces bool) {
kc := kube.New(kubeConfig())
kc.Log = debug
clientset, err := kc.Factory.KubernetesClientSet()
if err != nil {
// TODO return error
log.Fatal(err)
}
var namespace string
if !allNamespaces {
namespace = getNamespace()
}
var store *storage.Storage cmd := newRootCmd(actionConfig, os.Stdout, os.Args[1:])
switch os.Getenv("HELM_DRIVER") {
case "secret", "secrets", "":
d := driver.NewSecrets(clientset.CoreV1().Secrets(namespace))
d.Log = debug
store = storage.Init(d)
case "configmap", "configmaps":
d := driver.NewConfigMaps(clientset.CoreV1().ConfigMaps(namespace))
d.Log = debug
store = storage.Init(d)
case "memory":
d := driver.NewMemory()
store = storage.Init(d)
default:
// Not sure what to do here.
panic("Unknown driver in HELM_DRIVER: " + os.Getenv("HELM_DRIVER"))
}
actionConfig.RESTClientGetter = kubeConfig()
actionConfig.KubeClient = kc
actionConfig.Releases = store
actionConfig.Log = debug
}
func kubeConfig() genericclioptions.RESTClientGetter {
configOnce.Do(func() {
config = kube.GetConfig(settings.KubeConfig, settings.KubeContext, settings.Namespace)
})
return config
}
func getNamespace() string {
if settings.Namespace != "" {
return settings.Namespace
}
if ns, _, err := kubeConfig().ToRawKubeConfigLoader().Namespace(); err == nil { if err := cmd.Execute(); err != nil {
return ns debug("%+v", err)
os.Exit(1)
} }
return "default"
} }
// wordSepNormalizeFunc changes all flags that contain "_" separators // wordSepNormalizeFunc changes all flags that contain "_" separators

@ -205,7 +205,7 @@ func runInstall(args []string, client *action.Install, valueOpts *values.Options
} }
} }
client.Namespace = getNamespace() client.Namespace = action.GetNamespace()
return client.Run(chartRequested, vals) return client.Run(chartRequested, vals)
} }

@ -51,7 +51,7 @@ func newLintCmd(out io.Writer) *cobra.Command {
if len(args) > 0 { if len(args) > 0 {
paths = args paths = args
} }
client.Namespace = getNamespace() client.Namespace = action.GetNamespace()
vals, err := valueOpts.MergeValues(getter.All(settings)) vals, err := valueOpts.MergeValues(getter.All(settings))
if err != nil { if err != nil {
return err return err

@ -19,6 +19,7 @@ package main
import ( import (
"fmt" "fmt"
"io" "io"
"os"
"strconv" "strconv"
"github.com/gosuri/uitable" "github.com/gosuri/uitable"
@ -69,7 +70,7 @@ func newListCmd(cfg *action.Configuration, out io.Writer) *cobra.Command {
Args: require.NoArgs, Args: require.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
if client.AllNamespaces { if client.AllNamespaces {
initActionConfig(cfg, true) action.InitActionConfig(settings, true, os.Getenv("HELM_DRIVER"), debug)
} }
client.SetStateMask() client.SetStateMask()

@ -71,7 +71,7 @@ func newUpgradeCmd(cfg *action.Configuration, out io.Writer) *cobra.Command {
Long: upgradeDesc, Long: upgradeDesc,
Args: require.ExactArgs(2), Args: require.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
client.Namespace = getNamespace() client.Namespace = action.GetNamespace()
if client.Version == "" && client.Devel { if client.Version == "" && client.Devel {
debug("setting version to >0.0.0-0") debug("setting version to >0.0.0-0")

@ -19,19 +19,23 @@ package action
import ( import (
"path" "path"
"regexp" "regexp"
"sync"
"time" "time"
"github.com/pkg/errors" "github.com/pkg/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/discovery" "k8s.io/client-go/discovery"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"helm.sh/helm/v3/internal/experimental/registry" "helm.sh/helm/v3/internal/experimental/registry"
"helm.sh/helm/v3/pkg/chartutil" "helm.sh/helm/v3/pkg/chartutil"
"helm.sh/helm/v3/pkg/cli"
"helm.sh/helm/v3/pkg/kube" "helm.sh/helm/v3/pkg/kube"
"helm.sh/helm/v3/pkg/release" "helm.sh/helm/v3/pkg/release"
"helm.sh/helm/v3/pkg/storage" "helm.sh/helm/v3/pkg/storage"
"helm.sh/helm/pkg/storage/driver"
) )
// Timestamper is a function capable of producing a timestamp.Timestamper. // Timestamper is a function capable of producing a timestamp.Timestamper.
@ -49,6 +53,10 @@ var (
errInvalidRevision = errors.New("invalid release revision") errInvalidRevision = errors.New("invalid release revision")
// errInvalidName indicates that an invalid release name was provided // errInvalidName indicates that an invalid release name was provided
errInvalidName = errors.New("invalid release name, must match regex ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])+$ and the length must not longer than 53") errInvalidName = errors.New("invalid release name, must match regex ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])+$ and the length must not longer than 53")
config genericclioptions.RESTClientGetter
configOnce sync.Once
settings *cli.EnvSettings
) )
// ValidName is a regular expression for names. // ValidName is a regular expression for names.
@ -82,6 +90,15 @@ type Configuration struct {
Log func(string, ...interface{}) Log func(string, ...interface{})
} }
// RESTClientGetter gets the rest client
type RESTClientGetter interface {
ToRESTConfig() (*rest.Config, error)
ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error)
ToRESTMapper() (meta.RESTMapper, error)
}
type debug func(format string, v ...interface{})
// capabilities builds a Capabilities from discovery information. // capabilities builds a Capabilities from discovery information.
func (c *Configuration) getCapabilities() (*chartutil.Capabilities, error) { func (c *Configuration) getCapabilities() (*chartutil.Capabilities, error) {
if c.Capabilities != nil { if c.Capabilities != nil {
@ -197,8 +214,66 @@ func (c *Configuration) recordRelease(r *release.Release) {
} }
} }
type RESTClientGetter interface { // InitActionConfig initializes the action configuration
ToRESTConfig() (*rest.Config, error) func InitActionConfig(envsettings *cli.EnvSettings, allNamespaces bool, helmDriver string, log debug) (*Configuration, error) {
ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error) settings = envsettings
ToRESTMapper() (meta.RESTMapper, error)
var actionConfig Configuration
kubeconfig := kubeConfig()
kc := kube.New(kubeconfig)
kc.Log = log
clientset, err := kc.Factory.KubernetesClientSet()
if err != nil {
return nil, err
}
var namespace string
if !allNamespaces {
namespace = GetNamespace()
}
var store *storage.Storage
switch helmDriver {
case "secret", "secrets", "":
d := driver.NewSecrets(clientset.CoreV1().Secrets(namespace))
d.Log = log
store = storage.Init(d)
case "configmap", "configmaps":
d := driver.NewConfigMaps(clientset.CoreV1().ConfigMaps(namespace))
d.Log = log
store = storage.Init(d)
case "memory":
d := driver.NewMemory()
store = storage.Init(d)
default:
// Not sure what to do here.
panic("Unknown driver in HELM_DRIVER: " + helmDriver)
}
actionConfig.RESTClientGetter = kubeconfig
actionConfig.KubeClient = kc
actionConfig.Releases = store
actionConfig.Log = log
return &actionConfig, nil
}
func kubeConfig() genericclioptions.RESTClientGetter {
configOnce.Do(func() {
config = kube.GetConfig(settings.KubeConfig, settings.KubeContext, settings.Namespace)
})
return config
}
//GetNamespace gets the namespace from the configuration
func GetNamespace() string {
if envSettings.Namespace != "" {
return envSettings.Namespace
}
if ns, _, err := kubeConfig(envSettings).ToRawKubeConfigLoader().Namespace(); err == nil {
return ns
}
return "default"
} }

Loading…
Cancel
Save