UNPKG

@vroomlabs/gsdk-deploy

Version:

Google Cloud deployment script for kubernetes clusters using Global Load Balancer

154 lines (123 loc) 8.54 kB
'use strict'; /****************************************************************************** * MIT License * Copyright (c) 2017 https://github.com/vroomlabs * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Created by rogerk on 7/2/17. ******************************************************************************/Object.defineProperty(exports,'__esModule',{value:true});exports.GoogleApi=undefined;var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if('value'in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}(); var _fs=require('fs');var fs=_interopRequireWildcard(_fs); var _os=require('os');var os=_interopRequireWildcard(_os); var _path=require('path');var path=_interopRequireWildcard(_path); var _googleapis=require('googleapis');var google=_interopRequireWildcard(_googleapis); var _logger=require('../util/logger'); var _shell=require('../util/shell');var shell=_interopRequireWildcard(_shell);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError('Cannot call a class as a function')}} var request=require('request-promise'); var packageInfo=require('../../package.json');var GoogleApi=exports.GoogleApi=function(){ /** * @param {string} gcloud * @param {string} project */ function GoogleApi(gcloud,project){_classCallCheck(this,GoogleApi); this.gcloud=gcloud; this.project=project; this.compute=google.compute('v1'); this.container=google.container('v1'); } /** * Upgrades the sdk components if desired. */_createClass(GoogleApi,[{key:'upgradeSdk',value:function(){var _ref=_asyncToGenerator(/*#__PURE__*/regeneratorRuntime.mark(function _callee(){var reqVersion;return regeneratorRuntime.wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0: reqVersion=''; // if (packageInfo['gsdk-version']) { // let reqinfo = {url: packageInfo['gsdk-version'], json: true}; // try { // let versionInfo = await request(reqinfo); // if (versionInfo && versionInfo.version && versionInfo.version.match(/^\d+.\d+.\d+$/)) { // reqVersion = ` --version ${versionInfo.version}`; // } // } // catch (e) { // logger.verbose('Unable to fetch sdk version.', { request: reqinfo, error: e.message }); // } // } _logger.logger.info('Updating gcloud sdk...');_context.prev=2;_context.next=5;return( shell.exec(this.gcloud+' --quiet components update'+reqVersion,{direct:'silly'}));case 5:_context.next=10;break;case 7:_context.prev=7;_context.t0=_context['catch'](2); _logger.logger.verbose('Failed to update gcloud sdk.',_context.t0);case 10: _logger.logger.info('Updating kubectrl sdk...');_context.prev=11;_context.next=14;return( shell.exec(this.gcloud+' --quiet components update kubectl',{direct:'silly'}));case 14:_context.next=19;break;case 16:_context.prev=16;_context.t1=_context['catch'](11); _logger.logger.verbose('Failed to update gcloud sdk.',_context.t1);case 19:case'end':return _context.stop();}}},_callee,this,[[2,7],[11,16]])}));function upgradeSdk(){return _ref.apply(this,arguments)}return upgradeSdk}() /** * Demand authenticates with google * @param {Arguments} args */},{key:'authenticate',value:function(){var _ref2=_asyncToGenerator(/*#__PURE__*/regeneratorRuntime.mark(function _callee2( args){var versions,text,gsdkVer,tmpdir,jsonToken;return regeneratorRuntime.wrap(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:if(! args.autoUpgrade){_context2.next=3;break}_context2.next=3;return( this.upgradeSdk());case 3: versions={};_context2.next=6;return( shell.exec(this.gcloud+' version'));case 6:text=_context2.sent; _logger.logger.silly('gcloud version:\n'+text); text.split('\n').map(function(line){return line.match(/^(\w.*)\s+(\d[^\s]*)$/)}).filter(function(l){return l}). forEach(function(m){return versions[m[1]]=m[2]}); gsdkVer=versions['Google Cloud SDK']; delete versions['Google Cloud SDK']; _logger.logger.debug('Google Cloud SDK Version = '+gsdkVer); _logger.logger.verbose('component versions',versions);if(! args.authEnv){_context2.next=21;break}if( process.env.hasOwnProperty(args.authEnv)){_context2.next=16;break}throw( new Error('Authentication environment not found: '+args.authEnv));case 16: tmpdir=path.join(os.homedir(),'.gcloud-key'); if(!fs.existsSync(tmpdir))fs.mkdirSync(tmpdir); jsonToken=JSON.parse(Buffer.from(process.env[args.authEnv],'base64').toString('utf8')); args.authFile=path.join(tmpdir,args.authEnv.toLowerCase()+'.json'); fs.writeFileSync(args.authFile,JSON.stringify(jsonToken));case 21:if(! args.authFile){_context2.next=27;break}if( fs.existsSync(args.authFile)){_context2.next=24;break}throw( new Error('Unable to locate authentication file: '+args.authFile));case 24:_context2.next=26;return( shell.exec(this.gcloud+' auth activate-service-account --key-file '+args.authFile,{direct:'debug'}));case 26: process.env.GOOGLE_APPLICATION_CREDENTIALS=path.resolve(args.authFile);case 27:case'end':return _context2.stop();}}},_callee2,this)}));function authenticate(_x){return _ref2.apply(this,arguments)}return authenticate}()},{key:'selectProject',value:function(){var _ref3=_asyncToGenerator(/*#__PURE__*/regeneratorRuntime.mark(function _callee3( project){var auth;return regeneratorRuntime.wrap(function _callee3$(_context3){while(1){switch(_context3.prev=_context3.next){case 0: // Set default project: this.project=project; _logger.logger.info('Connecting to project '+project);_context3.next=4;return( shell.exec(this.gcloud+' config set project '+project,{direct:'verbose'}));case 4:_context3.next=6;return( new Promise(function(resolve,reject){ google.auth.getApplicationDefault(function(err,auth,projectId){ if(err){ _logger.logger.error('google.auth.getApplicationDefault',err); return reject(err); } if(project!==projectId){ _logger.logger.warn('Expected project '+project+', authenticated on '+projectId+' instead.'); } resolve(auth); }); }));case 6:auth=_context3.sent; if(auth.createScopedRequired&&auth.createScopedRequired()){ auth=auth.createScoped([ 'https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/compute']); } this.compute=google.compute({ version:'v1', auth:auth, project:project}); this.container=google.container({ version:'v1', auth:auth, project:project});case 10:case'end':return _context3.stop();}}},_callee3,this)}));function selectProject(_x2){return _ref3.apply(this,arguments)}return selectProject}()}]);return GoogleApi}();