@@ -12,6 +12,8 @@ import (
1212 norman "github.com/rancher/norman/types"
1313 managementClient "github.com/rancher/rancher/pkg/client/generated/management/v3"
1414 projectClient "github.com/rancher/rancher/pkg/client/generated/project/v3"
15+ "k8s.io/client-go/kubernetes"
16+ "k8s.io/client-go/tools/clientcmd"
1517)
1618
1719func resourceRancher2Cluster () * schema.Resource {
@@ -238,7 +240,7 @@ func resourceRancher2ClusterRead(d *schema.ResourceData, meta interface{}) error
238240 return err
239241 }
240242
241- kubeConfig , err := getClusterKubeconfig (meta .(* Config ), cluster .ID )
243+ kubeConfig , err := getClusterKubeconfig (meta .(* Config ), cluster .ID , d . Get ( "kube_config" ).( string ) )
242244 if err != nil && ! IsForbidden (err ) {
243245 return err
244246 }
@@ -584,10 +586,81 @@ func createClusterRegistrationToken(client *managementClient.Client, clusterID s
584586 return newRegToken , nil
585587}
586588
587- func getClusterKubeconfig (c * Config , id string ) (* managementClient.GenerateKubeConfigOutput , error ) {
589+ func isKubeConfigValid (c * Config , config string ) (string , bool , error ) {
590+ token , tokenValid , err := isKubeConfigTokenValid (c , config )
591+ if err != nil {
592+ return "" , false , err
593+ }
594+ if ! tokenValid {
595+ return "" , false , nil
596+ }
597+ kubeconfig , err := clientcmd .RESTConfigFromKubeConfig ([]byte (config ))
598+ if err != nil {
599+ return "" , false , fmt .Errorf ("Checking Kubeconfig: %v" , err )
600+ }
601+ _ , err = kubernetes .NewForConfig (kubeconfig )
602+ if err != nil {
603+ return token , false , nil
604+ }
605+
606+ return token , true , nil
607+ }
608+
609+ func isKubeConfigTokenValid (c * Config , config string ) (string , bool , error ) {
610+ token , err := getTokenFromKubeConfig (config )
611+ if err != nil {
612+ return "" , false , fmt .Errorf ("Getting Kubeconfig token: %v" , err )
613+ }
614+ isValid , err := isTokenValid (c , splitTokenID (token ))
615+ if err != nil {
616+ return "" , false , fmt .Errorf ("Checking Kubeconfig token: %v" , err )
617+ }
618+ return token , isValid , nil
619+ }
620+
621+ func replaceKubeConfigToken (c * Config , config , token string ) (string , error ) {
622+ if len (token ) == 0 {
623+ return config , nil
624+ }
625+ kubeconfig , err := getObjFromKubeConfig (config )
626+ if err != nil {
627+ return "" , fmt .Errorf ("Getting K8s config object: %v" , err )
628+ }
629+ if kubeconfig == nil || kubeconfig .AuthInfos == nil || len (kubeconfig .AuthInfos ) == 0 {
630+ return config , nil
631+ }
632+
633+ client , err := c .ManagementClient ()
634+ if err != nil {
635+ return "" , fmt .Errorf ("Replacing cluster Kubeconfig token: %v" , err )
636+ }
637+ removeToken , err := client .Token .ByID (splitTokenID (kubeconfig .AuthInfos [0 ].AuthInfo .Token ))
638+ if err != nil {
639+ if ! IsNotFound (err ) && ! IsForbidden (err ) {
640+ return "" , err
641+ }
642+ }
643+
644+ err = client .Token .Delete (removeToken )
645+ if err != nil {
646+ return "" , fmt .Errorf ("Error removing Token: %s" , err )
647+ }
648+ kubeconfig .AuthInfos [0 ].AuthInfo .Token = token
649+ return getKubeConfigFromObj (kubeconfig )
650+ }
651+
652+ func getClusterKubeconfig (c * Config , id , origconfig string ) (* managementClient.GenerateKubeConfigOutput , error ) {
588653 action := "generateKubeconfig"
589654 cluster := & Cluster {}
590655
656+ token , kubeValid , err := isKubeConfigValid (c , origconfig )
657+ if err != nil {
658+ return nil , fmt .Errorf ("Getting cluster Kubeconfig: %v" , err )
659+ }
660+ if kubeValid {
661+ return & managementClient.GenerateKubeConfigOutput {Config : origconfig }, nil
662+ }
663+
591664 client , err := c .ManagementClient ()
592665 if err != nil {
593666 return nil , fmt .Errorf ("Getting cluster Kubeconfig: %v" , err )
@@ -621,6 +694,13 @@ func getClusterKubeconfig(c *Config, id string) (*managementClient.GenerateKubeC
621694 }
622695 err = client .APIBaseClient .Action (managementClient .ClusterType , action , clusterResource , nil , kubeConfig )
623696 if err == nil {
697+ if isRancher26 && len (token ) > 0 {
698+ newConfig , err := replaceKubeConfigToken (c , kubeConfig .Config , token )
699+ if err != nil {
700+ return nil , err
701+ }
702+ kubeConfig .Config = newConfig
703+ }
624704 return kubeConfig , nil
625705 }
626706 if ! IsNotFound (err ) && ! IsForbidden (err ) && ! IsServiceUnavailableError (err ) {
0 commit comments