UNPKG

liveapicreator-admin-cli

Version:

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

723 lines (691 loc) 22.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 = { doRule: function(action, cmd) { if (action === 'list') { module.exports.list(cmd); } else if (action === 'create') { module.exports.create(cmd); } else if (action === 'export') { module.exports.export(cmd); } else if (action === 'import') { module.exports.import(cmd); } else if (action === 'delete') { module.exports.del(cmd); } else { console.log('You must specify an action: list, create, import, export, update or delete'); //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 + "/rules?sysfilter=equal(project_ident:" + projIdent +")&pagesize=100&sysorder=(name:asc)", { headers: { Authorization: "CALiveAPICreator " + apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { if (data.errorMessage) { console.log(data.errorMessage.red); return; } printObject.printHeader('Rules'); var table = new Table(); var adminCmd = ""; var tblWidth = 0; var typeWidth = 0; _.each(data, function(p) { table.cell("Ident", p.ident); table.cell("Name", p.name); table.cell("Table", p.entity_name); if(p.attribute_name) { table.cell("Attr",p.attribute_name); } else { table.cell("Attr",""); } //console.log("Entity Name "+p.entity_name); tblWidth = (p.entity_name && p.entity_name.length > tblWidth) ? p.entity_name.length : tblWidth; var type = module.exports.getRuleType(p.ruletype_ident); table.cell("Type", type); adminCmd += module.exports.show(p); typeWidth = type.length > typeWidth ? type.length : typeWidth; var maxWidth = printObject.getScreenWidth() - (tblWidth + typeWidth + 11+ 2); var maxColWidth = (maxWidth / 3) - 3; var autoName = p.title; if (autoName && autoName.length > maxColWidth) { autoName = autoName.substring(0, (maxColWidth - 3)) + "..."; table.cell("Title", autoName.replace(/\n/g, '')); } else { table.cell("Title",""); } var comments = p.comments; if (comments) { comments = comments.replace(/\n/g, ''); } if ( ! comments) { comments = ""; } else if (comments.length > maxColWidth){ comments = comments.substring(0, (maxColWidth - 3)) + "..."; } table.cell("Comments", comments); table.newRow(); }); if (data.length === 0) { console.log('There is no rule defined for this project'.yellow); } else { table.sort(['Table', 'Type', 'Description']); console.log(table.toString()); if (cmd.verbose){ console.log(adminCmd) }; } printObject.printHeader("# rules: " + data.length); }); }, create: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; if ( ! cmd.ruletype) { console.log('Missing parameter: ruletype'.red); return; } cmd.ruletype = cmd.ruletype.toLowerCase(); switch(cmd.ruletype) { case 'sum': cmd.ruletype = 1; break; case 'count': cmd.ruletype = 2; break; case 'formula': cmd.ruletype = 3; break; case 'parentcopy': cmd.ruletype = 4; break; case 'validation': cmd.ruletype = 5; break; case 'commitvalidation': cmd.ruletype = 6; break; case 'event': cmd.ruletype = 7; break; case 'earlyevent': cmd.ruletype = 8; break; case 'commitevent': cmd.ruletype = 9; break; case 'minimum': cmd.ruletype = 11; break; case 'maximum': cmd.ruletype = 12; break; case 'managedparent': cmd.ruletype = 13; break; case 'pre-insert': cmd.ruletype = 10; break; default: console.log('Invalid rule type'.red); return; } if ( ! cmd.entity_name) { console.log('Missing parameter: entity_name'.red); return; } if ( ! cmd.entity_name.match(/\w+:\w+/)) { console.log('Parameter entity_name must have the format prefix:table'.red); return; } if (cmd.active) { cmd.active = (cmd.active.toLowerCase() === 'true'); } else { cmd.active = true; } if ( ! cmd.attribute_name && (cmd.ruletype==1 || cmd.ruletype==2 || cmd.ruletype==3 || cmd.ruletype==4 || cmd.ruletype==11 || cmd.ruletype==12)) { console.log('Missing parameter: attribute_name'.red); return; } var rule_text1 = null; var rule_text2 = null; var rule_text3 = null; // Sum if (cmd.ruletype == 1) { if ( ! cmd.role_name) { console.log('Sum Rule is Missing parameter: role_name'.red); return; } if ( ! cmd.child_attribute) { console.log('Sum Rule is Missing parameter: child_attribute'.red); return; } rule_text1 = cmd.role_name; rule_text2 = cmd.clause; rule_text3 = cmd.child_attribute; } // Count if (cmd.ruletype == 2) { if ( ! cmd.role_name) { console.log('Count Rule is Missing parameter: role_name'.red); return; } rule_text1 = cmd.role_name; rule_text2 = cmd.clause; } // Formula var prop4 = null; if (cmd.ruletype === 3) { if ( ! cmd.expression) { console.log('Formula Rule is Missing parameter: expression'.red); return; } rule_text1 = cmd.expression; prop4 = 'javascript'; } // Validation if (cmd.ruletype === 5 || cmd.ruletype === 6) { if ( ! cmd.expression) { console.log('Validation is Missing parameter: expression'.red); return; } rule_text1 = cmd.expression; prop4 = 'javascript'; rule_text2 = cmd.error_message; } // Events if (cmd.ruletype === 7 || cmd.ruletype === 8 || cmd.ruletype === 9 || cmd.ruletype === 10) { if ( ! cmd.expression) { console.log('Event is Missing parameter: expression'.red); return; } rule_text1 = cmd.expression; prop4 = 'javascript'; } // Parent copy if (cmd.ruletype == 4) { if ( ! cmd.role_name) { console.log('Parent Copy Missing parameter: role_name'.red); return; } if ( ! cmd.parent_attribute) { console.log('Parent Copy is Missing parameter: parent_attribute'.red); return; } rule_text1 = cmd.role_name; rule_text2 = cmd.parent_attribute; } // Min/Max if (cmd.ruletype == 11 || cmd.ruletpe == 12) { if ( ! cmd.role_name) { console.log('Min/Max is Missing parameter: role_name'.red); return; } if ( ! cmd.child_attribute) { console.log('Min/Max Rule is Missing parameter: child_attribute'.red); return; } rule_text1 = cmd.role_name; rule_text2 = cmd.clause; rule_text3 = cmd.child_attribute; } // managed parent (insert parent if none) if (cmd.ruletype == 13) { if ( ! cmd.role_name) { console.log('Manage Parent Rule is Missing parameter Role to Parent: role_name'.red); return; } rule_text1 = cmd.role_name; } var curProj = cmd.project_ident; var jit = false; if(cmd.jit !== null){ jit = cmd.jit; } var ruleActive = true; if(cmd.active !== null){ ruleActive = cmd.active; } var rule_name = null; if (cmd.rule_name) { rule_name = cmd.rule_name; } var sqlable = false; if(cmd.sqlable !== null){ sqlable = cmd.sqlable; } if ( ! curProj) { curProj = dotfile.getCurrentProject(); } if ( ! curProj) { console.log('There is no current project.'.yellow); return; } var rule_name = (cmd.rule_name == 'null')?null:cmd.rule_name; var newRule = { name: rule_name, entity_name: cmd.entity_name, attribute_name: cmd.attribute_name, prop4: prop4, rule_text1: rule_text1, rule_text2: rule_text2, rule_text3: rule_text3, name: rule_name, comments: cmd.comments || "", active: ruleActive, ruletype_ident: cmd.ruletype, project_ident: curProj, jit: jit, sqlable: sqlable }; var startTime = new Date(); client.post(loginInfo.url + "/rules", { data: newRule, 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('Rule was created'); _.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.printHeader(trailer); }); }, update: function(cmd) { console.log('Sorry, this function is not yet implemented'); }, 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 projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); if ( ! projIdent) { console.log('There is no current project.'.yellow); return; } } filt = "equal(project_ident:"+projIdent; if (cmd.ident) { filt += ",ident:" + cmd.ident +")"; } else if (cmd.rule_name) { filt += ",name:'" + cmd.rule_name + "')"; } else { console.log('Missing parameter: please specify either rule_name or ident'.red); return; } client.get(loginInfo.url + "/admin:rules?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(("Rule(s) not found").red); return; } if (data.length > 1) { console.log(("Error: more than one rule returned for the given condition: " + filt).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('Database connection 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); }); }); }, getRuleType: function(ruleType) { var type = null; switch(ruleType){ case 1: type = "sum"; break; case 2: type = "count"; break; case 3: type = "formula"; break; case 4: type = "parent copy"; break; case 5: type = "validation"; break; case 6: type = "commit validation"; break; case 7: type = "event"; break; case 8: type = "early event"; break; case 9: type = "commit event"; break; case 10: type = "pre-insert"; break; case 11: type = "minimum"; break; case 12: type = "maximum"; break; case 13: type = "managed parent"; break; default: type = "unknown"; } return type; }, show: function(p){ var adminCmd = ""; switch(p.ruletype_ident) { case 1: type = "sum"; adminCmd += "lacadmin rule create --ruletype sum --entity_name "+p.entity_name; adminCmd += " --attribute_name "+p.attribute_name; adminCmd += " --rule_name "+p.name; adminCmd += " --role_name "+p.rule_text1; adminCmd += " --child_attribute "+p.rule_text3; adminCmd += " --clause '"+p.rule_text2+"'"; adminCmd += " --active "+ p.active; adminCmd += " --jit "+ p.jit; adminCmd += " --sqlable "+ p.sqlable; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 2: type = "count"; adminCmd += "lacadmin rule create --ruletype count --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name+ "'"; adminCmd += " --role_name "+p.rule_text1; adminCmd += " --attribute_name "+p.attribute_name; adminCmd += " --clause '"+p.rule_text2+"'"; adminCmd += " --active "+ p.active; adminCmd += " --jit "+ p.jit; adminCmd += " --sqlable "+ p.sqlable; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 3: type = "formula"; adminCmd += "lacadmin rule create --ruletype formula --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name+ "'"; adminCmd += " --attribute_name "+p.attribute_name; adminCmd += " --expression '"+p.rule_text1 + "'"; adminCmd += " --active "+ p.active; adminCmd += " --jit "+ p.jit; adminCmd += " --sqlable "+ p.sqlable; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 4: type = "parent copy"; adminCmd += "lacadmin rule create --ruletype parentcopy --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name+ "'"; adminCmd += " --attribute_name "+p.attribute_name; adminCmd += " --role_name "+p.rule_text1; adminCmd += " --parent_attribute "+p.rule_text2; adminCmd += " --active "+ p.active; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 5: type = "validation"; adminCmd += "lacadmin rule create --ruletype validation --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name + "'"; adminCmd += " --expression '"+p.rule_text1 + "'"; adminCmd += " --error_message '"+p.rule_text2 +"'"; adminCmd += " --active "+ p.active; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 6: type = "commit validation"; adminCmd += "lacadmin rule create --ruletype commitvalidation --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name + "'"; adminCmd += " --expression '"+p.rule_text1 + "'"; adminCmd += " --active "+ p.active; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 7: type = "event"; adminCmd += "lacadmin rule create --ruletype event --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name+ "'"; adminCmd += " --expression '"+p.rule_text1 +"'"; adminCmd += " --active "+ p.active; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 8: type = "early event"; adminCmd += "lacadmin rule create --ruletype earlyevent --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name + "'"; adminCmd += " --expression '"+p.rule_text1 + "'"; adminCmd += " --active "+ p.active; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 9: type = "commit event"; adminCmd += "lacadmin rule create --ruletype commitevent --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name+ "'"; adminCmd += " --expression '"+p.rule_text1 + "'"; adminCmd += " --active "+ p.active; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 10: type = "pre-insert"; adminCmd += "lacadmin rule create --ruletype pre-insert --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name + "'"; adminCmd += " --expression '"+p.rule_text1 + "'"; adminCmd += " --active "+ p.active; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 11: type = "minimum"; adminCmd += "lacadmin rule create --ruletype minimum --entity_name "+p.entity_name; adminCmd += " --rule_name '"+p.name + "'"; adminCmd += " --attribute_name "+p.attribute_name; adminCmd += " --role_name "+p.rule_text1; adminCmd += " --child_attribute "+p.rule_text3; adminCmd += " --clause '"+p.rule_text2+ "'"; adminCmd += " --active "+ p.active; adminCmd += " --jit "+ p.jit; adminCmd += " --sqlable "+ p.sqlable; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 12: type = "maximum"; adminCmd += "lacadmin rule create --ruletype maximum --entity_name "+p.entity_name; adminCmd += " --rule_name "+p.name; adminCmd += " --attribute_name "+p.attribute_name; adminCmd += " --role_name "+p.rule_text1; adminCmd += " --child_attribute "+p.rule_text3; adminCmd += " --clause '"+p.rule_text2 + "'"; adminCmd += " --active "+ p.active; adminCmd += " --jit "+ p.jit; adminCmd += " --sqlable "+ p.sqlable; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; case 13: type = "managed parent"; adminCmd += "lacadmin rule create --ruletype managedparent --entity_name "+p.entity_name; adminCmd += " --rule_name "+p.name; adminCmd += " --role_name "+p.rule_text1; adminCmd += " --expression '"+p.rule_text1 + "'"; adminCmd += " --active "+ p.active; adminCmd += " --comments '"+p.comments +"'"; adminCmd += "\n\n"; break; default: type = "unknown"; } return adminCmd; }, 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 = ""; if(cmd.ident){ filter = "&sysfilter=equal(ident: "+cmd.ident+")"; } else { if(cmd.rule_name) { filter = "&sysfilter=equal(name: '"+cmd.rule_name+"')"; } } client.get(url + "/rules?sysfilter=equal(project_ident:" + projIdent +")&pagesize=500"+filter, { 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; } var toStdout = false; if ( ! cmd.file) { toStdout = true; } if (data.length === 0) { console.log(("Rule(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'].links; } if (toStdout) { console.log(JSON.stringify(data, null, 2)); } else { var exportFile = fs.openSync(cmd.file, 'w+', 0600); fs.writeSync(exportFile, JSON.stringify(data, null, 2)); console.log(('Rules have been exported to file: ' + cmd.file).green); } }); }, import: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) { return; } var projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); if ( ! projIdent) { console.log('There is no current project.'.yellow); return; } } if ( ! cmd.file) { cmd.file = '/dev/stdin'; } var fileContent = JSON.parse(fs.readFileSync(cmd.file)); if(Array.isArray(fileContent) && fileContent.length > 0){ for(var i = 0 ; i < fileContent.length ; i++ ){ fileContent[i].project_ident = projIdent; delete fileContent[i].ts; //fileContent[i]["@metadata"] = {action:"MERGE_INSERT"} ; } } else { fileContent.project_ident = projIdent; delete fileContent.ts; //fileContent["@metadata"] = {action:"MERGE_INSERT"} ; } var startTime = new Date(); client.post(loginInfo.url + "/AllRules", { 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('Rule(s) created, including:'); if(data.statusCode == 200 ){ console.log("Request took: " + (endTime - startTime) + "ms"); return; } var newRule = _.find( data.txsummary, function(p) { return p['@metadata'].resource === 'AllRules'; }); if ( ! newRule) { console.log('ERROR: unable to find imported rules'.red); return; } if (cmd.verbose) { _.each(data.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); } else { printObject.printObject(newRule, newRule['@metadata'].entity, 0, newRule['@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.printHeader(trailer); }); } };