UNPKG

qlik-stex

Version:

Qlik Sense Scalability Tools extension for testing multi apps scenarions ex. saas

447 lines (289 loc) 12.5 kB
var https = require('https'); var fs = require('fs'); const optionDefinitions = [ { name: 'delete', alias: 'd', type: Boolean, defaultOption: false }, { name: 'reload', alias: 'r', type: Boolean }, { name: 'certpath', alias: 'c', type: String }, { name: 'app', alias: 'a', type: String }, { name: 'noofapps', alias: 'n', type: Number }, { name: 'help', alias: 'q', type: Boolean }, { name: 'host', alias: 'h', type: String } ] const commandLineArgs = require('command-line-args') const command_options = commandLineArgs(optionDefinitions) var appsCreated = []; var options = { hostname: '', port: 4242, path: '/qrs/app?xrfkey=abcdefghijklmnop', method: 'GET', headers: { 'x-qlik-xrfkey' : 'abcdefghijklmnop', 'X-Qlik-User' : 'UserDirectory= Internal; UserId= sa_repository ' }, key: fs.readFileSync("C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client_key.pem"), cert: fs.readFileSync("C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client.pem"), ca: fs.readFileSync("C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem") }; var everyoneStream =''; var tagID =''; var AppId = ''; var noofapps=''; if(typeof command_options.certpath !=='undefined' && command_options.certpath !='') { var lastChar = command_options.certpath.substr(command_options.certpath.length - 1); if(lastChar !== '\\') { command_options.certpath += "\\"; } options.key = fs.readFileSync(command_options.certpath + "client_key.pem"), options.cert= fs.readFileSync(command_options.certpath + "client.pem"), options.ca= fs.readFileSync(command_options.certpath + "root.pem") } if(command_options.help) { console.log('-a ID of app to copy (GUID)') console.log('-c Directory where the certificates are stored, if not used the standard Qlik Sense directory will be used (C:\ProgramData\Qlik\Sense\Repository\Exported Certificates\.Local Certificates)'); console.log('-d Delete all apps used for scalability, this parameter ignores all other parameters apart from –c and -h'); console.log('-h Qlik Sense hostname'); console.log('-n Number of copies of the app'); console.log('-r All copies will be reloaded after creation, use this if you have random data generated in the app'); } else if(command_options.delete) { if(command_options.host !=='' && typeof command_options.host !== 'undefined') { options.hostname = command_options.host; deleteApps(); } else { console.log('Hostname not defined') } } else { if(command_options.app !=='' && typeof command_options.app !== 'undefined') { if(command_options.noofapps !=='' && typeof command_options.noofapps !== 'undefined') { if(command_options.host !=='' && typeof command_options.host !== 'undefined') { AppId = command_options.app; noofapps =command_options.noofapps; options.hostname = command_options.host; findStreamID(); } else { console.log('Hostname not defined') } } else { console.log('Number of apps not defined') } } else { console.log('App not defined') } } function setTagOnApp(app) { var d = new Date(); var lm = d.toISOString(); options.path = '/qrs/app/'+ app.id +'?xrfkey=abcdefghijklmnop' options.method = 'PUT'; app.lastModified = lm; app.tags.push({ 'id': tagID }); var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function () { var body = Buffer.concat(chunks); publishApp(app); if(command_options.reload) { reloadApp(app.id); } }); }); req.write(JSON.stringify(app)); req.end(); } function publishApp(app) { options.path = '/qrs/App/'+ app.id +'/publish?name='+encodeURIComponent(app.name)+'&stream='+everyoneStream+'&xrfkey=abcdefghijklmnop' options.method = 'PUT'; var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function () { var body = Buffer.concat(chunks); }); }); req.end(); } function reloadApp(app){ options.path = '/qrs/app/'+ app+'/reload?xrfkey=abcdefghijklmnop' options.method = 'POST'; var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function () { var body = Buffer.concat(chunks); }); }); req.write(''); req.end(); } function getapps() { https.get(options, function(res) { res.on("data", function(chunk) { }); }).on('error', function(e) { console.log("Got error: " + e.message); }); } function copyApp() { options.path = '/qrs/App/' + AppId + '/copy?xrfkey=abcdefghijklmnop'; options.method = 'POST' https.get(options, function(res) { //console.log("Got response from Qlik: " + res.statusCode); res.on("data", function(chunk) { var app = JSON.parse(chunk.toString()) appsCreated.push(app.id); setTagOnApp(app); }); }).on('error', function(e) { console.log("Got error: " + e.message); }); } function findStreamID() { options.path = '/qrs/Stream/table?filter=(name+eq+%27Everyone%27)&orderAscending=true&skip=0&sortColumn=name&take=200&xrfkey=abcdefghijklmnop'; options.method = 'POST' options.headers = {"content-type": "application/json", 'x-qlik-xrfkey' : 'abcdefghijklmnop', 'X-Qlik-User' : 'UserDirectory= Internal; UserId= sa_repository '} var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function () { var body = Buffer.concat(chunks); everyoneStream = JSON.parse(body.toString()).rows[0][0]; getTag(); }); }); req.write('{"entity":"Stream","columns":[{"name":"id","columnType":"Property","definition":"id"},{"name":"privileges","columnType":"Privileges","definition":"privileges"},{"name":"name","columnType":"Property","definition":"name"},{"name":"tags","columnType":"List","definition":"tag","list":[{"name":"name","columnType":"Property","definition":"name"},{"name":"id","columnType":"Property","definition":"id"}]}]}'); req.end(); } function getTag(){ options.path = '/qrs/Tag/table?filter=(name+eq+%27Scaletest%27)&orderAscending=true&skip=0&sortColumn=name&take=200&xrfkey=abcdefghijklmnop'; options.method = 'POST' options.headers = {"content-type": "application/json", 'x-qlik-xrfkey' : 'abcdefghijklmnop', 'X-Qlik-User' : 'UserDirectory= Internal; UserId= sa_repository '} var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function () { var body = Buffer.concat(chunks); var tagLength = JSON.parse(body.toString()).rows.length; if(tagLength > 0) { tagID = JSON.parse(body.toString()).rows[0][0]; for(n=0; n<noofapps; n++) { (function(t){ setTimeout(function() { console.log("App nr: " + t + " created"); copyApp(); }, t*1000); })(n+1); } } else { return createTag(); } }); }) req.write('{"entity":"Tag","columns":[{"name":"id","columnType":"Property","definition":"id"},{"name":"privileges","columnType":"Privileges","definition":"privileges"},{"name":"name","columnType":"Property","definition":"name"},{"name":"occurrences","columnType":"Function","definition":"Count(EngineService,PrintingService,ProxyService,VirtualProxyConfig,RepositoryService,SchedulerService,ServerNodeConfiguration,App,App.Object,ReloadTask,ExternalProgramTask,UserSyncTask,SystemRule,Stream,User,UserDirectory,DataConnection,Extension,ContentLibrary)"}]}'); req.end(); } function createTag(){ options.path = '/qrs/Tag?privileges=true&xrfkey=abcdefghijklmnop'; options.method = 'POST' options.headers = {"content-type": "application/json", 'x-qlik-xrfkey' : 'abcdefghijklmnop', 'X-Qlik-User' : 'UserDirectory= Internal; UserId= sa_repository '} var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function () { var body = Buffer.concat(chunks); JSON.parse(body.toString()); getTag(); }) }) req.write('{"name":"Scaletest"}'); req.end(); } function deleteApps() { options.path = '/qrs/App/table?filter=(tags.name+eq+%27Scaletest%27)&orderAscending=true&skip=0&sortColumn=name&xrfkey=abcdefghijklmnop'; options.method = 'POST', options.headers = {"content-type": "application/json", 'x-qlik-xrfkey' : 'abcdefghijklmnop', 'X-Qlik-User' : 'UserDirectory= Internal; UserId= sa_repository '} var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function () { var body = Buffer.concat(chunks); var d = 0; JSON.parse(body.toString()).rows.forEach(function(e) { deleteApp(e[0]); d++; }) console.log("Found " + d + " apps"); return; }); }) req.write('{"entity":"App","columns":[{"name":"id","columnType":"Property","definition":"id"},{"name":"privileges","columnType":"Privileges","definition":"privileges"},{"name":"name","columnType":"Property","definition":"name"},{"name":"owner","columnType":"Property","definition":"owner"},{"name":"publishTime","columnType":"Property","definition":"publishTime"},{"name":"AppStatuss","columnType":"List","definition":"AppStatus","list":[{"name":"statusType","columnType":"Property","definition":"statusType"},{"name":"statusValue","columnType":"Property","definition":"statusValue"},{"name":"id","columnType":"Property","definition":"id"}]},{"name":"stream","columnType":"Property","definition":"stream"},{"name":"tags","columnType":"List","definition":"tag","list":[{"name":"name","columnType":"Property","definition":"name"},{"name":"id","columnType":"Property","definition":"id"}]}]}'); req.end(); } function deleteApp(id) { options.path = '/qrs/app/'+id+'?xrfkey=abcdefghijklmnop'; options.method = 'DELETE'; var req = https.request(options, function (res) { var chunks = []; res.on("data", function (chunk) { chunks.push(chunk); }); res.on("end", function () { var body = Buffer.concat(chunks); console.log("App deleted: " + id); //console.log(JSON.parse(body.toString())); }); }) req.write(''); req.end(); }