UNPKG

icinga-aws-autoscaling

Version:

Dynamic management of AWS Auto-Scaling Group inventory in Icinga.

180 lines (161 loc) 5.68 kB
'use strict'; const request = require('request'); const config = require('../../config.json'); /** * Icinga API class. */ module.exports = { /** * @param {String} instanceId * @param {Object} instanceData * * @return {Promise} */ createHost(instanceId, instanceData) { const requestOptions = this.createHostRequestOptions(instanceId, instanceData); return this.sendRequest(requestOptions); }, /** * @param {String} instanceId * @param {Object} instanceData * * @return {Promise} */ deleteHost(instanceId, instanceData) { const requestOptions = this.deleteHostRequestOptions(instanceId, instanceData); return this.sendRequest(requestOptions); }, /** * @param {Object} requestOptions * * @return {Promise} */ sendRequest(requestOptions) { return new Promise((resolve, reject) => { try { /** * @var {Object} body * @property {Object} results */ request(requestOptions, function(error, response, body) { if (error) { return reject({ message: 'Request level exception occurred.', data: { exception: error } }); } if (response.statusCode !== 200) { return reject({ message: 'Invalid status code in response from Icinga.', data: { response_code: response.statusCode } }); } if (body.results === undefined || body.results[0] === undefined) { return reject({ message: 'Unexpected response body returned by Icinga.', data: { body } }); } if (parseInt(body.results[0].code) !== 200) { return reject({ message: 'Invalid results code in Icinga response body.', data: { results_code: body.results[0].code } }); } return resolve(); }); } catch (e) { reject({ message: e.message, data: { exception: e } }); } }); }, /** * @param {String} instanceId * @param {Object} instanceData * * @return {Object} */ createHostRequestOptions(instanceId, instanceData) { const hostName = this.icingaHostName(instanceId, instanceData); let options = { method: 'PUT', uri: `https://${config.icinga_host}:${config.icinga_port}/v1/objects/hosts/${hostName}`, strictSSL: false, headers: { 'Accept': 'application/json' }, auth: { user: config.icinga_user, pass: config.icinga_pass }, json: { templates: [ 'generic-host' ], attrs: { address: instanceData.publicDns, 'vars.instance_size': instanceData.instanceSize, 'vars.ebs_optimized': instanceData.ebsOptimized, 'vars.key_name': instanceData.keyName } } }; const icingaHostVars = config.icinga_host_vars; if (icingaHostVars instanceof Object) { for (let hostVar in icingaHostVars) { if (icingaHostVars.hasOwnProperty(hostVar) && options.json.attrs[`vars.${hostVar}`] === undefined) { // Dynamically set host vars from config. options.json.attrs[`vars.${hostVar}`] = icingaHostVars[hostVar]; } } } return options; }, /** * @param {String} instanceId * @param {Object} instanceData * * @return {Object} */ deleteHostRequestOptions(instanceId, instanceData) { const hostName = this.icingaHostName(instanceId, instanceData); return { method: 'POST', uri: `https://${config.icinga_host}:${config.icinga_port}/v1/objects/hosts/${hostName}?cascade=1`, strictSSL: false, headers: { 'Accept': 'application/json', 'X-HTTP-Method-Override': 'DELETE' }, auth: { user: config.icinga_user, pass: config.icinga_pass }, json: {} }; }, /** * @param {String} instanceId * @param {Object} instanceData * * @return {String} */ icingaHostName(instanceId, instanceData) { let hostName = instanceId; if ((typeof config.icinga_host_name_property) === 'string' && config.icinga_host_name_property.length > 0) { const icingaHostNameProperty = config.icinga_host_name_property.toLowerCase(); const mapping = { public_dns: instanceData.publicDns, public_ip: instanceData.publicIpAddress, private_dns: instanceData.privateDns, private_ip: instanceData.privateIpAddress }; if (mapping.hasOwnProperty(icingaHostNameProperty)) { hostName = mapping[icingaHostNameProperty]; } } return hostName; } };