Unify client creation around kapi.Client
parent
24606b9a5f
commit
3a5406f79e
|
@ -33,6 +33,7 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"k8s.io/minikube/pkg/drivers/kic/oci"
|
"k8s.io/minikube/pkg/drivers/kic/oci"
|
||||||
|
"k8s.io/minikube/pkg/kapi"
|
||||||
"k8s.io/minikube/pkg/minikube/browser"
|
"k8s.io/minikube/pkg/minikube/browser"
|
||||||
"k8s.io/minikube/pkg/minikube/exit"
|
"k8s.io/minikube/pkg/minikube/exit"
|
||||||
"k8s.io/minikube/pkg/minikube/localpath"
|
"k8s.io/minikube/pkg/minikube/localpath"
|
||||||
|
@ -112,7 +113,7 @@ func startKicServiceTunnel(svc, configName string) {
|
||||||
ctrlC := make(chan os.Signal, 1)
|
ctrlC := make(chan os.Signal, 1)
|
||||||
signal.Notify(ctrlC, os.Interrupt)
|
signal.Notify(ctrlC, os.Interrupt)
|
||||||
|
|
||||||
clientset, err := service.K8s.GetClientset(1 * time.Second)
|
clientset, err := kapi.Client(configName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
exit.WithError("error creating clientset", err)
|
exit.WithError("error creating clientset", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,17 +23,16 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"k8s.io/minikube/pkg/drivers/kic/oci"
|
"k8s.io/minikube/pkg/drivers/kic/oci"
|
||||||
|
"k8s.io/minikube/pkg/kapi"
|
||||||
"k8s.io/minikube/pkg/minikube/config"
|
"k8s.io/minikube/pkg/minikube/config"
|
||||||
"k8s.io/minikube/pkg/minikube/exit"
|
"k8s.io/minikube/pkg/minikube/exit"
|
||||||
"k8s.io/minikube/pkg/minikube/localpath"
|
"k8s.io/minikube/pkg/minikube/localpath"
|
||||||
"k8s.io/minikube/pkg/minikube/mustload"
|
"k8s.io/minikube/pkg/minikube/mustload"
|
||||||
"k8s.io/minikube/pkg/minikube/service"
|
|
||||||
"k8s.io/minikube/pkg/minikube/tunnel"
|
"k8s.io/minikube/pkg/minikube/tunnel"
|
||||||
"k8s.io/minikube/pkg/minikube/tunnel/kic"
|
"k8s.io/minikube/pkg/minikube/tunnel/kic"
|
||||||
)
|
)
|
||||||
|
@ -65,7 +64,7 @@ var tunnelCmd = &cobra.Command{
|
||||||
// We define the tunnel and minikube error free if the API server responds within a second.
|
// We define the tunnel and minikube error free if the API server responds within a second.
|
||||||
// This also contributes to better UX, the tunnel status check can happen every second and
|
// This also contributes to better UX, the tunnel status check can happen every second and
|
||||||
// doesn't hang on the API server call during startup and shutdown time or if there is a temporary error.
|
// doesn't hang on the API server call during startup and shutdown time or if there is a temporary error.
|
||||||
clientset, err := service.K8s.GetClientset(1 * time.Second)
|
clientset, err := kapi.Client(cname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
exit.WithError("error creating clientset", err)
|
exit.WithError("error creating clientset", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,10 +259,6 @@ func enableOrDisableStorageClasses(cc *config.ClusterConfig, name string, val st
|
||||||
if name == "storage-provisioner-gluster" {
|
if name == "storage-provisioner-gluster" {
|
||||||
class = "glusterfile"
|
class = "glusterfile"
|
||||||
}
|
}
|
||||||
storagev1, err := storageclass.GetStoragev1()
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrapf(err, "Error getting storagev1 interface %v ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
api, err := machine.NewAPIClient()
|
api, err := machine.NewAPIClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -279,6 +275,11 @@ func enableOrDisableStorageClasses(cc *config.ClusterConfig, name string, val st
|
||||||
return enableOrDisableAddon(cc, name, val)
|
return enableOrDisableAddon(cc, name, val)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
storagev1, err := storageclass.GetStoragev1(cc.Name)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "Error getting storagev1 interface %v ", err)
|
||||||
|
}
|
||||||
|
|
||||||
if enable {
|
if enable {
|
||||||
// Only StorageClass for 'name' should be marked as default
|
// Only StorageClass for 'name' should be marked as default
|
||||||
err = storageclass.SetDefaultStorageClass(storagev1, class)
|
err = storageclass.SetDefaultStorageClass(storagev1, class)
|
||||||
|
|
|
@ -35,14 +35,11 @@ import (
|
||||||
core "k8s.io/api/core/v1"
|
core "k8s.io/api/core/v1"
|
||||||
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
"k8s.io/client-go/kubernetes"
|
|
||||||
typed_core "k8s.io/client-go/kubernetes/typed/core/v1"
|
typed_core "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/minikube/pkg/kapi"
|
||||||
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
|
|
||||||
"k8s.io/minikube/pkg/minikube/config"
|
"k8s.io/minikube/pkg/minikube/config"
|
||||||
"k8s.io/minikube/pkg/minikube/machine"
|
"k8s.io/minikube/pkg/minikube/machine"
|
||||||
"k8s.io/minikube/pkg/minikube/out"
|
"k8s.io/minikube/pkg/minikube/out"
|
||||||
"k8s.io/minikube/pkg/minikube/proxy"
|
|
||||||
"k8s.io/minikube/pkg/util/retry"
|
"k8s.io/minikube/pkg/util/retry"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -57,7 +54,6 @@ const (
|
||||||
// K8sClient represents a kubernetes client
|
// K8sClient represents a kubernetes client
|
||||||
type K8sClient interface {
|
type K8sClient interface {
|
||||||
GetCoreClient() (typed_core.CoreV1Interface, error)
|
GetCoreClient() (typed_core.CoreV1Interface, error)
|
||||||
GetClientset(timeout time.Duration) (*kubernetes.Clientset, error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// K8sClientGetter can get a K8sClient
|
// K8sClientGetter can get a K8sClient
|
||||||
|
@ -72,38 +68,13 @@ func init() {
|
||||||
|
|
||||||
// GetCoreClient returns a core client
|
// GetCoreClient returns a core client
|
||||||
func (k *K8sClientGetter) GetCoreClient() (typed_core.CoreV1Interface, error) {
|
func (k *K8sClientGetter) GetCoreClient() (typed_core.CoreV1Interface, error) {
|
||||||
client, err := k.GetClientset(defaultK8sClientTimeout)
|
client, err := kapi.Client(viper.GetString(config.ProfileName))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "getting clientset")
|
return nil, errors.Wrap(err, "getting clientset")
|
||||||
}
|
}
|
||||||
return client.CoreV1(), nil
|
return client.CoreV1(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetClientset returns a clientset
|
|
||||||
func (*K8sClientGetter) GetClientset(timeout time.Duration) (*kubernetes.Clientset, error) {
|
|
||||||
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
|
|
||||||
profile := viper.GetString(config.ProfileName)
|
|
||||||
configOverrides := &clientcmd.ConfigOverrides{
|
|
||||||
Context: clientcmdapi.Context{
|
|
||||||
Cluster: profile,
|
|
||||||
AuthInfo: profile,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides)
|
|
||||||
clientConfig, err := kubeConfig.ClientConfig()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("kubeConfig: %v", err)
|
|
||||||
}
|
|
||||||
clientConfig.Timeout = timeout
|
|
||||||
clientConfig = proxy.UpdateTransport(clientConfig)
|
|
||||||
client, err := kubernetes.NewForConfig(clientConfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "client from config")
|
|
||||||
}
|
|
||||||
|
|
||||||
return client, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SvcURL represents a service URL. Each item in the URLs field combines the service URL with one of the configured
|
// SvcURL represents a service URL. Each item in the URLs field combines the service URL with one of the configured
|
||||||
// node ports. The PortNames field contains the configured names of the ports in the URLs field (sorted correspondingly -
|
// node ports. The PortNames field contains the configured names of the ports in the URLs field (sorted correspondingly -
|
||||||
// first item in PortNames belongs to the first item in URLs).
|
// first item in PortNames belongs to the first item in URLs).
|
||||||
|
|
|
@ -26,8 +26,6 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/docker/machine/libmachine"
|
"github.com/docker/machine/libmachine"
|
||||||
"github.com/docker/machine/libmachine/host"
|
"github.com/docker/machine/libmachine/host"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -35,7 +33,6 @@ import (
|
||||||
core "k8s.io/api/core/v1"
|
core "k8s.io/api/core/v1"
|
||||||
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
"k8s.io/client-go/kubernetes"
|
|
||||||
typed_core "k8s.io/client-go/kubernetes/typed/core/v1"
|
typed_core "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
"k8s.io/client-go/kubernetes/typed/core/v1/fake"
|
"k8s.io/client-go/kubernetes/typed/core/v1/fake"
|
||||||
testing_fake "k8s.io/client-go/testing"
|
testing_fake "k8s.io/client-go/testing"
|
||||||
|
@ -65,10 +62,6 @@ func (m *MockClientGetter) GetCoreClient() (typed_core.CoreV1Interface, error) {
|
||||||
secretsMap: m.secretsMap}, nil
|
secretsMap: m.secretsMap}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MockClientGetter) GetClientset(timeout time.Duration) (*kubernetes.Clientset, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MockCoreClient) Secrets(ns string) typed_core.SecretInterface {
|
func (m *MockCoreClient) Secrets(ns string) typed_core.SecretInterface {
|
||||||
return &fake.FakeSecrets{Fake: &fake.FakeCoreV1{Fake: &testing_fake.Fake{}}}
|
return &fake.FakeSecrets{Fake: &fake.FakeCoreV1{Fake: &testing_fake.Fake{}}}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,9 +22,8 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
v1 "k8s.io/api/storage/v1"
|
v1 "k8s.io/api/storage/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/client-go/kubernetes"
|
|
||||||
storagev1 "k8s.io/client-go/kubernetes/typed/storage/v1"
|
storagev1 "k8s.io/client-go/kubernetes/typed/storage/v1"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/minikube/pkg/kapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
func annotateDefaultStorageClass(storage storagev1.StorageV1Interface, class *v1.StorageClass, enable bool) error {
|
func annotateDefaultStorageClass(storage storagev1.StorageV1Interface, class *v1.StorageClass, enable bool) error {
|
||||||
|
@ -71,25 +70,11 @@ func SetDefaultStorageClass(storage storagev1.StorageV1Interface, name string) e
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetStoragev1 return storage v1 interface for client
|
// GetStoragev1 return storage v1 interface for client
|
||||||
func GetStoragev1() (storagev1.StorageV1Interface, error) {
|
func GetStoragev1(context string) (storagev1.StorageV1Interface, error) {
|
||||||
client, err := getClient()
|
client, err := kapi.Client(context)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
sv1 := client.StorageV1()
|
sv1 := client.StorageV1()
|
||||||
return sv1, nil
|
return sv1, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getClient() (*kubernetes.Clientset, error) {
|
|
||||||
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
|
|
||||||
kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
|
|
||||||
config, err := kubeConfig.ClientConfig()
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "Error creating kubeConfig")
|
|
||||||
}
|
|
||||||
client, err := kubernetes.NewForConfig(config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "Error creating new client from kubeConfig.ClientConfig()")
|
|
||||||
}
|
|
||||||
return client, nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -212,45 +212,6 @@ users:
|
||||||
- name: minikube
|
- name: minikube
|
||||||
`
|
`
|
||||||
|
|
||||||
func TestGetClient(t *testing.T) {
|
|
||||||
var tests = []struct {
|
|
||||||
description string
|
|
||||||
config string
|
|
||||||
err bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
description: "ok",
|
|
||||||
config: mockK8sConfig,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "no valid config",
|
|
||||||
config: "this is not valid config",
|
|
||||||
err: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
configFile, err := ioutil.TempFile("/tmp", "")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf(err.Error())
|
|
||||||
}
|
|
||||||
defer os.Remove(configFile.Name())
|
|
||||||
for _, test := range tests {
|
|
||||||
t.Run(test.description, func(t *testing.T) {
|
|
||||||
|
|
||||||
if err := setK8SConfig(test.config, configFile.Name()); err != nil {
|
|
||||||
t.Fatalf(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = getClient()
|
|
||||||
if err != nil && !test.err {
|
|
||||||
t.Fatalf("Unexpected err: %v for test: %v", err, test.description)
|
|
||||||
}
|
|
||||||
if err == nil && test.err {
|
|
||||||
t.Fatalf("Expected err for test: %v", test.description)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetStoragev1(t *testing.T) {
|
func TestGetStoragev1(t *testing.T) {
|
||||||
var tests = []struct {
|
var tests = []struct {
|
||||||
description string
|
description string
|
||||||
|
@ -278,7 +239,7 @@ func TestGetStoragev1(t *testing.T) {
|
||||||
t.Fatalf(err.Error())
|
t.Fatalf(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = GetStoragev1()
|
_, err = GetStoragev1(configfile.Name())
|
||||||
if err != nil && !test.err {
|
if err != nil && !test.err {
|
||||||
t.Fatalf("Unexpected err: %v for test: %v", err, test.description)
|
t.Fatalf("Unexpected err: %v for test: %v", err, test.description)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue