@depup/kubernetes-client 9.0.0-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +39 -0
- package/backends/kubernetes-client-node.js +153 -0
- package/backends/request/auth-providers/cmd.js +62 -0
- package/backends/request/auth-providers/openid.js +27 -0
- package/backends/request/client.js +243 -0
- package/backends/request/config.js +344 -0
- package/backends/request/index.js +5 -0
- package/changes.json +42 -0
- package/lib/alias.js +71 -0
- package/lib/config.js +3 -0
- package/lib/index.js +15 -0
- package/lib/specs/swagger-1.10.json.gz +0 -0
- package/lib/specs/swagger-1.11.json.gz +0 -0
- package/lib/specs/swagger-1.12.json.gz +0 -0
- package/lib/specs/swagger-1.13.json.gz +0 -0
- package/lib/swagger-client.js +233 -0
- package/package.json +119 -0
- package/typings/index.d.ts +7022 -0
- package/typings/tsconfig.json +11 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
/* eslint no-process-env: 0 no-sync:0 */
|
|
3
|
+
|
|
4
|
+
const deprecate = require('depd')('kubernetes-client')
|
|
5
|
+
const fs = require('fs')
|
|
6
|
+
const path = require('path')
|
|
7
|
+
const yaml = require('js-yaml')
|
|
8
|
+
const merge = require('deepmerge')
|
|
9
|
+
|
|
10
|
+
const root = process.env.KUBERNETES_CLIENT_SERVICEACCOUNT_ROOT || '/var/run/secrets/kubernetes.io/serviceaccount/'
|
|
11
|
+
const caPath = path.join(root, 'ca.crt')
|
|
12
|
+
const tokenPath = path.join(root, 'token')
|
|
13
|
+
const namespacePath = path.join(root, 'namespace')
|
|
14
|
+
|
|
15
|
+
function convertKubeconfig (kubeconfig) {
|
|
16
|
+
const context = kubeconfig.getCurrentContext()
|
|
17
|
+
const cluster = kubeconfig.getCurrentCluster()
|
|
18
|
+
const user = kubeconfig.getCurrentUser()
|
|
19
|
+
const namespace = context.namespace
|
|
20
|
+
|
|
21
|
+
let ca
|
|
22
|
+
let insecureSkipTlsVerify = false
|
|
23
|
+
if (cluster) {
|
|
24
|
+
if (cluster.caFile) {
|
|
25
|
+
ca = fs.readFileSync(path.normalize(cluster.caFile))
|
|
26
|
+
} else if (cluster.caData) {
|
|
27
|
+
ca = Buffer.from(cluster.caData, 'base64').toString()
|
|
28
|
+
}
|
|
29
|
+
insecureSkipTlsVerify = cluster.skipTLSVerify
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let cert
|
|
33
|
+
let key
|
|
34
|
+
|
|
35
|
+
let auth = {}
|
|
36
|
+
if (user) {
|
|
37
|
+
if (user.certFile) {
|
|
38
|
+
cert = fs.readFileSync(path.normalize(user.certFile))
|
|
39
|
+
} else if (user.certData) {
|
|
40
|
+
cert = Buffer.from(user.certData, 'base64').toString()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (user.keyFile) {
|
|
44
|
+
key = fs.readFileSync(path.normalize(user.keyFile))
|
|
45
|
+
} else if (user.keyData) {
|
|
46
|
+
key = Buffer.from(user.keyData, 'base64').toString()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (user.token) {
|
|
50
|
+
auth.bearer = user.token
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (user.authProvider) {
|
|
54
|
+
const config = user.authProvider.config
|
|
55
|
+
|
|
56
|
+
// if we can't determine the type, just fail later (or don't refresh).
|
|
57
|
+
let type = null
|
|
58
|
+
let token = null
|
|
59
|
+
if (config['cmd-path']) {
|
|
60
|
+
type = 'cmd'
|
|
61
|
+
token = config['access-token']
|
|
62
|
+
} else if (config['idp-issuer-url']) {
|
|
63
|
+
type = 'openid'
|
|
64
|
+
token = config['id-token']
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// If we have just an access-token, allow that... will expire later though.
|
|
68
|
+
if (config['access-token'] && !type) {
|
|
69
|
+
token = config['access-token']
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
auth = {
|
|
73
|
+
request: {
|
|
74
|
+
bearer: token
|
|
75
|
+
},
|
|
76
|
+
provider: {
|
|
77
|
+
config,
|
|
78
|
+
type
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (user.exec) {
|
|
84
|
+
const env = {}
|
|
85
|
+
if (user.exec.env) {
|
|
86
|
+
user.exec.env.forEach(variable => {
|
|
87
|
+
env[variable.name] = variable.value
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
let args = ''
|
|
91
|
+
if (user.exec.args) {
|
|
92
|
+
args = user.exec.args.join(' ')
|
|
93
|
+
}
|
|
94
|
+
auth = {
|
|
95
|
+
provider: {
|
|
96
|
+
type: 'cmd',
|
|
97
|
+
config: {
|
|
98
|
+
'cmd-args': args,
|
|
99
|
+
'cmd-path': user.exec.command,
|
|
100
|
+
'token-key': 'status.token',
|
|
101
|
+
'cmd-env': env
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (user.username) auth.user = user.username
|
|
108
|
+
if (user.password) auth.pass = user.password
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
url: cluster.server,
|
|
113
|
+
auth: Object.keys(auth).length ? auth : null,
|
|
114
|
+
ca,
|
|
115
|
+
insecureSkipTlsVerify,
|
|
116
|
+
namespace,
|
|
117
|
+
cert,
|
|
118
|
+
key
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
module.exports.convertKubeconfig = convertKubeconfig
|
|
123
|
+
|
|
124
|
+
function defaultConfigPaths () {
|
|
125
|
+
if (process.env.KUBECONFIG) {
|
|
126
|
+
// From https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable
|
|
127
|
+
// KUBECONFIG can support multiple config files.
|
|
128
|
+
const delimiter = process.platform === 'win32' ? ';' : ':'
|
|
129
|
+
return process.env.KUBECONFIG.split(delimiter)
|
|
130
|
+
}
|
|
131
|
+
const homeDir = process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME']
|
|
132
|
+
return [path.join(homeDir, '.kube', 'config')]
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Returns with in cluster config
|
|
137
|
+
* Based on: https://github.com/kubernetes/client-go/blob/124670e99da15091e13916f0ad4b2b2df2a39cd5/rest/config.go#L274
|
|
138
|
+
* and http://kubernetes.io/docs/user-guide/accessing-the-cluster/#accessing-the-api-from-a-pod
|
|
139
|
+
*
|
|
140
|
+
* @function getInCluster
|
|
141
|
+
* @returns {Object} { url, cert, auth, namespace }
|
|
142
|
+
*/
|
|
143
|
+
function getInCluster () {
|
|
144
|
+
const host = process.env.KUBERNETES_SERVICE_HOST
|
|
145
|
+
const port = process.env.KUBERNETES_SERVICE_PORT
|
|
146
|
+
if (!host || !port) {
|
|
147
|
+
throw new TypeError(
|
|
148
|
+
'Unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST' +
|
|
149
|
+
' and KUBERNETES_SERVICE_PORT must be defined')
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const ca = fs.readFileSync(caPath, 'utf8')
|
|
153
|
+
const bearer = fs.readFileSync(tokenPath, 'utf8')
|
|
154
|
+
const namespace = fs.readFileSync(namespacePath, 'utf8')
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
url: `https://${host}:${port}`,
|
|
158
|
+
ca,
|
|
159
|
+
auth: { bearer },
|
|
160
|
+
namespace
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports.getInCluster = deprecate.function(
|
|
165
|
+
getInCluster,
|
|
166
|
+
'getInCluster see https://github.com/godaddy/kubernetes-client/blob/master/merging-with-kubernetes.md#request-kubeconfig-')
|
|
167
|
+
|
|
168
|
+
//
|
|
169
|
+
// Accept a manually specified current-context to take precedence over
|
|
170
|
+
// `current-context`
|
|
171
|
+
//
|
|
172
|
+
/* eslint-disable complexity, max-statements */
|
|
173
|
+
function fromKubeconfig (kubeconfig, current) {
|
|
174
|
+
if (!kubeconfig) kubeconfig = loadKubeconfig()
|
|
175
|
+
// if kubeconfig is provided as a path to the yaml file,
|
|
176
|
+
// or array of paths to the yaml files,
|
|
177
|
+
// automatically load it.
|
|
178
|
+
if (typeof kubeconfig === 'string' || Array.isArray(kubeconfig)) {
|
|
179
|
+
kubeconfig = loadKubeconfig(kubeconfig)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
current = current || kubeconfig['current-context']
|
|
183
|
+
const context = kubeconfig.contexts
|
|
184
|
+
.find(item => item.name === current).context
|
|
185
|
+
const cluster = kubeconfig.clusters
|
|
186
|
+
.find(item => item.name === context.cluster).cluster
|
|
187
|
+
const userConfig = kubeconfig.users
|
|
188
|
+
.find(user => user.name === context.user)
|
|
189
|
+
const user = userConfig ? userConfig.user : null
|
|
190
|
+
const namespace = context.namespace
|
|
191
|
+
|
|
192
|
+
let ca
|
|
193
|
+
let insecureSkipTlsVerify = false
|
|
194
|
+
if (cluster) {
|
|
195
|
+
if (cluster['certificate-authority']) {
|
|
196
|
+
ca = fs.readFileSync(path.normalize(cluster['certificate-authority']))
|
|
197
|
+
} else if (cluster['certificate-authority-data']) {
|
|
198
|
+
ca = Buffer.from(cluster['certificate-authority-data'], 'base64').toString()
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (cluster['insecure-skip-tls-verify']) {
|
|
202
|
+
insecureSkipTlsVerify = cluster['insecure-skip-tls-verify']
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
let cert
|
|
207
|
+
let key
|
|
208
|
+
|
|
209
|
+
let auth = {}
|
|
210
|
+
if (user) {
|
|
211
|
+
if (user['client-certificate']) {
|
|
212
|
+
cert = fs.readFileSync(path.normalize(user['client-certificate']))
|
|
213
|
+
} else if (user['client-certificate-data']) {
|
|
214
|
+
cert = Buffer.from(user['client-certificate-data'], 'base64').toString()
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (user['client-key']) {
|
|
218
|
+
key = fs.readFileSync(path.normalize(user['client-key']))
|
|
219
|
+
} else if (user['client-key-data']) {
|
|
220
|
+
key = Buffer.from(user['client-key-data'], 'base64').toString()
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (user.token) {
|
|
224
|
+
auth.bearer = user.token
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (user['auth-provider']) {
|
|
228
|
+
const config = user['auth-provider'].config
|
|
229
|
+
|
|
230
|
+
// if we can't determine the type, just fail later (or don't refresh).
|
|
231
|
+
let type = null
|
|
232
|
+
let token = null
|
|
233
|
+
if (config['cmd-path']) {
|
|
234
|
+
type = 'cmd'
|
|
235
|
+
token = config['access-token']
|
|
236
|
+
} else if (config['idp-issuer-url']) {
|
|
237
|
+
type = 'openid'
|
|
238
|
+
token = config['id-token']
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// If we have just an access-token, allow that... will expire later though.
|
|
242
|
+
if (config['access-token'] && !type) {
|
|
243
|
+
token = config['access-token']
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
auth = {
|
|
247
|
+
request: {
|
|
248
|
+
bearer: token
|
|
249
|
+
},
|
|
250
|
+
provider: {
|
|
251
|
+
config,
|
|
252
|
+
type
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (user.exec) {
|
|
258
|
+
const env = {}
|
|
259
|
+
if (user.exec.env) {
|
|
260
|
+
user.exec.env.forEach(variable => {
|
|
261
|
+
env[variable.name] = variable.value
|
|
262
|
+
})
|
|
263
|
+
}
|
|
264
|
+
let args = ''
|
|
265
|
+
if (user.exec.args) {
|
|
266
|
+
args = user.exec.args.join(' ')
|
|
267
|
+
}
|
|
268
|
+
auth = {
|
|
269
|
+
provider: {
|
|
270
|
+
type: 'cmd',
|
|
271
|
+
config: {
|
|
272
|
+
'cmd-args': args,
|
|
273
|
+
'cmd-path': user.exec.command,
|
|
274
|
+
'token-key': 'status.token',
|
|
275
|
+
'cmd-env': env
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (user.username) auth.user = user.username
|
|
282
|
+
if (user.password) auth.pass = user.password
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
url: cluster.server,
|
|
287
|
+
namespace,
|
|
288
|
+
auth: Object.keys(auth).length ? auth : null,
|
|
289
|
+
ca,
|
|
290
|
+
insecureSkipTlsVerify,
|
|
291
|
+
key,
|
|
292
|
+
cert
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/* eslint-enable complexity, max-statements */
|
|
296
|
+
|
|
297
|
+
module.exports.fromKubeconfig = deprecate.function(
|
|
298
|
+
fromKubeconfig,
|
|
299
|
+
'fromKubeconfig see https://github.com/godaddy/kubernetes-client/blob/master/merging-with-kubernetes.md#request-kubeconfig-')
|
|
300
|
+
|
|
301
|
+
function mapCertificates (cfgPath, config) {
|
|
302
|
+
const configDir = path.dirname(cfgPath)
|
|
303
|
+
|
|
304
|
+
if (config.clusters) {
|
|
305
|
+
config.clusters.filter(cluster => cluster.cluster['certificate-authority']).forEach(cluster => {
|
|
306
|
+
cluster.cluster['certificate-authority'] = path.resolve(configDir, cluster.cluster['certificate-authority'])
|
|
307
|
+
})
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (config.users) {
|
|
311
|
+
config.users.filter(user => user.user['client-certificate']).forEach(user => {
|
|
312
|
+
user.user['client-certificate'] = path.resolve(configDir, user.user['client-certificate'])
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
config.users.filter(user => user.user['client-key']).forEach(user => {
|
|
316
|
+
user.user['client-key'] = path.resolve(configDir, user.user['client-key'])
|
|
317
|
+
})
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
return config
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
function loadKubeconfig (cfgPath) {
|
|
324
|
+
let cfgPaths
|
|
325
|
+
|
|
326
|
+
if (!cfgPath) {
|
|
327
|
+
cfgPaths = defaultConfigPaths()
|
|
328
|
+
} else if (Array.isArray(cfgPath)) {
|
|
329
|
+
cfgPaths = cfgPath
|
|
330
|
+
} else {
|
|
331
|
+
cfgPaths = [cfgPath]
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
const configs = cfgPaths.map(cfgPath => {
|
|
335
|
+
const config = yaml.safeLoad(fs.readFileSync(cfgPath))
|
|
336
|
+
return mapCertificates(cfgPath, config)
|
|
337
|
+
})
|
|
338
|
+
|
|
339
|
+
return merge.all(configs)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
module.exports.loadKubeconfig = deprecate.function(
|
|
343
|
+
loadKubeconfig,
|
|
344
|
+
'loadKubeconfig see https://github.com/godaddy/kubernetes-client/blob/master/merging-with-kubernetes.md#request-kubeconfig-')
|
package/changes.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bumped": {
|
|
3
|
+
"@kubernetes/client-node": {
|
|
4
|
+
"from": "0.10.2",
|
|
5
|
+
"to": "^1.4.0"
|
|
6
|
+
},
|
|
7
|
+
"camelcase": {
|
|
8
|
+
"from": "^6.0.0",
|
|
9
|
+
"to": "^9.0.0"
|
|
10
|
+
},
|
|
11
|
+
"deepmerge": {
|
|
12
|
+
"from": "^4.2.2",
|
|
13
|
+
"to": "^4.3.1"
|
|
14
|
+
},
|
|
15
|
+
"js-yaml": {
|
|
16
|
+
"from": "^3.13.1",
|
|
17
|
+
"to": "^4.1.1"
|
|
18
|
+
},
|
|
19
|
+
"openid-client": {
|
|
20
|
+
"from": "^3.14.0",
|
|
21
|
+
"to": "^6.8.2"
|
|
22
|
+
},
|
|
23
|
+
"pump": {
|
|
24
|
+
"from": "^3.0.0",
|
|
25
|
+
"to": "^3.0.4"
|
|
26
|
+
},
|
|
27
|
+
"qs": {
|
|
28
|
+
"from": "^6.9.0",
|
|
29
|
+
"to": "^6.15.0"
|
|
30
|
+
},
|
|
31
|
+
"url-join": {
|
|
32
|
+
"from": "^4.0.1",
|
|
33
|
+
"to": "^5.0.0"
|
|
34
|
+
},
|
|
35
|
+
"ws": {
|
|
36
|
+
"from": "^7.2.3",
|
|
37
|
+
"to": "^8.19.0"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"timestamp": "2026-03-17T22:56:35.690Z",
|
|
41
|
+
"totalUpdated": 9
|
|
42
|
+
}
|
package/lib/alias.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// We support the full names and all the abbbreviated aliases:
|
|
4
|
+
// http://kubernetes.io/docs/user-guide/kubectl-overview/
|
|
5
|
+
// and anything else we think is useful.
|
|
6
|
+
const resourceAliases = {
|
|
7
|
+
clusterroles: [],
|
|
8
|
+
clusterrolebindings: [],
|
|
9
|
+
componentstatuses: ['cs'],
|
|
10
|
+
configmaps: ['cm'],
|
|
11
|
+
cronjobs: [],
|
|
12
|
+
customresourcedefinitions: ['crd'],
|
|
13
|
+
daemonsets: ['ds'],
|
|
14
|
+
deployments: ['deploy'],
|
|
15
|
+
events: ['ev'],
|
|
16
|
+
endpoints: ['ep'],
|
|
17
|
+
horizontalpodautoscalers: ['hpa'],
|
|
18
|
+
ingresses: ['ing'],
|
|
19
|
+
jobs: [],
|
|
20
|
+
limitranges: ['limits'],
|
|
21
|
+
namespaces: ['ns'],
|
|
22
|
+
nodes: ['no'],
|
|
23
|
+
persistentvolumes: ['pv'],
|
|
24
|
+
persistentvolumeclaims: ['pvc'],
|
|
25
|
+
// Deprecated name of statefulsets in kubernetes 1.4
|
|
26
|
+
petsets: [],
|
|
27
|
+
pods: ['po'],
|
|
28
|
+
replicationcontrollers: ['rc'],
|
|
29
|
+
replicasets: ['rs'],
|
|
30
|
+
resourcequotas: ['quota'],
|
|
31
|
+
roles: [],
|
|
32
|
+
rolebindings: [],
|
|
33
|
+
// Deprecated name of cronjobs in kubernetes 1.4
|
|
34
|
+
scheduledjobs: [],
|
|
35
|
+
secrets: [],
|
|
36
|
+
serviceaccounts: [],
|
|
37
|
+
services: ['svc'],
|
|
38
|
+
statefulsets: [],
|
|
39
|
+
// Deprecated name of customresourcedefinition in kubernetes 1.7
|
|
40
|
+
thirdpartyresources: []
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const esPlurals = {
|
|
44
|
+
componentstatuses: true,
|
|
45
|
+
ingresses: true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const excludeFromAliasing = {
|
|
49
|
+
apis: true,
|
|
50
|
+
status: true
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
module.exports = function (resourceType) {
|
|
54
|
+
let aliases = [resourceType]
|
|
55
|
+
if (resourceAliases[resourceType]) {
|
|
56
|
+
aliases = aliases.concat(resourceAliases[resourceType])
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
//
|
|
60
|
+
// NOTE(sbw): try to catch things that shouldn't have singular aliases. This
|
|
61
|
+
// fails on some relatively common resources, like "status".
|
|
62
|
+
//
|
|
63
|
+
if ((resourceType.slice(-1) !== 's') || (resourceType in excludeFromAliasing)) {
|
|
64
|
+
return aliases
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const trimLength = esPlurals[resourceType] ? 2 : 1
|
|
68
|
+
const single = resourceType.substr(0, resourceType.length - trimLength)
|
|
69
|
+
aliases.push(single)
|
|
70
|
+
return aliases
|
|
71
|
+
}
|
package/lib/config.js
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const deprecate = require('depd')('kubernetes-client')
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
Client: require('./swagger-client').Client,
|
|
5
|
+
Client1_13: require('./swagger-client').Client1_13,
|
|
6
|
+
alias: require('./alias'),
|
|
7
|
+
config: require('../backends/request/config'),
|
|
8
|
+
KubeConfig: require('./config')
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
deprecate.property(
|
|
12
|
+
module.exports,
|
|
13
|
+
'config',
|
|
14
|
+
'require(\'kubernetes-client\').config,' +
|
|
15
|
+
' use require(\'kubernetes-client/backends/request\').config.')
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|