liveapicreator-admin-cli
Version:
The NodeJS command line utility for 'CA Live API Creator' DevOps Administration from CA Technologies
535 lines (500 loc) • 15.4 kB
JavaScript
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 = {
doProject: function(action, cmd) {
if (action === 'list') {
module.exports.list(cmd);
}
else if (action === 'create') {
module.exports.create(cmd);
}
else if (action === 'update') {
module.exports.update(cmd);
}
else if (action === 'delete') {
module.exports.del(cmd);
}
else if (action === 'use') {
module.exports.use(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, create, update, delete, use, 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;
client.get(url + "/projects"+"?pagesize=100", {
headers: {
Authorization: "CALiveAPICreator " + apiKey + ":1",
"Content-Type" : "application/json"
}
}, function(data) {
if (data.errorMessage) {
console.log(data.errorMessage.red);
return;
}
printObject.printHeader('All projects');
var table = new Table();
var verboseDisplay = "";
_.each(data, function(p) {
table.cell("Ident", p.ident);
table.cell("Name", p.name);
table.cell("Enabled", p.is_active);
table.cell("URL", p.url_name);
var comments = p.comments;
if ( ! comments) {
comments = "";
}
else if (comments.length > 50){
comments = comments.substring(0, 47) + "...";
}
comments = comments.replace("\n"," ");
comments = comments.replace("\n"," ");
table.cell("Comments", comments);
table.newRow();
if(cmd.verbose) {
verboseDisplay += "\n";
verboseDisplay += "lacadmin project export --url_name "+p.url_name+" --file PROJECT_"+p.url_name + ".json\n";
verboseDisplay += "#lacadmin project import --file PROJECT_"+p.url_name + ".json\n";
}
});
table.sort(['Name']);
console.log(table.toString());
printObject.printTrailer("# projects: " + data.length);
if(cmd.verbose) {
console.log(verboseDisplay);
}
});
},
create: function(cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if ( ! loginInfo)
return;
if ( ! cmd.project_name) {
console.log('Missing parameter: project_name'.red);
return;
}
if ( ! cmd.url_name) {
console.log('Missing parameter: url_name'.red);
return;
}
if ( ! cmd.authprovider) {
console.log('You did not specify an authentication provider -- you will not be able to log into this project until you do so.'.yellow);
}
context.getContext(cmd, function() {
//console.log('Current account: ' + JSON.stringify(context.account));
var newProject = {
name: cmd.project_name,
url_name: cmd.url_name,
is_active: true,
authprovider_ident: cmd.authprovider || 1000,
account_ident: context.account.ident,
comments: cmd.comments
};
if (cmd.status) {
if (cmd.status !== 'A' && cmd.status !== 'I') {
console.log('Project status must be either A (for active) or I (for inactive). Default is A if unspecified.'.red);
return;
}
newProject.status = cmd.status;
}
var startTime = new Date();
client.post(loginInfo.url + "/projects", {
data: newProject,
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 was created, including:');
var newProj = _.find(data.txsummary, function(p) {
return p['@metadata'].resource === 'admin:projects';
});
if ( ! newProj) {
console.log('ERROR: unable to find newly created project'.red);
return;
}
if (cmd.verbose) {
_.each(data.txsummary, function(obj) {
printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb);
});
}
else {
printObject.printObject(newProj, newProj['@metadata'].entity, 0, newProj['@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);
dotfile.setCurrentProject(newProj.ident, cmd.project_name, data.url_name);
});
});
},
update: function(cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if ( ! loginInfo)
return;
var apiKey = loginInfo.apiKey;
if ( ! apiKey){
console.log(("Error: Login apiKey is missing or empty").red);
return;
}
var filter = null;
var projIdent = cmd.project_ident;
if (cmd.ident) {
filter = "?sysfilter=equal(ident:" + cmd.ident + ")";
} else if ( ! projIdent) {
projIdent = dotfile.getCurrentProject();
if ( ! projIdent) {
console.log('There is no current project.'.yellow);
return;
}
filter = "/" + projIdent;
}
if( ! filter) {
console.log('Missing parameter: please specify either ident or use a specific project'.red);
return;
}
console.log(filter);
client.get(loginInfo.url + "/AllProjects" + 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(("Project Update Error: " + data.errorMessage).red);
return;
}
if (data.length === 0) {
console.log(("Error: no such project").red);
return;
}
if (data.length > 1) {
console.log(("Project Update Error: more than one project for the given condition: " + filter).red);
return;
}
var project = data[0];
if (cmd.project_name) {
project.name = cmd.project_name;
}
if (cmd.url_name) {
project.url_name = cmd.url_name;
}
if (cmd.url) {
project.url = cmd.url;
}
if (cmd.comments) {
project.comments = cmd.comments;
}
if (cmd.authprovider) {
project.authprovider_ident = cmd.authprovider;
}
if (cmd.status) {
if (cmd.status !== 'A' && cmd.status !== 'I') {
console.log('Project status must be either A (for active) or I (for inactive). Default is A if unspecified.'.red);
return;
}
project.is_active = cmd.status == "A";
}
//{"@metadata" : {"action":"MERGE_INSERT", "key":"ident"}
var startTime = new Date();
client.put(project['@metadata'].href, {
data: project,
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 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);
});
});
},
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.url_name) {
filt = "equal(url_name:'" + cmd.url_name + "')";
}
else if (cmd.project_name) {
filt = "equal(name:'" + cmd.project_name + "')";
}
else {
console.log('Missing parameter: please specify either project_name or url_name'.red);
return;
}
client.get(loginInfo.url + "/projects?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(("Project "+ cmd.project_name +" does not exist").yellow);
return;
}
if (data.length > 1) {
console.log(("Error: more than one project for the given condition: " + filter).red);
return;
}
var project = data[0];
var startTime = new Date();
client['delete'](project['@metadata'].href + "?checksum=" + project['@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('Project was deleted, including the following objects:');
var delProj = _.find(data2.txsummary, function(p) {
return p['@metadata'].resource === 'admin:projects';
});
if ( ! delProj) {
console.log('ERROR: unable to find deleted project'.red);
return;
}
if (cmd.verbose) {
_.each(data2.txsummary, function(obj) {
printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb);
});
}
else {
printObject.printObject(delProj, delProj['@metadata'].entity, 0, delProj['@metadata'].verb);
console.log(('and ' + (data2.txsummary.length - 1) + ' other objects').grey);
}
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);
});
});
},
use: function(cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if ( ! loginInfo)
return;
var filter = null;
if (cmd.url_name) {
filter = "equal(url_name:'" + cmd.url_name + "')";
}
else if (cmd.project_name) {
filter = "equal(name:'" + cmd.project_name + "')";
}
else {
console.log('Missing parameter: please specify either project_name or url_name'.red);
return;
}
client.get(loginInfo.url + "/projects?sysfilter=" + 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;
}
if (data.length === 0) {
console.log(("Error: no such project").red);
return;
}
if (data.length > 1) {
console.log(("Error: more than one project for the given condition: " + filter).red);
return;
}
var project = data[0];
dotfile.setCurrentProject(project.ident, project.name, project.url_name);
});
},
export: function(cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if ( ! loginInfo)
return;
var filter = null;
var projIdent = cmd.ident;
filter = "equal(ident:" + projIdent + ")";
if (cmd.url_name) {
filter = "equal(url_name:'" + cmd.url_name + "')";
} else if (cmd.project_name) {
filter = "equal(name:'" + cmd.project_name + "')";
} else if ( ! projIdent) {
projIdent = dotfile.getCurrentProject();
if(! projIdent){
console.log('No current project selected'.red);
return;
}
filter = "equal(ident:" + projIdent + ")";
} else {
console.log('Missing parameter: please specify either project_name or url_name'.red);
return;
}
var toStdout = false;
if ( ! cmd.file) {
toStdout = true;
}
console.log("Deprecated in 4.1 - use lacadmin api export".red);
client.get(loginInfo.url + "/ProjectExport?pagesize=10000&sysfilter=" + 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;
}
if (data.length === 0) {
console.log(("Error: no such project").red);
return;
}
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(('Project has been exported to file: ' + cmd.file).green);
}
});
},
import: function(cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if ( ! loginInfo) {
return;
}
if ( ! cmd.file) {
cmd.file = '/dev/stdin';
}
var fileContent = JSON.parse(fs.readFileSync(cmd.file));
if (cmd.project_name) {
fileContent[0].name = cmd.project_name;
}
if (cmd.url_name) {
fileContent[0].url_name = cmd.url_name;
}
console.log("Deprecated in 4.1 - use lacadmin api import".red);
var startTime = new Date();
client.post(loginInfo.url + "/ProjectExport", {
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('Project was created, including:');
if(data.statusCode == 200 ){
console.log("Request took: " + (endTime - startTime) + "ms");
return;
}
var newProj = _.find( data.txsummary, function(p) {
return p['@metadata'].resource === 'ProjectExport';
});
if ( ! newProj) {
console.log('ERROR: unable to find imported project'.red);
return;
}
if (cmd.verbose) {
_.each(data.txsummary, function(obj) {
printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb);
});
}
else {
printObject.printObject(newProj, newProj['@metadata'].entity, 0, newProj['@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;
}
//set the imported project to be the current selected project
dotfile.setCurrentProject(newProj.ident, newProj.name, newProj.url_name);
printObject.printHeader(trailer);
console.log("You are now using project ident: "+newProj.ident +" name: "+ newProj.name);
});
}
};