UNPKG

liveapicreator-admin-cli

Version:

The NodeJS command line utility for 'CA Live API Creator' DevOps Administration from CA Technologies

313 lines (297 loc) 8.95 kB
var Client = require('node-rest-client').Client; var colors = require('colors'); var _ = require('underscore'); var fs = require('fs'); var CLITable = require('cli-table'); var Table = require('easy-table'); var context = require('./context.js'); var login = require('../util/login.js'); var printObject = require('../util/printObject.js'); var dotfile = require('../util/dotfile.js'); module.exports = { doSettings: function(action, cmd) { if (action === 'list') { module.exports.list(cmd); } else if (action === 'update') { module.exports.update(cmd); } else if (action === 'import') { module.exports.import(cmd); } else if (action === 'export') { module.exports.export(cmd); } else { console.log('You must specify an action: list, update, import, or export'); //program.help(); } }, list: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; var url = loginInfo.url; var apiKey = loginInfo.apiKey; var projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); if ( ! projIdent) { console.log('There is no current project.'.yellow); return; } } client.get(url + "/ProjectOptions?sysfilter=equal(project_ident:" + projIdent +")&pagesize=100", { headers: { Authorization: "CALiveAPICreator " + apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { if (data.errorMessage) { console.log(data.errorMessage.red); return; } printObject.printHeader('API Project Option Settings'); var table = new Table(); _.each(data, function(p) { table.cell("Ident", p.ident); table.cell("Project", p.project_ident); table.cell("Name", p.ProjectOptionTypes.name); table.cell("Value", p.option_value); var comments = p.ProjectOptionTypes.description; if ( ! comments) { comments = ""; } else if (comments.length > 50){ comments = comments.substring(0, 47) + "..."; } //table.cell("Comments", comments); table.newRow(); }); table.sort(['Name']); console.log(table.toString()); printObject.printHeader("# settings: " + data.length); }); }, update: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; if ( ! cmd.ident) { console.log('Missing parameter: ident'.red); return; } var apiKey = loginInfo.apiKey; if ( ! apiKey){ console.log(("Error: Login apiKey is missing or empty").red); return; } var filter = null; if (cmd.ident) { filter = "equal(ident:" + cmd.ident + ")"; } else { console.log('There is no setting ident.'.yellow); eturn; } var projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); if ( ! projIdent) { console.log('There is no current project.'.yellow); return; } filter += "&sysfilter=equal(project_ident:" + projIdent + ")"; } client.get(loginInfo.url + "/ProjectOptions?sysfilter=" + filter, { headers: { Authorization: "CALiveAPICreator " + apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { //console.log('get result: ' + JSON.stringify(data, null, 2)); if (data.errorMessage) { console.log(("Error: " + data.errorMessage).red); return; } if (data.length === 0) { console.log(("Error: no such api option setting found").red); return; } if (data.length > 1) { console.log(("Error: more than one project setting for the given condition: " + filter).red); return; } var setting = data[0]; if (cmd.option_value) { setting.option_value = cmd.option_value; } if (cmd.project_ident) { setting.project_ident = cmd.project_ident; } var startTime = new Date(); client.put(setting['@metadata'].href, { data: setting, headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { var endTime = new Date(); if (data.errorMessage) { console.log(data.errorMessage.red); return; } printObject.printHeader('Project setting was updated, including the following objects:'); _.each(data.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); var trailer = "Request took: " + (endTime - startTime) + "ms"; trailer += " - # objects touched: "; if (data.txsummary.length == 0) { console.log('No data returned'.yellow); } else { trailer += data.txsummary.length; } printObject.printTrailer(trailer); }); }); }, import: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; var url = loginInfo.url; var apiKey = loginInfo.apiKey; if ( ! cmd.file) { cmd.file = '/dev/stdin'; } var projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); if ( ! projIdent) { console.log('There is no current project.'.yellow); return; } } context.getContext(cmd, function() { var fileContent = JSON.parse(fs.readFileSync(cmd.file)); var row = null; for(var i = 0 ; i < fileContent.length ; i++ ){ delete fileContent[i].ProjectOptionTypes; delete fileContent[i].ts; fileContent[i].project_ident = projIdent; fileContent[i]["@metadata"] = {action:"MERGE_INSERT", key: ["projectoptiontype_ident","project_ident"]} ; row = fileContent[i]; var startTime = new Date(); client.put(loginInfo.url + "/ProjectOptions", { data: row, headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { var endTime = new Date(); if (data.errorMessage) { console.log(data.errorMessage.red); return; } printObject.printHeader('Logic project settings was created, including:'); if(data.statusCode == 200 ){ console.log("Request took: " + (endTime - startTime) + "ms"); return; } var newSettings = _.find(data.txsummary, function(p) { return p['@metadata'].resource === 'ProjectOptions'; }); if ( ! newSettings) { console.log('INFO: no change to find imported project settings'.yellow); return; } if (cmd.verbose) { _.each(data.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); } else { printObject.printObject(newSettings, newSettings['@metadata'].entity, 0, newSettings['@metadata'].verb); console.log(('and ' + (data.txsummary.length - 1) + ' other objects').grey); } var trailer = "Request took: " + (endTime - startTime) + "ms"; trailer += " - # objects touched: "; if (data.txsummary.length === 0) { console.log('No data returned'.yellow); } else { trailer += data.txsummary.length; } printObject.printTrailer(trailer); }) } }); }, export: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; var url = loginInfo.url; var apiKey = loginInfo.apiKey; var projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); if ( ! projIdent) { console.log('There is no current project.'.yellow); return; } } var filter = null; if (projIdent) { filter = "equal(project_ident:" + projIdent + ")"; } else { console.log('Missing parameter: please specify project settings (use list) project_ident '.red); return; } if(cmd.ident){ filter += "&sysfilter=equal(ident:" + cmd.ident + ")"; } var toStdout = false; if ( ! cmd.file) { toStdout = true; } //console.log(filter); client.get(loginInfo.url + "/ProjectOptions?sysfilter=" + filter +"&pagesize=100", { headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { if (data.errorMessage) { console.log(("Error: " + data.errorMessage).red); return; } if (data.length === 0) { console.log(("API option(s) not found").red); return; } for(var i = 0; i < data.length ; i++){ delete data[i].ident; delete data[i].project_ident; delete data[i]['@metadata']; delete data[i].ProjectOptionTypes['@metadata']; } if (toStdout) { console.log(JSON.stringify(data, null, 2)); var libcode = data[0].code; //console.log("libcode "+new Buffer(libcode.value.toString(), 'base64').toString('ascii')); } else { var exportFile = fs.openSync(cmd.file, 'w+', 0600); fs.writeSync(exportFile, JSON.stringify(data, null, 2)); console.log(('API Project settings has been exported to file: ' + cmd.file).green); } }); } }