UNPKG

apiconnect-cli-publish-bluemix

Version:

Plugin for IBM API Connect Developer Toolkit

193 lines (169 loc) 6.11 kB
/********************************************************* {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); }); }