From 2bf67ad8d7e0d31bcefe2c78e2488b7cd46aeadd Mon Sep 17 00:00:00 2001 From: Carter Wooten Date: Thu, 18 Apr 2019 19:19:39 -0400 Subject: [PATCH 1/7] Adding code to permit individual packaging --- deploy/lib/uploadArtifacts.js | 60 +++++++++++++++++++++++++++-------- package.json | 1 + package/googlePackage.js | 5 +++ 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/deploy/lib/uploadArtifacts.js b/deploy/lib/uploadArtifacts.js index 6141242..ec6de94 100644 --- a/deploy/lib/uploadArtifacts.js +++ b/deploy/lib/uploadArtifacts.js @@ -1,24 +1,58 @@ 'use strict'; const fs = require('fs'); +const _ = require('lodash'); +const BbPromise = require('bluebird'); +const path = require('path'); +const filesize = require('filesize'); module.exports = { uploadArtifacts() { this.serverless.cli.log('Uploading artifacts...'); - const params = { - bucket: this.serverless.service.provider.deploymentBucketName, - resource: { - name: this.serverless.service.package.artifactFilePath, - contentType: 'application/octet-stream', - }, - media: { - mimeType: 'application/octet-stream', - body: fs.createReadStream(this.serverless.service.package.artifact), - }, - }; - - return this.provider.request('storage', 'objects', 'insert', params) + const functionNames = this.serverless.service.getAllFunctions(); + const artifactFilePaths = _.uniq( + _.map(functionNames, (name) => { + const functionArtifactFileName = `${name}.zip`; + const functionObject = this.serverless.service.getFunction(name); + functionObject.package = functionObject.package || {}; + const artifactFilePath = functionObject.package.artifact || + this.serverless.service.package.artifact; + + if (!artifactFilePath || + (this.serverless.service.artifact && !functionObject.package.artifact)) { + if (this.serverless.service.package.individually || functionObject.package.individually) { + const artifactFileName = functionArtifactFileName; + return path.join(this.packagePath, artifactFileName); + } + return path.join(this.packagePath, this.provider.naming.getServiceArtifactName()); + } + + return artifactFilePath; + }), + ); + + return BbPromise.map(artifactFilePaths, (artifactFilePath) => { + const stats = fs.statSync(artifactFilePath); + const fileName = path.basename(artifactFilePath); + this.serverless.cli.log( + `Uploading service ${fileName} file to Google Cloud Storage (${filesize(stats.size)})...` + ); + + const params = { + bucket: this.serverless.service.provider.deploymentBucketName, + resource: { + name: `${this.serverless.service.package.artifactDirectoryName}/${path.basename(artifactFilePath)}`, + contentType: 'application/octet-stream', + }, + media: { + mimeType: 'application/octet-stream', + body: fs.createReadStream(artifactFilePath), + }, + }; + + return this.provider.request('storage', 'objects', 'insert', params); + }) .then(() => { this.serverless.cli.log('Artifacts successfully uploaded...'); }); diff --git a/package.json b/package.json index cf13ec0..ff3d555 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "async": "^2.1.4", "bluebird": "^3.4.7", "chalk": "^1.1.3", + "filesize": "^4.1.2", "fs-extra": "^3.0.1", "googleapis": "^32.0.0", "lodash": "^4.17.4" diff --git a/package/googlePackage.js b/package/googlePackage.js index d1cc375..1b1fc5b 100644 --- a/package/googlePackage.js +++ b/package/googlePackage.js @@ -1,6 +1,7 @@ 'use strict'; const BbPromise = require('bluebird'); +const path = require('path'); const cleanupServerlessDir = require('./lib/cleanupServerlessDir'); const validate = require('../shared/validate'); @@ -17,6 +18,10 @@ class GooglePackage { constructor(serverless, options) { this.serverless = serverless; this.options = options; + this.servicePath = this.serverless.config.servicePath || ''; + this.packagePath = this.options.package || + this.serverless.service.package.path || + path.join(this.servicePath || '.', '.serverless'); this.provider = this.serverless.getProvider('google'); Object.assign( From 0f6e734c40ac13273c87ac92c2ae2cc11cef814e Mon Sep 17 00:00:00 2001 From: Carter Wooten Date: Thu, 18 Apr 2019 19:23:07 -0400 Subject: [PATCH 2/7] Update `compileFunctions` for individual packaging --- package/lib/compileFunctions.js | 145 +++++++++++++++++--------------- 1 file changed, 75 insertions(+), 70 deletions(-) diff --git a/package/lib/compileFunctions.js b/package/lib/compileFunctions.js index e667347..e027533 100644 --- a/package/lib/compileFunctions.js +++ b/package/lib/compileFunctions.js @@ -8,78 +8,83 @@ const _ = require('lodash'); const BbPromise = require('bluebird'); module.exports = { + compileFunction(functionName) { + const funcObject = this.serverless.service.getFunction(functionName); + + this.serverless.cli + .log(`Compiling function "${functionName}"...`); + + validateHandlerProperty(funcObject, functionName); + validateEventsProperty(funcObject, functionName); + + const funcTemplate = getFunctionTemplate( + funcObject, + this.serverless.service.provider.region, + `gs://${ + this.serverless.service.provider.deploymentBucketName + }/${this.serverless.service.package.artifactDirectoryName}/${functionName}.zip`); + + funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') + || _.get(this, 'serverless.service.provider.memorySize') + || 256; + funcTemplate.properties.location = _.get(funcObject, 'location') + || _.get(this, 'serverless.service.provider.region') + || 'us-central1'; + funcTemplate.properties.runtime = _.get(funcObject, 'runtime') + || _.get(this, 'serverless.service.provider.runtime') + || 'nodejs8'; + funcTemplate.properties.timeout = _.get(funcObject, 'timeout') + || _.get(this, 'serverless.service.provider.timeout') + || '60s'; + funcTemplate.properties.environmentVariables = _.merge( + _.get(this, 'serverless.service.provider.environment'), + funcObject.environment // eslint-disable-line comma-dangle + ); + + if (!_.size(funcTemplate.properties.environmentVariables)) { + delete funcTemplate.properties.environmentVariables; + } + + funcTemplate.properties.labels = _.assign({}, + _.get(this, 'serverless.service.provider.labels') || {}, + _.get(funcObject, 'labels') || {} // eslint-disable-line comma-dangle + ); + + const eventType = Object.keys(funcObject.events[0])[0]; + + if (eventType === 'http') { + const url = funcObject.events[0].http; + + funcTemplate.properties.httpsTrigger = {}; + funcTemplate.properties.httpsTrigger.url = url; + } + if (eventType === 'event') { + const type = funcObject.events[0].event.eventType; + const path = funcObject.events[0].event.path; //eslint-disable-line + const resource = funcObject.events[0].event.resource; + + funcTemplate.properties.eventTrigger = {}; + funcTemplate.properties.eventTrigger.eventType = type; + if (path) funcTemplate.properties.eventTrigger.path = path; + funcTemplate.properties.eventTrigger.resource = resource; + } + + this.serverless.service.provider.compiledConfigurationTemplate.resources.push(funcTemplate); + }, compileFunctions() { const artifactFilePath = this.serverless.service.package.artifact; - const fileName = artifactFilePath.split(path.sep).pop(); - - this.serverless.service.package - .artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; - - this.serverless.service.getAllFunctions().forEach((functionName) => { - const funcObject = this.serverless.service.getFunction(functionName); - - this.serverless.cli - .log(`Compiling function "${functionName}"...`); - - validateHandlerProperty(funcObject, functionName); - validateEventsProperty(funcObject, functionName); - - const funcTemplate = getFunctionTemplate( - funcObject, - this.serverless.service.provider.region, - `gs://${ - this.serverless.service.provider.deploymentBucketName - }/${this.serverless.service.package.artifactFilePath}`); - - funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') - || _.get(this, 'serverless.service.provider.memorySize') - || 256; - funcTemplate.properties.location = _.get(funcObject, 'location') - || _.get(this, 'serverless.service.provider.region') - || 'us-central1'; - funcTemplate.properties.runtime = _.get(funcObject, 'runtime') - || _.get(this, 'serverless.service.provider.runtime') - || 'nodejs8'; - funcTemplate.properties.timeout = _.get(funcObject, 'timeout') - || _.get(this, 'serverless.service.provider.timeout') - || '60s'; - funcTemplate.properties.environmentVariables = _.merge( - _.get(this, 'serverless.service.provider.environment'), - funcObject.environment // eslint-disable-line comma-dangle - ); - - if (!_.size(funcTemplate.properties.environmentVariables)) { - delete funcTemplate.properties.environmentVariables; - } - - funcTemplate.properties.labels = _.assign({}, - _.get(this, 'serverless.service.provider.labels') || {}, - _.get(funcObject, 'labels') || {} // eslint-disable-line comma-dangle - ); - - const eventType = Object.keys(funcObject.events[0])[0]; - - if (eventType === 'http') { - const url = funcObject.events[0].http; - - funcTemplate.properties.httpsTrigger = {}; - funcTemplate.properties.httpsTrigger.url = url; - } - if (eventType === 'event') { - const type = funcObject.events[0].event.eventType; - const path = funcObject.events[0].event.path; //eslint-disable-line - const resource = funcObject.events[0].event.resource; - - funcTemplate.properties.eventTrigger = {}; - funcTemplate.properties.eventTrigger.eventType = type; - if (path) funcTemplate.properties.eventTrigger.path = path; - funcTemplate.properties.eventTrigger.resource = resource; - } - - this.serverless.service.provider.compiledConfigurationTemplate.resources.push(funcTemplate); - }); - - return BbPromise.resolve(); + if (artifactFilePath) { + const fileName = artifactFilePath.split(path.sep).pop(); + + this.serverless.service.package + .artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; + } + + const allFunctions = this.serverless.service.getAllFunctions(); + return BbPromise.each( + allFunctions, + functionName => this.compileFunction(functionName) + ); }, }; From 50701e266e3508b865e31aa7f67b64bb69a5d8e1 Mon Sep 17 00:00:00 2001 From: Carter Wooten Date: Thu, 18 Apr 2019 19:43:30 -0400 Subject: [PATCH 3/7] Fixes after testing without individual packaging --- deploy/googleDeploy.js | 5 +++++ deploy/lib/uploadArtifacts.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/deploy/googleDeploy.js b/deploy/googleDeploy.js index dfe845e..7a69471 100644 --- a/deploy/googleDeploy.js +++ b/deploy/googleDeploy.js @@ -1,6 +1,7 @@ 'use strict'; const BbPromise = require('bluebird'); +const path = require('path'); const validate = require('../shared/validate'); const utils = require('../shared/utils'); @@ -15,6 +16,10 @@ class GoogleDeploy { constructor(serverless, options) { this.serverless = serverless; this.options = options; + this.servicePath = this.serverless.config.servicePath || ''; + this.packagePath = this.options.package || + this.serverless.service.package.path || + path.join(this.servicePath || '.', '.serverless'); this.provider = this.serverless.getProvider('google'); Object.assign( diff --git a/deploy/lib/uploadArtifacts.js b/deploy/lib/uploadArtifacts.js index ec6de94..87a5d05 100644 --- a/deploy/lib/uploadArtifacts.js +++ b/deploy/lib/uploadArtifacts.js @@ -25,7 +25,7 @@ module.exports = { const artifactFileName = functionArtifactFileName; return path.join(this.packagePath, artifactFileName); } - return path.join(this.packagePath, this.provider.naming.getServiceArtifactName()); + return path.join(this.packagePath, `${this.provider.serverless.service.service}.zip`); } return artifactFilePath; From b08e4938f7d276313711be93ac7a5ac11287cfe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=A9ger?= <8971906+El-Fitz@users.noreply.github.com> Date: Fri, 4 Jun 2021 15:20:07 +0200 Subject: [PATCH 4/7] fix linting --- deploy/lib/uploadArtifacts.js | 2 +- package/lib/compileFunctions.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/lib/uploadArtifacts.js b/deploy/lib/uploadArtifacts.js index 87a5d05..e0b3f88 100644 --- a/deploy/lib/uploadArtifacts.js +++ b/deploy/lib/uploadArtifacts.js @@ -36,7 +36,7 @@ module.exports = { const stats = fs.statSync(artifactFilePath); const fileName = path.basename(artifactFilePath); this.serverless.cli.log( - `Uploading service ${fileName} file to Google Cloud Storage (${filesize(stats.size)})...` + `Uploading service ${fileName} file to Google Cloud Storage (${filesize(stats.size)})...`, ); const params = { diff --git a/package/lib/compileFunctions.js b/package/lib/compileFunctions.js index e027533..e4b3fb2 100644 --- a/package/lib/compileFunctions.js +++ b/package/lib/compileFunctions.js @@ -79,11 +79,11 @@ module.exports = { this.serverless.service.package .artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; } - + const allFunctions = this.serverless.service.getAllFunctions(); return BbPromise.each( allFunctions, - functionName => this.compileFunction(functionName) + functionName => this.compileFunction(functionName), ); }, }; From 7629380da3a6cd784435a76e09261e49b43a4bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=A9ger?= <8971906+El-Fitz@users.noreply.github.com> Date: Fri, 4 Jun 2021 16:08:00 +0200 Subject: [PATCH 5/7] resolve conflicts --- deploy/lib/uploadArtifacts.js | 3 +- package.json | 13 +- package/lib/compileFunctions.js | 259 +++++++++++++++++--------------- 3 files changed, 142 insertions(+), 133 deletions(-) diff --git a/deploy/lib/uploadArtifacts.js b/deploy/lib/uploadArtifacts.js index e0b3f88..b6fe3ee 100644 --- a/deploy/lib/uploadArtifacts.js +++ b/deploy/lib/uploadArtifacts.js @@ -52,8 +52,7 @@ module.exports = { }; return this.provider.request('storage', 'objects', 'insert', params); - }) - .then(() => { + }).then(() => { this.serverless.cli.log('Artifacts successfully uploaded...'); }); }, diff --git a/package.json b/package.json index ff3d555..3908cc7 100644 --- a/package.json +++ b/package.json @@ -25,13 +25,14 @@ "serverless.com" ], "dependencies": { - "async": "^2.1.4", - "bluebird": "^3.4.7", - "chalk": "^1.1.3", + "async": "^2.6.3", + "bluebird": "^3.7.2", + "chalk": "^3.0.0", "filesize": "^4.1.2", - "fs-extra": "^3.0.1", - "googleapis": "^32.0.0", - "lodash": "^4.17.4" + "fs-extra": "^8.1.0", + "get-stdin": "^8.0.0", + "googleapis": "^50.0.0", + "lodash": "^4.17.21" }, "devDependencies": { "coveralls": "^2.11.16", diff --git a/package/lib/compileFunctions.js b/package/lib/compileFunctions.js index e4b3fb2..6fe8771 100644 --- a/package/lib/compileFunctions.js +++ b/package/lib/compileFunctions.js @@ -8,138 +8,147 @@ const _ = require('lodash'); const BbPromise = require('bluebird'); module.exports = { - compileFunction(functionName) { + compileFunction(functionName, projectName) { const funcObject = this.serverless.service.getFunction(functionName); - - this.serverless.cli - .log(`Compiling function "${functionName}"...`); - + + this.serverless.cli.log(`Compiling function "${functionName}"...`); + validateHandlerProperty(funcObject, functionName); validateEventsProperty(funcObject, functionName); - + validateVpcConnectorProperty(funcObject, functionName); + const funcTemplate = getFunctionTemplate( funcObject, + projectName, this.serverless.service.provider.region, - `gs://${ - this.serverless.service.provider.deploymentBucketName - }/${this.serverless.service.package.artifactDirectoryName}/${functionName}.zip`); - - funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') + `gs://${this.serverless.service.provider.deploymentBucketName}/${this.serverless.service.package.artifactDirectoryName}/${functionName}.zip` + ); + + funcTemplate.properties.serviceAccountEmail = + _.get(funcObject, 'serviceAccountEmail') || + _.get(this, 'serverless.service.provider.serviceAccountEmail') || + null; + funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') || _.get(this, 'serverless.service.provider.memorySize') || 256; - funcTemplate.properties.location = _.get(funcObject, 'location') - || _.get(this, 'serverless.service.provider.region') - || 'us-central1'; - funcTemplate.properties.runtime = _.get(funcObject, 'runtime') - || _.get(this, 'serverless.service.provider.runtime') - || 'nodejs8'; - funcTemplate.properties.timeout = _.get(funcObject, 'timeout') + funcTemplate.properties.runtime = this.provider.getRuntime(funcObject); + funcTemplate.properties.timeout = _.get(funcObject, 'timeout') || _.get(this, 'serverless.service.provider.timeout') || '60s'; - funcTemplate.properties.environmentVariables = _.merge( - _.get(this, 'serverless.service.provider.environment'), - funcObject.environment // eslint-disable-line comma-dangle - ); - - if (!_.size(funcTemplate.properties.environmentVariables)) { - delete funcTemplate.properties.environmentVariables; - } - - funcTemplate.properties.labels = _.assign({}, - _.get(this, 'serverless.service.provider.labels') || {}, - _.get(funcObject, 'labels') || {} // eslint-disable-line comma-dangle - ); - - const eventType = Object.keys(funcObject.events[0])[0]; - - if (eventType === 'http') { - const url = funcObject.events[0].http; - - funcTemplate.properties.httpsTrigger = {}; - funcTemplate.properties.httpsTrigger.url = url; - } - if (eventType === 'event') { - const type = funcObject.events[0].event.eventType; - const path = funcObject.events[0].event.path; //eslint-disable-line - const resource = funcObject.events[0].event.resource; - - funcTemplate.properties.eventTrigger = {}; - funcTemplate.properties.eventTrigger.eventType = type; - if (path) funcTemplate.properties.eventTrigger.path = path; - funcTemplate.properties.eventTrigger.resource = resource; - } - - this.serverless.service.provider.compiledConfigurationTemplate.resources.push(funcTemplate); - }, - compileFunctions() { - const artifactFilePath = this.serverless.service.package.artifact; - if (artifactFilePath) { - const fileName = artifactFilePath.split(path.sep).pop(); - - this.serverless.service.package - .artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; - } - - const allFunctions = this.serverless.service.getAllFunctions(); - return BbPromise.each( - allFunctions, - functionName => this.compileFunction(functionName), - ); - }, -}; - -const validateHandlerProperty = (funcObject, functionName) => { - if (!funcObject.handler) { - const errorMessage = [ - `Missing "handler" property for function "${functionName}".`, - ' Your function needs a "handler".', - ' Please check the docs for more info.', - ].join(''); - throw new Error(errorMessage); - } -}; - -const validateEventsProperty = (funcObject, functionName) => { - if (!funcObject.events || funcObject.events.length === 0) { - const errorMessage = [ - `Missing "events" property for function "${functionName}".`, - ' Your function needs at least one "event".', - ' Please check the docs for more info.', - ].join(''); - throw new Error(errorMessage); - } - - if (funcObject.events.length > 1) { - const errorMessage = [ - `The function "${functionName}" has more than one event.`, - ' Only one event per function is supported.', - ' Please check the docs for more info.', - ].join(''); - throw new Error(errorMessage); - } - - const supportedEvents = ['http', 'event']; - const eventType = Object.keys(funcObject.events[0])[0]; - if (supportedEvents.indexOf(eventType) === -1) { - const errorMessage = [ - `Event type "${eventType}" of function "${functionName}" not supported.`, - ` supported event types are: ${supportedEvents.join(', ')}`, - ].join(''); - throw new Error(errorMessage); - } -}; - -const getFunctionTemplate = (funcObject, region, sourceArchiveUrl) => { //eslint-disable-line - return { - type: 'cloudfunctions.v1beta2.function', - name: funcObject.name, - properties: { - location: region, - availableMemoryMb: 256, - runtime: 'nodejs8', - timeout: '60s', - function: funcObject.handler, - sourceArchiveUrl, - }, - }; -}; + funcTemplate.properties.environmentVariables = this.provider.getConfiguredEnvironment(funcObject); + + if (!funcTemplate.properties.serviceAccountEmail) { + delete funcTemplate.properties.serviceAccountEmail; + } + + if (funcObject.vpc) { + _.assign(funcTemplate.properties, { + vpcConnector: _.get(funcObject, 'vpc') || _.get(this, 'serverless.service.provider.vpc'), + }); + } + + if (funcObject.maxInstances) { + funcTemplate.properties.maxInstances = funcObject.maxInstances; + } + + if (!_.size(funcTemplate.properties.environmentVariables)) { + delete funcTemplate.properties.environmentVariables; + } + + funcTemplate.properties.labels = _.assign({}, + _.get(this, 'serverless.service.provider.labels') || {}, + _.get(funcObject, 'labels') || {} // eslint-disable-line comma-dangle + ); + + const eventType = Object.keys(funcObject.events[0])[0]; + + if (eventType === 'http') { + const url = funcObject.events[0].http; + + funcTemplate.properties.httpsTrigger = {}; + funcTemplate.properties.httpsTrigger.url = url; + } + if (eventType === 'event') { + const type = funcObject.events[0].event.eventType; + const path = funcObject.events[0].event.path; //eslint-disable-line + const resource = funcObject.events[0].event.resource; + + funcTemplate.properties.eventTrigger = {}; + funcTemplate.properties.eventTrigger.eventType = type; + if (path) funcTemplate.properties.eventTrigger.path = path; + funcTemplate.properties.eventTrigger.resource = resource; + } + + this.serverless.service.provider.compiledConfigurationTemplate.resources.push(funcTemplate); + }, + compileFunctions() { + const artifactFilePath = this.serverless.service.package.artifact; + const fileName = artifactFilePath.split(path.sep).pop(); + const projectName = _.get(this, 'serverless.service.provider.project'); + this.serverless.service.provider.region = this.serverless.service.provider.region || 'us-central1'; + this.serverless.service.package.artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; + + const allFunctions = this.serverless.service.getAllFunctions(); + return BbPromise.each( + allFunctions, + functionName => this.compileFunction(functionName, projectName), + ); + }, + }; + + const validateHandlerProperty = (funcObject, functionName) => { + if (!funcObject.handler) { + const errorMessage = [ + `Missing "handler" property for function "${functionName}".`, + ' Your function needs a "handler".', + ' Please check the docs for more info.', + ].join(''); + throw new Error(errorMessage); + } + }; + + const validateEventsProperty = (funcObject, functionName) => { + if (!funcObject.events || funcObject.events.length === 0) { + const errorMessage = [ + `Missing "events" property for function "${functionName}".`, + ' Your function needs at least one "event".', + ' Please check the docs for more info.', + ].join(''); + throw new Error(errorMessage); + } + + if (funcObject.events.length > 1) { + const errorMessage = [ + `The function "${functionName}" has more than one event.`, + ' Only one event per function is supported.', + ' Please check the docs for more info.', + ].join(''); + throw new Error(errorMessage); + } + + const supportedEvents = ['http', 'event']; + const eventType = Object.keys(funcObject.events[0])[0]; + if (supportedEvents.indexOf(eventType) === -1) { + const errorMessage = [ + `Event type "${eventType}" of function "${functionName}" not supported.`, + ` supported event types are: ${supportedEvents.join(', ')}`, + ].join(''); + throw new Error(errorMessage); + } + }; + + const getFunctionTemplate = (funcObject, region, sourceArchiveUrl) => { //eslint-disable-line + return { + type: 'cloudfunctions.v1beta2.function', + name: funcObject.name, + properties: { + location: region, + availableMemoryMb: 256, + runtime: 'nodejs8', + timeout: '60s', + function: funcObject.handler, + sourceArchiveUrl, + }, + }; + }; + \ No newline at end of file From 54971971acd371d627d6ef6ef2ccc9a18002e6ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=A9ger?= <8971906+El-Fitz@users.noreply.github.com> Date: Fri, 4 Jun 2021 16:14:45 +0200 Subject: [PATCH 6/7] fix indentation --- package/lib/compileFunctions.js | 255 ++++++++++++++++---------------- 1 file changed, 127 insertions(+), 128 deletions(-) diff --git a/package/lib/compileFunctions.js b/package/lib/compileFunctions.js index 6fe8771..c637667 100644 --- a/package/lib/compileFunctions.js +++ b/package/lib/compileFunctions.js @@ -22,133 +22,132 @@ module.exports = { projectName, this.serverless.service.provider.region, `gs://${this.serverless.service.provider.deploymentBucketName}/${this.serverless.service.package.artifactDirectoryName}/${functionName}.zip` - ); - - funcTemplate.properties.serviceAccountEmail = - _.get(funcObject, 'serviceAccountEmail') || - _.get(this, 'serverless.service.provider.serviceAccountEmail') || - null; - funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') - || _.get(this, 'serverless.service.provider.memorySize') - || 256; - funcTemplate.properties.runtime = this.provider.getRuntime(funcObject); - funcTemplate.properties.timeout = _.get(funcObject, 'timeout') - || _.get(this, 'serverless.service.provider.timeout') - || '60s'; - funcTemplate.properties.environmentVariables = this.provider.getConfiguredEnvironment(funcObject); - - if (!funcTemplate.properties.serviceAccountEmail) { - delete funcTemplate.properties.serviceAccountEmail; - } - - if (funcObject.vpc) { - _.assign(funcTemplate.properties, { - vpcConnector: _.get(funcObject, 'vpc') || _.get(this, 'serverless.service.provider.vpc'), - }); - } - - if (funcObject.maxInstances) { - funcTemplate.properties.maxInstances = funcObject.maxInstances; - } - - if (!_.size(funcTemplate.properties.environmentVariables)) { - delete funcTemplate.properties.environmentVariables; - } - - funcTemplate.properties.labels = _.assign({}, - _.get(this, 'serverless.service.provider.labels') || {}, - _.get(funcObject, 'labels') || {} // eslint-disable-line comma-dangle - ); - - const eventType = Object.keys(funcObject.events[0])[0]; - - if (eventType === 'http') { - const url = funcObject.events[0].http; - - funcTemplate.properties.httpsTrigger = {}; - funcTemplate.properties.httpsTrigger.url = url; - } - if (eventType === 'event') { - const type = funcObject.events[0].event.eventType; - const path = funcObject.events[0].event.path; //eslint-disable-line - const resource = funcObject.events[0].event.resource; - - funcTemplate.properties.eventTrigger = {}; - funcTemplate.properties.eventTrigger.eventType = type; - if (path) funcTemplate.properties.eventTrigger.path = path; - funcTemplate.properties.eventTrigger.resource = resource; - } - - this.serverless.service.provider.compiledConfigurationTemplate.resources.push(funcTemplate); - }, - compileFunctions() { - const artifactFilePath = this.serverless.service.package.artifact; - const fileName = artifactFilePath.split(path.sep).pop(); - const projectName = _.get(this, 'serverless.service.provider.project'); - this.serverless.service.provider.region = this.serverless.service.provider.region || 'us-central1'; - this.serverless.service.package.artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; - - const allFunctions = this.serverless.service.getAllFunctions(); - return BbPromise.each( - allFunctions, - functionName => this.compileFunction(functionName, projectName), - ); - }, - }; - - const validateHandlerProperty = (funcObject, functionName) => { - if (!funcObject.handler) { - const errorMessage = [ - `Missing "handler" property for function "${functionName}".`, - ' Your function needs a "handler".', - ' Please check the docs for more info.', - ].join(''); - throw new Error(errorMessage); - } - }; + ); + + funcTemplate.properties.serviceAccountEmail = + _.get(funcObject, 'serviceAccountEmail') || + _.get(this, 'serverless.service.provider.serviceAccountEmail') || + null; + funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') + || _.get(this, 'serverless.service.provider.memorySize') + || 256; + funcTemplate.properties.runtime = this.provider.getRuntime(funcObject); + funcTemplate.properties.timeout = _.get(funcObject, 'timeout') + || _.get(this, 'serverless.service.provider.timeout') + || '60s'; + funcTemplate.properties.environmentVariables = this.provider.getConfiguredEnvironment(funcObject); + + if (!funcTemplate.properties.serviceAccountEmail) { + delete funcTemplate.properties.serviceAccountEmail; + } + + if (funcObject.vpc) { + _.assign(funcTemplate.properties, { + vpcConnector: _.get(funcObject, 'vpc') || _.get(this, 'serverless.service.provider.vpc'), + }); + } + + if (funcObject.maxInstances) { + funcTemplate.properties.maxInstances = funcObject.maxInstances; + } + + if (!_.size(funcTemplate.properties.environmentVariables)) { + delete funcTemplate.properties.environmentVariables; + } + + funcTemplate.properties.labels = _.assign({}, + _.get(this, 'serverless.service.provider.labels') || {}, + _.get(funcObject, 'labels') || {} // eslint-disable-line comma-dangle + ); + + const eventType = Object.keys(funcObject.events[0])[0]; + + if (eventType === 'http') { + const url = funcObject.events[0].http; - const validateEventsProperty = (funcObject, functionName) => { - if (!funcObject.events || funcObject.events.length === 0) { - const errorMessage = [ - `Missing "events" property for function "${functionName}".`, - ' Your function needs at least one "event".', - ' Please check the docs for more info.', - ].join(''); - throw new Error(errorMessage); - } - - if (funcObject.events.length > 1) { - const errorMessage = [ - `The function "${functionName}" has more than one event.`, - ' Only one event per function is supported.', - ' Please check the docs for more info.', - ].join(''); - throw new Error(errorMessage); - } - - const supportedEvents = ['http', 'event']; - const eventType = Object.keys(funcObject.events[0])[0]; - if (supportedEvents.indexOf(eventType) === -1) { - const errorMessage = [ - `Event type "${eventType}" of function "${functionName}" not supported.`, - ` supported event types are: ${supportedEvents.join(', ')}`, - ].join(''); - throw new Error(errorMessage); - } - }; + funcTemplate.properties.httpsTrigger = {}; + funcTemplate.properties.httpsTrigger.url = url; + } + if (eventType === 'event') { + const type = funcObject.events[0].event.eventType; + const path = funcObject.events[0].event.path; //eslint-disable-line + const resource = funcObject.events[0].event.resource; - const getFunctionTemplate = (funcObject, region, sourceArchiveUrl) => { //eslint-disable-line - return { - type: 'cloudfunctions.v1beta2.function', - name: funcObject.name, - properties: { - location: region, - availableMemoryMb: 256, - runtime: 'nodejs8', - timeout: '60s', - function: funcObject.handler, - sourceArchiveUrl, - }, - }; - }; - \ No newline at end of file + funcTemplate.properties.eventTrigger = {}; + funcTemplate.properties.eventTrigger.eventType = type; + if (path) funcTemplate.properties.eventTrigger.path = path; + funcTemplate.properties.eventTrigger.resource = resource; + } + + this.serverless.service.provider.compiledConfigurationTemplate.resources.push(funcTemplate); + }, + compileFunctions() { + const artifactFilePath = this.serverless.service.package.artifact; + const fileName = artifactFilePath.split(path.sep).pop(); + const projectName = _.get(this, 'serverless.service.provider.project'); + this.serverless.service.provider.region = this.serverless.service.provider.region || 'us-central1'; + this.serverless.service.package.artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; + + const allFunctions = this.serverless.service.getAllFunctions(); + return BbPromise.each( + allFunctions, + functionName => this.compileFunction(functionName, projectName), + ); + }, +}; + +const validateHandlerProperty = (funcObject, functionName) => { + if (!funcObject.handler) { + const errorMessage = [ + `Missing "handler" property for function "${functionName}".`, + ' Your function needs a "handler".', + ' Please check the docs for more info.', + ].join(''); + throw new Error(errorMessage); + } +}; + +const validateEventsProperty = (funcObject, functionName) => { + if (!funcObject.events || funcObject.events.length === 0) { + const errorMessage = [ + `Missing "events" property for function "${functionName}".`, + ' Your function needs at least one "event".', + ' Please check the docs for more info.', + ].join(''); + throw new Error(errorMessage); + } + + if (funcObject.events.length > 1) { + const errorMessage = [ + `The function "${functionName}" has more than one event.`, + ' Only one event per function is supported.', + ' Please check the docs for more info.', + ].join(''); + throw new Error(errorMessage); + } + + const supportedEvents = ['http', 'event']; + const eventType = Object.keys(funcObject.events[0])[0]; + if (supportedEvents.indexOf(eventType) === -1) { + const errorMessage = [ + `Event type "${eventType}" of function "${functionName}" not supported.`, + ` supported event types are: ${supportedEvents.join(', ')}`, + ].join(''); + throw new Error(errorMessage); + } +}; + +const getFunctionTemplate = (funcObject, region, sourceArchiveUrl) => { //eslint-disable-line + return { + type: 'cloudfunctions.v1beta2.function', + name: funcObject.name, + properties: { + location: region, + availableMemoryMb: 256, + runtime: 'nodejs8', + timeout: '60s', + function: funcObject.handler, + sourceArchiveUrl, + }, + }; +}; From 90efdcae0b7db44069f7ea02a92c62e07143027b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=A9ger?= <8971906+El-Fitz@users.noreply.github.com> Date: Fri, 4 Jun 2021 17:02:07 +0200 Subject: [PATCH 7/7] get branch up-to-date with remote master --- deploy/googleDeploy.js | 3 +- deploy/lib/uploadArtifacts.js | 22 ++++---- package/googlePackage.js | 3 +- package/lib/compileFunctions.js | 92 ++++++++++++--------------------- 4 files changed, 49 insertions(+), 71 deletions(-) diff --git a/deploy/googleDeploy.js b/deploy/googleDeploy.js index e7c718e..f576bf1 100644 --- a/deploy/googleDeploy.js +++ b/deploy/googleDeploy.js @@ -17,7 +17,8 @@ class GoogleDeploy { this.serverless = serverless; this.options = options; this.servicePath = this.serverless.config.servicePath || ''; - this.packagePath = this.options.package || + this.packagePath = + this.options.package || this.serverless.service.package.path || path.join(this.servicePath || '.', '.serverless'); this.provider = this.serverless.getProvider('google'); diff --git a/deploy/lib/uploadArtifacts.js b/deploy/lib/uploadArtifacts.js index b6fe3ee..aa69ed1 100644 --- a/deploy/lib/uploadArtifacts.js +++ b/deploy/lib/uploadArtifacts.js @@ -16,11 +16,13 @@ module.exports = { const functionArtifactFileName = `${name}.zip`; const functionObject = this.serverless.service.getFunction(name); functionObject.package = functionObject.package || {}; - const artifactFilePath = functionObject.package.artifact || - this.serverless.service.package.artifact; + const artifactFilePath = + functionObject.package.artifact || this.serverless.service.package.artifact; - if (!artifactFilePath || - (this.serverless.service.artifact && !functionObject.package.artifact)) { + if ( + !artifactFilePath || + (this.serverless.service.artifact && !functionObject.package.artifact) + ) { if (this.serverless.service.package.individually || functionObject.package.individually) { const artifactFileName = functionArtifactFileName; return path.join(this.packagePath, artifactFileName); @@ -29,20 +31,22 @@ module.exports = { } return artifactFilePath; - }), + }) ); return BbPromise.map(artifactFilePaths, (artifactFilePath) => { const stats = fs.statSync(artifactFilePath); const fileName = path.basename(artifactFilePath); this.serverless.cli.log( - `Uploading service ${fileName} file to Google Cloud Storage (${filesize(stats.size)})...`, + `Uploading service ${fileName} file to Google Cloud Storage (${filesize(stats.size)})...` ); const params = { bucket: this.serverless.service.provider.deploymentBucketName, resource: { - name: `${this.serverless.service.package.artifactDirectoryName}/${path.basename(artifactFilePath)}`, + name: `${this.serverless.service.package.artifactDirectoryName}/${path.basename( + artifactFilePath + )}`, contentType: 'application/octet-stream', }, media: { @@ -53,7 +57,7 @@ module.exports = { return this.provider.request('storage', 'objects', 'insert', params); }).then(() => { - this.serverless.cli.log('Artifacts successfully uploaded...'); - }); + this.serverless.cli.log('Artifacts successfully uploaded...'); + }); }, }; diff --git a/package/googlePackage.js b/package/googlePackage.js index 8ac5830..3836141 100644 --- a/package/googlePackage.js +++ b/package/googlePackage.js @@ -19,7 +19,8 @@ class GooglePackage { this.serverless = serverless; this.options = options; this.servicePath = this.serverless.config.servicePath || ''; - this.packagePath = this.options.package || + this.packagePath = + this.options.package || this.serverless.service.package.path || path.join(this.servicePath || '.', '.serverless'); this.provider = this.serverless.getProvider('google'); diff --git a/package/lib/compileFunctions.js b/package/lib/compileFunctions.js index 94b8d7d..1c7f405 100644 --- a/package/lib/compileFunctions.js +++ b/package/lib/compileFunctions.js @@ -11,61 +11,63 @@ const { validateEventsProperty } = require('../../shared/validate'); module.exports = { compileFunction(functionName, projectName) { const funcObject = this.serverless.service.getFunction(functionName); - + this.serverless.cli.log(`Compiling function "${functionName}"...`); - + validateHandlerProperty(funcObject, functionName); validateEventsProperty(funcObject, functionName); validateVpcConnectorProperty(funcObject, functionName); - + const funcTemplate = getFunctionTemplate( funcObject, projectName, this.serverless.service.provider.region, `gs://${this.serverless.service.provider.deploymentBucketName}/${this.serverless.service.package.artifactDirectoryName}/${functionName}.zip` ); - + funcTemplate.properties.serviceAccountEmail = - _.get(funcObject, 'serviceAccountEmail') || - _.get(this, 'serverless.service.provider.serviceAccountEmail') || - null; - funcTemplate.properties.availableMemoryMb = _.get(funcObject, 'memorySize') - || _.get(this, 'serverless.service.provider.memorySize') - || 256; + _.get(funcObject, 'serviceAccountEmail') || + _.get(this, 'serverless.service.provider.serviceAccountEmail') || + null; + funcTemplate.properties.availableMemoryMb = + _.get(funcObject, 'memorySize') || + _.get(this, 'serverless.service.provider.memorySize') || + 256; funcTemplate.properties.runtime = this.provider.getRuntime(funcObject); - funcTemplate.properties.timeout = _.get(funcObject, 'timeout') - || _.get(this, 'serverless.service.provider.timeout') - || '60s'; - funcTemplate.properties.environmentVariables = this.provider.getConfiguredEnvironment(funcObject); - + funcTemplate.properties.timeout = + _.get(funcObject, 'timeout') || _.get(this, 'serverless.service.provider.timeout') || '60s'; + funcTemplate.properties.environmentVariables = + this.provider.getConfiguredEnvironment(funcObject); + if (!funcTemplate.properties.serviceAccountEmail) { delete funcTemplate.properties.serviceAccountEmail; } - + if (funcObject.vpc) { _.assign(funcTemplate.properties, { vpcConnector: _.get(funcObject, 'vpc') || _.get(this, 'serverless.service.provider.vpc'), }); } - + if (funcObject.maxInstances) { funcTemplate.properties.maxInstances = funcObject.maxInstances; } - + if (!_.size(funcTemplate.properties.environmentVariables)) { delete funcTemplate.properties.environmentVariables; } - - funcTemplate.properties.labels = _.assign({}, + + funcTemplate.properties.labels = _.assign( + {}, _.get(this, 'serverless.service.provider.labels') || {}, _.get(funcObject, 'labels') || {} // eslint-disable-line comma-dangle ); - + const eventType = Object.keys(funcObject.events[0])[0]; - + if (eventType === 'http') { const url = funcObject.events[0].http; - + funcTemplate.properties.httpsTrigger = {}; funcTemplate.properties.httpsTrigger.url = url; } @@ -73,26 +75,26 @@ module.exports = { const type = funcObject.events[0].event.eventType; const path = funcObject.events[0].event.path; //eslint-disable-line const resource = funcObject.events[0].event.resource; - + funcTemplate.properties.eventTrigger = {}; funcTemplate.properties.eventTrigger.eventType = type; if (path) funcTemplate.properties.eventTrigger.path = path; funcTemplate.properties.eventTrigger.resource = resource; } - + this.serverless.service.provider.compiledConfigurationTemplate.resources.push(funcTemplate); }, compileFunctions() { const artifactFilePath = this.serverless.service.package.artifact; const fileName = artifactFilePath.split(path.sep).pop(); const projectName = _.get(this, 'serverless.service.provider.project'); - this.serverless.service.provider.region = this.serverless.service.provider.region || 'us-central1'; + this.serverless.service.provider.region = + this.serverless.service.provider.region || 'us-central1'; this.serverless.service.package.artifactFilePath = `${this.serverless.service.package.artifactDirectoryName}/${fileName}`; - + const allFunctions = this.serverless.service.getAllFunctions(); - return BbPromise.each( - allFunctions, - functionName => this.compileFunction(functionName, projectName), + return BbPromise.each(allFunctions, (functionName) => + this.compileFunction(functionName, projectName) ); }, }; @@ -108,36 +110,6 @@ const validateHandlerProperty = (funcObject, functionName) => { } }; -const validateEventsProperty = (funcObject, functionName) => { - if (!funcObject.events || funcObject.events.length === 0) { - const errorMessage = [ - `Missing "events" property for function "${functionName}".`, - ' Your function needs at least one "event".', - ' Please check the docs for more info.', - ].join(''); - throw new Error(errorMessage); - } - - if (funcObject.events.length > 1) { - const errorMessage = [ - `The function "${functionName}" has more than one event.`, - ' Only one event per function is supported.', - ' Please check the docs for more info.', - ].join(''); - throw new Error(errorMessage); - } - - const supportedEvents = ['http', 'event']; - const eventType = Object.keys(funcObject.events[0])[0]; - if (supportedEvents.indexOf(eventType) === -1) { - const errorMessage = [ - `Event type "${eventType}" of function "${functionName}" not supported.`, - ` supported event types are: ${supportedEvents.join(', ')}`, - ].join(''); - throw new Error(errorMessage); - } -}; - const validateVpcConnectorProperty = (funcObject, functionName) => { if (funcObject.vpc && typeof funcObject.vpc === 'string') { const vpcNamePattern = /projects\/[\s\S]*\/locations\/[\s\S]*\/connectors\/[\s\S]*/i;