...
1
16
17 package clientcmd
18
19 import (
20 "io"
21 "sync"
22
23 "k8s.io/klog/v2"
24
25 restclient "k8s.io/client-go/rest"
26 clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
27 )
28
29
30
31
32
33
34 type DeferredLoadingClientConfig struct {
35 loader ClientConfigLoader
36 overrides *ConfigOverrides
37 fallbackReader io.Reader
38
39 clientConfig ClientConfig
40 loadingLock sync.Mutex
41
42
43 icc InClusterConfig
44 }
45
46
47 type InClusterConfig interface {
48 ClientConfig
49 Possible() bool
50 }
51
52
53 func NewNonInteractiveDeferredLoadingClientConfig(loader ClientConfigLoader, overrides *ConfigOverrides) ClientConfig {
54 return &DeferredLoadingClientConfig{loader: loader, overrides: overrides, icc: &inClusterClientConfig{overrides: overrides}}
55 }
56
57
58 func NewInteractiveDeferredLoadingClientConfig(loader ClientConfigLoader, overrides *ConfigOverrides, fallbackReader io.Reader) ClientConfig {
59 return &DeferredLoadingClientConfig{loader: loader, overrides: overrides, icc: &inClusterClientConfig{overrides: overrides}, fallbackReader: fallbackReader}
60 }
61
62 func (config *DeferredLoadingClientConfig) createClientConfig() (ClientConfig, error) {
63 config.loadingLock.Lock()
64 defer config.loadingLock.Unlock()
65
66 if config.clientConfig != nil {
67 return config.clientConfig, nil
68 }
69 mergedConfig, err := config.loader.Load()
70 if err != nil {
71 return nil, err
72 }
73
74 var currentContext string
75 if config.overrides != nil {
76 currentContext = config.overrides.CurrentContext
77 }
78 if config.fallbackReader != nil {
79 config.clientConfig = NewInteractiveClientConfig(*mergedConfig, currentContext, config.overrides, config.fallbackReader, config.loader)
80 } else {
81 config.clientConfig = NewNonInteractiveClientConfig(*mergedConfig, currentContext, config.overrides, config.loader)
82 }
83 return config.clientConfig, nil
84 }
85
86 func (config *DeferredLoadingClientConfig) RawConfig() (clientcmdapi.Config, error) {
87 mergedConfig, err := config.createClientConfig()
88 if err != nil {
89 return clientcmdapi.Config{}, err
90 }
91
92 return mergedConfig.RawConfig()
93 }
94
95
96 func (config *DeferredLoadingClientConfig) ClientConfig() (*restclient.Config, error) {
97 mergedClientConfig, err := config.createClientConfig()
98 if err != nil {
99 return nil, err
100 }
101
102
103
104 mergedConfig, err := mergedClientConfig.ClientConfig()
105 switch {
106 case err != nil:
107 if !IsEmptyConfig(err) {
108
109 return nil, err
110 }
111 case mergedConfig != nil:
112
113
114 if !config.loader.IsDefaultConfig(mergedConfig) {
115 return mergedConfig, nil
116 }
117 }
118
119
120 if config.icc.Possible() {
121 klog.V(4).Infof("Using in-cluster configuration")
122 return config.icc.ClientConfig()
123 }
124
125
126 return mergedConfig, err
127 }
128
129
130 func (config *DeferredLoadingClientConfig) Namespace() (string, bool, error) {
131 mergedKubeConfig, err := config.createClientConfig()
132 if err != nil {
133 return "", false, err
134 }
135
136 ns, overridden, err := mergedKubeConfig.Namespace()
137
138
139 if (err != nil && !IsEmptyConfig(err)) || overridden || !config.icc.Possible() {
140
141 return ns, overridden, err
142 }
143
144 if len(ns) > 0 {
145
146 if ns != "default" {
147 return ns, false, nil
148 }
149
150
151 if raw, err := mergedKubeConfig.RawConfig(); err == nil {
152
153 currentContext := raw.CurrentContext
154 if config.overrides != nil && len(config.overrides.CurrentContext) > 0 {
155 currentContext = config.overrides.CurrentContext
156 }
157 if context := raw.Contexts[currentContext]; context != nil && len(context.Namespace) > 0 {
158 return ns, false, nil
159 }
160 }
161 }
162
163 klog.V(4).Infof("Using in-cluster namespace")
164
165
166 return config.icc.Namespace()
167 }
168
169
170 func (config *DeferredLoadingClientConfig) ConfigAccess() ConfigAccess {
171 return config.loader
172 }
173
View as plain text