@vroomlabs/gsdk-deploy
Version:
Google Cloud deployment script for kubernetes clusters using Global Load Balancer
154 lines (123 loc) • 8.54 kB
JavaScript
;
/******************************************************************************
* 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}();