-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
94 lines (81 loc) · 3.08 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
const util = require('util');
const fs = require('fs');
const Handlebars = require('handlebars');
const exec = util.promisify(require('child_process').exec);
const open = require('open');
const config = require('./config.json');
const { parseStdout } = require('./src/parseK8sStdout');
const k8sResources = {};
const helpers = {};
/**
* Obtains specific kind of resources and their status for specific cluster
* @param {string} environmentName Name of current environment
* @param {string} resourceType Type of k8s resource to get
* @param {string?} namespace Optional namespace to be used
*/
async function getResource(environmentName, resourceType, namespace) {
const namespaceCmd = namespace ? ` -n ${namespace}` : '';
const output = await exec(`kubectl get ${resourceType} ${namespaceCmd}`);
const resources = parseStdout(output);
k8sResources[environmentName] = k8sResources[environmentName] || {};
k8sResources[environmentName][resourceType] = resources;
// If Pod or HPA, do extra tasks
if (helpers[resourceType]) {
helpers[resourceType].applyHelperFunctions(k8sResources[environmentName][resourceType], config);
}
}
/**
* Obtains k8s all resources status for specific cluster
* @param {Object | string} environment Environment where to obtain resources from
*/
async function getK8sResources(environment) {
let namespace;
let environmentName = environment;
let context = environment;
if (typeof environment !== 'string') {
environmentName = environment.context;
namespace = environment.namespace;
context = `${environment.context} -n ${environment.namespace}`;
}
await exec(`kubectl config use-context ${context}`);
for (const resource of config.resources) {
// eslint-disable-next-line no-await-in-loop
await getResource(environmentName, resource, namespace);
}
if (helpers.cluster) {
helpers.cluster.applyHelperFunctions(k8sResources[environmentName], config);
}
}
/**
* Registers helpers needed for extend logic
*/
function registerHelpers() {
// TODO - Improve helper injection
/* eslint-disable global-require */
helpers.hpa = require('./src/hpaHelper');
helpers.cluster = require('./src/clusterHelper');
}
/**
* Obtains k8s current status for all environments and creates HTML report
*/
async function getK8sInfo() {
try {
// Register helpers
registerHelpers();
// Get resources
for (const environment of config.environments) {
// eslint-disable-next-line no-await-in-loop
await getK8sResources(environment);
}
// Create template
Handlebars.registerHelper('substract', (lvalue, rvalue) => parseInt(lvalue) - parseInt(rvalue));
const templateHtml = fs.readFileSync('./template/index.html', 'utf8');
const template = Handlebars.compile(templateHtml);
fs.writeFileSync(config.reportName, template(k8sResources));
await open(config.reportName);
} catch (e) {
console.error(e);
}
}
// TODO - Improve, refresh every X minutes?
getK8sInfo();