@@ -25,7 +25,6 @@ import (
2525type  Manager  struct  {
2626	cfg                      * rest.Config 
2727	clientCmdConfig          clientcmd.ClientConfig 
28- 	inCluster                bool 
2928	discoveryClient          discovery.CachedDiscoveryInterface 
3029	accessControlClientSet   * AccessControlClientset 
3130	accessControlRESTMapper  * AccessControlRESTMapper 
@@ -38,33 +37,77 @@ type Manager struct {
3837var  _  helm.Kubernetes  =  (* Manager )(nil )
3938var  _  Openshift  =  (* Manager )(nil )
4039
41- func  NewManager (config  * config.StaticConfig , kubeconfigContext  string ) (* Manager , error ) {
42- 	k8s  :=  & Manager {
43- 		staticConfig : config ,
40+ var  (
41+ 	ErrorKubeconfigInClusterNotAllowed  =  errors .New ("kubeconfig manager cannot be used in in-cluster deployments" )
42+ 	ErrorInClusterNotInCluster          =  errors .New ("in-cluster manager cannot be used outside of a cluster" )
43+ )
44+ 
45+ func  NewKubeconfigManager (config  * config.StaticConfig , kubeconfigContext  string ) (* Manager , error ) {
46+ 	if  IsInCluster (config ) {
47+ 		return  nil , ErrorKubeconfigInClusterNotAllowed 
4448	}
49+ 
4550	pathOptions  :=  clientcmd .NewDefaultPathOptions ()
46- 	if  k8s . staticConfig .KubeConfig  !=  ""  {
47- 		pathOptions .LoadingRules .ExplicitPath  =  k8s . staticConfig .KubeConfig 
51+ 	if  config .KubeConfig  !=  ""  {
52+ 		pathOptions .LoadingRules .ExplicitPath  =  config .KubeConfig 
4853	}
49- 	k8s . clientCmdConfig  =  clientcmd .NewNonInteractiveDeferredLoadingClientConfig (
54+ 	clientCmdConfig  : =  clientcmd .NewNonInteractiveDeferredLoadingClientConfig (
5055		pathOptions .LoadingRules ,
5156		& clientcmd.ConfigOverrides {
5257			ClusterInfo :    clientcmdapi.Cluster {Server : "" },
5358			CurrentContext : kubeconfigContext ,
5459		})
55- 	var  err  error 
56- 	if  IsInCluster (k8s .staticConfig ) {
57- 		k8s .cfg , err  =  InClusterConfig ()
58- 		k8s .inCluster  =  true 
59- 	} else  {
60- 		k8s .cfg , err  =  k8s .clientCmdConfig .ClientConfig ()
60+ 
61+ 	restConfig , err  :=  clientCmdConfig .ClientConfig ()
62+ 	if  err  !=  nil  {
63+ 		return  nil , fmt .Errorf ("failed to create kubernetes rest config from kubeconfig: %v" , err )
6164	}
62- 	if  err  !=  nil  ||  k8s .cfg  ==  nil  {
63- 		return  nil , fmt .Errorf ("failed to create kubernetes rest config: %v" , err )
65+ 
66+ 	return  newManager (config , restConfig , clientCmdConfig )
67+ }
68+ 
69+ func  NewInClusterManager (config  * config.StaticConfig ) (* Manager , error ) {
70+ 	if  config .KubeConfig  !=  ""  {
71+ 		return  nil , fmt .Errorf ("kubeconfig file %s cannot be used with the in-cluster deployments: %v" , config .KubeConfig , ErrorKubeconfigInClusterNotAllowed )
72+ 	}
73+ 
74+ 	if  ! IsInCluster (config ) {
75+ 		return  nil , ErrorInClusterNotInCluster 
76+ 	}
77+ 
78+ 	restConfig , err  :=  InClusterConfig ()
79+ 	if  err  !=  nil  {
80+ 		return  nil , fmt .Errorf ("failed to create in-cluster kubernetes rest config: %v" , err )
81+ 	}
82+ 
83+ 	// Create a dummy kubeconfig clientcmdapi.Config for in-cluster config to be used in places where clientcmd.ClientConfig is required 
84+ 	clientCmdConfig  :=  clientcmdapi .NewConfig ()
85+ 	clientCmdConfig .Clusters ["cluster" ] =  & clientcmdapi.Cluster {
86+ 		Server :                restConfig .Host ,
87+ 		InsecureSkipTLSVerify : restConfig .Insecure ,
88+ 	}
89+ 	clientCmdConfig .AuthInfos ["user" ] =  & clientcmdapi.AuthInfo {
90+ 		Token : restConfig .BearerToken ,
91+ 	}
92+ 	clientCmdConfig .Contexts [inClusterKubeConfigDefaultContext ] =  & clientcmdapi.Context {
93+ 		Cluster :  "cluster" ,
94+ 		AuthInfo : "user" ,
95+ 	}
96+ 	clientCmdConfig .CurrentContext  =  inClusterKubeConfigDefaultContext 
97+ 
98+ 	return  newManager (config , restConfig , clientcmd .NewDefaultClientConfig (* clientCmdConfig , nil ))
99+ }
100+ 
101+ func  newManager (config  * config.StaticConfig , restConfig  * rest.Config , clientCmdConfig  clientcmd.ClientConfig ) (* Manager , error ) {
102+ 	k8s  :=  & Manager {
103+ 		staticConfig :    config ,
104+ 		cfg :             restConfig ,
105+ 		clientCmdConfig : clientCmdConfig ,
64106	}
65107	if  k8s .cfg .UserAgent  ==  ""  {
66108		k8s .cfg .UserAgent  =  rest .DefaultKubernetesUserAgent ()
67109	}
110+ 	var  err  error 
68111	// TODO: Won't work because not all client-go clients use the shared context (e.g. discovery client uses context.TODO()) 
69112	//k8s.cfg.Wrap(func(original http.RoundTripper) http.RoundTripper { 
70113	//	return &impersonateRoundTripper{original} 
@@ -229,7 +272,6 @@ func (m *Manager) Derived(ctx context.Context) (*Kubernetes, error) {
229272	derived  :=  & Kubernetes {
230273		manager : & Manager {
231274			clientCmdConfig : clientcmd .NewDefaultClientConfig (clientCmdApiConfig , nil ),
232- 			inCluster :       m .inCluster ,
233275			cfg :             derivedCfg ,
234276			staticConfig :    m .staticConfig ,
235277		},
0 commit comments