2015-10-26 08:23:38 -05:00

104 lines
2.6 KiB
JavaScript

'use strict';
/**
* Environment variable utilities
*/
const path = require('path'),
JawsUtils = require('./index'),
JawsCLI = require('./cli'),
JawsError = require('../jaws-error'),
AWSUtils = require('./aws'),
dotenv = require('dotenv'),
Promise = require('bluebird');
/**
*
* @param Jaws
* @param region
* @param stage
* @returns {Promise.<Map>} {raw: "",map:{}}
*/
exports.getEnvFileAsMap = function(Jaws, region, stage) {
let deferred;
if (stage == 'local') {
deferred = Promise.resolve(fs.readFileSync(path.join(Jaws._projectRootPath, '.env')));
} else {
deferred = Jaws.getEnvFile(region, stage)
.then(function(s3ObjData) {
return (!s3ObjData.Body) ? '' : s3ObjData.Body;
});
}
return deferred
.then(function(envFileBuffer) {
return {raw: envFileBuffer, map: dotenv.parse(envFileBuffer)};
})
.catch(function(err) {
console.error(`Warning: trouble getting env for stage: ${stage} region: ${region}`, err);
return {};
});
};
/**
* Get env files for a region or all regions, for a given stage
*
* @param Jaws
* @param region string 'all' or region name
* @param stage
* @returns {Promise.<Array>} {regionName: "", vars: {}, raw: ""}
*/
exports.getEnvFiles = function(Jaws, region, stage) {
let _this = this,
regionGets = [];
if (region != 'all' || stage == 'local') { //single region
if (stage == 'local') {
region = 'local';
}
regionGets.push(_this.getEnvFileAsMap(Jaws, region, stage).then(envVars => {
return {regionName: region, vars: envVars.map, raw: envVars.raw};
}));
} else {
//All regions
if (!Jaws._projectJson.stages[stage]) {
return Promise.reject(new JawsError(`Invalid stage ${stage}`, JawsError.errorCodes.UNKNOWN));
}
Jaws._projectJson.stages[stage].forEach(regionCfg => {
regionGets.push(
_this.getEnvFileAsMap(Jaws, regionCfg.region, stage)
.then(envVars => {
return {regionName: regionCfg.region, vars: envVars.map, raw: envVars.raw};
}));
});
}
return Promise.all(regionGets);
};
/**
* Put env file contents to region + stage file
*
* @param Jaws
* @param region
* @param stage
* @param contents
* @returns {Promise}
*/
exports.putEnvFile = function(Jaws, region, stage, contents) {
let bucket = Jaws.getJawsBucket(region, stage);
JawsCLI.log(
`Uploading ENV file from S3 bucket: ${bucket} in ${region}`
);
return AWSUtils.putEnvFile(
Jaws._awsProfile,
region,
bucket,
Jaws._projectJson.name,
stage,
contents);
};