Skip to content

Commit

Permalink
Support passing kubeContext. (#27)
Browse files Browse the repository at this point in the history
* Support passing kubeContext. Refactor some logic with kube client

* fix tests and linting. no need to pass pointer, just use string

* remove unused kubeconfig flag
  • Loading branch information
Andrew Suderman authored Jan 15, 2021
1 parent 09d7dcf commit 46a645c
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 22 deletions.
9 changes: 7 additions & 2 deletions cmd/find.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,13 @@ var (
pollHelmHub bool
helmHubConfigURL string
wide bool
kubeContext string
)

func init() {
rootCmd.AddCommand(clusterCmd)
rootCmd.PersistentFlags().StringVarP(&outputFile, "output-file", "", "", "Path on local filesystem to write file output to")
rootCmd.PersistentFlags().StringVar(&kubeContext, "context", "", "A context to use in the kubeconfig.")
clusterCmd.PersistentFlags().StringVar(&helmVersion, "helm-version", "3", "Helm version in the current cluster (2|3|auto)")
clusterCmd.PersistentFlags().BoolVar(&wide, "wide", false, "Output chart name and namespace")

Expand Down Expand Up @@ -67,9 +69,12 @@ var clusterCmd = &cobra.Command{
Long: "Find deployed helm releases that have updated charts available in chart repos",
Run: func(cmd *cobra.Command, args []string) {

h := nova_helm.NewHelm(helmVersion, kubeContext)
HelmRepos := nova_helm.NewRepo(getRepoURLs())
outputObjects, err := nova_helm.GetReleaseOutput(helmVersion, HelmRepos)
out := output.Output{outputObjects}
outputObjects, err := h.GetReleaseOutput(HelmRepos)
out := output.Output{
HelmReleases: outputObjects,
}

if err != nil {
klog.Fatalf("Error getting helm releases from cluster: %v", err)
Expand Down
4 changes: 2 additions & 2 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ var (

func init() {
klog.InitFlags(nil)
flag.Set("alsologtostderr", "true")
flag.Set("logtostderr", "true")
_ = flag.Set("alsologtostderr", "true")
_ = flag.Set("logtostderr", "true")
flag.Parse()
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
}
Expand Down
17 changes: 6 additions & 11 deletions pkg/helm/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,17 @@ import (
"k8s.io/klog"
)

// Helm represents all current releases that we can find in the cluster
// Helm contains a helm version and kubernetes client interface
type Helm struct {
Version string
Kube *kube
}

// NewHelm returns a basic helm struct with the version of helm requested
func NewHelm(version string) *Helm {
func NewHelm(version string, kubeContext string) *Helm {
return &Helm{
Version: version,
Kube: getConfigInstance(),
Kube: getConfigInstance(kubeContext),
}
}

Expand Down Expand Up @@ -126,24 +126,19 @@ func (h *Helm) GetHelmReleasesVersion2(helmRepos []*Repo) ([]output.ReleaseOutpu
}

// GetReleaseOutput return the expected output or error
func GetReleaseOutput(version string, repos []*Repo) (outputObjects []output.ReleaseOutput, err error) {

switch version {
func (h *Helm) GetReleaseOutput(repos []*Repo) (outputObjects []output.ReleaseOutput, err error) {
switch h.Version {
case "2":
h := NewHelm(version)
outputObjects, err = h.GetHelmReleasesVersion2(repos)
case "3":
h := NewHelm(version)
outputObjects, err = h.GetHelmReleasesVersion3(repos)
case "auto":
h := NewHelm("3")
outputObjectsVersion3, err3 := h.GetHelmReleasesVersion3(repos)
if outputObjectsVersion3 != nil {
outputObjects = append(outputObjects, outputObjectsVersion3...)
}
h2 := NewHelm("2")

outputObjectsVersion2, err2 := h2.GetHelmReleasesVersion2(repos)
outputObjectsVersion2, err2 := h.GetHelmReleasesVersion2(repos)
if outputObjectsVersion2 != nil {
outputObjects = append(outputObjects, outputObjectsVersion2...)
}
Expand Down
18 changes: 11 additions & 7 deletions pkg/helm/kube.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,31 @@ var kubeClient *kube
var once sync.Once

// GetConfigInstance returns a Kubernetes interface based on the current configuration
func getConfigInstance() *kube {
func getConfigInstance(context string) *kube {
once.Do(func() {
if kubeClient == nil {
kubeClient = &kube{
Client: getKubeClient(),
Client: getKubeClient(context),
}
}
})
return kubeClient
}

func getKubeClient() kubernetes.Interface {
kubeConf, err := config.GetConfig()
func getKubeClient(context string) kubernetes.Interface {
var clientset *kubernetes.Clientset

kubeConf, err := config.GetConfigWithContext(context)
if err != nil {
klog.Errorf("Error getting kubeconfig: %v", err)
klog.Errorf("error getting config with context %s: %v", context, err)
os.Exit(1)
}
clientset, err := kubernetes.NewForConfig(kubeConf)

clientset, err = kubernetes.NewForConfig(kubeConf)
if err != nil {
klog.Errorf("Error creating kubernetes client: %v", err)
klog.Errorf("error create kubernetes client: %v", err)
os.Exit(1)
}
return clientset

}

0 comments on commit 46a645c

Please sign in to comment.