-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
127 lines (105 loc) · 4.3 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
var exec = require('child_process').exec;
function execute(command, callback) {
exec(command, function (error, stdout, stderr) {
callback(stdout);
});
}
getResourcesByNamespace = function (namespace, callback) {
execute(`kubectl get deployments --output=json --namespace=${namespace} | jq -r '[.items[] | {app:.spec.template.spec.containers[0].name,replicas:.spec.replicas,resources:.spec.template.spec.containers[0].resources}]'`,
function (response) {
let json = JSON.parse(response);
var items = [];
for (var k in json) {
let item = json[k];
if (item.replicas === 0 || item.resources.limits === undefined || item.resources.limits.cpu === undefined || item.resources.limits.memory === undefined
|| item.resources.requests === undefined || item.resources.requests.cpu === undefined || item.resources.requests.memory === undefined) {
console.log(`INFO: ${item.app} is not specified.
Replicas: ${item.replicas}
Requests: ${JSON.stringify(item.resources.requests)}
Limits: ${JSON.stringify(item.resources.limits)}.
Skipped.`);
continue;
}
var resource = {
app: item.app,
replicas: item.replicas,
resources: {
limits: { cpu: getCoreCpuUnit(item.resources.limits.cpu), memory: getGBMemoryUnit(item.resources.limits.memory) },
requests: { cpu: getCoreCpuUnit(item.resources.requests.cpu), memory: getGBMemoryUnit(item.resources.requests.memory) }
}
};
items.push(resource);
}
callback(items);
});
};
getCoreCpuUnit = function (value) {
let lastChar = value.charAt(value.length - 1);
if (lastChar === 'm') {
return value.replace('m', '') / 1000;
};
return value;
};
getGBMemoryUnit = function (value) {
let lastChar = value.charAt(value.length - 2);
if (lastChar === "M") {
return value.replace('Mi', '') / 1024;
}
return Number(value.replace('Gi', ''));
};
calculateAppResouces = function (resources, clusterCount, csv) {
var calculatedResources = [];
for (k in resources) {
let item = resources[k];
let rCpu = item.replicas * clusterCount * item.resources.requests.cpu;
let lCpu = item.replicas * clusterCount * item.resources.limits.cpu;
let rMem = item.replicas * clusterCount * item.resources.requests.memory;
let lMem = item.replicas * clusterCount * item.resources.limits.memory;
calculatedResources.push({
app: item.app,
replicas: item.replicas,
totalRequestCpu: rCpu,
totalLimitCpu: lCpu,
totalRequestMem: rMem,
totalLimitMem: lMem,
requests: item.resources.requests,
limits: item.resources.limits
});
if (csv) {
console.log(`${item.app},${item.replicas},${item.resources.requests.cpu},${item.resources.limits.cpu},${item.resources.requests.memory},${item.resources.limits.memory}`);
}
}
return calculatedResources;
};
calculateOverall = function (resources) {
let rTotalCpu = 0;
let lTotalCpu = 0;
let rTotalMem = 0;
let lTotalMem = 0;
for (var k in resources) {
var item = resources[k];
rTotalCpu += item.totalRequestCpu;
lTotalCpu += item.totalLimitCpu;
rTotalMem += item.totalRequestMem;
lTotalMem += item.totalLimitMem;
}
return {
rTotalCpu: rTotalCpu,
lTotalCpu: lTotalCpu,
rTotalMem: rTotalMem,
lTotalMem: lTotalMem
};
};
const { argv } = require('yargs')
// console.log(argv);
getResourcesByNamespace(argv.namespace, function (response) {
// console.log(response);
var calcAppResponse = calculateAppResouces(response, argv.clusterCount, argv.csv);
if (argv.detailed) {
console.log(calcAppResponse);//detailed
}
var overall = calculateOverall(calcAppResponse);
console.log(overall);
});
// console.log(getCoreCpuUnit("250m"));
// console.log(getGBMemoryUnit('512Mi'));