...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package config
17
18 import (
19 "path/filepath"
20 "regexp"
21 "strings"
22 "time"
23
24 "k8s.io/apimachinery/pkg/api/meta"
25 "k8s.io/cli-runtime/pkg/genericclioptions"
26 "k8s.io/client-go/discovery"
27 diskcached "k8s.io/client-go/discovery/cached/disk"
28 "k8s.io/client-go/rest"
29 "k8s.io/client-go/restmapper"
30 "k8s.io/client-go/tools/clientcmd"
31 clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
32 "k8s.io/client-go/util/homedir"
33 )
34
35 var defaultCacheDir = filepath.Join(homedir.HomeDir(), ".kube", "http-cache")
36
37
38 type simpleRestClientGetter struct {
39 clientcmdapi.Config
40 }
41
42
43 func (getter *simpleRestClientGetter) ToRESTConfig() (*rest.Config, error) {
44 return getter.ToRawKubeConfigLoader().ClientConfig()
45 }
46
47
48 func (getter *simpleRestClientGetter) ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error) {
49 config, err := getter.ToRESTConfig()
50 if err != nil {
51 return nil, err
52 }
53
54 config.Burst = 100
55
56 httpCacheDir := defaultCacheDir
57 discoveryCacheDir := computeDiscoverCacheDir(filepath.Join(homedir.HomeDir(), ".kube", "cache", "discovery"), config.Host)
58
59 return diskcached.NewCachedDiscoveryClientForConfig(config, discoveryCacheDir, httpCacheDir, time.Duration(10*time.Minute))
60 }
61
62
63 func (getter *simpleRestClientGetter) ToRESTMapper() (meta.RESTMapper, error) {
64 discoveryClient, err := getter.ToDiscoveryClient()
65 if err != nil {
66 return nil, err
67 }
68
69 mapper := restmapper.NewDeferredDiscoveryRESTMapper(discoveryClient)
70 expander := restmapper.NewShortcutExpander(mapper, discoveryClient)
71 return expander, nil
72 }
73
74
75 func (getter *simpleRestClientGetter) ToRawKubeConfigLoader() clientcmd.ClientConfig {
76 return clientcmd.NewDefaultClientConfig(getter.Config, &clientcmd.ConfigOverrides{ClusterDefaults: clientcmd.ClusterDefaults})
77 }
78
79
80 var overlyCautiousIllegalFileCharacters = regexp.MustCompile(`[^(\w/\.)]`)
81
82
83 func computeDiscoverCacheDir(parentDir, host string) string {
84
85 schemelessHost := strings.Replace(strings.Replace(host, "https://", "", 1), "http://", "", 1)
86
87 safeHost := overlyCautiousIllegalFileCharacters.ReplaceAllString(schemelessHost, "_")
88 return filepath.Join(parentDir, safeHost)
89 }
90
91
92 func NewSimpleRESTClientGetter(config clientcmdapi.Config) genericclioptions.RESTClientGetter {
93 return &simpleRestClientGetter{config}
94 }
95