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"
"os"
"strings"
"sync"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/klog"
// Import to initialize client auth plugins.
@ -35,18 +33,13 @@ import (
"helm.sh/helm/v3/pkg/action"
"helm.sh/helm/v3/pkg/cli"
"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
const FeatureGateOCI = gates.Gate("HELM_EXPERIMENTAL_OCI")
var (
settings = cli.New()
config genericclioptions.RESTClientGetter
configOnce sync.Once
settings = cli.New()
)
func init() {
@ -71,13 +64,9 @@ func initKubeLogs() {
func main() {
initKubeLogs()
actionConfig := new(action.Configuration)
cmd := newRootCmd(actionConfig, os.Stdout, os.Args[1:])
// Initialize the rest of the actionConfig
initActionConfig(actionConfig, false)
actionConfig, err := action.InitActionConfig(settings, false, os.Getenv("HELM_DRIVER"), debug)
if err := cmd.Execute(); err != nil {
if err != nil {
debug("%+v", err)
switch e := err.(type) {
case pluginError:
@ -86,62 +75,13 @@ func main() {
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
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
}
cmd := newRootCmd(actionConfig, os.Stdout, os.Args[1:])
if ns, _, err := kubeConfig().ToRawKubeConfigLoader().Namespace(); err == nil {
return ns
if err := cmd.Execute(); err != nil {
debug("%+v", err)
os.Exit(1)
}
return "default"
}
// 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)
}

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

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

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

@ -19,19 +19,23 @@ package action
import (
"path"
"regexp"
"sync"
"time"
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/discovery"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"helm.sh/helm/v3/internal/experimental/registry"
"helm.sh/helm/v3/pkg/chartutil"
"helm.sh/helm/v3/pkg/cli"
"helm.sh/helm/v3/pkg/kube"
"helm.sh/helm/v3/pkg/release"
"helm.sh/helm/v3/pkg/storage"
"helm.sh/helm/pkg/storage/driver"
)
// Timestamper is a function capable of producing a timestamp.Timestamper.
@ -49,6 +53,10 @@ var (
errInvalidRevision = errors.New("invalid release revision")
// 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")
config genericclioptions.RESTClientGetter
configOnce sync.Once
settings *cli.EnvSettings
)
// ValidName is a regular expression for names.
@ -82,6 +90,15 @@ type Configuration struct {
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.
func (c *Configuration) getCapabilities() (*chartutil.Capabilities, error) {
if c.Capabilities != nil {
@ -197,8 +214,66 @@ func (c *Configuration) recordRelease(r *release.Release) {
}
}
type RESTClientGetter interface {
ToRESTConfig() (*rest.Config, error)
ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error)
ToRESTMapper() (meta.RESTMapper, error)
// InitActionConfig initializes the action configuration
func InitActionConfig(envsettings *cli.EnvSettings, allNamespaces bool, helmDriver string, log debug) (*Configuration, error) {
settings = envsettings
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