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