Skip to content

Commit e9aadfd

Browse files
authored
Merge pull request #20 from kube-HPC/add-kube-version
add kube-version api
2 parents 049247a + 0721d2b commit e9aadfd

File tree

11 files changed

+853
-598
lines changed

11 files changed

+853
-598
lines changed

lib/formatters.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = {
2+
parseInt(value, defaultValue) {
3+
if (typeof value === 'number') {
4+
return value;
5+
}
6+
if (typeof value === 'string') {
7+
const ret = parseInt(value, 10);
8+
if (Number.isNaN(ret)) {
9+
return defaultValue;
10+
}
11+
return ret;
12+
}
13+
return defaultValue;
14+
}
15+
};

lib/utils.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const clonedeep = require('lodash.clonedeep');
2+
const compareVersions = require('compare-versions');
3+
24
const objectPath = require('object-path');
35
const { awsAccessKeyId, awsSecretAccessKey, s3EndpointUrl } = require('./templates/s3-template');
46
const { fsBaseDirectory, fsVolumeMounts, fsVolumes } = require('./templates/fs-template');
@@ -308,6 +310,47 @@ const applySecret = (inputSpec, containerName, secret) => {
308310
return spec;
309311
};
310312

313+
const getIngressApiVersion = (kubeVersion) => {
314+
const { version } = kubeVersion;
315+
if (compareVersions.compare(version, '1.14', '<')) {
316+
return 'extensions/v1beta1';
317+
}
318+
if (compareVersions.compare(version, '1.19', '<')) {
319+
return 'networking.k8s.io/v1beta1';
320+
}
321+
return 'networking.k8s.io/v1';
322+
};
323+
324+
const shouldAddIngressPathType = (kubeVersion) => {
325+
const { version } = kubeVersion;
326+
return compareVersions.compare(version, '1.19', '>=');
327+
};
328+
329+
const getIngressBackend = (serviceName, servicePort, kubeVersion) => {
330+
const { version } = kubeVersion;
331+
if (compareVersions.compare(version, '1.19', '<')) {
332+
return {
333+
backend: {
334+
serviceName,
335+
servicePort
336+
}
337+
};
338+
}
339+
const backend = {
340+
service: {
341+
name: serviceName,
342+
port: {
343+
[Number.isInteger(servicePort) ? 'number' : 'name']: servicePort
344+
}
345+
}
346+
};
347+
const ret = { backend };
348+
if (shouldAddIngressPathType(kubeVersion)) {
349+
ret.pathType = 'ImplementationSpecific';
350+
}
351+
return ret;
352+
};
353+
311354
module.exports = {
312355
findContainer,
313356
parseImageName,
@@ -326,5 +369,7 @@ module.exports = {
326369
applySecret,
327370
createEnvFromConfigmap,
328371
applyAnnotation,
329-
applyImagePullSecret
372+
applyImagePullSecret,
373+
getIngressApiVersion,
374+
getIngressBackend
330375
};

lib/versions.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
11

22
const Client = require('./client-base');
3+
const formatters = require('./formatters');
34

45
class Versions extends Client {
6+
constructor(client, namespace) {
7+
super(client, namespace);
8+
this._kubeVersion = null;
9+
}
10+
511
async get() {
612
return this._client.version.get();
713
}
14+
15+
async getParsedVersion() {
16+
if (!this._kubeVersion) {
17+
const kubeVersionRaw = await this.get();
18+
this._kubeVersion = {
19+
...kubeVersionRaw.body,
20+
major: formatters.parseInt(kubeVersionRaw.body.major, 1),
21+
minor: formatters.parseInt(kubeVersionRaw.body.minor, 9)
22+
};
23+
this._kubeVersion.version = `${this._kubeVersion.major}.${this._kubeVersion.minor}`;
24+
}
25+
return this._kubeVersion;
26+
}
827
}
928

1029
module.exports = Versions;

package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"author": "Nassi Harel",
2424
"license": "MIT",
2525
"dependencies": {
26+
"compare-versions": "^3.6.0",
2627
"kubernetes-client": "^6.12.1",
2728
"lodash.clonedeep": "^4.5.0",
2829
"object-path": "^0.11.4"

tests/formattersTest.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const { expect } = require('chai');
2+
const formatters = require('../lib/formatters');
3+
4+
describe('formatters', () => {
5+
it('parse empty', () => {
6+
const res = formatters.parseInt(undefined, 101)
7+
expect(res).to.eql(101)
8+
})
9+
it('parse number', () => {
10+
const res = formatters.parseInt(102, 101)
11+
expect(res).to.eql(102)
12+
})
13+
it('parse error', () => {
14+
const res = formatters.parseInt('foo', 101)
15+
expect(res).to.eql(101)
16+
})
17+
})

tests/mocks/kubernetes-server.mock.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ const express = require('express');
33
const bodyParser = require('body-parser');
44
const app = express();
55
const pod = require('../stubs/pod.json');
6+
const version = require('../stubs/version.json');
67
const configmaps = require('../stubs/configmaps.json');
78

89
const map = {
910
'/api/kube/api/v1/namespaces/default/pods/worker': pod,
11+
'/api/kube/version': version,
1012
'/api/kube/api/v1/namespaces/default/configmaps/hkube-versions': configmaps,
1113
'/api/kube/api/v1/namespaces/default/resourcequotas/foo': {body: {name: 'foo'}}
1214
}

tests/setup.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const kubernetesServerMock = require('./mocks/kubernetes-server.mock');
2+
3+
const kubeconfig = {
4+
apiVersion: 'v1',
5+
kind: 'Config',
6+
'current-context': 'dev',
7+
clusters: [{
8+
name: 'dev',
9+
cluster: {
10+
server: "http://127.0.0.1:9001/api/kube"
11+
}
12+
}],
13+
contexts: [{
14+
name: 'dev',
15+
context: {
16+
cluster: 'dev',
17+
user: 'dev-admin'
18+
}
19+
}],
20+
users: [{
21+
name: 'default-admin',
22+
user: {}
23+
}]
24+
}
25+
26+
27+
before(async () => {
28+
const index = require('../index');
29+
Client = index.Client;
30+
utils = index.utils;
31+
client = new Client({ isLocal: false, timeout: 5000, kubeconfig });
32+
await kubernetesServerMock.start({ port: 9001 });
33+
34+
global.testParams = {
35+
utils,
36+
Client,
37+
client
38+
}
39+
});

tests/stubs/version.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"statusCode": 200,
3+
"body": {
4+
"major": "1",
5+
"minor": "19",
6+
"gitVersion": "v1.19.7",
7+
"gitCommit": "1dd5338295409edcfff11505e7bb246f0d325d15",
8+
"gitTreeState": "clean",
9+
"buildDate": "2021-01-13T13:15:20Z",
10+
"goVersion": "go1.15.5",
11+
"compiler": "gc",
12+
"platform": "linux/amd64"
13+
}
14+
}

0 commit comments

Comments
 (0)