beame-provision-test
Version:
provision test package
184 lines (166 loc) • 5.65 kB
JavaScript
;
/* test provision restful APIs */
//var commonEPprefix="https://zenit.office.beameio.net/api";
var commonEPprefix="https://prov-staging.beameio.net/api";
var answerExpected=false;
var testData = null;
//next is for reference only:
var paramKeys=["version","postData","api","answerExpected","decode"];
//reused from ProvApiervice
var exports = module.exports;
/**
* @typedef {Object} CertSettings
* @property {String} appCertPath
* @property {String} x509Name
* @property {String} pkName
*/
/**
* @typedef {Object} OrderPemResponse
* @property {String} x509
* @property {String} ca
* @property {String} pkcs7
*/
/**
* @typedef {Object} ProvEndpointResponse
* @property {String} uid
* @property {String} hostname
*/
/**
* @typedef {Object} ProvApiResponse
* @property {String} StatusCode
* @property {String} ErrorMessage
* @property {String} Message
* @property {Boolean} IsSuccess
* @property {Object} Payload
*/
var _ = require('underscore');
var request = require('request');
var pem = require('pem');
var fs = require('fs');
var sys = require('sys');
var exec = require('child_process').exec;//needed to run openssl cli
//private helpers
var parseProvisionResponse = function (error, response, body, type, callback) {
console.log('Host responded with status <'+response.statusCode+'>');
if (error) {
console.error('provision error', error);
callback(error, null);
return;
}
/** @type {ProvApiResponse} */
if (response.statusCode == 200) {
//noinspection JSUnresolvedVariable
if(testData.answerExpected){
var resp = JSON.parse(body);
if (!resp) {
console.error('Wrong response from provisioning api(' + type + '):', body);
throw new Error('Wrong response from provisioning api(' + type + '): ' + utils.stringify(resp));
}
callback(null, resp);
}
else{
var tmpResp="{\"updateStatus\":\"pass\"}";
var resp=JSON.parse(tmpResp);
callback(null,resp);
}
}
else {
callback(body+':status:'+response.statusCode, null);
}
};
var postToProvisionApi = function (url, options, type, callback) {
console.log('postToProvision: '+url);
request.post(
url,
options,
function (error, response, body) {
parseProvisionResponse(error, response, body, type, function (err, payload) {
if (payload) {
callback(null, payload);
}
else {
callback(err, null);
}
});
}
);
};
var privateKey;
var secretKey;
function readHostName(filePath,cb){
fs.readFile(filePath, (err, data) => {
if (err) throw err;
console.log(data);
cb(err,data);
});
}
//exports.setAuthData = function(pk,cert,generateKeys,cb){
exports.setAuthData = function(authData,cb){
console.log('reading auth data: pk<' + authData.pk+'> <'+authData.x509+'>');
this.options = {
key: fs.readFileSync(authData.pk),
cert: fs.readFileSync(authData.x509)
};
var devPK=this.options.key;
if(authData.generateKeys || authData.makeCSR){
/* --------- generate RSA key: ------------------------------------------------*/
var cmd="openssl genrsa 2048";
if(!authData.generateKeys)
cmd="echo \""+devPK+"\"";
console.log('generating private key with: '+cmd);
var child = exec(cmd, function (error, stdout, stderr) {
var devPK = stdout;
// console.log('devPK: ' + devPK);
if (error !== null) {
console.log('stderr: ' + stderr);
/* ------- put error handler to deal with possible openssl failure -----------*/
console.log('Failed to generate Private Key: ' + error);
}
//else{//store RSA key in developer data
var pkFile=authData.devPath+"private_key.pem";
fs.writeFile(pkFile, devPK, function(err) {
if(err) {
return console.log(err);
}
//else
cmd="openssl req -key "+pkFile+" -new -subj \"/"+authData.CSRsubj+"\"";
console.log('CLI: '+cmd);
child = exec(cmd, function (error, stdout, stderr) {
if (error !== null) {
console.log('stderr: ' + stderr);
/* ------------- put error handler to deal with possible openssl failure ---------*/
console.log('exec error: ' + error);
}
//else
var CSR=stdout;
cb(CSR,devPK);
});
});
});
}
else{
cb(null,null);
}
}
exports.getEndpoint = function (url, cb){
testData={answerExpected:false};
request.get(url)
.on('response',function(res){
res.on('data',function(body){
console.log('Endpoint answer: '+body);
cb(null, JSON.parse(body));
});
})
.on('error',function(err){
cb(err, null);
});
}
//noinspection JSUnusedGlobalSymbols
//var paramKeys=["version","postData","api","answerExpected","decode"];
exports.runRestfulAPI = function (inParams, callback) {
testData=inParams;
var options = _.extend(this.options, {form: testData.postData});
var apiEndpoint=commonEPprefix+testData.version+testData.api;
console.log('Posting to: '+apiEndpoint);
postToProvisionApi(apiEndpoint, options, testData.api, callback);
};