Skip to content
This repository was archived by the owner on Jun 29, 2022. It is now read-only.

Commit d04a44f

Browse files
authored
Merge pull request #628 from kinvolk/invidian/kubeconfig-content
pkg/k8sutil: change NewClientset to load kubeconfig from file content, not from path
2 parents 8e9c994 + 90f3c1a commit d04a44f

File tree

6 files changed

+95
-12
lines changed

6 files changed

+95
-12
lines changed

cli/cmd/cluster-apply.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package cmd
1616

1717
import (
1818
"fmt"
19+
"io/ioutil"
1920

2021
"github.com/pkg/errors"
2122
log "github.com/sirupsen/logrus"
@@ -125,12 +126,17 @@ func runClusterApply(cmd *cobra.Command, args []string) {
125126
}
126127

127128
func verifyCluster(kubeconfigPath string, expectedNodes int) error {
128-
client, err := k8sutil.NewClientset(kubeconfigPath)
129+
kubeconfig, err := ioutil.ReadFile(kubeconfigPath) // #nosec G304
130+
if err != nil {
131+
return errors.Wrapf(err, "failed to read kubeconfig file")
132+
}
133+
134+
cs, err := k8sutil.NewClientset(kubeconfig)
129135
if err != nil {
130136
return errors.Wrapf(err, "failed to set up clientset")
131137
}
132138

133-
cluster, err := lokomotive.NewCluster(client, expectedNodes)
139+
cluster, err := lokomotive.NewCluster(cs, expectedNodes)
134140
if err != nil {
135141
return errors.Wrapf(err, "failed to set up cluster client")
136142
}

cli/cmd/component-delete.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package cmd
1717
import (
1818
"context"
1919
"fmt"
20+
"io/ioutil"
2021
"strings"
2122

2223
log "github.com/sirupsen/logrus"
@@ -167,7 +168,12 @@ func deleteHelmRelease(c components.Component, kubeconfig string, deleteNSBool b
167168
}
168169

169170
func deleteNS(ns string, kubeconfig string) error {
170-
cs, err := k8sutil.NewClientset(kubeconfig)
171+
kubeconfigContent, err := ioutil.ReadFile(kubeconfig) // #nosec G304
172+
if err != nil {
173+
return fmt.Errorf("failed to read kubeconfig file: %v", err)
174+
}
175+
176+
cs, err := k8sutil.NewClientset(kubeconfigContent)
171177
if err != nil {
172178
return err
173179
}

cli/cmd/health.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package cmd
1616

1717
import (
1818
"fmt"
19+
"io/ioutil"
1920
"os"
2021
"text/tabwriter"
2122

@@ -47,7 +48,13 @@ func runHealth(cmd *cobra.Command, args []string) {
4748
if err != nil {
4849
contextLogger.Fatalf("Error in finding kubeconfig file: %s", err)
4950
}
50-
client, err := k8sutil.NewClientset(kubeconfig)
51+
52+
kubeconfigContent, err := ioutil.ReadFile(kubeconfig) // #nosec G304
53+
if err != nil {
54+
contextLogger.Fatalf("Failed to read kubeconfig file: %v", err)
55+
}
56+
57+
cs, err := k8sutil.NewClientset(kubeconfigContent)
5158
if err != nil {
5259
contextLogger.Fatalf("Error in creating setting up Kubernetes client: %q", err)
5360
}
@@ -64,7 +71,7 @@ func runHealth(cmd *cobra.Command, args []string) {
6471
contextLogger.Fatal("No cluster configured")
6572
}
6673

67-
cluster, err := lokomotive.NewCluster(client, p.Meta().ExpectedNodes)
74+
cluster, err := lokomotive.NewCluster(cs, p.Meta().ExpectedNodes)
6875
if err != nil {
6976
contextLogger.Fatalf("Error in creating new Lokomotive cluster: %q", err)
7077
}

pkg/components/util/install.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package util
1717
import (
1818
"context"
1919
"fmt"
20+
"io/ioutil"
2021

2122
"helm.sh/helm/v3/pkg/action"
2223
"helm.sh/helm/v3/pkg/chart"
@@ -31,7 +32,12 @@ import (
3132
)
3233

3334
func ensureNamespaceExists(name string, kubeconfigPath string) error {
34-
cs, err := k8sutil.NewClientset(kubeconfigPath)
35+
kubeconfig, err := ioutil.ReadFile(kubeconfigPath) // #nosec G304
36+
if err != nil {
37+
return fmt.Errorf("reading kubeconfig file: %w", err)
38+
}
39+
40+
cs, err := k8sutil.NewClientset(kubeconfig)
3541
if err != nil {
3642
return fmt.Errorf("creating clientset: %w", err)
3743
}

pkg/k8sutil/client.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,25 @@
1515
package k8sutil
1616

1717
import (
18+
"fmt"
19+
1820
"k8s.io/client-go/kubernetes"
1921
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
2022
"k8s.io/client-go/tools/clientcmd"
2123
)
2224

23-
func NewClientset(kubeconfigPath string) (*kubernetes.Clientset, error) {
24-
c, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
25+
// NewClientset creates new Kubernetes Client set object from the contents
26+
// of the given kubeconfig file.
27+
func NewClientset(data []byte) (*kubernetes.Clientset, error) {
28+
c, err := clientcmd.NewClientConfigFromBytes(data)
2529
if err != nil {
26-
return nil, err
30+
return nil, fmt.Errorf("creating client config failed: %w", err)
2731
}
2832

29-
apiclientset, err := kubernetes.NewForConfig(c)
33+
restConfig, err := c.ClientConfig()
3034
if err != nil {
31-
return nil, err
35+
return nil, fmt.Errorf("converting client config to rest client config failed: %w", err)
3236
}
3337

34-
return apiclientset, nil
38+
return kubernetes.NewForConfig(restConfig)
3539
}

pkg/k8sutil/client_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright 2020 The Lokomotive Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package k8sutil_test
16+
17+
import (
18+
"testing"
19+
20+
"github.com/kinvolk/lokomotive/pkg/k8sutil"
21+
)
22+
23+
const (
24+
validKubeconfig = `
25+
apiVersion: v1
26+
kind: Config
27+
clusters:
28+
- name: admin
29+
cluster:
30+
server: https://nonexistent:6443
31+
users:
32+
- name: admin
33+
user:
34+
token: "foo.bar"
35+
current-context: admin
36+
contexts:
37+
- name: admin
38+
context:
39+
cluster: admin
40+
user: admin
41+
`
42+
)
43+
44+
func TestNewClientset(t *testing.T) {
45+
if _, err := k8sutil.NewClientset([]byte(validKubeconfig)); err != nil {
46+
t.Fatalf("Creating clientset from valid kubeconfig should succeed, got: %v", err)
47+
}
48+
}
49+
50+
func TestNewClientsetInvalidKubeconfig(t *testing.T) {
51+
if _, err := k8sutil.NewClientset([]byte("foo")); err == nil {
52+
t.Fatalf("creating clientset from invalid kubeconfig should fail")
53+
}
54+
}

0 commit comments

Comments
 (0)