UNPKG

liveapicreator-admin-cli

Version:

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

362 lines (348 loc) 11.1 kB
var Client = require('node-rest-client').Client; var colors = require('colors'); var _ = require('underscore'); var Table = require('easy-table'); var fs = require('fs'); 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 = { doFunction: function(action, cmd) { if (action === 'list') { module.exports.list(cmd); } else if (action === 'delete') { module.exports.del(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, 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; } } //var idx = url.indexOf("/abl"); //var functionURL = url.substring(0,idx) +"/default/"+urlname+"/v1"; var filter = "/AllFunctions?sysfilter=equal(project_ident:"+projIdent+")"; client.get(url + filter, { headers: { Authorization: "CALiveAPICreator " + apiKey + ":1", "Content-Type" : "application/json" } },function(data) { if (data.errorMessage) { console.log(data.errorMessage.red); return; } printObject.printHeader('Functions: '); var table = new Table(); var verboseDisplay = ""; _.each(data, function(p) { var type_name = ['none','number','string','boolean']; var parameters = "("; var parmsep = ""; _.each(p.parameters, function(arg) { parameters += parmsep + type_name[arg.type_ident] + " "+ arg.name; parmsep = ","; }); parameters += ")"; var sep = ""; //need a resource to return both functions and parameters table.cell("Ident", p.ident); table.cell("Name", p.name); table.cell("Parameters",parameters); table.cell("Resource",p.resource_names); table.cell("Is Active", p.is_active); var comments = p.comments; if ( ! comments) { comments = ""; } else if (comments.length > 50){ comments = comments.substring(0, 47) + "..."; } table.cell("Comments", comments); table.newRow(); if(cmd.verbose) { verboseDisplay += "\n"; verboseDisplay += "lacadmin function export --name '"+p.name+"' --file FUNCTION_"+p.name + ".json\n"; verboseDisplay += "#lacadmin function import --file FUNCTION_"+p.name + ".json\n"; } }); table.sort(['Name', 'name']); if (data.length === 0) { console.log('There are no functions defined for this API project'.yellow); } else { console.log(table.toString()); } printObject.printHeader("# functions: " + data.length); if(cmd.verbose) { console.log(verboseDisplay); } }); }, del : function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) { console.log('You are not currently logged into any API Creator server.'.red); return; } var filt = null; if (cmd.ident) { filt = "equal(ident:" + cmd.ident + ")"; } else if (cmd.function_name) { filt = "equal(name:'" + cmd.function_name + "')"; } if(filt === null) { console.log('Missing parameter: please specify either --name or --ident'.red); return; } client.get(loginInfo.url + "/admin:functions?sysfilter=" + filt, { headers: { Authorization: "CALiveAPICreator " + loginInfo.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(("Function not found using filter name or ident").red); return; } if (data.length > 1) { console.log(("Error: more than one function found for the given condition: " + filter).red); return; } var db = data[0]; var startTime = new Date(); client['delete'](db['@metadata'].href + "?checksum=" + db['@metadata'].checksum, { headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(data2) { var endTime = new Date(); if (data2.errorMessage) { console.log(data2.errorMessage.red); return; } printObject.printHeader('Function was deleted, including the following objects:'); _.each(data2.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); var trailer = "Request took: " + (endTime - startTime) + "ms"; trailer += " - # objects touched: "; if (data2.txsummary.length == 0) { console.log('No data returned'.yellow); } else { trailer += data2.txsummary.length; } printObject.printHeader(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 toStdout = false; if ( ! cmd.file) { toStdout = true; } var projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); if ( ! projIdent) { console.log('There is no current project.'.yellow); return; } } var filt = ""; if (cmd.ident) { filt = "&sysfilter=equal(ident:" + cmd.ident + ")"; } else if(cmd.function_name) { filt += "&sysfilter=equal(name:'"+cmd.function_name+"')"; } var output = []; var filter = "/AllFunctions?sysfilter=equal(project_ident:"+projIdent+")" + filt; client.get(url + 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(("Function found").red); return; } for(var i = 0; i < data.length ; i++){ delete data[i]["ident"]; delete data[i]["ts"]; delete data[i]["@metadata"]; if(Array.isArray(data[i]["parameters"]) && data[i]["parameters"].length > 0) { //console.log( JSON.stringify(data[i]["parameters"])); for(var j = 0; j < data[i]["parameters"].length ; j++){ //console.log( j +" : " + JSON.stringify(data[i]["parameters"])); delete data[i].parameters[j]["@metadata"]; delete data[i].parameters[j]["ts"]; delete data[i].parameters[j]["type_name"]; delete data[i].parameters[j]["ident"]; delete data[i].parameters[j]["function_ident"]; } } output.push(data[i]); //console.log(JSON.stringify(data[i],null,2)); } if (toStdout) { console.log(JSON.stringify(output, null, 2)); } else { var filename = cmd.file; var exportFile = fs.openSync(filename, 'w+', 0600); fs.writeSync(exportFile, JSON.stringify(output, null, 2)); console.log(('Functions have been exported to file: ' + filename).green); } }); }, 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 curProj = cmd.project_ident; if ( ! curProj) { curProj = dotfile.getCurrentProject(); } if ( ! curProj) { console.log('There is no current project.'.yellow); return; } 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 = null; var json = null; fs.readFile(cmd.file, function read(err,data){ if(err) { console.log("Unable to read file"); return; } json = data; fileContent = JSON.parse(json); //fix up the parent/child relationships //create each parent admin:functions // for each parameter link admin:function ident to admin:function_parameters function_ident if(Array.isArray(fileContent)){ for(var i = 0 ; i < fileContent.length; i++){ fileContent[i].project_ident = curProj; delete fileContent[i].ident; if(Array.isArray(fileContent[i]["parameters"]) && fileContent[i]["parameters"].length > 0) { //console.log( JSON.stringify(data[i]["parameters"])); for(var j = 0; j < fileContent[i]["parameters"].length ; j++){ delete fileContent[i].parameters[j]["ident"]; delete fileContent[i].parameters[j]["function_ident"]; } } } } else { fileContent[i].project_ident = curProj; delete fileContent[i].ident; if(Array.isArray(fileContent[i]["parameters"]) && fileContent[i]["parameters"].length > 0) { //console.log( JSON.stringify(data[i]["parameters"])); for(var j = 0; j < fileContent[i]["parameters"].length ; j++){ delete fileContent[i].parameters[j]["ident"]; delete fileContent[i].parameters[j]["function_ident"]; } } } var startTime = new Date(); client.post(loginInfo.url + "/AllFunctions", { data: fileContent, 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('Functions imported, including:'); var trailer = "Request took: " + (endTime - startTime) + "ms"; if(data.statusCode == 200){ console.log(trailer); } else { var newSort = _.find(data.txsummary, function(p) { return p['@metadata'].resource === 'AllFunctions'; }); if ( ! newSort) { console.log('ERROR: unable to find imported functions'.red); return; } if (cmd.verbose) { _.each(data.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); } else { printObject.printObject(newSort, newSort['@metadata'].entity, 0, newSort['@metadata'].verb); console.log(('and ' + (data.txsummary.length - 1) + ' other objects').grey); } trailer += " - # objects touched: "; if (data.txsummary.length === 0) { console.log('No data returned'.yellow); } else { trailer += data.txsummary.length; } } printObject.printHeader(trailer); }) }); }); } };