serverless-dynamodb-autoscaling
Advanced tools
Comparing version 0.5.1 to 0.6.0
@@ -1,6 +0,7 @@ | ||
{"/home/ubuntu/serverless-dynamodb-autoscaling/src/plugin.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/plugin.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":15},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":10},"end":{"line":4,"column":27}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"4":{"start":{"line":6,"column":17},"end":{"line":6,"column":40}},"5":{"start":{"line":7,"column":15},"end":{"line":7,"column":36}},"6":{"start":{"line":8,"column":17},"end":{"line":8,"column":40}},"7":{"start":{"line":9,"column":13},"end":{"line":13,"column":1}},"8":{"start":{"line":19,"column":8},"end":{"line":19,"column":37}},"9":{"start":{"line":20,"column":8},"end":{"line":22,"column":10}},"10":{"start":{"line":28,"column":8},"end":{"line":28,"column":61}},"11":{"start":{"line":34,"column":8},"end":{"line":34,"column":56}},"12":{"start":{"line":40,"column":8},"end":{"line":40,"column":60}},"13":{"start":{"line":41,"column":8},"end":{"line":41,"column":68}},"14":{"start":{"line":42,"column":8},"end":{"line":42,"column":77}},"15":{"start":{"line":43,"column":8},"end":{"line":43,"column":82}},"16":{"start":{"line":44,"column":8},"end":{"line":44,"column":87}},"17":{"start":{"line":45,"column":8},"end":{"line":45,"column":75}},"18":{"start":{"line":46,"column":8},"end":{"line":46,"column":86}},"19":{"start":{"line":52,"column":8},"end":{"line":63,"column":10}},"20":{"start":{"line":69,"column":26},"end":{"line":69,"column":28}},"21":{"start":{"line":70,"column":24},"end":{"line":70,"column":45}},"22":{"start":{"line":71,"column":22},"end":{"line":71,"column":37}},"23":{"start":{"line":72,"column":21},"end":{"line":72,"column":42}},"24":{"start":{"line":74,"column":8},"end":{"line":74,"column":143}},"25":{"start":{"line":76,"column":8},"end":{"line":76,"column":73}},"26":{"start":{"line":78,"column":8},"end":{"line":82,"column":9}},"27":{"start":{"line":79,"column":12},"end":{"line":81,"column":197}},"28":{"start":{"line":84,"column":8},"end":{"line":88,"column":9}},"29":{"start":{"line":85,"column":12},"end":{"line":87,"column":202}},"30":{"start":{"line":89,"column":8},"end":{"line":89,"column":25}},"31":{"start":{"line":95,"column":24},"end":{"line":95,"column":26}},"32":{"start":{"line":96,"column":29},"end":{"line":96,"column":31}},"33":{"start":{"line":97,"column":24},"end":{"line":97,"column":52}},"34":{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},"35":{"start":{"line":99,"column":12},"end":{"line":99,"column":32}},"36":{"start":{"line":101,"column":8},"end":{"line":105,"column":11}},"37":{"start":{"line":102,"column":28},"end":{"line":102,"column":133}},"38":{"start":{"line":102,"column":83},"end":{"line":102,"column":132}},"39":{"start":{"line":103,"column":12},"end":{"line":103,"column":50}},"40":{"start":{"line":104,"column":12},"end":{"line":104,"column":76}},"41":{"start":{"line":104,"column":51},"end":{"line":104,"column":74}},"42":{"start":{"line":106,"column":8},"end":{"line":106,"column":25}},"43":{"start":{"line":112,"column":8},"end":{"line":114,"column":9}},"44":{"start":{"line":113,"column":12},"end":{"line":113,"column":26}},"45":{"start":{"line":115,"column":8},"end":{"line":115,"column":37}},"46":{"start":{"line":121,"column":8},"end":{"line":121,"column":317}},"47":{"start":{"line":121,"column":69},"end":{"line":121,"column":100}},"48":{"start":{"line":121,"column":122},"end":{"line":121,"column":315}},"49":{"start":{"line":121,"column":170},"end":{"line":121,"column":314}},"50":{"start":{"line":121,"column":221},"end":{"line":121,"column":313}},"51":{"start":{"line":124,"column":8},"end":{"line":124,"column":378}},"52":{"start":{"line":124,"column":44},"end":{"line":124,"column":59}},"53":{"start":{"line":124,"column":72},"end":{"line":124,"column":145}},"54":{"start":{"line":124,"column":158},"end":{"line":124,"column":172}},"55":{"start":{"line":124,"column":185},"end":{"line":124,"column":271}},"56":{"start":{"line":124,"column":288},"end":{"line":124,"column":376}},"57":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":18,"column":4},"end":{"line":18,"column":5}},"loc":{"start":{"line":18,"column":28},"end":{"line":23,"column":5}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":27,"column":4},"end":{"line":27,"column":5}},"loc":{"start":{"line":27,"column":15},"end":{"line":29,"column":5}},"line":27},"2":{"name":"(anonymous_2)","decl":{"start":{"line":33,"column":4},"end":{"line":33,"column":5}},"loc":{"start":{"line":33,"column":21},"end":{"line":35,"column":5}},"line":33},"3":{"name":"(anonymous_3)","decl":{"start":{"line":39,"column":4},"end":{"line":39,"column":5}},"loc":{"start":{"line":39,"column":15},"end":{"line":47,"column":5}},"line":39},"4":{"name":"(anonymous_4)","decl":{"start":{"line":51,"column":4},"end":{"line":51,"column":5}},"loc":{"start":{"line":51,"column":21},"end":{"line":64,"column":5}},"line":51},"5":{"name":"(anonymous_5)","decl":{"start":{"line":68,"column":4},"end":{"line":68,"column":5}},"loc":{"start":{"line":68,"column":36},"end":{"line":90,"column":5}},"line":68},"6":{"name":"(anonymous_6)","decl":{"start":{"line":94,"column":4},"end":{"line":94,"column":5}},"loc":{"start":{"line":94,"column":28},"end":{"line":107,"column":5}},"line":94},"7":{"name":"(anonymous_7)","decl":{"start":{"line":101,"column":24},"end":{"line":101,"column":25}},"loc":{"start":{"line":101,"column":35},"end":{"line":105,"column":9}},"line":101},"8":{"name":"(anonymous_8)","decl":{"start":{"line":102,"column":69},"end":{"line":102,"column":70}},"loc":{"start":{"line":102,"column":83},"end":{"line":102,"column":132}},"line":102},"9":{"name":"(anonymous_9)","decl":{"start":{"line":104,"column":41},"end":{"line":104,"column":42}},"loc":{"start":{"line":104,"column":51},"end":{"line":104,"column":74}},"line":104},"10":{"name":"(anonymous_10)","decl":{"start":{"line":111,"column":4},"end":{"line":111,"column":5}},"loc":{"start":{"line":111,"column":20},"end":{"line":116,"column":5}},"line":111},"11":{"name":"(anonymous_11)","decl":{"start":{"line":120,"column":4},"end":{"line":120,"column":5}},"loc":{"start":{"line":120,"column":14},"end":{"line":122,"column":5}},"line":120},"12":{"name":"(anonymous_12)","decl":{"start":{"line":121,"column":57},"end":{"line":121,"column":58}},"loc":{"start":{"line":121,"column":69},"end":{"line":121,"column":100}},"line":121},"13":{"name":"(anonymous_13)","decl":{"start":{"line":121,"column":110},"end":{"line":121,"column":111}},"loc":{"start":{"line":121,"column":122},"end":{"line":121,"column":315}},"line":121},"14":{"name":"(anonymous_14)","decl":{"start":{"line":121,"column":159},"end":{"line":121,"column":160}},"loc":{"start":{"line":121,"column":170},"end":{"line":121,"column":314}},"line":121},"15":{"name":"(anonymous_15)","decl":{"start":{"line":121,"column":207},"end":{"line":121,"column":208}},"loc":{"start":{"line":121,"column":221},"end":{"line":121,"column":313}},"line":121},"16":{"name":"(anonymous_16)","decl":{"start":{"line":123,"column":4},"end":{"line":123,"column":5}},"loc":{"start":{"line":123,"column":28},"end":{"line":125,"column":5}},"line":123},"17":{"name":"(anonymous_17)","decl":{"start":{"line":124,"column":38},"end":{"line":124,"column":39}},"loc":{"start":{"line":124,"column":44},"end":{"line":124,"column":59}},"line":124},"18":{"name":"(anonymous_18)","decl":{"start":{"line":124,"column":66},"end":{"line":124,"column":67}},"loc":{"start":{"line":124,"column":72},"end":{"line":124,"column":145}},"line":124},"19":{"name":"(anonymous_19)","decl":{"start":{"line":124,"column":152},"end":{"line":124,"column":153}},"loc":{"start":{"line":124,"column":158},"end":{"line":124,"column":172}},"line":124},"20":{"name":"(anonymous_20)","decl":{"start":{"line":124,"column":179},"end":{"line":124,"column":180}},"loc":{"start":{"line":124,"column":185},"end":{"line":124,"column":271}},"line":124},"21":{"name":"(anonymous_21)","decl":{"start":{"line":124,"column":279},"end":{"line":124,"column":280}},"loc":{"start":{"line":124,"column":288},"end":{"line":124,"column":376}},"line":124}},"branchMap":{"0":{"loc":{"start":{"line":54,"column":25},"end":{"line":54,"column":87}},"type":"cond-expr","locations":[{"start":{"line":54,"column":62},"end":{"line":54,"column":81}},{"start":{"line":54,"column":84},"end":{"line":54,"column":87}}],"line":54},"1":{"loc":{"start":{"line":54,"column":25},"end":{"line":54,"column":59}},"type":"binary-expr","locations":[{"start":{"line":54,"column":25},"end":{"line":54,"column":36}},{"start":{"line":54,"column":40},"end":{"line":54,"column":59}}],"line":54},"2":{"loc":{"start":{"line":55,"column":25},"end":{"line":55,"column":85}},"type":"cond-expr","locations":[{"start":{"line":55,"column":62},"end":{"line":55,"column":81}},{"start":{"line":55,"column":84},"end":{"line":55,"column":85}}],"line":55},"3":{"loc":{"start":{"line":55,"column":25},"end":{"line":55,"column":59}},"type":"binary-expr","locations":[{"start":{"line":55,"column":25},"end":{"line":55,"column":36}},{"start":{"line":55,"column":40},"end":{"line":55,"column":59}}],"line":55},"4":{"loc":{"start":{"line":56,"column":23},"end":{"line":56,"column":82}},"type":"cond-expr","locations":[{"start":{"line":56,"column":58},"end":{"line":56,"column":75}},{"start":{"line":56,"column":78},"end":{"line":56,"column":82}}],"line":56},"5":{"loc":{"start":{"line":56,"column":23},"end":{"line":56,"column":55}},"type":"binary-expr","locations":[{"start":{"line":56,"column":23},"end":{"line":56,"column":34}},{"start":{"line":56,"column":38},"end":{"line":56,"column":55}}],"line":56},"6":{"loc":{"start":{"line":59,"column":25},"end":{"line":59,"column":90}},"type":"cond-expr","locations":[{"start":{"line":59,"column":64},"end":{"line":59,"column":84}},{"start":{"line":59,"column":87},"end":{"line":59,"column":90}}],"line":59},"7":{"loc":{"start":{"line":59,"column":25},"end":{"line":59,"column":61}},"type":"binary-expr","locations":[{"start":{"line":59,"column":25},"end":{"line":59,"column":37}},{"start":{"line":59,"column":41},"end":{"line":59,"column":61}}],"line":59},"8":{"loc":{"start":{"line":60,"column":25},"end":{"line":60,"column":88}},"type":"cond-expr","locations":[{"start":{"line":60,"column":64},"end":{"line":60,"column":84}},{"start":{"line":60,"column":87},"end":{"line":60,"column":88}}],"line":60},"9":{"loc":{"start":{"line":60,"column":25},"end":{"line":60,"column":61}},"type":"binary-expr","locations":[{"start":{"line":60,"column":25},"end":{"line":60,"column":37}},{"start":{"line":60,"column":41},"end":{"line":60,"column":61}}],"line":60},"10":{"loc":{"start":{"line":61,"column":23},"end":{"line":61,"column":85}},"type":"cond-expr","locations":[{"start":{"line":61,"column":60},"end":{"line":61,"column":78}},{"start":{"line":61,"column":81},"end":{"line":61,"column":85}}],"line":61},"11":{"loc":{"start":{"line":61,"column":23},"end":{"line":61,"column":57}},"type":"binary-expr","locations":[{"start":{"line":61,"column":23},"end":{"line":61,"column":35}},{"start":{"line":61,"column":39},"end":{"line":61,"column":57}}],"line":61},"12":{"loc":{"start":{"line":74,"column":107},"end":{"line":74,"column":139}},"type":"cond-expr","locations":[{"start":{"line":74,"column":116},"end":{"line":74,"column":133}},{"start":{"line":74,"column":137},"end":{"line":74,"column":139}}],"line":74},"13":{"loc":{"start":{"line":78,"column":8},"end":{"line":82,"column":9}},"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":82,"column":9}},{"start":{"line":78,"column":8},"end":{"line":82,"column":9}}],"line":78},"14":{"loc":{"start":{"line":84,"column":8},"end":{"line":88,"column":9}},"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":88,"column":9}},{"start":{"line":84,"column":8},"end":{"line":88,"column":9}}],"line":84},"15":{"loc":{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},"type":"if","locations":[{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},{"start":{"line":98,"column":8},"end":{"line":100,"column":9}}],"line":98},"16":{"loc":{"start":{"line":112,"column":8},"end":{"line":114,"column":9}},"type":"if","locations":[{"start":{"line":112,"column":8},"end":{"line":114,"column":9}},{"start":{"line":112,"column":8},"end":{"line":114,"column":9}}],"line":112},"17":{"loc":{"start":{"line":112,"column":12},"end":{"line":112,"column":46}},"type":"binary-expr","locations":[{"start":{"line":112,"column":12},"end":{"line":112,"column":16}},{"start":{"line":112,"column":20},"end":{"line":112,"column":46}}],"line":112},"18":{"loc":{"start":{"line":115,"column":16},"end":{"line":115,"column":26}},"type":"binary-expr","locations":[{"start":{"line":115,"column":16},"end":{"line":115,"column":20}},{"start":{"line":115,"column":24},"end":{"line":115,"column":26}}],"line":115},"19":{"loc":{"start":{"line":121,"column":69},"end":{"line":121,"column":100}},"type":"binary-expr","locations":[{"start":{"line":121,"column":69},"end":{"line":121,"column":82}},{"start":{"line":121,"column":86},"end":{"line":121,"column":100}}],"line":121}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":2,"9":2,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":1,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":5,"44":1,"45":4,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":1},"f":{"0":2,"1":0,"2":0,"3":0,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":5,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0},"b":{"0":[1,0],"1":[1,1],"2":[0,1],"3":[1,1],"4":[1,0],"5":[1,1],"6":[0,1],"7":[1,1],"8":[1,0],"9":[1,1],"10":[0,1],"11":[1,1],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[1,4],"17":[5,4],"18":[4,1],"19":[0,0]},"inputSourceMap":{"version":3,"file":"plugin.js","sourceRoot":"","sources":["plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import * as assert from 'assert'\nimport * as _ from 'lodash'\nimport * as util from 'util'\n\nimport Policy from './aws/policy'\nimport Role from './aws/role'\nimport Target from './aws/target'\n\nconst text = {\n INVALID_CONFIGURATION: 'Invalid serverless configuration',\n NO_AUTOSCALING_CONFIG: 'Not Auto Scaling configuration found',\n ONLY_AWS_SUPPORT: 'Only supported for AWS provicer'\n}\n\nclass Plugin {\n public hooks: {}\n\n /**\n * Constructur\n */\n constructor (private serverless: Serverless) {\n this.hooks = {\n 'deploy:compileEvents': this.beforeDeployResources.bind(this)\n }\n }\n\n /**\n * Get the current stage name\n */\n private getStage(): string {\n return this.serverless.getProvider('aws').getStage()\n }\n\n /**\n * Get the current service name\n */\n private getServiceName(): string {\n return this.serverless.service.getServiceName()\n }\n\n /**\n * Validate the request and check if configuration is available\n */\n private validate(): void {\n assert(this.serverless, text.INVALID_CONFIGURATION)\n assert(this.serverless.service, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider.name, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider.name === 'aws', text.ONLY_AWS_SUPPORT)\n\n assert(this.serverless.service.custom, text.NO_AUTOSCALING_CONFIG)\n assert(this.serverless.service.custom.capacities, text.NO_AUTOSCALING_CONFIG)\n }\n\n /**\n * Parse configuration and fill up with default values when needed\n */\n private defaults(config: Capacity): { read: CapacityConfiguration, write: CapacityConfiguration } {\n return {\n read: {\n maximum: config.read && config.read.maximum ? config.read.maximum : 200,\n minimum: config.read && config.read.minimum ? config.read.minimum : 5,\n usage: config.read && config.read.usage ? config.read.usage : 0.75\n },\n write: {\n maximum: config.write && config.write.maximum ? config.write.maximum : 200,\n minimum: config.write && config.write.minimum ? config.write.minimum : 5,\n usage: config.write && config.write.usage ? config.write.usage : 0.75\n }\n }\n }\n\n /**\n * Create CloudFormation resources for table (and optional index)\n */\n private resources(table: string, index: string, config: Capacity): any[] {\n const resources = []\n const service = this.getServiceName()\n const stage = this.getStage()\n const data = this.defaults(config)\n\n // Start processing configuration\n this.serverless.cli.log(\n util.format(' - Building configuration for resource \"table/%s%s\"', table, (index ? ('/index/' + index) : ''))\n )\n\n // Add role to manage Auto Scaling policies\n resources.push(new Role(service, table, index, stage))\n\n // Only add Auto Scaling for read capacity if configuration set is available\n if (config.read) {\n resources.push(\n // ScaleIn/ScaleOut values are fix to 60% usage\n new Policy(service, table, data.read.usage * 100, true, 60, 60, index, stage),\n new Target(service, table, data.read.minimum, data.read.maximum, true, index, stage)\n )\n }\n\n // Only add Auto Scaling for write capacity if configuration set is available\n if (config.write) {\n resources.push(\n // ScaleIn/ScaleOut values are fix to 60% usage\n new Policy(service, table, data.write.usage * 100, false, 60, 60, index, stage),\n new Target(service, table, data.write.minimum, data.write.maximum, false, index, stage)\n )\n }\n\n return resources\n }\n\n /**\n * Generate CloudFormation resources for DynamoDB table and indexes\n */\n private generate(table: string, config: Capacity) {\n let resources: any[] = []\n let lastRessources: any[] = []\n\n const indexes = this.normalize(config.index)\n if (!config.indexOnly) {\n indexes.unshift('') // Horrible solution\n }\n\n indexes.forEach(\n (index: string) => {\n const current = this.resources(table, index, config).map(\n (resource: any) => resource.setDependencies(lastRessources).toJSON()\n )\n\n resources = resources.concat(current)\n lastRessources = current.map((item: any) => Object.keys(item).pop())\n }\n )\n\n return resources\n }\n\n /**\n * Check if parameter is defined and return as array if only a string is provided\n */\n private normalize(data: string|string[]): string[] {\n if (data && data.constructor !== Array) {\n return [ data as string ]\n }\n\n return (data as string[] || []).slice(0)\n }\n\n /**\n * Process the provided configuration\n */\n private process() {\n this.serverless.service.custom.capacities.filter(\n (config: Capacity) => !!config.read || !!config.write\n ).forEach(\n (config: Capacity) => this.normalize(config.table).forEach(\n (table: string) => this.generate(table, config).forEach(\n (resource: string) => _.merge(\n this.serverless.service.provider.compiledCloudFormationTemplate.Resources,\n resource\n )\n )\n )\n )\n }\n\n private beforeDeployResources(): Promise<any> {\n return Promise.resolve().then(\n () => this.validate()\n ).then(\n () => this.serverless.cli.log(util.format('Configure DynamoDB Auto Scaling …'))\n ).then(\n () => this.process()\n ).then(\n () => this.serverless.cli.log(util.format('Added DynamoDB Auto Scaling to CloudFormation!'))\n ).catch(\n (err: Error) => this.serverless.cli.log(util.format('Skipping DynamoDB Auto Scaling: %s!', err.message))\n )\n }\n}\n\nmodule.exports = Plugin\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"7170c1b9e29b6f8fd8be8ce3e31aa9193fa98b6d"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/names.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/names.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":26}},"2":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"3":{"start":{"line":6,"column":4},"end":{"line":6,"column":56}},"4":{"start":{"line":8,"column":0},"end":{"line":8,"column":22}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":73}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":28}},"7":{"start":{"line":14,"column":4},"end":{"line":14,"column":130}},"8":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"9":{"start":{"line":18,"column":4},"end":{"line":18,"column":108}},"10":{"start":{"line":20,"column":0},"end":{"line":20,"column":32}},"11":{"start":{"line":22,"column":4},"end":{"line":22,"column":106}},"12":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}},"13":{"start":{"line":26,"column":4},"end":{"line":26,"column":129}},"14":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"15":{"start":{"line":30,"column":4},"end":{"line":30,"column":88}},"16":{"start":{"line":32,"column":0},"end":{"line":32,"column":24}},"17":{"start":{"line":34,"column":4},"end":{"line":34,"column":106}},"18":{"start":{"line":36,"column":0},"end":{"line":36,"column":20}}},"fnMap":{"0":{"name":"clean","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":14}},"loc":{"start":{"line":5,"column":22},"end":{"line":7,"column":1}},"line":5},"1":{"name":"truncate","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":17}},"loc":{"start":{"line":9,"column":25},"end":{"line":11,"column":1}},"line":9},"2":{"name":"policyScale","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":57},"end":{"line":15,"column":1}},"line":13},"3":{"name":"policyRole","decl":{"start":{"line":17,"column":9},"end":{"line":17,"column":19}},"loc":{"start":{"line":17,"column":50},"end":{"line":19,"column":1}},"line":17},"4":{"name":"dimension","decl":{"start":{"line":21,"column":9},"end":{"line":21,"column":18}},"loc":{"start":{"line":21,"column":32},"end":{"line":23,"column":1}},"line":21},"5":{"name":"target","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":15}},"loc":{"start":{"line":25,"column":52},"end":{"line":27,"column":1}},"line":25},"6":{"name":"metric","decl":{"start":{"line":29,"column":9},"end":{"line":29,"column":15}},"loc":{"start":{"line":29,"column":22},"end":{"line":31,"column":1}},"line":29},"7":{"name":"role","decl":{"start":{"line":33,"column":9},"end":{"line":33,"column":13}},"loc":{"start":{"line":33,"column":44},"end":{"line":35,"column":1}},"line":33}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":11},"end":{"line":10,"column":72}},"type":"cond-expr","locations":[{"start":{"line":10,"column":32},"end":{"line":10,"column":37}},{"start":{"line":10,"column":40},"end":{"line":10,"column":72}}],"line":10},"1":{"loc":{"start":{"line":14,"column":71},"end":{"line":14,"column":94}},"type":"cond-expr","locations":[{"start":{"line":14,"column":78},"end":{"line":14,"column":84}},{"start":{"line":14,"column":87},"end":{"line":14,"column":94}}],"line":14},"2":{"loc":{"start":{"line":14,"column":103},"end":{"line":14,"column":114}},"type":"binary-expr","locations":[{"start":{"line":14,"column":103},"end":{"line":14,"column":108}},{"start":{"line":14,"column":112},"end":{"line":14,"column":114}}],"line":14},"3":{"loc":{"start":{"line":14,"column":116},"end":{"line":14,"column":127}},"type":"binary-expr","locations":[{"start":{"line":14,"column":116},"end":{"line":14,"column":121}},{"start":{"line":14,"column":125},"end":{"line":14,"column":127}}],"line":14},"4":{"loc":{"start":{"line":18,"column":81},"end":{"line":18,"column":92}},"type":"binary-expr","locations":[{"start":{"line":18,"column":81},"end":{"line":18,"column":86}},{"start":{"line":18,"column":90},"end":{"line":18,"column":92}}],"line":18},"5":{"loc":{"start":{"line":18,"column":94},"end":{"line":18,"column":105}},"type":"binary-expr","locations":[{"start":{"line":18,"column":94},"end":{"line":18,"column":99}},{"start":{"line":18,"column":103},"end":{"line":18,"column":105}}],"line":18},"6":{"loc":{"start":{"line":22,"column":54},"end":{"line":22,"column":79}},"type":"cond-expr","locations":[{"start":{"line":22,"column":62},"end":{"line":22,"column":69}},{"start":{"line":22,"column":72},"end":{"line":22,"column":79}}],"line":22},"7":{"loc":{"start":{"line":22,"column":81},"end":{"line":22,"column":104}},"type":"cond-expr","locations":[{"start":{"line":22,"column":88},"end":{"line":22,"column":94}},{"start":{"line":22,"column":97},"end":{"line":22,"column":104}}],"line":22},"8":{"loc":{"start":{"line":26,"column":70},"end":{"line":26,"column":93}},"type":"cond-expr","locations":[{"start":{"line":26,"column":77},"end":{"line":26,"column":83}},{"start":{"line":26,"column":86},"end":{"line":26,"column":93}}],"line":26},"9":{"loc":{"start":{"line":26,"column":102},"end":{"line":26,"column":113}},"type":"binary-expr","locations":[{"start":{"line":26,"column":102},"end":{"line":26,"column":107}},{"start":{"line":26,"column":111},"end":{"line":26,"column":113}}],"line":26},"10":{"loc":{"start":{"line":26,"column":115},"end":{"line":26,"column":126}},"type":"binary-expr","locations":[{"start":{"line":26,"column":115},"end":{"line":26,"column":120}},{"start":{"line":26,"column":124},"end":{"line":26,"column":126}}],"line":26},"11":{"loc":{"start":{"line":30,"column":62},"end":{"line":30,"column":85}},"type":"cond-expr","locations":[{"start":{"line":30,"column":69},"end":{"line":30,"column":75}},{"start":{"line":30,"column":78},"end":{"line":30,"column":85}}],"line":30},"12":{"loc":{"start":{"line":34,"column":79},"end":{"line":34,"column":90}},"type":"binary-expr","locations":[{"start":{"line":34,"column":79},"end":{"line":34,"column":84}},{"start":{"line":34,"column":88},"end":{"line":34,"column":90}}],"line":34},"13":{"loc":{"start":{"line":34,"column":92},"end":{"line":34,"column":103}},"type":"binary-expr","locations":[{"start":{"line":34,"column":92},"end":{"line":34,"column":97}},{"start":{"line":34,"column":101},"end":{"line":34,"column":103}}],"line":34}},"s":{"0":5,"1":5,"2":5,"3":46,"4":5,"5":46,"6":5,"7":10,"8":5,"9":3,"10":5,"11":6,"12":5,"13":12,"14":5,"15":6,"16":5,"17":10,"18":5},"f":{"0":46,"1":46,"2":10,"3":3,"4":6,"5":12,"6":6,"7":10},"b":{"0":[44,2],"1":[5,5],"2":[10,10],"3":[10,10],"4":[3,3],"5":[3,3],"6":[0,6],"7":[3,3],"8":[6,6],"9":[12,12],"10":[12,12],"11":[3,3],"12":[10,9],"13":[10,9]},"inputSourceMap":{"version":3,"file":"names.js","sourceRoot":"","sources":["names.ts"],"names":[],"mappings":";;AAAA,2BAA0B;AAC1B,6BAA4B;AAE5B,eAAsB,KAAa;IACjC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAA;AACrD,CAAC;AAFD,sBAEC;AAED,kBAAyB,KAAa;IACpC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;AACtE,CAAC;AAFD,4BAEC;AAED,qBAA4B,OAAe,EAAE,KAAa,EAAE,IAAa,EAAE,KAAc,EAAE,KAAc;IACvG,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,+BAA+B,EAC/B,OAAO,EACP,IAAI,GAAG,MAAM,GAAG,OAAO,EACvB,KAAK,EACL,KAAK,IAAI,EAAE,EACX,KAAK,IAAI,EAAE,CACZ,CACF,CAAA;AACH,CAAC;AAXD,kCAWC;AAED,oBAA2B,OAAe,EAAE,KAAa,EAAE,KAAc,EAAE,KAAc;IACvF,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,kCAAkC,EAClC,OAAO,EACP,KAAK,EACL,KAAK,IAAI,EAAE,EACX,KAAK,IAAI,EAAE,CACZ,CACF,CAAA;AACH,CAAC;AAVD,gCAUC;AAED,mBAA0B,IAAa,EAAE,KAAc;IACrD,MAAM,CAAC,IAAI,CAAC,MAAM,CAChB,6BAA6B,EAC7B,KAAK,GAAG,OAAO,GAAG,OAAO,EACzB,IAAI,GAAG,MAAM,GAAG,OAAO,CACxB,CAAA;AACH,CAAC;AAND,8BAMC;AAED,gBAAuB,OAAe,EAAE,KAAa,EAAE,IAAa,EAAE,KAAc,EAAE,KAAc;IAClG,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,8BAA8B,EAC9B,OAAO,EACP,IAAI,GAAG,MAAM,GAAG,OAAO,EACvB,KAAK,EACL,KAAK,IAAI,EAAE,EACX,KAAK,IAAI,EAAE,CACZ,CACF,CAAA;AACH,CAAC;AAXD,wBAWC;AAED,gBAAuB,IAAa;IAClC,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,+BAA+B,EAC/B,IAAI,GAAG,MAAM,GAAG,OAAO,CACxB,CACF,CAAA;AACH,CAAC;AAPD,wBAOC;AAED,cAAqB,OAAe,EAAE,KAAa,EAAE,KAAc,EAAE,KAAc;IACjF,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,gCAAgC,EAChC,OAAO,EACP,KAAK,EACL,KAAK,IAAI,EAAE,EACX,KAAK,IAAI,EAAE,CACZ,CACF,CAAA;AACH,CAAC;AAVD,oBAUC","sourcesContent":["import * as md5 from 'md5'\nimport * as util from 'util'\n\nexport function clean(input: string): string {\n return truncate(input.replace(/[^a-z0-9+]+/gi, ''))\n}\n\nexport function truncate(input: string): string {\n return input.length <= 64 ? input : input.substr(0, 32) + md5(input)\n}\n\nexport function policyScale(service: string, table: string, read: boolean, index?: string, stage?: string): string {\n return clean(\n util.format(\n '%sTable%sScalingPolicy-%s%s%s',\n service,\n read ? 'Read' : 'Write',\n table,\n index || '',\n stage || ''\n )\n )\n}\n\nexport function policyRole(service: string, table: string, index?: string, stage?: string): string {\n return clean(\n util.format(\n '%sDynamoDBAutoscalePolicy-%s%s%s',\n service,\n table,\n index || '',\n stage || ''\n )\n )\n}\n\nexport function dimension(read: boolean, index: boolean): string {\n return util.format(\n 'dynamodb:%s:%sCapacityUnits',\n index ? 'index' : 'table',\n read ? 'Read' : 'Write'\n )\n}\n\nexport function target(service: string, table: string, read: boolean, index?: string, stage?: string): string {\n return clean(\n util.format(\n '%sAutoScalingTarget%s-%s%s%s',\n service,\n read ? 'Read' : 'Write',\n table,\n index || '',\n stage || ''\n )\n )\n}\n\nexport function metric(read: boolean): string {\n return clean(\n util.format(\n 'DynamoDB%sCapacityUtilization',\n read ? 'Read' : 'Write'\n )\n )\n}\n\nexport function role(service: string, table: string, index?: string, stage?: string): string {\n return clean(\n util.format(\n '%sDynamoDBAutoscaleRole-%s%s%s',\n service,\n table,\n index || '',\n stage || ''\n )\n )\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"0d93213574d24db41d9121240e66c091e4f986ca"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/policy.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/policy.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":32}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":31}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":27}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":27}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":25}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":31}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":33}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":27}},"9":{"start":{"line":13,"column":8},"end":{"line":13,"column":27}},"10":{"start":{"line":14,"column":8},"end":{"line":14,"column":31}},"11":{"start":{"line":15,"column":8},"end":{"line":15,"column":65}},"12":{"start":{"line":18,"column":8},"end":{"line":18,"column":33}},"13":{"start":{"line":19,"column":8},"end":{"line":19,"column":20}},"14":{"start":{"line":22,"column":27},"end":{"line":22,"column":50}},"15":{"start":{"line":23,"column":32},"end":{"line":23,"column":110}},"16":{"start":{"line":24,"column":27},"end":{"line":24,"column":100}},"17":{"start":{"line":25,"column":29},"end":{"line":25,"column":79}},"18":{"start":{"line":26,"column":8},"end":{"line":44,"column":10}},"19":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":78},"end":{"line":16,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":26},"end":{"line":20,"column":5}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":5}},"loc":{"start":{"line":21,"column":13},"end":{"line":45,"column":5}},"line":21}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":0,"13":0,"14":2,"15":2,"16":2,"17":2,"18":2,"19":2},"f":{"0":2,"1":0,"2":2},"b":{},"inputSourceMap":{"version":3,"file":"policy.js","sourceRoot":"","sources":["policy.ts"],"names":[],"mappings":";;AAAA,iCAAgC;AAEhC;IAIE,YACU,OAAe,EACf,KAAa,EACb,KAAa,EACb,IAAa,EACb,OAAe,EACf,QAAgB,EAChB,KAAa,EACb,KAAa;QAPb,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QACb,SAAI,GAAJ,IAAI,CAAS;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,aAAQ,GAAR,QAAQ,CAAQ;QAChB,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QAXf,iBAAY,GAAa,EAAE,CAAA;QAC3B,SAAI,GAAW,4CAA4C,CAAA;IAW/D,CAAC;IAEE,eAAe,CAAC,IAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,MAAM,CAAC,IAAI,CAAA;IACb,CAAC;IAEM,MAAM;QACX,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACtG,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAE5F,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAExE,MAAM,CAAC;YACL,CAAC,eAAe,CAAC,EAAE;gBACjB,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE;oBACV,UAAU,EAAE,eAAe;oBAC3B,UAAU,EAAE,uBAAuB;oBACnC,eAAe,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE;oBACpC,wCAAwC,EAAE;wBACxC,6BAA6B,EAAE;4BAC7B,oBAAoB,EAAE,UAAU;yBACjC;wBACD,eAAe,EAAE,IAAI,CAAC,OAAO;wBAC7B,gBAAgB,EAAE,IAAI,CAAC,QAAQ;wBAC/B,WAAW,EAAE,IAAI,CAAC,KAAK;qBACxB;iBACF;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAhDD,yBAgDC","sourcesContent":["import * as names from './names'\n\nexport default class Policy {\n private dependencies: string[] = []\n private type: string = 'AWS::ApplicationAutoScaling::ScalingPolicy'\n\n constructor (\n private service: string,\n private table: string,\n private value: number,\n private read: boolean,\n private scaleIn: number,\n private scaleOut: number,\n private index: string,\n private stage: string\n ) { }\n\n public setDependencies(list: string[]): Policy {\n this.dependencies = list\n\n return this\n }\n\n public toJSON(): any {\n const nameMetric = names.metric(this.read)\n const nameScalePolicy = names.policyScale(this.service, this.table, this.read, this.index, this.stage)\n const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage)\n\n const dependencies = [this.table, nameTarget ].concat(this.dependencies)\n\n return {\n [nameScalePolicy]: {\n DependsOn: dependencies,\n Properties: {\n PolicyName: nameScalePolicy,\n PolicyType: 'TargetTrackingScaling',\n ScalingTargetId: { Ref: nameTarget },\n TargetTrackingScalingPolicyConfiguration: {\n PredefinedMetricSpecification: {\n PredefinedMetricType: nameMetric\n },\n ScaleInCooldown: this.scaleIn,\n ScaleOutCooldown: this.scaleOut,\n TargetValue: this.value\n }\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"334829cadced5fc00817e52fc02bf8cb14aa93aa"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/role.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/role.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":32}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":31}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":27}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":27}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":27}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":31}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":37}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":36}},"9":{"start":{"line":13,"column":8},"end":{"line":25,"column":10}},"10":{"start":{"line":28,"column":8},"end":{"line":28,"column":33}},"11":{"start":{"line":29,"column":8},"end":{"line":29,"column":20}},"12":{"start":{"line":32,"column":25},"end":{"line":32,"column":85}},"13":{"start":{"line":33,"column":31},"end":{"line":33,"column":97}},"14":{"start":{"line":34,"column":29},"end":{"line":34,"column":67}},"15":{"start":{"line":35,"column":26},"end":{"line":37,"column":9}},"16":{"start":{"line":38,"column":25},"end":{"line":40,"column":9}},"17":{"start":{"line":41,"column":8},"end":{"line":67,"column":10}},"18":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":46},"end":{"line":26,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":27,"column":4},"end":{"line":27,"column":5}},"loc":{"start":{"line":27,"column":26},"end":{"line":30,"column":5}},"line":27},"2":{"name":"(anonymous_2)","decl":{"start":{"line":31,"column":4},"end":{"line":31,"column":5}},"loc":{"start":{"line":31,"column":13},"end":{"line":68,"column":5}},"line":31}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":0,"11":0,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2},"f":{"0":2,"1":0,"2":2},"b":{},"inputSourceMap":{"version":3,"file":"role.js","sourceRoot":"","sources":["role.ts"],"names":[],"mappings":";;AAAA,iCAAgC;AAEhC;IAkBE,YACU,OAAe,EACf,KAAa,EACb,KAAa,EACb,KAAa;QAHb,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QArBf,iBAAY,GAAa,EAAE,CAAA;QAC3B,SAAI,GAAW,gBAAgB,CAAA;QAC/B,YAAO,GAAW,YAAY,CAAA;QAC9B,YAAO,GAAG;YAChB,UAAU,EAAE;gBACV,2BAA2B;gBAC3B,2BAA2B;gBAC3B,yBAAyB;gBACzB,gCAAgC;gBAChC,0BAA0B;aAC3B;YACD,QAAQ,EAAE;gBACR,wBAAwB;gBACxB,sBAAsB;aACvB;SACF,CAAA;IAOG,CAAC;IAEE,eAAe,CAAC,IAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,MAAM,CAAC,IAAI,CAAA;IACb,CAAC;IAEM,MAAM;QACX,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAEzF,MAAM,YAAY,GAAG,CAAE,IAAI,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC7D,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,uCAAuC;SACjD,CAAA;QACD,MAAM,QAAQ,GAAG;YACf,UAAU,EAAE,CAAE,EAAE,EAAE,CAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAE,CAAE;SACzG,CAAA;QAED,MAAM,CAAC;YACL,CAAC,QAAQ,CAAC,EAAE;gBACV,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE;oBACV,wBAAwB,EAAE;wBACxB,SAAS,EAAE;4BACT,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE;yBACpE;wBACD,OAAO,EAAE,IAAI,CAAC,OAAO;qBACtB;oBACD,QAAQ,EAAE;wBACR;4BACE,cAAc,EAAE;gCACd,SAAS,EAAE;oCACT,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE;oCACnE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;iCACvE;gCACD,OAAO,EAAE,IAAI,CAAC,OAAO;6BACtB;4BACD,UAAU,EAAE,cAAc;yBAC3B;qBACF;oBACD,QAAQ,EAAE,QAAQ;iBACnB;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAvED,uBAuEC","sourcesContent":["import * as names from './names'\n\nexport default class Role {\n private dependencies: string[] = []\n private type: string = 'AWS::IAM::Role'\n private version: string = '2012-10-17'\n private actions = {\n CloudWatch: [\n 'cloudwatch:PutMetricAlarm',\n 'cloudwatch:DescribeAlarms',\n 'cloudwatch:DeleteAlarms',\n 'cloudwatch:GetMetricStatistics',\n 'cloudwatch:SetAlarmState'\n ],\n DynamoDB: [\n 'dynamodb:DescribeTable',\n 'dynamodb:UpdateTable'\n ]\n }\n\n constructor (\n private service: string,\n private table: string,\n private index: string,\n private stage: string\n ) { }\n\n public setDependencies(list: string[]): Role {\n this.dependencies = list\n\n return this\n }\n\n public toJSON(): any {\n const nameRole = names.role(this.service, this.table, this.index, this.stage)\n const namePolicyRole = names.policyRole(this.service, this.table, this.index, this.stage)\n\n const dependencies = [ this.table ].concat(this.dependencies)\n const principal = {\n Service: 'application-autoscaling.amazonaws.com'\n }\n const resource = {\n 'Fn::Join': [ '', [ 'arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.table } ] ]\n }\n\n return {\n [nameRole]: {\n DependsOn: dependencies,\n Properties: {\n AssumeRolePolicyDocument: {\n Statement: [\n { Action: 'sts:AssumeRole', Effect: 'Allow', Principal: principal }\n ],\n Version: this.version\n },\n Policies: [\n {\n PolicyDocument: {\n Statement: [\n { Action: this.actions.CloudWatch, Effect: 'Allow', Resource: '*' },\n { Action: this.actions.DynamoDB, Effect: 'Allow', Resource: resource }\n ],\n Version: this.version\n },\n PolicyName: namePolicyRole\n }\n ],\n RoleName: nameRole\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"d1cc4e5acd6e9476f96e0953fb03434f80c6089a"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/target.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/target.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":32}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":31}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":27}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":23}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":23}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":25}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":27}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":27}},"9":{"start":{"line":13,"column":8},"end":{"line":13,"column":31}},"10":{"start":{"line":14,"column":8},"end":{"line":14,"column":66}},"11":{"start":{"line":17,"column":8},"end":{"line":17,"column":33}},"12":{"start":{"line":18,"column":8},"end":{"line":18,"column":20}},"13":{"start":{"line":21,"column":25},"end":{"line":21,"column":56}},"14":{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},"15":{"start":{"line":23,"column":12},"end":{"line":23,"column":49}},"16":{"start":{"line":25,"column":27},"end":{"line":25,"column":100}},"17":{"start":{"line":26,"column":25},"end":{"line":26,"column":85}},"18":{"start":{"line":27,"column":30},"end":{"line":27,"column":70}},"19":{"start":{"line":28,"column":29},"end":{"line":28,"column":77}},"20":{"start":{"line":29,"column":8},"end":{"line":42,"column":10}},"21":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":62},"end":{"line":15,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":5}},"loc":{"start":{"line":16,"column":26},"end":{"line":19,"column":5}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":4},"end":{"line":20,"column":5}},"loc":{"start":{"line":20,"column":13},"end":{"line":43,"column":5}},"line":20}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},"type":"if","locations":[{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},{"start":{"line":22,"column":8},"end":{"line":24,"column":9}}],"line":22}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":0,"12":0,"13":2,"14":2,"15":0,"16":2,"17":2,"18":2,"19":2,"20":2,"21":2},"f":{"0":2,"1":0,"2":2},"b":{"0":[0,2]},"inputSourceMap":{"version":3,"file":"target.js","sourceRoot":"","sources":["target.ts"],"names":[],"mappings":";;AAAA,iCAAgC;AAEhC;IAIE,YACU,OAAe,EACf,KAAa,EACb,GAAW,EACX,GAAW,EACX,IAAa,EACb,KAAc,EACd,KAAc;QANd,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAQ;QACX,QAAG,GAAH,GAAG,CAAQ;QACX,SAAI,GAAJ,IAAI,CAAS;QACb,UAAK,GAAL,KAAK,CAAS;QACd,UAAK,GAAL,KAAK,CAAS;QAVhB,iBAAY,GAAa,EAAE,CAAA;QAC3B,SAAI,GAAW,6CAA6C,CAAA;IAUhE,CAAC;IAEE,eAAe,CAAC,IAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,MAAM,CAAC,IAAI,CAAA;IACb,CAAC;IAEM,MAAM;QACX,MAAM,QAAQ,GAAG,CAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAE,CAAA;QAElD,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC5F,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7E,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAE9D,MAAM,YAAY,GAAG,CAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAEvE,MAAM,CAAC;YACL,CAAC,UAAU,CAAC,EAAE;gBACZ,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE;oBACV,WAAW,EAAE,IAAI,CAAC,GAAG;oBACrB,WAAW,EAAE,IAAI,CAAC,GAAG;oBACrB,UAAU,EAAE,EAAE,UAAU,EAAE,CAAE,EAAE,EAAE,QAAQ,CAAE,EAAE;oBAC5C,OAAO,EAAE,EAAE,YAAY,EAAE,CAAE,QAAQ,EAAE,KAAK,CAAE,EAAE;oBAC9C,iBAAiB,EAAE,aAAa;oBAChC,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAhDD,yBAgDC","sourcesContent":["import * as names from './names'\n\nexport default class Target {\n private dependencies: string[] = []\n private type: string = 'AWS::ApplicationAutoScaling::ScalableTarget'\n\n constructor (\n private service: string,\n private table: string,\n private min: number,\n private max: number,\n private read: boolean,\n private index?: string,\n private stage?: string\n ) { }\n\n public setDependencies(list: string[]): Target {\n this.dependencies = list\n\n return this\n }\n\n public toJSON(): any {\n const resource = [ 'table/', { Ref: this.table } ]\n\n if (this.index) {\n resource.push('/index/', this.index)\n }\n\n const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage)\n const nameRole = names.role(this.service, this.table, this.index, this.stage)\n const nameDimension = names.dimension(this.read, !!this.index)\n\n const dependencies = [ this.table, nameRole ].concat(this.dependencies)\n\n return {\n [nameTarget]: {\n DependsOn: dependencies,\n Properties: {\n MaxCapacity: this.max,\n MinCapacity: this.min,\n ResourceId: { 'Fn::Join': [ '', resource ] },\n RoleARN: { 'Fn::GetAtt': [ nameRole, 'Arn' ] },\n ScalableDimension: nameDimension,\n ServiceNamespace: 'dynamodb'\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"73f5453518bcaa2f508bf4120400b124ba2bfa72"} | ||
{"/home/ubuntu/serverless-dynamodb-autoscaling/src/plugin.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/plugin.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":15},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":10},"end":{"line":4,"column":27}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"4":{"start":{"line":6,"column":17},"end":{"line":6,"column":40}},"5":{"start":{"line":7,"column":15},"end":{"line":7,"column":36}},"6":{"start":{"line":8,"column":17},"end":{"line":8,"column":40}},"7":{"start":{"line":9,"column":13},"end":{"line":17,"column":1}},"8":{"start":{"line":23,"column":8},"end":{"line":23,"column":37}},"9":{"start":{"line":24,"column":8},"end":{"line":26,"column":10}},"10":{"start":{"line":32,"column":8},"end":{"line":32,"column":61}},"11":{"start":{"line":38,"column":8},"end":{"line":38,"column":56}},"12":{"start":{"line":44,"column":8},"end":{"line":44,"column":62}},"13":{"start":{"line":50,"column":8},"end":{"line":50,"column":60}},"14":{"start":{"line":51,"column":8},"end":{"line":51,"column":68}},"15":{"start":{"line":52,"column":8},"end":{"line":52,"column":77}},"16":{"start":{"line":53,"column":8},"end":{"line":53,"column":82}},"17":{"start":{"line":54,"column":8},"end":{"line":54,"column":87}},"18":{"start":{"line":55,"column":8},"end":{"line":55,"column":75}},"19":{"start":{"line":56,"column":8},"end":{"line":56,"column":86}},"20":{"start":{"line":62,"column":8},"end":{"line":73,"column":10}},"21":{"start":{"line":79,"column":21},"end":{"line":79,"column":42}},"22":{"start":{"line":80,"column":24},"end":{"line":86,"column":9}},"23":{"start":{"line":88,"column":8},"end":{"line":88,"column":107}},"24":{"start":{"line":90,"column":26},"end":{"line":92,"column":9}},"25":{"start":{"line":94,"column":8},"end":{"line":96,"column":9}},"26":{"start":{"line":95,"column":12},"end":{"line":95,"column":76}},"27":{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},"28":{"start":{"line":99,"column":12},"end":{"line":99,"column":77}},"29":{"start":{"line":101,"column":8},"end":{"line":101,"column":25}},"30":{"start":{"line":104,"column":8},"end":{"line":107,"column":10}},"31":{"start":{"line":113,"column":24},"end":{"line":113,"column":26}},"32":{"start":{"line":114,"column":29},"end":{"line":114,"column":31}},"33":{"start":{"line":115,"column":24},"end":{"line":115,"column":52}},"34":{"start":{"line":116,"column":8},"end":{"line":118,"column":9}},"35":{"start":{"line":117,"column":12},"end":{"line":117,"column":32}},"36":{"start":{"line":119,"column":8},"end":{"line":123,"column":11}},"37":{"start":{"line":120,"column":28},"end":{"line":120,"column":133}},"38":{"start":{"line":120,"column":83},"end":{"line":120,"column":132}},"39":{"start":{"line":121,"column":12},"end":{"line":121,"column":50}},"40":{"start":{"line":122,"column":12},"end":{"line":122,"column":76}},"41":{"start":{"line":122,"column":51},"end":{"line":122,"column":74}},"42":{"start":{"line":124,"column":8},"end":{"line":124,"column":25}},"43":{"start":{"line":130,"column":8},"end":{"line":132,"column":9}},"44":{"start":{"line":131,"column":12},"end":{"line":131,"column":26}},"45":{"start":{"line":133,"column":8},"end":{"line":133,"column":37}},"46":{"start":{"line":139,"column":8},"end":{"line":139,"column":317}},"47":{"start":{"line":139,"column":69},"end":{"line":139,"column":100}},"48":{"start":{"line":139,"column":122},"end":{"line":139,"column":315}},"49":{"start":{"line":139,"column":170},"end":{"line":139,"column":314}},"50":{"start":{"line":139,"column":221},"end":{"line":139,"column":313}},"51":{"start":{"line":142,"column":8},"end":{"line":142,"column":298}},"52":{"start":{"line":142,"column":44},"end":{"line":142,"column":59}},"53":{"start":{"line":142,"column":72},"end":{"line":142,"column":124}},"54":{"start":{"line":142,"column":137},"end":{"line":142,"column":151}},"55":{"start":{"line":142,"column":164},"end":{"line":142,"column":215}},"56":{"start":{"line":142,"column":232},"end":{"line":142,"column":296}},"57":{"start":{"line":145,"column":0},"end":{"line":145,"column":24}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":22,"column":4},"end":{"line":22,"column":5}},"loc":{"start":{"line":22,"column":28},"end":{"line":27,"column":5}},"line":22},"1":{"name":"(anonymous_1)","decl":{"start":{"line":31,"column":4},"end":{"line":31,"column":5}},"loc":{"start":{"line":31,"column":15},"end":{"line":33,"column":5}},"line":31},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":4},"end":{"line":37,"column":5}},"loc":{"start":{"line":37,"column":21},"end":{"line":39,"column":5}},"line":37},"3":{"name":"(anonymous_3)","decl":{"start":{"line":43,"column":4},"end":{"line":43,"column":5}},"loc":{"start":{"line":43,"column":16},"end":{"line":45,"column":5}},"line":43},"4":{"name":"(anonymous_4)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":5}},"loc":{"start":{"line":49,"column":15},"end":{"line":57,"column":5}},"line":49},"5":{"name":"(anonymous_5)","decl":{"start":{"line":61,"column":4},"end":{"line":61,"column":5}},"loc":{"start":{"line":61,"column":21},"end":{"line":74,"column":5}},"line":61},"6":{"name":"(anonymous_6)","decl":{"start":{"line":78,"column":4},"end":{"line":78,"column":5}},"loc":{"start":{"line":78,"column":36},"end":{"line":102,"column":5}},"line":78},"7":{"name":"(anonymous_7)","decl":{"start":{"line":103,"column":4},"end":{"line":103,"column":5}},"loc":{"start":{"line":103,"column":44},"end":{"line":108,"column":5}},"line":103},"8":{"name":"(anonymous_8)","decl":{"start":{"line":112,"column":4},"end":{"line":112,"column":5}},"loc":{"start":{"line":112,"column":28},"end":{"line":125,"column":5}},"line":112},"9":{"name":"(anonymous_9)","decl":{"start":{"line":119,"column":24},"end":{"line":119,"column":25}},"loc":{"start":{"line":119,"column":35},"end":{"line":123,"column":9}},"line":119},"10":{"name":"(anonymous_10)","decl":{"start":{"line":120,"column":69},"end":{"line":120,"column":70}},"loc":{"start":{"line":120,"column":83},"end":{"line":120,"column":132}},"line":120},"11":{"name":"(anonymous_11)","decl":{"start":{"line":122,"column":41},"end":{"line":122,"column":42}},"loc":{"start":{"line":122,"column":51},"end":{"line":122,"column":74}},"line":122},"12":{"name":"(anonymous_12)","decl":{"start":{"line":129,"column":4},"end":{"line":129,"column":5}},"loc":{"start":{"line":129,"column":20},"end":{"line":134,"column":5}},"line":129},"13":{"name":"(anonymous_13)","decl":{"start":{"line":138,"column":4},"end":{"line":138,"column":5}},"loc":{"start":{"line":138,"column":14},"end":{"line":140,"column":5}},"line":138},"14":{"name":"(anonymous_14)","decl":{"start":{"line":139,"column":57},"end":{"line":139,"column":58}},"loc":{"start":{"line":139,"column":69},"end":{"line":139,"column":100}},"line":139},"15":{"name":"(anonymous_15)","decl":{"start":{"line":139,"column":110},"end":{"line":139,"column":111}},"loc":{"start":{"line":139,"column":122},"end":{"line":139,"column":315}},"line":139},"16":{"name":"(anonymous_16)","decl":{"start":{"line":139,"column":159},"end":{"line":139,"column":160}},"loc":{"start":{"line":139,"column":170},"end":{"line":139,"column":314}},"line":139},"17":{"name":"(anonymous_17)","decl":{"start":{"line":139,"column":207},"end":{"line":139,"column":208}},"loc":{"start":{"line":139,"column":221},"end":{"line":139,"column":313}},"line":139},"18":{"name":"(anonymous_18)","decl":{"start":{"line":141,"column":4},"end":{"line":141,"column":5}},"loc":{"start":{"line":141,"column":28},"end":{"line":143,"column":5}},"line":141},"19":{"name":"(anonymous_19)","decl":{"start":{"line":142,"column":38},"end":{"line":142,"column":39}},"loc":{"start":{"line":142,"column":44},"end":{"line":142,"column":59}},"line":142},"20":{"name":"(anonymous_20)","decl":{"start":{"line":142,"column":66},"end":{"line":142,"column":67}},"loc":{"start":{"line":142,"column":72},"end":{"line":142,"column":124}},"line":142},"21":{"name":"(anonymous_21)","decl":{"start":{"line":142,"column":131},"end":{"line":142,"column":132}},"loc":{"start":{"line":142,"column":137},"end":{"line":142,"column":151}},"line":142},"22":{"name":"(anonymous_22)","decl":{"start":{"line":142,"column":158},"end":{"line":142,"column":159}},"loc":{"start":{"line":142,"column":164},"end":{"line":142,"column":215}},"line":142},"23":{"name":"(anonymous_23)","decl":{"start":{"line":142,"column":223},"end":{"line":142,"column":224}},"loc":{"start":{"line":142,"column":232},"end":{"line":142,"column":296}},"line":142}},"branchMap":{"0":{"loc":{"start":{"line":64,"column":25},"end":{"line":64,"column":87}},"type":"cond-expr","locations":[{"start":{"line":64,"column":62},"end":{"line":64,"column":81}},{"start":{"line":64,"column":84},"end":{"line":64,"column":87}}],"line":64},"1":{"loc":{"start":{"line":64,"column":25},"end":{"line":64,"column":59}},"type":"binary-expr","locations":[{"start":{"line":64,"column":25},"end":{"line":64,"column":36}},{"start":{"line":64,"column":40},"end":{"line":64,"column":59}}],"line":64},"2":{"loc":{"start":{"line":65,"column":25},"end":{"line":65,"column":85}},"type":"cond-expr","locations":[{"start":{"line":65,"column":62},"end":{"line":65,"column":81}},{"start":{"line":65,"column":84},"end":{"line":65,"column":85}}],"line":65},"3":{"loc":{"start":{"line":65,"column":25},"end":{"line":65,"column":59}},"type":"binary-expr","locations":[{"start":{"line":65,"column":25},"end":{"line":65,"column":36}},{"start":{"line":65,"column":40},"end":{"line":65,"column":59}}],"line":65},"4":{"loc":{"start":{"line":66,"column":23},"end":{"line":66,"column":82}},"type":"cond-expr","locations":[{"start":{"line":66,"column":58},"end":{"line":66,"column":75}},{"start":{"line":66,"column":78},"end":{"line":66,"column":82}}],"line":66},"5":{"loc":{"start":{"line":66,"column":23},"end":{"line":66,"column":55}},"type":"binary-expr","locations":[{"start":{"line":66,"column":23},"end":{"line":66,"column":34}},{"start":{"line":66,"column":38},"end":{"line":66,"column":55}}],"line":66},"6":{"loc":{"start":{"line":69,"column":25},"end":{"line":69,"column":90}},"type":"cond-expr","locations":[{"start":{"line":69,"column":64},"end":{"line":69,"column":84}},{"start":{"line":69,"column":87},"end":{"line":69,"column":90}}],"line":69},"7":{"loc":{"start":{"line":69,"column":25},"end":{"line":69,"column":61}},"type":"binary-expr","locations":[{"start":{"line":69,"column":25},"end":{"line":69,"column":37}},{"start":{"line":69,"column":41},"end":{"line":69,"column":61}}],"line":69},"8":{"loc":{"start":{"line":70,"column":25},"end":{"line":70,"column":88}},"type":"cond-expr","locations":[{"start":{"line":70,"column":64},"end":{"line":70,"column":84}},{"start":{"line":70,"column":87},"end":{"line":70,"column":88}}],"line":70},"9":{"loc":{"start":{"line":70,"column":25},"end":{"line":70,"column":61}},"type":"binary-expr","locations":[{"start":{"line":70,"column":25},"end":{"line":70,"column":37}},{"start":{"line":70,"column":41},"end":{"line":70,"column":61}}],"line":70},"10":{"loc":{"start":{"line":71,"column":23},"end":{"line":71,"column":85}},"type":"cond-expr","locations":[{"start":{"line":71,"column":60},"end":{"line":71,"column":78}},{"start":{"line":71,"column":81},"end":{"line":71,"column":85}}],"line":71},"11":{"loc":{"start":{"line":71,"column":23},"end":{"line":71,"column":57}},"type":"binary-expr","locations":[{"start":{"line":71,"column":23},"end":{"line":71,"column":35}},{"start":{"line":71,"column":39},"end":{"line":71,"column":57}}],"line":71},"12":{"loc":{"start":{"line":88,"column":71},"end":{"line":88,"column":103}},"type":"cond-expr","locations":[{"start":{"line":88,"column":80},"end":{"line":88,"column":97}},{"start":{"line":88,"column":101},"end":{"line":88,"column":103}}],"line":88},"13":{"loc":{"start":{"line":94,"column":8},"end":{"line":96,"column":9}},"type":"if","locations":[{"start":{"line":94,"column":8},"end":{"line":96,"column":9}},{"start":{"line":94,"column":8},"end":{"line":96,"column":9}}],"line":94},"14":{"loc":{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},"type":"if","locations":[{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},{"start":{"line":98,"column":8},"end":{"line":100,"column":9}}],"line":98},"15":{"loc":{"start":{"line":116,"column":8},"end":{"line":118,"column":9}},"type":"if","locations":[{"start":{"line":116,"column":8},"end":{"line":118,"column":9}},{"start":{"line":116,"column":8},"end":{"line":118,"column":9}}],"line":116},"16":{"loc":{"start":{"line":130,"column":8},"end":{"line":132,"column":9}},"type":"if","locations":[{"start":{"line":130,"column":8},"end":{"line":132,"column":9}},{"start":{"line":130,"column":8},"end":{"line":132,"column":9}}],"line":130},"17":{"loc":{"start":{"line":130,"column":12},"end":{"line":130,"column":46}},"type":"binary-expr","locations":[{"start":{"line":130,"column":12},"end":{"line":130,"column":16}},{"start":{"line":130,"column":20},"end":{"line":130,"column":46}}],"line":130},"18":{"loc":{"start":{"line":133,"column":16},"end":{"line":133,"column":26}},"type":"binary-expr","locations":[{"start":{"line":133,"column":16},"end":{"line":133,"column":20}},{"start":{"line":133,"column":24},"end":{"line":133,"column":26}}],"line":133},"19":{"loc":{"start":{"line":139,"column":69},"end":{"line":139,"column":100}},"type":"binary-expr","locations":[{"start":{"line":139,"column":69},"end":{"line":139,"column":82}},{"start":{"line":139,"column":86},"end":{"line":139,"column":100}}],"line":139}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":2,"9":2,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":1,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":5,"44":1,"45":4,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":1},"f":{"0":2,"1":0,"2":0,"3":0,"4":0,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":5,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0},"b":{"0":[1,0],"1":[1,1],"2":[0,1],"3":[1,1],"4":[1,0],"5":[1,1],"6":[0,1],"7":[1,1],"8":[1,0],"9":[1,1],"10":[0,1],"11":[1,1],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[1,4],"17":[5,4],"18":[4,1],"19":[0,0]},"inputSourceMap":{"version":3,"file":"plugin.js","sourceRoot":"","sources":["plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import * as assert from 'assert'\nimport * as _ from 'lodash'\nimport * as util from 'util'\n\nimport Policy from './aws/policy'\nimport Role from './aws/role'\nimport Target from './aws/target'\n\nconst text = {\n CLI_DONE: 'Added DynamoDB Auto Scaling to CloudFormation!',\n CLI_RESOURCE: ' - Building configuration for resource \"table/%s%s\"',\n CLI_SKIP: 'Skipping DynamoDB Auto Scaling: %s!',\n CLI_START: 'Configure DynamoDB Auto Scaling …',\n INVALID_CONFIGURATION: 'Invalid serverless configuration',\n NO_AUTOSCALING_CONFIG: 'Not Auto Scaling configuration found',\n ONLY_AWS_SUPPORT: 'Only supported for AWS provicer'\n}\n\ninterface Defaults {\n read: CapacityConfiguration,\n write: CapacityConfiguration\n}\n\nclass Plugin {\n public hooks: {}\n\n /**\n * Constructur\n */\n constructor (private serverless: Serverless) {\n this.hooks = {\n 'before:package:createDeploymentArtifacts': this.beforeDeployResources.bind(this)\n }\n }\n\n /**\n * Get the current stage name\n */\n private getStage(): string {\n return this.serverless.getProvider('aws').getStage()\n }\n\n /**\n * Get the current service name\n */\n private getServiceName(): string {\n return this.serverless.service.getServiceName()\n }\n\n /**\n * Get the current service region\n */\n private getRegion(): string {\n return this.serverless.getProvider('aws').getRegion()\n }\n\n /**\n * Validate the request and check if configuration is available\n */\n private validate(): void {\n assert(this.serverless, text.INVALID_CONFIGURATION)\n assert(this.serverless.service, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider.name, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider.name === 'aws', text.ONLY_AWS_SUPPORT)\n\n assert(this.serverless.service.custom, text.NO_AUTOSCALING_CONFIG)\n assert(this.serverless.service.custom.capacities, text.NO_AUTOSCALING_CONFIG)\n }\n\n /**\n * Parse configuration and fill up with default values when needed\n */\n private defaults(config: Capacity): Defaults {\n return {\n read: {\n maximum: config.read && config.read.maximum ? config.read.maximum : 200,\n minimum: config.read && config.read.minimum ? config.read.minimum : 5,\n usage: config.read && config.read.usage ? config.read.usage : 0.75\n },\n write: {\n maximum: config.write && config.write.maximum ? config.write.maximum : 200,\n minimum: config.write && config.write.minimum ? config.write.minimum : 5,\n usage: config.write && config.write.usage ? config.write.usage : 0.75\n }\n }\n }\n\n /**\n * Create CloudFormation resources for table (and optional index)\n */\n private resources(table: string, index: string, config: Capacity): any[] {\n const data = this.defaults(config)\n\n const options: Options = {\n index,\n region: this.getRegion(),\n service: this.getServiceName(),\n stage: this.getStage(),\n table\n }\n\n // Start processing configuration\n this.serverless.cli.log(\n util.format(text.CLI_RESOURCE, table, (index ? ('/index/' + index) : ''))\n )\n\n // Add role to manage Auto Scaling policies\n const resources: any[] = [\n new Role(options)\n ]\n\n // Only add Auto Scaling for read capacity if configuration set is available\n if (!!config.read) {\n resources.push(...this.getPolicyAndTarget(options, data, true))\n }\n\n // Only add Auto Scaling for write capacity if configuration set is available\n if (!!config.write) {\n resources.push(...this.getPolicyAndTarget(options, data, false))\n }\n\n return resources\n }\n\n private getPolicyAndTarget(options: Options, data: Defaults, read: boolean): any[] {\n return [\n new Policy(options, false, data.read.usage * 100, 60, 60),\n new Target(options, false, data.read.minimum, data.read.maximum)\n ]\n }\n\n /**\n * Generate CloudFormation resources for DynamoDB table and indexes\n */\n private generate(table: string, config: Capacity) {\n let resources: any[] = []\n let lastRessources: any[] = []\n\n const indexes = this.normalize(config.index)\n if (!config.indexOnly) {\n indexes.unshift('') // Horrible solution\n }\n\n indexes.forEach(\n (index: string) => {\n const current = this.resources(table, index, config).map(\n (resource: any) => resource.setDependencies(lastRessources).toJSON()\n )\n\n resources = resources.concat(current)\n lastRessources = current.map((item: any) => Object.keys(item).pop())\n }\n )\n\n return resources\n }\n\n /**\n * Check if parameter is defined and return as array if only a string is provided\n */\n private normalize(data: string|string[]): string[] {\n if (data && data.constructor !== Array) {\n return [ data as string ]\n }\n\n return (data as string[] || []).slice(0)\n }\n\n /**\n * Process the provided configuration\n */\n private process() {\n this.serverless.service.custom.capacities.filter(\n (config: Capacity) => !!config.read || !!config.write\n ).forEach(\n (config: Capacity) => this.normalize(config.table).forEach(\n (table: string) => this.generate(table, config).forEach(\n (resource: string) => _.merge(\n this.serverless.service.provider.compiledCloudFormationTemplate.Resources,\n resource\n )\n )\n )\n )\n }\n\n private beforeDeployResources(): Promise<any> {\n return Promise.resolve().then(\n () => this.validate()\n ).then(\n () => this.serverless.cli.log(util.format(text.CLI_START))\n ).then(\n () => this.process()\n ).then(\n () => this.serverless.cli.log(util.format(text.CLI_DONE))\n ).catch(\n (err: Error) => this.serverless.cli.log(util.format(text.CLI_SKIP, err.message))\n )\n }\n}\n\nmodule.exports = Plugin\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"f26d3fd7dcc13f88042fbf091da3df70140e0634"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/name.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/name.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":26}},"2":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"3":{"start":{"line":5,"column":13},"end":{"line":12,"column":1}},"4":{"start":{"line":14,"column":4},"end":{"line":14,"column":56}},"5":{"start":{"line":17,"column":4},"end":{"line":17,"column":73}},"6":{"start":{"line":20,"column":4},"end":{"line":20,"column":56}},"7":{"start":{"line":24,"column":8},"end":{"line":24,"column":31}},"8":{"start":{"line":27,"column":8},"end":{"line":27,"column":33}},"9":{"start":{"line":30,"column":8},"end":{"line":30,"column":34}},"10":{"start":{"line":33,"column":8},"end":{"line":33,"column":33}},"11":{"start":{"line":36,"column":8},"end":{"line":36,"column":34}},"12":{"start":{"line":39,"column":8},"end":{"line":39,"column":38}},"13":{"start":{"line":42,"column":8},"end":{"line":42,"column":39}},"14":{"start":{"line":45,"column":8},"end":{"line":45,"column":50}},"15":{"start":{"line":48,"column":21},"end":{"line":48,"column":66}},"16":{"start":{"line":49,"column":8},"end":{"line":49,"column":74}},"17":{"start":{"line":52,"column":8},"end":{"line":52,"column":44}},"18":{"start":{"line":55,"column":8},"end":{"line":55,"column":71}},"19":{"start":{"line":58,"column":8},"end":{"line":58,"column":76}},"20":{"start":{"line":61,"column":8},"end":{"line":61,"column":72}},"21":{"start":{"line":64,"column":8},"end":{"line":68,"column":19}},"22":{"start":{"line":71,"column":8},"end":{"line":71,"column":36}},"23":{"start":{"line":74,"column":8},"end":{"line":79,"column":32}},"24":{"start":{"line":82,"column":0},"end":{"line":82,"column":23}}},"fnMap":{"0":{"name":"clean","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":14}},"loc":{"start":{"line":13,"column":22},"end":{"line":15,"column":1}},"line":13},"1":{"name":"truncate","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":17}},"loc":{"start":{"line":16,"column":25},"end":{"line":18,"column":1}},"line":16},"2":{"name":"ucfirst","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":16}},"loc":{"start":{"line":19,"column":23},"end":{"line":21,"column":1}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":5}},"loc":{"start":{"line":23,"column":25},"end":{"line":25,"column":5}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":26,"column":4},"end":{"line":26,"column":5}},"loc":{"start":{"line":26,"column":17},"end":{"line":28,"column":5}},"line":26},"5":{"name":"(anonymous_5)","decl":{"start":{"line":29,"column":4},"end":{"line":29,"column":5}},"loc":{"start":{"line":29,"column":18},"end":{"line":31,"column":5}},"line":29},"6":{"name":"(anonymous_6)","decl":{"start":{"line":32,"column":4},"end":{"line":32,"column":5}},"loc":{"start":{"line":32,"column":17},"end":{"line":34,"column":5}},"line":32},"7":{"name":"(anonymous_7)","decl":{"start":{"line":35,"column":4},"end":{"line":35,"column":5}},"loc":{"start":{"line":35,"column":18},"end":{"line":37,"column":5}},"line":35},"8":{"name":"(anonymous_8)","decl":{"start":{"line":38,"column":4},"end":{"line":38,"column":5}},"loc":{"start":{"line":38,"column":22},"end":{"line":40,"column":5}},"line":38},"9":{"name":"(anonymous_9)","decl":{"start":{"line":41,"column":4},"end":{"line":41,"column":5}},"loc":{"start":{"line":41,"column":23},"end":{"line":43,"column":5}},"line":41},"10":{"name":"(anonymous_10)","decl":{"start":{"line":44,"column":4},"end":{"line":44,"column":5}},"loc":{"start":{"line":44,"column":17},"end":{"line":46,"column":5}},"line":44},"11":{"name":"(anonymous_11)","decl":{"start":{"line":47,"column":4},"end":{"line":47,"column":5}},"loc":{"start":{"line":47,"column":20},"end":{"line":50,"column":5}},"line":47},"12":{"name":"(anonymous_12)","decl":{"start":{"line":51,"column":4},"end":{"line":51,"column":5}},"loc":{"start":{"line":51,"column":11},"end":{"line":53,"column":5}},"line":51},"13":{"name":"(anonymous_13)","decl":{"start":{"line":54,"column":4},"end":{"line":54,"column":5}},"loc":{"start":{"line":54,"column":17},"end":{"line":56,"column":5}},"line":54},"14":{"name":"(anonymous_14)","decl":{"start":{"line":57,"column":4},"end":{"line":57,"column":5}},"loc":{"start":{"line":57,"column":22},"end":{"line":59,"column":5}},"line":57},"15":{"name":"(anonymous_15)","decl":{"start":{"line":60,"column":4},"end":{"line":60,"column":5}},"loc":{"start":{"line":60,"column":17},"end":{"line":62,"column":5}},"line":60},"16":{"name":"(anonymous_16)","decl":{"start":{"line":63,"column":4},"end":{"line":63,"column":5}},"loc":{"start":{"line":63,"column":25},"end":{"line":69,"column":5}},"line":63},"17":{"name":"(anonymous_17)","decl":{"start":{"line":70,"column":4},"end":{"line":70,"column":5}},"loc":{"start":{"line":70,"column":13},"end":{"line":72,"column":5}},"line":70},"18":{"name":"(anonymous_18)","decl":{"start":{"line":73,"column":4},"end":{"line":73,"column":5}},"loc":{"start":{"line":73,"column":13},"end":{"line":80,"column":5}},"line":73}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":11},"end":{"line":17,"column":72}},"type":"cond-expr","locations":[{"start":{"line":17,"column":32},"end":{"line":17,"column":37}},{"start":{"line":17,"column":40},"end":{"line":17,"column":72}}],"line":17},"1":{"loc":{"start":{"line":48,"column":21},"end":{"line":48,"column":66}},"type":"cond-expr","locations":[{"start":{"line":48,"column":49},"end":{"line":48,"column":56}},{"start":{"line":48,"column":59},"end":{"line":48,"column":66}}],"line":48},"2":{"loc":{"start":{"line":49,"column":49},"end":{"line":49,"column":72}},"type":"cond-expr","locations":[{"start":{"line":49,"column":56},"end":{"line":49,"column":62}},{"start":{"line":49,"column":65},"end":{"line":49,"column":72}}],"line":49},"3":{"loc":{"start":{"line":55,"column":45},"end":{"line":55,"column":68}},"type":"cond-expr","locations":[{"start":{"line":55,"column":52},"end":{"line":55,"column":58}},{"start":{"line":55,"column":61},"end":{"line":55,"column":68}}],"line":55},"4":{"loc":{"start":{"line":58,"column":50},"end":{"line":58,"column":73}},"type":"cond-expr","locations":[{"start":{"line":58,"column":57},"end":{"line":58,"column":63}},{"start":{"line":58,"column":66},"end":{"line":58,"column":73}}],"line":58},"5":{"loc":{"start":{"line":61,"column":46},"end":{"line":61,"column":69}},"type":"cond-expr","locations":[{"start":{"line":61,"column":53},"end":{"line":61,"column":59}},{"start":{"line":61,"column":62},"end":{"line":61,"column":69}}],"line":61},"6":{"loc":{"start":{"line":66,"column":12},"end":{"line":66,"column":52}},"type":"cond-expr","locations":[{"start":{"line":66,"column":19},"end":{"line":66,"column":45}},{"start":{"line":66,"column":48},"end":{"line":66,"column":52}}],"line":66}},"s":{"0":5,"1":5,"2":5,"3":5,"4":38,"5":38,"6":120,"7":9,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":5,"15":5,"16":5,"17":7,"18":10,"19":8,"20":8,"21":30,"22":30,"23":30,"24":5},"f":{"0":38,"1":38,"2":120,"3":9,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":5,"11":5,"12":7,"13":10,"14":8,"15":8,"16":30,"17":30,"18":30},"b":{"0":[30,8],"1":[2,3],"2":[1,4],"3":[5,5],"4":[4,4],"5":[4,4],"6":[30,0]},"inputSourceMap":{"version":3,"file":"name.js","sourceRoot":"","sources":["name.ts"],"names":[],"mappings":";;AAAA,2BAA0B;AAC1B,6BAA4B;AAE5B,MAAM,IAAI,GAAG;IACX,SAAS,EAAE,6BAA6B;IACxC,MAAM,EAAE,+BAA+B;IACvC,UAAU,EAAE,yBAAyB;IACrC,WAAW,EAAE,uBAAuB;IACpC,IAAI,EAAE,uBAAuB;IAC7B,MAAM,EAAE,sBAAsB;CAC/B,CAAA;AAED,eAAe,KAAa;IAC1B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,kBAAkB,KAAa;IAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;AACtE,CAAC;AAED,iBAAiB,IAAY;IAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC;AAED;IACE,YAAoB,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAI,CAAC;IAElC,UAAU;QACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAEM,WAAW;QAChB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;IAEM,UAAU;QACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAEM,WAAW;QAChB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;IAEM,eAAe;QACpB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IAEM,gBAAgB;QACrB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;IAEM,UAAU;QACf,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAC5B,CAAA;IACH,CAAC;IAEM,SAAS,CAAC,IAAa;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,GAAG,OAAO,GAAG,OAAO,CAAA;QAE1D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;IACnE,CAAC;IAEM,IAAI;QACT,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACrC,CAAC;IAEM,MAAM,CAAC,IAAa;QACzB,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,CACjD,CAAA;IACH,CAAC;IAEM,WAAW,CAAC,IAAa;QAC9B,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,CACtD,CAAA;IACH,CAAC;IAEM,MAAM,CAAC,IAAa;QACzB,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,CAClD,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,IAAY,EAAE,GAAG,IAAc;QAC3C,MAAM,CAAC;YACL,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;YACxC,IAAI,CAAC,MAAM,EAAE;SACd,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACZ,CAAC;IAEO,MAAM;QACZ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;IAC7B,CAAC;IAEO,MAAM;QACZ,MAAM,CAAC;YACL,IAAI,CAAC,OAAO,CAAC,KAAK;YAClB,IAAI,CAAC,OAAO,CAAC,KAAK;YAClB,IAAI,CAAC,OAAO,CAAC,KAAK;YAClB,IAAI,CAAC,OAAO,CAAC,MAAM;SACpB,CAAC,GAAG,CACH,OAAO,CACR,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACZ,CAAC;CACF;AAnFD,uBAmFC","sourcesContent":["import * as md5 from 'md5'\nimport * as util from 'util'\n\nconst TEXT = {\n DIMENSION: 'dynamodb:%s:%sCapacityUnits',\n METRIC: 'DynamoDB%sCapacityUtilization',\n POLICYROLE: 'DynamoDBAutoscalePolicy',\n POLICYSCALE: 'TableScalingPolicy-%s',\n ROLE: 'DynamoDBAutoscaleRole',\n TARGET: 'AutoScalingTarget-%s'\n}\n\nfunction clean(input: string): string {\n return truncate(input.replace(/[^a-z0-9+]+/gi, ''))\n}\n\nfunction truncate(input: string): string {\n return input.length <= 64 ? input : input.substr(0, 32) + md5(input)\n}\n\nfunction ucfirst(data: string): string {\n return data.charAt(0).toUpperCase() + data.slice(1)\n}\n\nexport default class Name {\n constructor(private options: Options) { }\n\n public metricRead(): string {\n return this.metric(true)\n }\n\n public metricWrite(): string {\n return this.metric(false)\n }\n\n public targetRead(): string {\n return this.target(true)\n }\n\n public targetWrite(): string {\n return this.target(false)\n }\n\n public policyScaleRead(): string {\n return this.policyScale(true)\n }\n\n public policyScaleWrite(): string {\n return this.policyScale(false)\n }\n\n public policyRole(): string {\n return clean(\n this.build(TEXT.POLICYROLE)\n )\n }\n\n public dimension(read: boolean): string {\n const type = this.options.index === '' ? 'table' : 'index'\n\n return util.format(TEXT.DIMENSION, type, read ? 'Read' : 'Write')\n }\n\n public role(): string {\n return clean(this.build(TEXT.ROLE))\n }\n\n public target(read: boolean): string {\n return clean(\n this.build(TEXT.TARGET, read ? 'Read' : 'Write')\n )\n }\n\n public policyScale(read: boolean): string {\n return clean(\n this.build(TEXT.POLICYSCALE, read ? 'Read' : 'Write')\n )\n }\n\n public metric(read: boolean): string {\n return clean(\n util.format(TEXT.METRIC, read ? 'Read' : 'Write')\n )\n }\n\n private build(data: string, ...args: string[]): string {\n return [\n this.prefix(),\n args ? util.format(data, ...args) : data,\n this.suffix()\n ].join('')\n }\n\n private prefix(): string {\n return this.options.service\n }\n\n private suffix(): string {\n return [\n this.options.table,\n this.options.index,\n this.options.stage,\n this.options.region\n ].map(\n ucfirst\n ).join('')\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"3e0a046b61f949a099d35fe6a39fd7f9750ad030"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/policy.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/policy.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":23}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":25}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":27}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":31}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":33}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":65}},"8":{"start":{"line":14,"column":37},"end":{"line":14,"column":64}},"9":{"start":{"line":15,"column":27},"end":{"line":15,"column":59}},"10":{"start":{"line":16,"column":23},"end":{"line":16,"column":50}},"11":{"start":{"line":17,"column":26},"end":{"line":17,"column":80}},"12":{"start":{"line":18,"column":8},"end":{"line":36,"column":10}},"13":{"start":{"line":39,"column":0},"end":{"line":39,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":57},"end":{"line":12,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":5}},"loc":{"start":{"line":13,"column":13},"end":{"line":37,"column":5}},"line":13}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2},"f":{"0":2,"1":2},"b":{},"inputSourceMap":{"version":3,"file":"policy.js","sourceRoot":"","sources":["policy.ts"],"names":[],"mappings":";;AAAA,yCAAiC;AAEjC,YAA4B,SAAQ,kBAAQ;IAG1C,YACE,OAAgB,EACR,IAAa,EACb,KAAa,EACb,OAAe,EACf,QAAgB;QACtB,KAAK,CAAC,OAAO,CAAC,CAAA;QAJR,SAAI,GAAJ,IAAI,CAAS;QACb,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,aAAQ,GAAR,QAAQ,CAAQ;QAPT,SAAI,GAAW,4CAA4C,CAAA;IAQzD,CAAC;IAEb,MAAM;QACX,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE1C,MAAM,SAAS,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAE1E,MAAM,CAAC;YACL,CAAC,UAAU,CAAC,EAAE;gBACZ,SAAS;gBACT,UAAU,EAAE;oBACV,UAAU;oBACV,UAAU,EAAE,uBAAuB;oBACnC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;oBAChC,wCAAwC,EAAE;wBACxC,6BAA6B,EAAE;4BAC7B,oBAAoB;yBACrB;wBACD,eAAe,EAAE,IAAI,CAAC,OAAO;wBAC7B,gBAAgB,EAAE,IAAI,CAAC,QAAQ;wBAC/B,WAAW,EAAE,IAAI,CAAC,KAAK;qBACxB;iBACF;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAtCD,yBAsCC","sourcesContent":["import Resource from './resource'\n\nexport default class Policy extends Resource {\n private readonly type: string = 'AWS::ApplicationAutoScaling::ScalingPolicy'\n\n constructor (\n options: Options,\n private read: boolean,\n private value: number,\n private scaleIn: number,\n private scaleOut: number\n ) { super(options) }\n\n public toJSON(): any {\n const PredefinedMetricType = this.name.metric(this.read)\n const PolicyName = this.name.policyScale(this.read)\n const Target = this.name.target(this.read)\n\n const DependsOn = [ this.options.table, Target ].concat(this.dependencies)\n\n return {\n [PolicyName]: {\n DependsOn,\n Properties: {\n PolicyName,\n PolicyType: 'TargetTrackingScaling',\n ScalingTargetId: { Ref: Target },\n TargetTrackingScalingPolicyConfiguration: {\n PredefinedMetricSpecification: {\n PredefinedMetricType\n },\n ScaleInCooldown: this.scaleIn,\n ScaleOutCooldown: this.scaleOut,\n TargetValue: this.value\n }\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"545a804283946c5337ac2ce2db558ff164ef3bf3"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/resource.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/resource.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":15},"end":{"line":3,"column":32}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":31}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":31}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":48}},"5":{"start":{"line":11,"column":8},"end":{"line":11,"column":33}},"6":{"start":{"line":12,"column":8},"end":{"line":12,"column":20}},"7":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":25},"end":{"line":9,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":4},"end":{"line":10,"column":5}},"loc":{"start":{"line":10,"column":26},"end":{"line":13,"column":5}},"line":10}},"branchMap":{},"s":{"0":4,"1":4,"2":6,"3":6,"4":6,"5":0,"6":0,"7":4},"f":{"0":6,"1":0},"b":{},"inputSourceMap":{"version":3,"file":"resource.js","sourceRoot":"","sources":["resource.ts"],"names":[],"mappings":";;AAAA,iCAAyB;AAEzB;IAIE,YAAsB,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;QAH5B,iBAAY,GAAa,EAAE,CAAA;QAInC,IAAI,CAAC,IAAI,GAAG,IAAI,cAAI,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;IAEM,eAAe,CAAC,IAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,MAAM,CAAC,IAAI,CAAA;IACb,CAAC;CACF;AAbD,2BAaC","sourcesContent":["import Name from './name'\n\nexport default class Resource {\n protected dependencies: string[] = []\n protected name: Name\n\n constructor(protected options: Options) {\n this.name = new Name(options)\n }\n\n public setDependencies(list: string[]): Resource {\n this.dependencies = list\n\n return this\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"6e9b94b6575337f0101086babf22c8900a92e9ad"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/role.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/role.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":23}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":37}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":36}},"5":{"start":{"line":9,"column":8},"end":{"line":21,"column":10}},"6":{"start":{"line":24,"column":25},"end":{"line":24,"column":41}},"7":{"start":{"line":25,"column":27},"end":{"line":25,"column":49}},"8":{"start":{"line":26,"column":26},"end":{"line":26,"column":72}},"9":{"start":{"line":27,"column":26},"end":{"line":27,"column":42}},"10":{"start":{"line":28,"column":24},"end":{"line":28,"column":36}},"11":{"start":{"line":29,"column":21},"end":{"line":29,"column":30}},"12":{"start":{"line":30,"column":8},"end":{"line":56,"column":10}},"13":{"start":{"line":59,"column":8},"end":{"line":61,"column":10}},"14":{"start":{"line":64,"column":8},"end":{"line":66,"column":10}},"15":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":25},"end":{"line":22,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":5}},"loc":{"start":{"line":23,"column":13},"end":{"line":57,"column":5}},"line":23},"2":{"name":"(anonymous_2)","decl":{"start":{"line":58,"column":4},"end":{"line":58,"column":5}},"loc":{"start":{"line":58,"column":15},"end":{"line":62,"column":5}},"line":58},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":4},"end":{"line":63,"column":5}},"loc":{"start":{"line":63,"column":16},"end":{"line":67,"column":5}},"line":63}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2},"f":{"0":2,"1":2,"2":2,"3":2},"b":{},"inputSourceMap":{"version":3,"file":"role.js","sourceRoot":"","sources":["role.ts"],"names":[],"mappings":";;AAAA,yCAAiC;AAEjC,UAA0B,SAAQ,kBAAQ;IAiBxC,YACE,OAAgB;QACd,KAAK,CAAC,OAAO,CAAC,CAAA;QAlBD,SAAI,GAAW,gBAAgB,CAAA;QAC/B,YAAO,GAAW,YAAY,CAAA;QAC9B,YAAO,GAAG;YACzB,UAAU,EAAE;gBACV,2BAA2B;gBAC3B,2BAA2B;gBAC3B,yBAAyB;gBACzB,gCAAgC;gBAChC,0BAA0B;aAC3B;YACD,QAAQ,EAAE;gBACR,wBAAwB;gBACxB,sBAAsB;aACvB;SACF,CAAA;IAIkB,CAAC;IAEb,MAAM;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAA;QAEzC,MAAM,SAAS,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAEtB,MAAM,CAAC;YACL,CAAC,QAAQ,CAAC,EAAE;gBACV,SAAS;gBACT,UAAU,EAAE;oBACV,wBAAwB,EAAE;wBACxB,SAAS,EAAE;4BACT,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;yBACzD;wBACD,OAAO;qBACR;oBACD,QAAQ,EAAE;wBACR;4BACE,cAAc,EAAE;gCACd,SAAS,EAAE;oCACT,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE;oCACnE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE;iCAC9E;gCACD,OAAO;6BACR;4BACD,UAAU;yBACX;qBACF;oBACD,QAAQ;iBACT;gBACD,IAAI;aACL;SACF,CAAA;IACH,CAAC;IAEO,QAAQ;QACd,MAAM,CAAC;YACL,UAAU,EAAE,CAAE,EAAE,EAAE,CAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAE,CAAE;SACjH,CAAA;IACH,CAAC;IAEO,SAAS;QACf,MAAM,CAAC;YACL,OAAO,EAAE,uCAAuC;SACjD,CAAA;IACH,CAAC;CACF;AAtED,uBAsEC","sourcesContent":["import Resource from './resource'\n\nexport default class Role extends Resource {\n private readonly type: string = 'AWS::IAM::Role'\n private readonly version: string = '2012-10-17'\n private readonly actions = {\n CloudWatch: [\n 'cloudwatch:PutMetricAlarm',\n 'cloudwatch:DescribeAlarms',\n 'cloudwatch:DeleteAlarms',\n 'cloudwatch:GetMetricStatistics',\n 'cloudwatch:SetAlarmState'\n ],\n DynamoDB: [\n 'dynamodb:DescribeTable',\n 'dynamodb:UpdateTable'\n ]\n }\n\n constructor (\n options: Options\n ) { super(options) }\n\n public toJSON(): any {\n const RoleName = this.name.role()\n const PolicyName = this.name.policyRole()\n\n const DependsOn = [ this.options.table ].concat(this.dependencies)\n const Principal = this.principal()\n const Version = this.version\n const Type = this.type\n\n return {\n [RoleName]: {\n DependsOn,\n Properties: {\n AssumeRolePolicyDocument: {\n Statement: [\n { Action: 'sts:AssumeRole', Effect: 'Allow', Principal }\n ],\n Version\n },\n Policies: [\n {\n PolicyDocument: {\n Statement: [\n { Action: this.actions.CloudWatch, Effect: 'Allow', Resource: '*' },\n { Action: this.actions.DynamoDB, Effect: 'Allow', Resource: this.resource() }\n ],\n Version\n },\n PolicyName\n }\n ],\n RoleName\n },\n Type\n }\n }\n }\n\n private resource(): {} {\n return {\n 'Fn::Join': [ '', [ 'arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.options.table } ] ]\n }\n }\n\n private principal(): {} {\n return {\n Service: 'application-autoscaling.amazonaws.com'\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"edb65fc0b18e4b810041c2a604a42e71f0ae8240"} | ||
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/target.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/target.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":23}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":25}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":23}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":23}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":66}},"7":{"start":{"line":13,"column":25},"end":{"line":13,"column":64}},"8":{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},"9":{"start":{"line":15,"column":12},"end":{"line":15,"column":57}},"10":{"start":{"line":17,"column":27},"end":{"line":17,"column":54}},"11":{"start":{"line":18,"column":25},"end":{"line":18,"column":41}},"12":{"start":{"line":19,"column":30},"end":{"line":19,"column":60}},"13":{"start":{"line":20,"column":26},"end":{"line":20,"column":82}},"14":{"start":{"line":21,"column":8},"end":{"line":34,"column":10}},"15":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":41},"end":{"line":11,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":13},"end":{"line":35,"column":5}},"line":12}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},"type":"if","locations":[{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},{"start":{"line":14,"column":8},"end":{"line":16,"column":9}}],"line":14}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2},"f":{"0":2,"1":2},"b":{"0":[2,0]},"inputSourceMap":{"version":3,"file":"target.js","sourceRoot":"","sources":["target.ts"],"names":[],"mappings":";;AAAA,yCAAiC;AAEjC,YAA4B,SAAQ,kBAAQ;IAG1C,YACE,OAAgB,EACR,IAAa,EACb,GAAW,EACX,GAAW;QACjB,KAAK,CAAC,OAAO,CAAC,CAAA;QAHR,SAAI,GAAJ,IAAI,CAAS;QACb,QAAG,GAAH,GAAG,CAAQ;QACX,QAAG,GAAH,GAAG,CAAQ;QANJ,SAAI,GAAG,6CAA6C,CAAA;IAOlD,CAAC;IAEb,MAAM;QACX,MAAM,QAAQ,GAAG,CAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAE,CAAA;QAE1D,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC9C,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAE5E,MAAM,CAAC;YACL,CAAC,UAAU,CAAC,EAAE;gBACZ,SAAS;gBACT,UAAU,EAAE;oBACV,WAAW,EAAE,IAAI,CAAC,GAAG;oBACrB,WAAW,EAAE,IAAI,CAAC,GAAG;oBACrB,UAAU,EAAE,EAAE,UAAU,EAAE,CAAE,EAAE,EAAE,QAAQ,CAAE,EAAE;oBAC5C,OAAO,EAAE,EAAE,YAAY,EAAE,CAAE,QAAQ,EAAE,KAAK,CAAE,EAAE;oBAC9C,iBAAiB,EAAE,aAAa;oBAChC,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAtCD,yBAsCC","sourcesContent":["import Resource from './resource'\n\nexport default class Target extends Resource {\n private readonly type = 'AWS::ApplicationAutoScaling::ScalableTarget'\n\n constructor (\n options: Options,\n private read: boolean,\n private min: number,\n private max: number\n ) { super(options) }\n\n public toJSON(): any {\n const resource = [ 'table/', { Ref: this.options.table } ]\n\n if (this.options.index !== '') {\n resource.push('/index/', this.options.index)\n }\n\n const nameTarget = this.name.target(this.read)\n const nameRole = this.name.role()\n const nameDimension = this.name.dimension(this.read)\n\n const DependsOn = [ this.options.table, nameRole ].concat(this.dependencies)\n\n return {\n [nameTarget]: {\n DependsOn,\n Properties: {\n MaxCapacity: this.max,\n MinCapacity: this.min,\n ResourceId: { 'Fn::Join': [ '', resource ] },\n RoleARN: { 'Fn::GetAtt': [ nameRole, 'Arn' ] },\n ScalableDimension: nameDimension,\n ServiceNamespace: 'dynamodb'\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"6430f1da987204abff506fa77fde439acdfb1757"} | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const names = require("./names"); | ||
class Policy { | ||
constructor(service, table, value, read, scaleIn, scaleOut, index, stage) { | ||
this.service = service; | ||
this.table = table; | ||
const resource_1 = require("./resource"); | ||
class Policy extends resource_1.default { | ||
constructor(options, read, value, scaleIn, scaleOut) { | ||
super(options); | ||
this.read = read; | ||
this.value = value; | ||
this.read = read; | ||
this.scaleIn = scaleIn; | ||
this.scaleOut = scaleOut; | ||
this.index = index; | ||
this.stage = stage; | ||
this.dependencies = []; | ||
this.type = 'AWS::ApplicationAutoScaling::ScalingPolicy'; | ||
} | ||
setDependencies(list) { | ||
this.dependencies = list; | ||
return this; | ||
} | ||
toJSON() { | ||
const nameMetric = names.metric(this.read); | ||
const nameScalePolicy = names.policyScale(this.service, this.table, this.read, this.index, this.stage); | ||
const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage); | ||
const dependencies = [this.table, nameTarget].concat(this.dependencies); | ||
const PredefinedMetricType = this.name.metric(this.read); | ||
const PolicyName = this.name.policyScale(this.read); | ||
const Target = this.name.target(this.read); | ||
const DependsOn = [this.options.table, Target].concat(this.dependencies); | ||
return { | ||
[nameScalePolicy]: { | ||
DependsOn: dependencies, | ||
[PolicyName]: { | ||
DependsOn, | ||
Properties: { | ||
PolicyName: nameScalePolicy, | ||
PolicyName, | ||
PolicyType: 'TargetTrackingScaling', | ||
ScalingTargetId: { Ref: nameTarget }, | ||
ScalingTargetId: { Ref: Target }, | ||
TargetTrackingScalingPolicyConfiguration: { | ||
PredefinedMetricSpecification: { | ||
PredefinedMetricType: nameMetric | ||
PredefinedMetricType | ||
}, | ||
@@ -37,0 +29,0 @@ ScaleInCooldown: this.scaleIn, |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const names = require("./names"); | ||
class Role { | ||
constructor(service, table, index, stage) { | ||
this.service = service; | ||
this.table = table; | ||
this.index = index; | ||
this.stage = stage; | ||
this.dependencies = []; | ||
const resource_1 = require("./resource"); | ||
class Role extends resource_1.default { | ||
constructor(options) { | ||
super(options); | ||
this.type = 'AWS::IAM::Role'; | ||
@@ -27,25 +23,18 @@ this.version = '2012-10-17'; | ||
} | ||
setDependencies(list) { | ||
this.dependencies = list; | ||
return this; | ||
} | ||
toJSON() { | ||
const nameRole = names.role(this.service, this.table, this.index, this.stage); | ||
const namePolicyRole = names.policyRole(this.service, this.table, this.index, this.stage); | ||
const dependencies = [this.table].concat(this.dependencies); | ||
const principal = { | ||
Service: 'application-autoscaling.amazonaws.com' | ||
}; | ||
const resource = { | ||
'Fn::Join': ['', ['arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.table }]] | ||
}; | ||
const RoleName = this.name.role(); | ||
const PolicyName = this.name.policyRole(); | ||
const DependsOn = [this.options.table].concat(this.dependencies); | ||
const Principal = this.principal(); | ||
const Version = this.version; | ||
const Type = this.type; | ||
return { | ||
[nameRole]: { | ||
DependsOn: dependencies, | ||
[RoleName]: { | ||
DependsOn, | ||
Properties: { | ||
AssumeRolePolicyDocument: { | ||
Statement: [ | ||
{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: principal } | ||
{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal } | ||
], | ||
Version: this.version | ||
Version | ||
}, | ||
@@ -57,17 +46,27 @@ Policies: [ | ||
{ Action: this.actions.CloudWatch, Effect: 'Allow', Resource: '*' }, | ||
{ Action: this.actions.DynamoDB, Effect: 'Allow', Resource: resource } | ||
{ Action: this.actions.DynamoDB, Effect: 'Allow', Resource: this.resource() } | ||
], | ||
Version: this.version | ||
Version | ||
}, | ||
PolicyName: namePolicyRole | ||
PolicyName | ||
} | ||
], | ||
RoleName: nameRole | ||
RoleName | ||
}, | ||
Type: this.type | ||
Type | ||
} | ||
}; | ||
} | ||
resource() { | ||
return { | ||
'Fn::Join': ['', ['arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.options.table }]] | ||
}; | ||
} | ||
principal() { | ||
return { | ||
Service: 'application-autoscaling.amazonaws.com' | ||
}; | ||
} | ||
} | ||
exports.default = Role; | ||
//# sourceMappingURL=role.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const names = require("./names"); | ||
class Target { | ||
constructor(service, table, min, max, read, index, stage) { | ||
this.service = service; | ||
this.table = table; | ||
const resource_1 = require("./resource"); | ||
class Target extends resource_1.default { | ||
constructor(options, read, min, max) { | ||
super(options); | ||
this.read = read; | ||
this.min = min; | ||
this.max = max; | ||
this.read = read; | ||
this.index = index; | ||
this.stage = stage; | ||
this.dependencies = []; | ||
this.type = 'AWS::ApplicationAutoScaling::ScalableTarget'; | ||
} | ||
setDependencies(list) { | ||
this.dependencies = list; | ||
return this; | ||
} | ||
toJSON() { | ||
const resource = ['table/', { Ref: this.table }]; | ||
if (this.index) { | ||
resource.push('/index/', this.index); | ||
const resource = ['table/', { Ref: this.options.table }]; | ||
if (this.options.index !== '') { | ||
resource.push('/index/', this.options.index); | ||
} | ||
const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage); | ||
const nameRole = names.role(this.service, this.table, this.index, this.stage); | ||
const nameDimension = names.dimension(this.read, !!this.index); | ||
const dependencies = [this.table, nameRole].concat(this.dependencies); | ||
const nameTarget = this.name.target(this.read); | ||
const nameRole = this.name.role(); | ||
const nameDimension = this.name.dimension(this.read); | ||
const DependsOn = [this.options.table, nameRole].concat(this.dependencies); | ||
return { | ||
[nameTarget]: { | ||
DependsOn: dependencies, | ||
DependsOn, | ||
Properties: { | ||
@@ -33,0 +25,0 @@ MaxCapacity: this.max, |
@@ -10,2 +10,6 @@ "use strict"; | ||
const text = { | ||
CLI_DONE: 'Added DynamoDB Auto Scaling to CloudFormation!', | ||
CLI_RESOURCE: ' - Building configuration for resource "table/%s%s"', | ||
CLI_SKIP: 'Skipping DynamoDB Auto Scaling: %s!', | ||
CLI_START: 'Configure DynamoDB Auto Scaling …', | ||
INVALID_CONFIGURATION: 'Invalid serverless configuration', | ||
@@ -22,3 +26,3 @@ NO_AUTOSCALING_CONFIG: 'Not Auto Scaling configuration found', | ||
this.hooks = { | ||
'deploy:compileEvents': this.beforeDeployResources.bind(this) | ||
'before:package:createDeploymentArtifacts': this.beforeDeployResources.bind(this) | ||
}; | ||
@@ -39,2 +43,8 @@ } | ||
/** | ||
* Get the current service region | ||
*/ | ||
getRegion() { | ||
return this.serverless.getProvider('aws').getRegion(); | ||
} | ||
/** | ||
* Validate the request and check if configuration is available | ||
@@ -72,24 +82,32 @@ */ | ||
resources(table, index, config) { | ||
const resources = []; | ||
const service = this.getServiceName(); | ||
const stage = this.getStage(); | ||
const data = this.defaults(config); | ||
const options = { | ||
index, | ||
region: this.getRegion(), | ||
service: this.getServiceName(), | ||
stage: this.getStage(), | ||
table | ||
}; | ||
// Start processing configuration | ||
this.serverless.cli.log(util.format(' - Building configuration for resource "table/%s%s"', table, (index ? ('/index/' + index) : ''))); | ||
this.serverless.cli.log(util.format(text.CLI_RESOURCE, table, (index ? ('/index/' + index) : ''))); | ||
// Add role to manage Auto Scaling policies | ||
resources.push(new role_1.default(service, table, index, stage)); | ||
const resources = [ | ||
new role_1.default(options) | ||
]; | ||
// Only add Auto Scaling for read capacity if configuration set is available | ||
if (config.read) { | ||
resources.push( | ||
// ScaleIn/ScaleOut values are fix to 60% usage | ||
new policy_1.default(service, table, data.read.usage * 100, true, 60, 60, index, stage), new target_1.default(service, table, data.read.minimum, data.read.maximum, true, index, stage)); | ||
if (!!config.read) { | ||
resources.push(...this.getPolicyAndTarget(options, data, true)); | ||
} | ||
// Only add Auto Scaling for write capacity if configuration set is available | ||
if (config.write) { | ||
resources.push( | ||
// ScaleIn/ScaleOut values are fix to 60% usage | ||
new policy_1.default(service, table, data.write.usage * 100, false, 60, 60, index, stage), new target_1.default(service, table, data.write.minimum, data.write.maximum, false, index, stage)); | ||
if (!!config.write) { | ||
resources.push(...this.getPolicyAndTarget(options, data, false)); | ||
} | ||
return resources; | ||
} | ||
getPolicyAndTarget(options, data, read) { | ||
return [ | ||
new policy_1.default(options, false, data.read.usage * 100, 60, 60), | ||
new target_1.default(options, false, data.read.minimum, data.read.maximum) | ||
]; | ||
} | ||
/** | ||
@@ -128,3 +146,3 @@ * Generate CloudFormation resources for DynamoDB table and indexes | ||
beforeDeployResources() { | ||
return Promise.resolve().then(() => this.validate()).then(() => this.serverless.cli.log(util.format('Configure DynamoDB Auto Scaling …'))).then(() => this.process()).then(() => this.serverless.cli.log(util.format('Added DynamoDB Auto Scaling to CloudFormation!'))).catch((err) => this.serverless.cli.log(util.format('Skipping DynamoDB Auto Scaling: %s!', err.message))); | ||
return Promise.resolve().then(() => this.validate()).then(() => this.serverless.cli.log(util.format(text.CLI_START))).then(() => this.process()).then(() => this.serverless.cli.log(util.format(text.CLI_DONE))).catch((err) => this.serverless.cli.log(util.format(text.CLI_SKIP, err.message))); | ||
} | ||
@@ -131,0 +149,0 @@ } |
{ | ||
"name": "serverless-dynamodb-autoscaling", | ||
"description": "Serverless Plugin for Amazon DynamoDB Auto Scaling.", | ||
"version": "0.5.1", | ||
"homepage": "https://sbstjn.com/serverless-dynamodb-auto-scaling-with-cloudformation.html", | ||
"version": "0.6.0", | ||
"main": "dist/plugin.js", | ||
@@ -9,5 +10,7 @@ "scripts": { | ||
"test:cover": "jest --coverage", | ||
"test:watch": "jest --watch", | ||
"coveralls": "cat ./coverage/lcov.info | coveralls", | ||
"lint": "tslint {src,test}/**/*.ts", | ||
"build": "tsc" | ||
"build": "tsc", | ||
"build:watch": "tsc --watch" | ||
}, | ||
@@ -34,13 +37,14 @@ "keywords": [ | ||
}, | ||
"homepage": "https://github.com/sbstjn/serverless-dynamodb-autoscaling", | ||
"devDependencies": { | ||
"@types/jest": "^20.0.5", | ||
"@types/lodash": "^4.14.71", | ||
"@types/md5": "^2.1.32", | ||
"@types/node": "^8.0.19", | ||
"coveralls": "^2.13.1", | ||
"dot-json": "^1.0.3", | ||
"jasmine-data-provider": "^2.2.0", | ||
"jest": "^20.0.4", | ||
"serverless-types": "^0.0.1", | ||
"ts-jest": "^20.0.7", | ||
"tslint": "^5.5.0", | ||
"@types/md5": "^2.1.32", | ||
"@types/lodash": "^4.14.71", | ||
"typescript": "^2.4.2" | ||
@@ -47,0 +51,0 @@ }, |
@@ -74,2 +74,6 @@ # ⚡️ Serverless Plugin for DynamoDB Auto Scaling | ||
### Breaking Changes | ||
*There have been multiple breaking changes regarding CloudFormation resource names in the past. If you end up with an error, that your CloudFormation Stack cannot be updated, try to remove the `custom > capacities` configuration from your `serverless.yml` file and deploy the service without any Auto Scaling configuration. After that, just re-add your previous configuration and deploy your service again.* | ||
## DynamoDB | ||
@@ -121,1 +125,16 @@ | ||
To make sure you have a pleasant experience, please read the [code of conduct](CODE_OF_CONDUCT.md). It outlines core values and beliefs and will make working together a happier experience. | ||
### Local Development | ||
If you plan to change the TypeScript files and link the package to another project, use the `link` and `build` yarn commands: | ||
``` | ||
$ > yarn link | ||
$ > yarn build:watch # or "yarn build" | ||
``` | ||
Use your local build of the package in another project: | ||
``` | ||
$ > yarn link serverless-dynamodb-autoscaling | ||
``` |
@@ -1,41 +0,31 @@ | ||
import * as names from './names' | ||
import Resource from './resource' | ||
export default class Policy { | ||
private dependencies: string[] = [] | ||
private type: string = 'AWS::ApplicationAutoScaling::ScalingPolicy' | ||
export default class Policy extends Resource { | ||
private readonly type: string = 'AWS::ApplicationAutoScaling::ScalingPolicy' | ||
constructor ( | ||
private service: string, | ||
private table: string, | ||
options: Options, | ||
private read: boolean, | ||
private value: number, | ||
private read: boolean, | ||
private scaleIn: number, | ||
private scaleOut: number, | ||
private index: string, | ||
private stage: string | ||
) { } | ||
private scaleOut: number | ||
) { super(options) } | ||
public setDependencies(list: string[]): Policy { | ||
this.dependencies = list | ||
return this | ||
} | ||
public toJSON(): any { | ||
const nameMetric = names.metric(this.read) | ||
const nameScalePolicy = names.policyScale(this.service, this.table, this.read, this.index, this.stage) | ||
const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage) | ||
const PredefinedMetricType = this.name.metric(this.read) | ||
const PolicyName = this.name.policyScale(this.read) | ||
const Target = this.name.target(this.read) | ||
const dependencies = [this.table, nameTarget ].concat(this.dependencies) | ||
const DependsOn = [ this.options.table, Target ].concat(this.dependencies) | ||
return { | ||
[nameScalePolicy]: { | ||
DependsOn: dependencies, | ||
[PolicyName]: { | ||
DependsOn, | ||
Properties: { | ||
PolicyName: nameScalePolicy, | ||
PolicyName, | ||
PolicyType: 'TargetTrackingScaling', | ||
ScalingTargetId: { Ref: nameTarget }, | ||
ScalingTargetId: { Ref: Target }, | ||
TargetTrackingScalingPolicyConfiguration: { | ||
PredefinedMetricSpecification: { | ||
PredefinedMetricType: nameMetric | ||
PredefinedMetricType | ||
}, | ||
@@ -42,0 +32,0 @@ ScaleInCooldown: this.scaleIn, |
@@ -1,8 +0,7 @@ | ||
import * as names from './names' | ||
import Resource from './resource' | ||
export default class Role { | ||
private dependencies: string[] = [] | ||
private type: string = 'AWS::IAM::Role' | ||
private version: string = '2012-10-17' | ||
private actions = { | ||
export default class Role extends Resource { | ||
private readonly type: string = 'AWS::IAM::Role' | ||
private readonly version: string = '2012-10-17' | ||
private readonly actions = { | ||
CloudWatch: [ | ||
@@ -22,35 +21,23 @@ 'cloudwatch:PutMetricAlarm', | ||
constructor ( | ||
private service: string, | ||
private table: string, | ||
private index: string, | ||
private stage: string | ||
) { } | ||
options: Options | ||
) { super(options) } | ||
public setDependencies(list: string[]): Role { | ||
this.dependencies = list | ||
return this | ||
} | ||
public toJSON(): any { | ||
const nameRole = names.role(this.service, this.table, this.index, this.stage) | ||
const namePolicyRole = names.policyRole(this.service, this.table, this.index, this.stage) | ||
const RoleName = this.name.role() | ||
const PolicyName = this.name.policyRole() | ||
const dependencies = [ this.table ].concat(this.dependencies) | ||
const principal = { | ||
Service: 'application-autoscaling.amazonaws.com' | ||
} | ||
const resource = { | ||
'Fn::Join': [ '', [ 'arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.table } ] ] | ||
} | ||
const DependsOn = [ this.options.table ].concat(this.dependencies) | ||
const Principal = this.principal() | ||
const Version = this.version | ||
const Type = this.type | ||
return { | ||
[nameRole]: { | ||
DependsOn: dependencies, | ||
[RoleName]: { | ||
DependsOn, | ||
Properties: { | ||
AssumeRolePolicyDocument: { | ||
Statement: [ | ||
{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: principal } | ||
{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal } | ||
], | ||
Version: this.version | ||
Version | ||
}, | ||
@@ -62,15 +49,27 @@ Policies: [ | ||
{ Action: this.actions.CloudWatch, Effect: 'Allow', Resource: '*' }, | ||
{ Action: this.actions.DynamoDB, Effect: 'Allow', Resource: resource } | ||
{ Action: this.actions.DynamoDB, Effect: 'Allow', Resource: this.resource() } | ||
], | ||
Version: this.version | ||
Version | ||
}, | ||
PolicyName: namePolicyRole | ||
PolicyName | ||
} | ||
], | ||
RoleName: nameRole | ||
RoleName | ||
}, | ||
Type: this.type | ||
Type | ||
} | ||
} | ||
} | ||
private resource(): {} { | ||
return { | ||
'Fn::Join': [ '', [ 'arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.options.table } ] ] | ||
} | ||
} | ||
private principal(): {} { | ||
return { | ||
Service: 'application-autoscaling.amazonaws.com' | ||
} | ||
} | ||
} |
@@ -1,39 +0,29 @@ | ||
import * as names from './names' | ||
import Resource from './resource' | ||
export default class Target { | ||
private dependencies: string[] = [] | ||
private type: string = 'AWS::ApplicationAutoScaling::ScalableTarget' | ||
export default class Target extends Resource { | ||
private readonly type = 'AWS::ApplicationAutoScaling::ScalableTarget' | ||
constructor ( | ||
private service: string, | ||
private table: string, | ||
options: Options, | ||
private read: boolean, | ||
private min: number, | ||
private max: number, | ||
private read: boolean, | ||
private index?: string, | ||
private stage?: string | ||
) { } | ||
private max: number | ||
) { super(options) } | ||
public setDependencies(list: string[]): Target { | ||
this.dependencies = list | ||
return this | ||
} | ||
public toJSON(): any { | ||
const resource = [ 'table/', { Ref: this.table } ] | ||
const resource = [ 'table/', { Ref: this.options.table } ] | ||
if (this.index) { | ||
resource.push('/index/', this.index) | ||
if (this.options.index !== '') { | ||
resource.push('/index/', this.options.index) | ||
} | ||
const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage) | ||
const nameRole = names.role(this.service, this.table, this.index, this.stage) | ||
const nameDimension = names.dimension(this.read, !!this.index) | ||
const nameTarget = this.name.target(this.read) | ||
const nameRole = this.name.role() | ||
const nameDimension = this.name.dimension(this.read) | ||
const dependencies = [ this.table, nameRole ].concat(this.dependencies) | ||
const DependsOn = [ this.options.table, nameRole ].concat(this.dependencies) | ||
return { | ||
[nameTarget]: { | ||
DependsOn: dependencies, | ||
DependsOn, | ||
Properties: { | ||
@@ -40,0 +30,0 @@ MaxCapacity: this.max, |
@@ -10,2 +10,6 @@ import * as assert from 'assert' | ||
const text = { | ||
CLI_DONE: 'Added DynamoDB Auto Scaling to CloudFormation!', | ||
CLI_RESOURCE: ' - Building configuration for resource "table/%s%s"', | ||
CLI_SKIP: 'Skipping DynamoDB Auto Scaling: %s!', | ||
CLI_START: 'Configure DynamoDB Auto Scaling …', | ||
INVALID_CONFIGURATION: 'Invalid serverless configuration', | ||
@@ -16,2 +20,7 @@ NO_AUTOSCALING_CONFIG: 'Not Auto Scaling configuration found', | ||
interface Defaults { | ||
read: CapacityConfiguration, | ||
write: CapacityConfiguration | ||
} | ||
class Plugin { | ||
@@ -25,3 +34,3 @@ public hooks: {} | ||
this.hooks = { | ||
'deploy:compileEvents': this.beforeDeployResources.bind(this) | ||
'before:package:createDeploymentArtifacts': this.beforeDeployResources.bind(this) | ||
} | ||
@@ -45,2 +54,9 @@ } | ||
/** | ||
* Get the current service region | ||
*/ | ||
private getRegion(): string { | ||
return this.serverless.getProvider('aws').getRegion() | ||
} | ||
/** | ||
* Validate the request and check if configuration is available | ||
@@ -62,3 +78,3 @@ */ | ||
*/ | ||
private defaults(config: Capacity): { read: CapacityConfiguration, write: CapacityConfiguration } { | ||
private defaults(config: Capacity): Defaults { | ||
return { | ||
@@ -82,31 +98,30 @@ read: { | ||
private resources(table: string, index: string, config: Capacity): any[] { | ||
const resources = [] | ||
const service = this.getServiceName() | ||
const stage = this.getStage() | ||
const data = this.defaults(config) | ||
const options: Options = { | ||
index, | ||
region: this.getRegion(), | ||
service: this.getServiceName(), | ||
stage: this.getStage(), | ||
table | ||
} | ||
// Start processing configuration | ||
this.serverless.cli.log( | ||
util.format(' - Building configuration for resource "table/%s%s"', table, (index ? ('/index/' + index) : '')) | ||
util.format(text.CLI_RESOURCE, table, (index ? ('/index/' + index) : '')) | ||
) | ||
// Add role to manage Auto Scaling policies | ||
resources.push(new Role(service, table, index, stage)) | ||
const resources: any[] = [ | ||
new Role(options) | ||
] | ||
// Only add Auto Scaling for read capacity if configuration set is available | ||
if (config.read) { | ||
resources.push( | ||
// ScaleIn/ScaleOut values are fix to 60% usage | ||
new Policy(service, table, data.read.usage * 100, true, 60, 60, index, stage), | ||
new Target(service, table, data.read.minimum, data.read.maximum, true, index, stage) | ||
) | ||
if (!!config.read) { | ||
resources.push(...this.getPolicyAndTarget(options, data, true)) | ||
} | ||
// Only add Auto Scaling for write capacity if configuration set is available | ||
if (config.write) { | ||
resources.push( | ||
// ScaleIn/ScaleOut values are fix to 60% usage | ||
new Policy(service, table, data.write.usage * 100, false, 60, 60, index, stage), | ||
new Target(service, table, data.write.minimum, data.write.maximum, false, index, stage) | ||
) | ||
if (!!config.write) { | ||
resources.push(...this.getPolicyAndTarget(options, data, false)) | ||
} | ||
@@ -117,2 +132,9 @@ | ||
private getPolicyAndTarget(options: Options, data: Defaults, read: boolean): any[] { | ||
return [ | ||
new Policy(options, false, data.read.usage * 100, 60, 60), | ||
new Target(options, false, data.read.minimum, data.read.maximum) | ||
] | ||
} | ||
/** | ||
@@ -177,9 +199,9 @@ * Generate CloudFormation resources for DynamoDB table and indexes | ||
).then( | ||
() => this.serverless.cli.log(util.format('Configure DynamoDB Auto Scaling …')) | ||
() => this.serverless.cli.log(util.format(text.CLI_START)) | ||
).then( | ||
() => this.process() | ||
).then( | ||
() => this.serverless.cli.log(util.format('Added DynamoDB Auto Scaling to CloudFormation!')) | ||
() => this.serverless.cli.log(util.format(text.CLI_DONE)) | ||
).catch( | ||
(err: Error) => this.serverless.cli.log(util.format('Skipping DynamoDB Auto Scaling: %s!', err.message)) | ||
(err: Error) => this.serverless.cli.log(util.format(text.CLI_SKIP, err.message)) | ||
) | ||
@@ -186,0 +208,0 @@ } |
@@ -1,2 +0,1 @@ | ||
import * as names from '../../src/aws/names' | ||
import Policy from '../../src/aws/policy' | ||
@@ -6,17 +5,17 @@ | ||
it('creates CF resource for read capacity', () => { | ||
const p = new Policy('', 'my-table-name', 75, true, 60, 70) | ||
const p = new Policy({ | ||
index: '', | ||
region: '', | ||
service: '', | ||
stage: '', | ||
table: 'MyTableResource' | ||
}, true, 75, 60, 70) | ||
const j = p.toJSON() | ||
expect(j).toHaveProperty(names.policyScale('', 'my-table-name', true)) | ||
expect(j).toHaveProperty('TableScalingPolicyReadMyTableResource') | ||
const d = j[names.policyScale('', 'my-table-name', true)] | ||
const d = j.TableScalingPolicyReadMyTableResource | ||
expect(d).toHaveProperty('Type', 'AWS::ApplicationAutoScaling::ScalingPolicy') | ||
expect(d).toHaveProperty('Properties.PolicyName', names.policyScale('', 'my-table-name', true)) | ||
expect(d).toHaveProperty('Properties.PolicyType', 'TargetTrackingScaling') | ||
expect(d).toHaveProperty('Properties.ScalingTargetId', { Ref: names.target('', 'my-table-name', true) }) | ||
expect(d).toHaveProperty( | ||
'Properties.TargetTrackingScalingPolicyConfiguration.PredefinedMetricSpecification.PredefinedMetricType', | ||
names.metric(true) | ||
) | ||
@@ -31,24 +30,24 @@ const c = d.Properties.TargetTrackingScalingPolicyConfiguration | ||
it('creates CF resource for write capacity', () => { | ||
const p = new Policy('', 'my-table-name', 15, false, 60, 70) | ||
const p = new Policy({ | ||
index: '', | ||
region: '', | ||
service: '', | ||
stage: '', | ||
table: 'MyTableResource' | ||
}, false, 10, 20, 30) | ||
const j = p.toJSON() | ||
expect(j).toHaveProperty(names.policyScale('', 'my-table-name', false)) | ||
expect(j).toHaveProperty('TableScalingPolicyWriteMyTableResource') | ||
const d = j[names.policyScale('', 'my-table-name', false)] | ||
const d = j.TableScalingPolicyWriteMyTableResource | ||
expect(d).toHaveProperty('Type', 'AWS::ApplicationAutoScaling::ScalingPolicy') | ||
expect(d).toHaveProperty('Properties.PolicyName', names.policyScale('', 'my-table-name', false)) | ||
expect(d).toHaveProperty('Properties.PolicyType', 'TargetTrackingScaling') | ||
expect(d).toHaveProperty('Properties.ScalingTargetId', { Ref: names.target('', 'my-table-name', false) }) | ||
expect(d).toHaveProperty( | ||
'Properties.TargetTrackingScalingPolicyConfiguration.PredefinedMetricSpecification.PredefinedMetricType', | ||
names.metric(false) | ||
) | ||
const c = d.Properties.TargetTrackingScalingPolicyConfiguration | ||
expect(c).toHaveProperty('ScaleInCooldown', 60) | ||
expect(c).toHaveProperty('ScaleOutCooldown', 70) | ||
expect(c).toHaveProperty('TargetValue', 15) | ||
expect(c).toHaveProperty('ScaleInCooldown', 20) | ||
expect(c).toHaveProperty('ScaleOutCooldown', 30) | ||
expect(c).toHaveProperty('TargetValue', 10) | ||
}) | ||
}) |
@@ -1,2 +0,1 @@ | ||
import * as names from '../../src/aws/names' | ||
import Role from '../../src/aws/role' | ||
@@ -6,26 +5,28 @@ | ||
it('creates CF resource', () => { | ||
const r = new Role('', 'my-table-name') | ||
const r = new Role({ | ||
index: 'index', | ||
region: 'region', | ||
service: 'service', | ||
stage: 'stage', | ||
table: 'MyTableResource' | ||
}) | ||
const j = r.toJSON() | ||
expect(j).toHaveProperty(names.role('', 'my-table-name')) | ||
const d = j[names.role('', 'my-table-name')] | ||
expect(d).toHaveProperty('Type', 'AWS::IAM::Role') | ||
expect(d).toHaveProperty('Properties.RoleName', 'DynamoDBAutoscaleRolemytablename') | ||
expect(j).toHaveProperty('serviceDynamoDBAutoscaleRoleMyTableResourceIndexStageRegion') | ||
}) | ||
it('truncates role name if needed', () => { | ||
const r = new Role('service', 'my-table-name-with-some-extra-long-string-information-added-to-the-end') | ||
const r = new Role({ | ||
index: 'index', | ||
region: 'region', | ||
service: 'service-with-a-long-name-to-force-truncation', | ||
stage: 'stage', | ||
table: 'MyTableResource' | ||
}) | ||
const j = r.toJSON() | ||
const n = 'serviceDynamoDBAutoscaleRolemyta941c3679150ea9fa409846dd3c00ec13' | ||
expect(j).toHaveProperty(n) | ||
const d = j[n] | ||
expect(d.Properties.RoleName.length).toBe(64) | ||
expect(d).toHaveProperty('Properties.RoleName', n) | ||
expect(j).toHaveProperty('servicewithalongnametoforcetrunc81d5364e64588e2b095c450722c20a24') | ||
}) | ||
}) |
@@ -1,2 +0,1 @@ | ||
import * as names from '../../src/aws/names' | ||
import Target from '../../src/aws/target' | ||
@@ -6,34 +5,31 @@ | ||
it('creates CF resource for read capacity', () => { | ||
const t = new Target('', 'my-table-name', 4, 100, true) | ||
const t = new Target({ | ||
index: 'index', | ||
region: 'region', | ||
service: 'service', | ||
stage: 'stage', | ||
table: 'MyTableResource' | ||
}, true, 10, 100) | ||
const j = t.toJSON() | ||
expect(j).toHaveProperty(names.target('', 'my-table-name', true)) | ||
expect(j).toHaveProperty('serviceAutoScalingTargetReadMyTableResourceIndexStageRegion') | ||
const d = j[names.target('', 'my-table-name', true)] | ||
const d = j.serviceAutoScalingTargetReadMyTableResourceIndexStageRegion | ||
expect(d).toHaveProperty('Type', 'AWS::ApplicationAutoScaling::ScalableTarget') | ||
expect(d).toHaveProperty('Properties.MinCapacity', 4) | ||
expect(d).toHaveProperty('Properties.MinCapacity', 10) | ||
expect(d).toHaveProperty('Properties.MaxCapacity', 100) | ||
expect(d).toHaveProperty('Properties.ScalableDimension', names.dimension(true)) | ||
expect(d).toHaveProperty('Properties.ServiceNamespace', 'dynamodb') | ||
expect(d).toHaveProperty('Properties.RoleARN.Fn::GetAtt') | ||
expect(d).toHaveProperty('Properties.RoleARN.Fn::GetAtt', [ names.role('', 'my-table-name'), 'Arn' ]) | ||
}) | ||
it('creates CF resource for write capacity', () => { | ||
const t = new Target('', 'my-table-name', 100, 2000, false) | ||
const j = t.toJSON() | ||
it('creates CF resource for false capacity', () => { | ||
const t = new Target({ | ||
index: 'index', | ||
region: 'region', | ||
service: 'service', | ||
stage: 'stage', | ||
table: 'MyTableResource' | ||
}, false, 10, 100) | ||
expect(j).toHaveProperty(names.target('', 'my-table-name', false)) | ||
const d = j[names.target('', 'my-table-name', false)] | ||
expect(d).toHaveProperty('Type', 'AWS::ApplicationAutoScaling::ScalableTarget') | ||
expect(d).toHaveProperty('Properties.MinCapacity', 100) | ||
expect(d).toHaveProperty('Properties.MaxCapacity', 2000) | ||
expect(d).toHaveProperty('Properties.ScalableDimension', names.dimension(false)) | ||
expect(d).toHaveProperty('Properties.ServiceNamespace', 'dynamodb') | ||
expect(d).toHaveProperty('Properties.RoleARN.Fn::GetAtt') | ||
expect(d).toHaveProperty('Properties.RoleARN.Fn::GetAtt', [ names.role('', 'my-table-name'), 'Arn' ]) | ||
expect(t.toJSON()).toHaveProperty('serviceAutoScalingTargetWriteMyTableResourceIndexStageRegion') | ||
}) | ||
}) |
@@ -1,3 +0,1 @@ | ||
'use strict' | ||
import * as Plugin from '../src/plugin' | ||
@@ -4,0 +2,0 @@ |
@@ -19,7 +19,5 @@ { | ||
"src/**/*", | ||
"vendor/**/*" | ||
], | ||
"exclude": [ | ||
"node_modules/**/*" | ||
"vendor/**/*", | ||
"node_modules/serverless-types/**/*" | ||
] | ||
} |
@@ -14,1 +14,20 @@ declare interface Capacity { | ||
} | ||
declare interface Options { | ||
index: string | ||
region: string | ||
service: string | ||
stage: string | ||
table: string | ||
} | ||
/** | ||
* Merged with empty default Serverless.Service.Custom declaration | ||
*/ | ||
declare namespace Serverless { | ||
namespace Service { | ||
interface Custom { | ||
capacities: Capacity[] | ||
} | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
309532
50
1682
139
12