@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.
@@ -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-')
@@ -0,0 +1,5 @@
1
+ const Request = require('./client')
2
+
3
+ Request.config = require('./config')
4
+
5
+ module.exports = Request
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
@@ -0,0 +1,3 @@
1
+ const k8s = require('@kubernetes/client-node')
2
+
3
+ module.exports = k8s.KubeConfig
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