liveapicreator-admin-cli
Version:
The NodeJS command line utility for 'CA Live API Creator' DevOps Administration from CA Technologies
823 lines (794 loc) • 23.9 kB
JavaScript
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 = {
doDbase: function(action, cmd) {
if (action === 'list') {
module.exports.list(cmd);
}
else if (action === 'create') {
module.exports.create(cmd);
}
else if (action === 'createDatabase') {
module.exports.createDatabase(cmd);
}
else if (action === 'update') {
module.exports.update(cmd);
}
else if (action === 'delete') {
module.exports.del(cmd);
}
else if (action === 'import') {
module.exports.import(cmd);
}
else if (action === 'reload') {
module.exports.reload(cmd);
}
else if (action === 'export') {
module.exports.export(cmd);
}
else {
console.log('You must specify an action: list, create, update, delete, 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 + "/dbaseschemas?sysfilter=equal(project_ident:" + projIdent+")", {
headers: {
Authorization: "CALiveAPICreator " + apiKey + ":1",
"Content-Type" : "application/json"
}
}, function(data) {
if (data.errorMessage) {
console.log(data.errorMessage.red);
return;
}
printObject.printHeader('Datasources');
var table = new Table();
var verboseDisplay = "";
_.each(data, function(p) {
table.cell("Name", p.name);
table.cell("Prefix", p.prefix);
var type = "";
switch(p.dbasetype_ident) {
case 1: type = "mysql"; break;
case 2: type = "oracle"; break;
case 3: type = "sqlservertds"; break;
case 5: type = "sqlserver"; break;
case 6: type = "sqlserverazure"; break;
case 7: type = "nuodb"; break;
case 8: type = "postgresql"; break;
case 16: type = "salesforce"; break;
case 17: type = "derby"; break;
case 18: type = "db2zos"; break;
case 19: type = "db2luw"; break;
case 20: type = "db2ios"; break;
case 21: type = "hbase"; break;
case 22: type = "sap"; break;
case 23: type = "csv"; break;
case 24: type = "cassandra"; break;
case 25: type = "teradata"; break;
case 26: type = "informix"; break;
default: type = "unknown";
}
var isJndi = p.datasource_name != null;
table.cell("Type", type);
table.cell("Active", p.active);
table.cell("isEditable", p.schema_editable);
if(isJndi) {
table.cell("JNDI", p.datasource_name);
} else {
table.cell("Catalog", p.catalog_name);
table.cell("Schema", p.schema_name);
table.cell("User", p.user_name);
table.cell("URL", p.url);
}
table.cell("IsEditable",p.schema_editable);
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 datasource create --db_name " + p.name;
verboseDisplay += " --prefix "+ p.prefix;
verboseDisplay += " --dbasetype "+ type;
verboseDisplay += " --active "+ p.active;
verboseDisplay += " --url \""+p.url +"\"";
if(p.catalog_name) {
verboseDisplay += " --catalog_name "+p.catalog_name;
}
if(p.schema_name) {
verboseDisplay += " --schema_name "+p.schema_name;
}
verboseDisplay += " --user_name "+p.user_name;
verboseDisplay += " --password somepassword";
verboseDisplay += " --schema_editable " + p.schema_editable;
if( p.comments ) {
verboseDisplay += " --comments \""+ comments +"\"";
}
verboseDisplay += "\n";
}
});
table.sort(['Active', 'Name']);
if (data.length === 0) {
console.log('Database not defined for this project'.yellow);
}
else {
console.log(table.toString());
}
printObject.printHeader("# datasources: " + 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.db_name) {
console.log('Missing parameter: name'.red);
return;
}
if ( ! cmd.prefix) {
prefix = "main";
}
var curProj = cmd.project_ident;
if ( ! curProj) {
curProj = dotfile.getCurrentProject();
}
if ( ! curProj) {
console.log('There is no current project.'.yellow);
return;
}
if ( ! cmd.user_name) {
console.log('Missing parameter: user_name'.red);
return;
}
if ( ! cmd.password) {
console.log('Missing parameter: password'.red);
return;
}
if ( ! cmd.url) {
console.log('Missing parameter: url'.red);
return;
}
var isJndi = cmd.jndi_name != null;
var schema_editable = false;
if(cmd.schema_editable) {
schema_editable = cmd.schema_editable == 'true';
}
var dbasetype = cmd.dbasetype;
if ( ! dbasetype) {
console.log('You must specify a data source --dbaseetype.'.red);
return;
}
dbasetype = dbasetype.toLowerCase();
switch(dbasetype) {
case "mysql": dbasetype = 1; break;
case "oracle": dbasetype = 2; break;
case "sqlserver": dbasetype = 5; break;
case "sql server": dbasetype = 5; break;
case "sqlserverazure": dbasetype = 6; break;
case "sql server azure": dbasetype = 6; break;
case "nuodb": dbasetype = 7; break;
case "postgres": dbasetype = 8; break;
case "postgresql": dbasetype = 8; break;
case "salesforce": dbasetype = 16; break;
case "derby": dbasetype = 17; break;
case "db2luw": dbasetype = 19; break;
case "db2ios": dbasetype = 20; break;
case "db2zos": dbasetype = 18; break;
case "hbase": dbasetype = 21; break;
case "sap": dbasetype = 22; break;
case "csv": dbasetype = 23; break;
case "cassandra": dbasetype = 24; break;
case "teradata": dbasetype = 25; break;
case "informix": dbasetype = 26; break;
default : console.log('Unknown data source type: --dbasetype ' + dbasetype); return;
}
context.getContext(cmd, function() {
//console.log('Current account: ' + JSON.stringify(context.account));
var newDbase;
if(isJndi) {
newDbase = {
name: cmd.db_name,
prefix: cmd.prefix,
datasource_name: cmd.jndi_name,
active: true,
comments: cmd.comments,
dbasetype_ident: dbasetype,
project_ident: curProj,
schema_editable: schema_editable
};
} else {
newDbase = {
name: cmd.db_name,
prefix: cmd.prefix,
url: cmd.url,
catalog_name: cmd.catalog_name,
schema_name: cmd.schema_name,
user_name: cmd.user_name,
password: cmd.password,
port_num: cmd.port_num,
active: true,
comments: cmd.comments,
dbasetype_ident: dbasetype,
project_ident: curProj,
schema_editable: schema_editable
};
}
var startTime = new Date();
client.post(loginInfo.url + "/dbaseschemas", {
data: newDbase,
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type" : "application/json"
}
}, function(data) {
var endTime = new Date();
if (data.errorMessage) {
console.log("Error in create datasource "+data.errorMessage.red);
return;
}
printObject.printHeader('Database connection 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.printTrailer(trailer);
});
});
},
createDatabase: 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;
}
if ( ! loginInfo)
return;
var curProj = cmd.project_ident;
if ( ! curProj) {
curProj = dotfile.getCurrentProject();
}
if ( ! curProj) {
console.log('There is no current project.'.yellow);
return;
}
if ( ! cmd.managedserver_ident) {
console.log('Missing parameter: managedserver_ident (use lacadmin managedserver list)'.red);
return;
}
var schema_editable = false;
if(cmd.schema_editable) {
schema_editable = cmd.schema_editable;
}
var managedServer = { managed_data_server_ident: Number(cmd.managedserver_ident) };
//console.log(JSON.stringify(managedServer,null,2));
client.post(loginInfo.url + "/@databases", {
data: managedServer,
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type" : "application/json"
}
}, function(database) {
if (database.errorMessage) {
console.log("@database error: "+database.errorMessage.red);
return;
}
//console.log(database);
context.getContext(cmd, function() {
// console.log('Current account: ' + JSON.stringify(context.account));
var prefix = database.name;
if ( cmd.prefix) {
prefix = cmd.prefix;
}
var db_name = database.name;
if ( cmd.db_name) {
db_name = cmd.db_name;
}
var newDbase = {
name: db_name,
prefix: prefix,
url: database.url,
catalog_name: database.catalog_name,
schema_name: database.schema_name,
user_name: database.user_name,
password: database.password,
// port_num: cmd.port_num,
active: true,
comments: 'created by lacadmin command line',
dbasetype_ident: database.dbasetype_ident,
project_ident: curProj,
schema_editable: schema_editable
};
var startTime = new Date();
client.post(loginInfo.url + "/dbaseschemas", {
data: newDbase,
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('Database connection 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.printTrailer(trailer);
});
});
});
},
update: 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 filter = null;
var projIdent = cmd.project_ident;
if ( ! projIdent) {
projIdent = dotfile.getCurrentProject();
if ( ! projIdent) {
console.log('There is no current project.'.yellow);
return;
}
filter = "equal(project_ident: "+ projIdent +")" ;
}
if(cmd.ident){
filter += "&sysfilter=equal(ident: "+ cmd.ident +")" ;
} else {
if (cmd.prefix) {
filter += "&sysfilter=equal(prefix:'" + cmd.prefix + "')";
}
else if (cmd.db_name) {
filter += "&sysfilter=equal(name:'" + cmd.db_name + "')";
} else {
console.log('Missing parameter: please specify either db_name or prefix'.red);
return;
}
}
//console.log(filter);
client.get(loginInfo.url + "/admin:dbaseschemas?sysfilter=" + filter, {
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type" : "application/json"
}
}, function(data) {
if (data.errorMessage) {
//console.log(data);
console.log(("Error: " + data.errorMessage).red);
return;
}
if (data.length === 0) {
console.log(("Datasource not found").red);
return;
}
if (data.length > 1) {
console.log(("Error: more than one datasource for the given condition: " + filter).red);
return;
}
var db = data[0];
if( cmd.password) {
db.password = cmd.password;
delete db.salt;
}
if( cmd.salt){
db.salt = cmd.salt;
}
if( cmd.user_name){
db.user_name = cmd.user_name;
}
if( cmd.db_name ){
db.name = cmd.db_name;
}
if ( cmd.url ){
db.url = cmd.url;
}
if( !cmd.prefix ) {
db.prefix = cmd.prefix;
}
if( cmd.port ) {
db.port = cmd.port;
}
if( cmd.schema_name ){
db.schema_name = cmd.schema_name;
}
if( cmd.catalog_name ){
db.catalog_name = cmd.catalog_name;
}
if( cmd.comments ){
db.comments = cmd.comments;
}
if( cmd.active ){
db.active = cmd.active == 'true';
}
if(cmd.schema_editable) {
db.schema_editable = cmd.schema_editable == 'true';
}
var startTime = new Date();
client.put(db['@metadata'].href, {
data: db,
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type" : "application/json"
}
}, function(data2) {
var endTime = new Date();
//console.log(JSON.stringify(data2,null,2));
if (data2.errorMessage) {
console.log(data2.errorMessage.red);
return;
}
printObject.printHeader('Database connection was updated, 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.printTrailer(trailer);
});
});
},
reload: 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 filter = null;
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 +")" ;
}
if(cmd.ident){
filter += "&sysfilter=equal(ident: "+ cmd.ident +")" ;
} else {
if (cmd.prefix) {
filter += "&sysfilter=equal(prefix:'" + cmd.prefix + "')";
}
else if (cmd.db_name) {
filter += "&sysfilter=equal(name:'" + cmd.db_name + "')";
} else {
console.log('Missing parameter: please specify either --db_name, --ident or --prefix'.red);
return;
}
}
if( cmd.active ){
filter += "&sysfilter=equal(active: "+ cmd.active + ")";
} else {
filter += "&sysfilter=equal(active: true)";
}
client.get(loginInfo.url + "/DbSchemas?" + filter, {
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(("Error: no such database use --prefix, --db_name, or --ident").red);
return;
}
if (data.length > 1) {
console.log(("Error: more than one data source for the given condition: " + filter).red);
return;
}
var db = data[0];
delete db.ident;
var startTime = new Date();
var request = {statusRequest: projIdent };
client.put( loginInfo.url + "/DbSchemas/"+db.ident, {
data: db,
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 reload completed. Status Code: ' + data2.statusCode);
var trailer = "Request took: " + (endTime - startTime) + "ms";
if (data2.length == 0) {
console.log('No data returned'.yellow);
}
else {
//trailer += data2.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 projIdent = cmd.project_ident;
if ( ! projIdent) {
projIdent = dotfile.getCurrentProject();
if ( ! projIdent) {
console.log('There is no current project.'.yellow);
return;
}
}
var filt = null;
if (cmd.prefix) {
filt = "equal(prefix:'" + cmd.prefix + "'";
}
else if (cmd.db_name) {
filt = "equal(name:'" + cmd.db_name + "'";
}
else if (cmd.ident) {
filt = "equal(ident:" + cmd.ident;
}
else {
console.log('Missing parameter: please specify either --db_name, --ident or --prefix'.red);
return;
}
filt += ",project_ident:"+projIdent +")";
client.get(loginInfo.url + "/dbaseschemas?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(("Datasource not found using sysfilter="+filt).red);
return;
}
if (data.length > 1) {
console.log(("Error: more than one data source 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.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 = "sysfilter=equal(project_ident:" + projIdent + ")";
} else {
console.log('No current Project found - please specify project settings (use list) project_ident '.red);
return;
}
if (cmd.prefix) {
filter += "&sysfilter=equal(prefix:'" + cmd.prefix + "')";
} else if (cmd.db_name) {
filter += "&sysfilter=equal(name:'" + cmd.db_name + "')";
}
var toStdout = false;
if ( ! cmd.file) {
toStdout = true;
}
//console.log("Filter "+ filter);
client.get(loginInfo.url + "/dbaseschemas?" + filter, {
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type" : "application/json"
}
}, function(data) {
//Sconsole.log('get result: ' + JSON.stringify(data, null, 2));
if (data.errorMessage) {
console.log(("Error: " + data.errorMessage).red);
return;
}
if (data.length === 0) {
console.log(("Datasource not found").red);
return;
}
//do not export passwords
if(Array.isArray(data) && data.length > 0){
for(var i = 0; i < data.length ; i++){
//data[i].password = null;
//data[i].salt = null;
data[i].project_ident = null;
delete data[i]["ident"];
delete data[i]["@metadata"];
}
} else {
data.password = null;
data.salt = null;
data.project_ident = null;
delete data["ident"];
delete data["@metadata"];
}
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(('Data Source has been exported to file: ' + cmd.file).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;
}
context.getContext(cmd, function() {
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 = curProj;
delete fileContent[i].ident;
delete fileContent[i].ts;
fileContent[i]["@metadata"] = { action: "MERGE_INSERT", key:["project_ident","prefix"] };
}
}
var startTime = new Date();
client.put(loginInfo.url + "/admin:dbaseschemas", {
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('Datasource was imported, including:');
if(data.statusCode == 200 ){
console.log("Request took: " + (endTime - startTime) + "ms");
return;
}
var newDataSource = _.find(data.txsummary, function(p) {
return p['@metadata'].resource === 'admin:dbaseschemas';
});
if ( ! newDataSource) {
console.log('ERROR: unable to find imported data source'.red);
return;
}
if (cmd.verbose) {
_.each(data.txsummary, function(obj) {
printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb);
});
}
else {
printObject.printObject(newDataSource, newDataSource['@metadata'].entity, 0, newDataSource['@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);
})
});
}
};