apiconnect-cli-publish-bluemix
Version:
Plugin for IBM API Connect Developer Toolkit
193 lines (169 loc) • 6.11 kB
JavaScript
/********************************************************* {COPYRIGHT-TOP} ***
* Licensed Materials - Property of IBM
* 5725-Z22, 5725-Z63, 5725-U33, 5725-Z63
*
* (C) Copyright IBM Corporation 2016, 2017
*
* All Rights Reserved.
* US Government Users Restricted Rights - Use, duplication or disclosure
* restricted by GSA ADP Schedule Contract with IBM Corp.
********************************************************** {COPYRIGHT-END} **/
// Node module: apiconnect-cli-publish-bluemix
var Promise = require('bluebird');
var Login = require('apiconnect-cli-login-bluemix');
var g = require('strong-globalize')();
var logger = require('apiconnect-cli-logger');
var bluemixRuntime = require('./bluemix-runtime');
var validate = require('../utils/validate-guid');
module.exports = {
name: 'publish',
version: require('../../package.json').version,
path: __filename,
publish: publish,
topics: getTopics,
};
function getTopics() {
return [ {
name: 'local',
commands: [ {
command: 'publish',
aliases: [ 'publish' ],
helpInfo: function() {
return g.f('apic_bluemix_publish_help.txt');
},
action: actionPublish,
type: 'app',
options: [
'-o, --org <orgName>',
'-s, --space <spaceName>',
'-a, --app <appName>',
'-r, --region <region>',
'-p, --providerOrg <pOrgName>',
'-z, --dirToZip <directory>',
],
} ],
} ];
}
function actionPublish(options) {
return publish(options).then(function(res) {
logger.writeln(g.f('The App Guid for %s is %s', res.body.name, res.body.guid));
logger.writeln(g.f('The App is running at host %s and can be managed at %s.',
res.runtimeEndpoint, res.runtimeUrl));
}).catch(function(err) {
logger.writeln(g.f('%s did not publish successfully: %s', options.app, err));
throw err;
});
}
function publish(options) {
var ui = false;
var inplaceUpdate = true;
var newName = null;
var deployer;
var hostname = options.hostname;
/** ===================== Get the JWT ============================= */
var login = new Login(hostname);
var encryptedToken;
return login.status().then(function(tokenStatus) {
if (!tokenStatus.loggedIn && !tokenStatus.expiration) {
var notLoggedIn = {
statusCode: 401,
message: g.f('Login is required using {{`apic login`}}'),
};
return Promise.reject(notLoggedIn);
}
}).then(function() {
return login.token().then(function(token) {
encryptedToken = token;
/** ===================== Set the deployer option =================== */
deployer = bluemixRuntime.getBaseUrl(hostname);
/** ===================== Set UI options ========================== */
if (typeof (options.ui) === 'boolean') {
ui = options.ui;
if (ui) {
var orgCheck = validate.validateBluemixGuid(options.org, 'Org');
var spaceCheck = validate.validateBluemixGuid(options.space, 'Space');
if (!orgCheck.isGuid) {
var orgError = {
statusCode: 403,
message: g.f('The provided {{Bluemix}} organization `%s` is invalid.',
options.org.toString()),
};
return Promise.reject(orgError);
}
if (!spaceCheck.isGuid) {
var spaceError = {
statusCode: 403,
message: g.f('The provided {{Bluemix}} space `%s` is invalid.',
options.space.toString()),
};
return Promise.reject(spaceError);
}
}
}
/** ===================== Set Versioning Options ================== */
if ((options.versionOptions) && typeof (options.versionOptions.inplaceUpdate) === 'boolean') {
inplaceUpdate = options.versionOptions.inplaceUpdate;
if (!(inplaceUpdate)) {
newName = options.versionOptions.newName;
}
}
/** ===================== Make call to RTM ======================== */
return bluemixRuntime.createApp({
encryptedToken: encryptedToken,
appName: options.app,
deployer: deployer,
bmOrgName: options.org,
bmSpaceName: options.space,
providerAccount: options.providerOrg,
zipFilePath: options.zip,
ui: ui,
inplaceUpdate: inplaceUpdate,
newName: newName,
projectType: options.projectType,
}).then(function(body) {
if (body && body.guid) {
//call bluemix API here to get the baseURL, till then use test
return bluemixRuntime.getBluemixAPIHost(deployer, encryptedToken)
.then(function(url) {
var runtimeUrl;
if (!url) {
runtimeUrl = [];
} else {
var temp = url.replace('api.', 'console.');
runtimeUrl = temp + '/apps/' + body.guid;
}
var runtimeEndpoint;
if (body.routes && body.routes[0]) {
runtimeEndpoint = body.routes[0].host + '.' + body.routes[0].domain.name;
} else {
runtimeEndpoint = [];
}
var publishSuccess = {
statusCode: body.statusCode || 201,
message: g.f('Runtime published successfully.'),
body: body,
runtimeUrl: runtimeUrl,
runtimeEndpoint: runtimeEndpoint,
};
return Promise.resolve(publishSuccess);
});
} else {
var err = new Error(g.f('Server error occurred while deploying the application.'));
err.details = {
statusCode: body.statusCode || 500,
body: JSON.stringify(body),
};
logger.error(err);
return Promise.reject(err);
}
});
});
}).catch(function(err) {
var publishErr = {
statusCode: err.statusCode || err.details.statusCode || 500,
message: err.message || g.f('Server error occurred while deploying this application'),
error: err,
};
return Promise.reject(publishErr);
});
}