UNPKG

rainbow-cli

Version:

Rainbow CLI application based on the Rainbow SDK for Node.js

1,480 lines (1,286 loc) 95.1 kB
"use strict"; const fs = require("fs"); const NodeSDK = require("../common/SDK"); const Message = require("../common/Message"); const Exit = require("../common/Exit"); const moment = require("moment"); const timezone = require("moment-timezone"); const Helper = require("../common/Helper"); // const sleep = require('system-sleep'); process.on('SIGTERM', () => { // console.info('SIGTERM signal received.'); }); process.on('SIGINT', () => { // console.info('SIGINT signal received.'); }); var isStop = false; /* async function exitHandler(evtOrExitCodeOrError) { try { console.info('exit signal received exitHandler. Stop to graceful Stop the SDK. 1 '); // await async code here await NodeSDK.stop().then(() => { console.info('exit signal received. Stop to graceful Stop the SDK. 1 '); }); // Optionally: Handle evtOrExitCodeOrError here } catch (e) { console.error('EXIT HANDLER ERROR', e); } process.exit(isNaN(+evtOrExitCodeOrError) ? 1 : +evtOrExitCodeOrError); } [ 'beforeExit', 'uncaughtException', 'unhandledRejection', 'SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT','SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM', ].forEach(evt => process.on(evt, exitHandler)); // */ /* const eventLoopQueue = () => { return new Promise(resolve => setImmediate(() => { console.log('event loop'); resolve(); }) ); } const run = async () => { console.info('exit signal received in run. Start to graceful Stop the SDK.'); NodeSDK.stop().then(() => { console.info('exit signal received. Stop to graceful Stop the SDK. 1 '); //SOME_EXIT_CONDITION = true; isStop = true; //resolve("OK"); }); while (!isStop) { console.log('loop'); await eventLoopQueue(); } } //process.on('exit', async () => { process.on('exit', run); process.on('beforeexit', async () => { //var prom = new Promise (async(resolve, reject)=> { console.info('exit signal received. Start to graceful Stop the SDK.'); NodeSDK.stop().then(() => { console.info('exit signal received. Stop to graceful Stop the SDK. 1 '); //SOME_EXIT_CONDITION = true; isStop = true; //resolve("OK"); }); console.info('exit signal received. Stop to graceful Stop the SDK. 2!'); // }); //isStop; while (!isStop) { console.log('loop'); await eventLoopQueue(); } console.info('exit signal received. Stop to graceful Stop the SDK. 3'); }); // */ class CApplication { constructor(prefs) { this._prefs = prefs; } _formatCSVMetrics(json, groups, categories, options) { let csvJSON = { data: [] }; let metrics = json.data; let period = json.aggregationPeriod || "hour"; metrics.forEach(metric => { let metricsGroups = metric.groupCounters || []; let startDate = metric.aggregationStartDate; switch (period) { case "hour": startDate = moment(startDate).format("lll"); break; case "day": startDate = moment(startDate).format("ll"); break; case "month": startDate = moment(startDate).format("MMM YYYY"); break; default: startDate = moment(startDate).format("lll"); break; } let line = { date: startDate }; // Prepare CSV if (options.group) { for (var category in categories) { line[category] = 0; } } else { groups.forEach(group => { line[group] = 0; }); } metricsGroups.forEach(group => { if (options.group) { for (category in categories) { if (categories[category].includes(group.group)) { line[category] += group.count; } } } else { line[group.group] = group.count; } }); csvJSON["data"].push(line); }); return csvJSON; } _getGroupMetrics(token) { return new Promise(function (resolve, reject) { NodeSDK.get("/api/rainbow/metrics/v1.0/cpaasmetrics/apiGroupsMapping", token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _getMetrics(token, options) { return new Promise(function (resolve, reject) { let day = options.day, month = options.month, year = options.year, since = options.since, until = options.until; let param = "?"; let period = "hour"; let fromDate = moment().startOf("day"); let toDate = moment().endOf("day"); if (day) { fromDate = moment(day, "YYYYMMDD").startOf("day"); toDate = moment(day, "YYYYMMDD").endOf("day"); } else if (month) { fromDate = moment(month, "YYYYMM").startOf("month"); toDate = moment(month, "YYYYMM").endOf("month"); period = "day"; } else if (year) { fromDate = moment(year, "YYYY").startOf("year"); toDate = moment(year, "YYYY").endOf("year"); period = "month"; } else if (since) { fromDate = moment(since, "YYYYMM").startOf("month"); toDate = moment().endOf("month"); period = "month"; Message.log('since: fromDate: ' + fromDate + ' , toDate: ' + toDate); } else { fromDate = moment().startOf("month"); toDate = moment().endOf("month"); period = "day"; } if (until) { if (!since) { } toDate = moment(until, "YYYYMM").endOf("month"); period = "month"; Message.log('until: fromDate: ' + fromDate + ' , toDate: ' + toDate); } if (options.forcePeriod) { period = options.forcePeriod; } param += "fromDate=" + fromDate.toISOString(); param += "&toDate=" + toDate.toISOString(); let zone_name = moment.tz.guess(); param += "&timezone=" + zone_name; param += "&period=" + period; if (options.dczones) { param += "&dcZones=" + options.dczones; } // Message.log('param: ' + param); NodeSDK.get("/api/rainbow/metrics/v1.0/cpaasmetrics/" + options.appid + param, token) .then(function (json) { json.start = fromDate.toDate(); json.end = toDate.toDate(); json.appid = options.appid; resolve(json); }) .catch(function (err) { reject(err); }); }); } _createThreshold(token, group, notification, threshold, options) { return new Promise(function (resolve, reject) { let thresholdPayload = { type: "custom", notification: notification, threshold: threshold }; NodeSDK.post("/api/rainbow/applications/v1.0/applications/" + options.appid + "/thresholds/" + group, token, thresholdPayload) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _updateThreshold(token, type, group, notification, threshold, options) { return new Promise(function (resolve, reject) { let thresholdPayload = { type: "custom", notification: notification, threshold: threshold }; NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + options.appid + "/thresholds/" + group + "/" + type, token, thresholdPayload) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _deleteThreshold(token, group, options) { return new Promise(function (resolve, reject) { NodeSDK.delete("/api/rainbow/applications/v1.0/applications/" + options.appid + "/thresholds/" + group + "/custom", token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _getThresholds(token, options) { let groupName = ""; if (options.group) { groupName = "/" + options.group; } return new Promise(function (resolve, reject) { NodeSDK.get("/api/rainbow/applications/v1.0/applications/" + options.appid + "/thresholds" + groupName, token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _getApns(token, options) { return new Promise(function (resolve, reject) { NodeSDK.get("/api/rainbow/applications/v1.0/applications/" + options.appid + "/push-settings", token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _getApplicationAnalytics(token, options) { return new Promise(function (resolve, reject) { let since = options.since, until = options.until, appid = options.appid; let param = "?"; param += "fromMonth=" + moment(since, 'YYYYMM').format('YYYY-MM'); param += "&toMonth=" + moment(until, 'YYYYMM').format('YYYY-MM'); if (options.companyid) { param += "&companyId=" + options.companyid; } if (options.details) { param += "&format=" + options.details; } if (options.page > 0) { param += "&offset="; if (options.page > 1) { param += options.limit * (options.page - 1); } else { param += 0; } } param += "&limit=" + Math.min(options.limit, 1000); NodeSDK.get("/api/rainbow/analytics/v1.0/applications/" + appid + "/users" + param, token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _getApplicationCounters(token, options) { return new Promise(function (resolve, reject) { let appid = options.appid; NodeSDK.get("/api/rainbow/applications/v1.0/applications/counters/" + appid, token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _setApplicationCounter(token, options) { return new Promise(function (resolve, reject) { let counter = { appId: options.appid, [options.countername]: options.countervalue }; NodeSDK.post("/api/rainbow/applications/v1.0/applications/counters", token, counter) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _getApplication(token, options) { let that = this; return new Promise(function (resolve, reject) { NodeSDK.get("/api/rainbow/applications/v1.0/applications/" + options.appid, token) .then(function (json) { let url = "/api/rainbow/enduser/v1.0/users/"; if (that._prefs.user.roles.includes("support") || that._prefs.user.roles.includes("superadmin")) { url = "/api/rainbow/admin/v1.0/users/"; } if (json.data.ownerId) { NodeSDK.get(url + json.data.ownerId, token) .then(function (userJson) { json.data.owner = userJson.data; resolve(json); }) .catch(err => { json.data.owner = null; resolve(json); }); } else { resolve(json); } }) .catch(function (err) { reject(err); }); }); } _getPush(token, options) { return new Promise(function (resolve, reject) { NodeSDK.get( "/api/rainbow/applications/v1.0/applications/" + options.appid + "/push-settings/" + options.id, token ) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _getApps(token, filterToApply, offset, limit) { filterToApply += "&limit=" + limit + "&offset=" + offset; return NodeSDK.get("/api/rainbow/applications/v1.0/applications?" + filterToApply, token); } async _getExpiredPushCert(token, options) { var filterToApply = "format=full&state=active&env=deployed"; var limit = 100; var offset = 0; var finished = false; var expiredCertificates = []; while (!finished) { try { let json = await this._getApps(token, filterToApply, offset, limit); var apps = json.data; if (apps.length > 0) { var today = new Date(); apps.forEach(app => { var pushNotifs = app.pushNotificationSettings; if (pushNotifs) { pushNotifs.forEach(pushNotif => { let expDate = new Date(pushNotif.certificateExpirationTime); if (expDate instanceof Date) { if (expDate < today) { expiredCertificates.push({ appName: app.name, certType: pushNotif.type + '/' + pushNotif.certificateType, certExpDate: expDate }); } } }); } }); offset += limit; } else { finished = true; } } catch (error) { console.log(error); } } return expiredCertificates; } _getApplications(token, options) { let that = this; return new Promise(function (resolve, reject) { var filterToApply = "format=full"; if (options.format) { filterToApply = "format=" + options.format; } if (options.filter) { filterToApply += `&env=${options.filter}`; } if (options.state) { if (options.state === "notactive") { filterToApply += `&state=blocked,stopped,new`; } else { filterToApply += `&state=${options.state}`; } } if (options.byDate) { switch (options.filter) { case "blocked": case "deployed": filterToApply += "&sortField=dateOfDeployment&sortOrder=-1"; break; case "in_deployment": filterToApply += "&sortField=dateOfDeploymentRequest&sortOrder=-1"; break; default: filterToApply += "&sortField=dateOfCreation&sortOrder=-1"; break; } } if (options.owner) { filterToApply += "&ownerId=" + options.owner; } if (options.subscription) { filterToApply += "&subscriptionStatus=creating,active,alerting"; } if (options.name) { filterToApply += "&name=" + options.name; } if (options.type) { filterToApply += "&types=" + options.type; } if (options.kpi) { filterToApply += "&kpi=" + options.kpi; } if (options.page > 0) { filterToApply += "&offset="; if (options.page > 1) { filterToApply += options.limit * (options.page - 1); } else { filterToApply += 0; } } filterToApply += "&limit=" + Math.min(options.limit, 1000); NodeSDK.get("/api/rainbow/applications/v1.0/applications?" + filterToApply, token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _createApplication(token, options) { return new Promise(function (resolve, reject) { let application = { name: options.name, origin: "", type: options.type, activity: "J" }; if (options.owner) { application.ownerId = options.owner; } NodeSDK.post("/api/rainbow/applications/v1.0/applications", token, application) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _updateApplication(token, options, data) { return new Promise(function (resolve, reject) { NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + options.appid, token, data) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _createFCMV1(token, options) { return new Promise(function (resolve, reject) { try { const firebasejson = fs.readFileSync(options.firebasejson); const firebaseparsed = JSON.parse(firebasejson); if (!firebaseparsed.project_id || !firebaseparsed.private_key_id || !firebaseparsed.private_key || !firebaseparsed.client_email || !firebaseparsed.token_uri) { console.error("Incorrect firebase json file content (missing at least one of project_id, private_key_id, private_key, client_email, token_uri)"); reject("Incorrect firebase json file content"); } let fcmv1 = { type: "fcm_v1", project_id: firebaseparsed.project_id, private_key_id: firebaseparsed.private_key_id, private_key: firebaseparsed.private_key, client_email: firebaseparsed.client_email, token_uri: firebaseparsed.token_uri, isEnabled: true }; NodeSDK.post("/api/rainbow/applications/v1.0/applications/" + options.appid + "/push-settings", token, fcmv1) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); } catch(error) { reject(error); } }); } _createAPNSV2(token, options) { return new Promise(function (resolve, reject) { fs.readFile(options.file, "utf8", (err, data) => { let apnsv2 = { type: "apns_v2", certificateFile: data, appBundleId: options.appBundleId, isEnabled: true }; if (err) { console.log("ERR", err); reject(err); } else { NodeSDK.post("/api/rainbow/applications/v1.0/applications/" + options.appid + "/push-settings", token, apnsv2) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); } }); }); } _delete(token, options) { return new Promise(function (resolve, reject) { NodeSDK.delete("/api/rainbow/applications/v1.0/applications/" + options.appid, token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _block(token, options) { return new Promise(function (resolve, reject) { NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + options.appid + "/block", token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _unblock(token, options) { return new Promise(function (resolve, reject) { NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + options.appid + "/unblock", token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _deploy(token, options) { let getApplication = function (id, token) { return new Promise(function (resolve, reject) { NodeSDK.get("/api/rainbow/applications/v1.0/applications/" + id, token) .then(function (json) { resolve(json.data); }) .catch(function (err) { reject(err); }); }); }; let wait = function () { return new Promise(function (resolve) { setTimeout(function () { resolve(); }, 2000); }); }; let waitForApplication = function (id, token) { return new Promise(function (resolve, reject) { NodeSDK.get("/api/rainbow/applications/v1.0/applications/" + id, token) .then(function (json) { let app = json.data; if (app.kpi === "business" || app.kpi === "internal" || app.kpi === "demo" || app.kpi === "appconnect") { resolve(json.data); return; } if (app.subscriptions && app.subscriptions.length > 0 && !app.subscriptions[0].syncOngoing) { resolve(json.data); return; } wait().then(function () { return waitForApplication(id, token).then(function (application) { resolve(application); }); }); }) .catch(function (err) { reject(err); }); }); }; let addSubscription = function (application, token) { return new Promise(function (resolve, reject) { // Si pay as you go and no subscriptions if ( application.kpi === "business" || application.kpi === "internal" || application.kpi === "demo" || application.kpi === "appconnect" || (application.kpi === "payasyougo" && application.subscriptions && application.subscriptions.length > 0) ) { resolve(application); return; } NodeSDK.post( "/api/rainbow/subscription/v1.0/developers/" + application.ownerId + "/subscriptions", token, { applicationId: application.id } ) .then(function (json) { resolve(json); }) .catch(function (err) { if (err.code === 403) { err.details = "Can't deploy application. Error with payment method. Check if payment method exists."; } reject(err); }); }); }; let requestDeploy = function (application) { return new Promise(function (resolve, reject) { if (application.kpi !== "business" && application.kpi !== "internal" && application.kpi !== "demo" && application.kpi !== "appconnect") { resolve(application); return; } NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + application.id + "/request-deploy", token) .then(function (json) { resolve(json.data); }) .catch(function (err) { reject(err); }); }); }; return new Promise(function (resolve, reject) { let application = null; getApplication(options.appid, token) .then(function (json) { application = json; if (application.env === "deployed") { reject({ details: "Can't deploy application. Application is already deployed." }); return; } return addSubscription(application, token); }) .then(function () { return waitForApplication(options.appid, token); }) .then(function () { return requestDeploy(application); }) .then(function (application) { resolve(application); }) .catch(function (err) { reject(err); }); }); } _approve(token, options) { return new Promise(function (resolve, reject) { let data = { deployReason: options.reason || "" }; NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + options.appid + "/deploy", token, data) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _stop(token, options) { return new Promise(function (resolve, reject) { NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + options.appid + "/stop", token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _restart(token, options) { return new Promise(function (resolve, reject) { NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + options.appid + "/restart", token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _dismiss(token, options) { return new Promise(function (resolve, reject) { NodeSDK.put("/api/rainbow/applications/v1.0/applications/" + options.appid + "/decline", token) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _usage(token, options) { let param = { year: options.year, month: options.month }; return new Promise(function (resolve, reject) { NodeSDK.post( "/api/rainbow/invoicing/v1.0/cpaas/zuora/" + options.appid + "?year=" + options.year + "&month=" + options.month, token ) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } _deletePush(token, options) { return new Promise(function (resolve, reject) { NodeSDK.delete( "/api/rainbow/applications/v1.0/applications/" + options.appid + "/push-settings/" + options.id, token ) .then(function (json) { resolve(json); }) .catch(function (err) { reject(err); }); }); } getApplication(options) { var that = this; try { Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Get information for application", options.appid, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._getApplication(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.table2D(json.data); Message.lineFeed(); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } catch (err) { Message.error(err, options); Exit.error(); } } createApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Create new application", options.name, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._createApplication(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.printSuccess("Application created with Id", json.data.id, options); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } linkApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Link application to user", options.ownerid, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._updateApplication(that._prefs.token, options, { ownerId: options.ownerid }); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.printSuccess("Application successfully linked to user", options.ownerid, options); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } renewApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Renew application secret for application", options.appid, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._updateApplication(that._prefs.token, options, { refreshAppSecret: true }); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.printSuccess( "Application secret successfully renewed for application", options.appid, options ); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } deleteApplication(options) { var that = this; var doDelete = function (options) { let spin = Message.spin(options); NodeSDK.start(that._prefs.email, that._prefs.password, that._prefs.host) .then(function () { Message.log("execute action..."); return that._delete(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json); } else { Message.lineFeed(); Message.success(options); Message.log("finished! will exit!"); Exit.ok(); } }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); }; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Delete application", options.appid, options); if (options.noconfirmation) { doDelete(options); } else { Message.confirm("Are-you sure ? It will remove it completely").then(function (confirm) { if (confirm) { doDelete(options); } else { Message.canceled(options); Exit.error(); } }); } } else { Message.notLoggedIn(options); Exit.error(); } } blockApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Block an application", options.appid, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._block(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.printSuccess("Application blocked", json.data.id, options); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } unblockApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Unblock an application", options.appid, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._unblock(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.printSuccess("Application unblocked", json.data.id, options); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } deployApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Request to deploy application", options.appid, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._deploy(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json); } else { Message.lineFeed(); Message.printSuccess("Application deployment request done", json.id, options); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } approveApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Deploy an application", options.appid, options); let spin = null; NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return Message.ask("Deployment reason", ""); }) .then(function (reason) { options.reason = reason; spin = Message.spin(options); return that._approve(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.printSuccess("Application deployed", json.data.id, options); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } dismissApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Decline a request of deployment of application", options.appid, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._dismiss(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.printSuccess("Application deployment declined", json.data.id, options); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLoggedIn(options); Exit.error(); } } stopApplication(options) { var that = this; Message.welcome(options); if (this._prefs.token && this._prefs.user) { Message.loggedin(this._prefs, options); Message.action("Stop an application", options.appid, options); let spin = Message.spin(options); NodeSDK.start( this._prefs.email, this._prefs.password, this._prefs.host, this._prefs.proxy, this._prefs.appid, this._prefs.appsecret ) .then(function () { Message.log("execute action..."); return that._stop(that._prefs.token, options); }) .then(function (json) { Message.unspin(spin); Message.log("action done...", json); if (options.noOutput) { Message.out(json.data); } else { Message.lineFeed(); Message.printSuccess("Application stopped", json.data.id, options); Message.success(options); } Message.log("finished! will exit!"); Exit.ok(); }) .catch(function (err) { Message.unspin(spin); Message.error(err, options); Exit.error(); }); } else { Message.notLogge