mirror of
https://github.com/helm/helm.git
synced 2026-04-26 00:27:36 -04:00
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>
This commit is contained in:
parent
0141f9c806
commit
1ca2ab1d8d
6 changed files with 91 additions and 75 deletions
|
|
@ -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:])
|
||||
actionConfig, err := action.InitActionConfig(settings, false, os.Getenv("HELM_DRIVER"), debug)
|
||||
|
||||
// Initialize the rest of the actionConfig
|
||||
initActionConfig(actionConfig, false)
|
||||
|
||||
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
|
||||
cmd := newRootCmd(actionConfig, os.Stdout, os.Args[1:])
|
||||
|
||||
clientset, err := kc.Factory.KubernetesClientSet()
|
||||
if err != nil {
|
||||
// TODO return error
|
||||
log.Fatal(err)
|
||||
if err := cmd.Execute(); err != nil {
|
||||
debug("%+v", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
if ns, _, err := kubeConfig().ToRawKubeConfigLoader().Namespace(); err == nil {
|
||||
return ns
|
||||
}
|
||||
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…
Reference in a new issue