UNPKG

serverless-aliyun-function-compute-wnj

Version:

Provider plugin for the Serverless Framework v1.x which adds support for Aliyun Function Compute

111 lines (96 loc) 3.84 kB
'use strict'; const fs = require('fs'); const path = require('path'); const _ = require('lodash'); const BbPromise = require('bluebird'); module.exports = { setupRole(role) { const roleSym = Symbol('role'); return this.createRoleIfNotExists(role, roleSym) .then(() => this.createPoliciesIfNeeded(role, roleSym)) .then(() => this.attachPoliciesIfNeeded(role, roleSym)) .then(() => this[roleSym]); }, createRoleIfNotExists(role, roleSym) { return this.provider.getRole(role.RoleName) .then((foundRole) => { if (foundRole) { // TODO: update if AssumeRolePolicyDocument is different/smaller this[roleSym] = foundRole; this.serverless.cli.log(`RAM role ${role.RoleName} exists.`); return; } this.serverless.cli.log(`Creating RAM role ${role.RoleName}...`); return this.provider.createRole(role) .then((createdRole) => { this.serverless.cli.log(`Created RAM role ${role.RoleName}`); this[roleSym] = createdRole; }); }); }, createPoliciesIfNeeded(role, roleSym) { if (!this[roleSym]) { return; } return BbPromise.map(role.Policies, (policy) => this.createPolicyIfNeeded(policy)); }, createPolicyIfNeeded(policy) { if (policy.PolicyType === 'System') { return BbPromise.resolve(); } const policyName = policy.PolicyName; return this.provider.getPolicy(policyName, 'Custom') .then((foundPolicy) => { if (foundPolicy) { this.provider.getPolicyVersion(policyName, 'Custom', foundPolicy.DefaultVersion) .then((foundPolicyVersion) => { //remove the backslash const foundPolicyDocument = JSON.stringify(foundPolicyVersion.PolicyDocument).replace(/\\/g, ""); //add beginning/tail double quotes if (foundPolicyDocument !== ("\"" + JSON.stringify(policy.PolicyDocument) + "\"")) { //create a new version and set to default this.provider.createPolicyVersion(policy).then((createdPolicyVersion) => { this.provider.deletePolicyVersion(policyName, foundPolicy.DefaultVersion); this.serverless.cli.log(`Created RAM new policy version for ${policyName}, and set as default`,); this.serverless.cli.log(`Delete RAM old policy version ${foundPolicy.DefaultVersion}`); }); } else { this.serverless.cli.log(`No update to policy version found`); } }); return; } this.serverless.cli.log(`Creating RAM policy ${policyName}...`); return this.provider.createPolicy(policy) .then((createdPolicy) => { this.serverless.cli.log(`Created RAM policy ${policyName}`); }); }); }, attachPoliciesIfNeeded(role, roleSym) { if (!this[roleSym]) { return; } const roleName = role.RoleName; return this.provider.getPoliciesForRole(roleName).then((attached) => { return BbPromise.map(role.Policies, (policyProps) => { const policyName = policyProps.PolicyName; const policy = attached.find( (item) => item.PolicyName === policyName ); if (policy) { this.serverless.cli.log(`RAM policy ${policyName} has been attached to ${roleName}.`); return; } this.serverless.cli.log(`Attaching RAM policy ${policyName} to ${roleName}...`); return this.provider.attachPolicyToRole(role, { PolicyName: policyName, PolicyType: policyProps.PolicyType || 'Custom' }).then(() => { this.serverless.cli.log(`Attached RAM policy ${policyName} to ${roleName}`); }); }); }); }, };