deep-package-manager
Version:
DEEP Package Manager
195 lines (153 loc) • 5.74 kB
JavaScript
/**
* Created by mgoria on 5/27/16.
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PolicyTranslator = undefined;
var _AbstractService = require('../Provisioning/Service/AbstractService');
var _Inflector = require('./Inflector');
var _Exception = require('../Exception/Exception');
var _deepCore = require('deep-core');
var _deepCore2 = _interopRequireDefault(_deepCore);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class PolicyTranslator {
/**
* @param {Object} appConfig
*/
constructor(appConfig) {
this._appConfig = appConfig;
}
/**
* @param {String} apiGatewayBase
*
* @returns {String}
*/
extractApiGatewayId(apiGatewayBase) {
let matches = apiGatewayBase.match(/^https?:\/\/([^.]+)\.execute-api\.[^.]+\.amazonaws\.com\/(.+)$/i);
if (matches.length !== 3) {
return { id: '*', stage: '*' };
}
return { id: matches[1], stage: matches[2] };
}
/**
* @returns {String}
*/
getApiData() {
let apiGatewayBase = this._appConfig.website ? this._appConfig.website.apigateway : this._appConfig.provisioning.apigateway.api.baseUrl;
return this.extractApiGatewayId(apiGatewayBase);
}
/**
* @param {Object} policy
* @returns {Core.AWS.IAM.Policy}
*/
toIAMPolicy(policy) {
let iamPolicy = new _deepCore2.default.AWS.IAM.Policy();
let apiData = this.getApiData();
policy.Statement.forEach(rawDeepStmt => {
let lambdaStmt = iamPolicy.statement.add();
let apiStmt = iamPolicy.statement.add();
lambdaStmt.effect = rawDeepStmt.Effect;
apiStmt.effect = rawDeepStmt.Effect;
lambdaStmt.action.add(_deepCore2.default.AWS.Service.LAMBDA, 'InvokeFunction');
apiStmt.action.add(_deepCore2.default.AWS.Service.API_GATEWAY_EXECUTE, 'Invoke');
rawDeepStmt.Action.map(this._resolveDeepAction.bind(this)).forEach(functionName => {
lambdaStmt.resource.add(_deepCore2.default.AWS.Service.LAMBDA, this._appConfig.awsRegion, this._appConfig.awsAccountId, `function:${functionName}`);
});
rawDeepStmt.Action.map(this._resolveDeepActionEndpoints.bind(this)).forEach(endpointName => {
apiStmt.resource.add(_deepCore2.default.AWS.Service.API_GATEWAY_EXECUTE, this._appConfig.awsRegion, this._appConfig.awsAccountId, [apiData.id, apiData.stage, endpointName].join('/'));
});
});
return iamPolicy;
}
/**
* msId:*
* msId:resourceName:*
* msId:resourceName:actionName
*
* @param {String} action
* @private
*/
_resolveDeepActionEndpoints(action) {
if (typeof action != 'string') {
throw new TypeError(`Invalid action parameter type. Expected string got ${typeof action}`);
}
if (action === PolicyTranslator.ANY) {
return this.generateAwsResourceName('*');
}
let actionParts = action.split(':');
actionParts[1] = actionParts[1] || PolicyTranslator.ANY;
actionParts[2] = actionParts[2] || PolicyTranslator.ANY;
if (!this._actionsExists(actionParts)) {
throw new _Exception.Exception(`'${action}' deep action doesn't exists`);
}
return actionParts.reduce((name, part) => {
// API Gateway does not support dots into resource name / path
name += '/' + (part === PolicyTranslator.ANY ? part : part.replace(/\./g, '-'));
return name;
}, '*');
}
/**
* msId:*
* msId:resourceName:*
* msId:resourceName:actionName
*
* @param {String} action
* @private
*/
_resolveDeepAction(action) {
if (typeof action != 'string') {
throw new TypeError(`Invalid action parameter type. Expected string got ${typeof action}`);
}
if (action === PolicyTranslator.ANY) {
return this.generateAwsResourceName('*');
}
let actionParts = action.split(':');
actionParts[1] = actionParts[1] || PolicyTranslator.ANY;
actionParts[2] = actionParts[2] || PolicyTranslator.ANY;
if (!this._actionsExists(actionParts)) {
throw new _Exception.Exception(`'${action}' deep action doesn't exists`);
}
let microserviceIdentifier = actionParts.shift();
let lambdaFunctionName = actionParts.reduce((name, part) => {
name += part === PolicyTranslator.ANY ? part : _Inflector.Inflector.pascalCase(part);
return name;
}, '');
lambdaFunctionName = lambdaFunctionName.replace(/\*+/g, '*');
return this.generateAwsResourceName(lambdaFunctionName, microserviceIdentifier);
}
/**
* @param {String[]} parts
* @returns {Boolean}
* @private
*/
_actionsExists(parts) {
let microservices = this._appConfig.microservices;
let microservice = parts[0];
let resource = parts[1];
let action = parts[2];
return microservices.hasOwnProperty(microservice) && (resource === PolicyTranslator.ANY || microservices[microservice].resources.hasOwnProperty(resource)) && (action === PolicyTranslator.ANY || microservices[microservice].resources[resource].hasOwnProperty(action));
}
/**
* @returns {String}
*/
getAppHash() {
return _AbstractService.AbstractService.generateUniqueResourceHash(this._appConfig.awsAccountId, this._appConfig.appIdentifier);
}
/**
* @param {String} resourceName
* @param {String} msIdentifier
* @returns {String}
*/
generateAwsResourceName(resourceName, msIdentifier = '') {
return _AbstractService.AbstractService.generateAwsResourceName(resourceName, _deepCore2.default.AWS.Service.LAMBDA, this._appConfig.awsAccountId, this._appConfig.appIdentifier, this._appConfig.env, msIdentifier);
}
/**
* @returns {String}
*/
static get ANY() {
return '*';
}
}
exports.PolicyTranslator = PolicyTranslator;