From e784f04acadaedc14d4d8f5b2c39a02000af4952 Mon Sep 17 00:00:00 2001 From: BillConley01 Date: Tue, 12 Apr 2022 11:44:32 -0400 Subject: [PATCH 1/5] grouped all websockets-related properties under provider.websocket namespace --- docs/providers/aws/events/websocket.md | 7 ++++--- docs/providers/aws/guide/serverless.yml.md | 11 ++++++----- lib/plugins/aws/lib/naming.js | 6 +++--- .../aws/package/compile/events/websockets/lib/api.js | 4 ++-- .../compile/events/websockets/lib/deployment.js | 2 +- .../package/compile/events/websockets/lib/stage.js | 2 +- lib/plugins/aws/provider.js | 12 +++++++++--- test/unit/lib/plugins/aws/lib/naming.test.js | 4 ++-- 8 files changed, 28 insertions(+), 20 deletions(-) diff --git a/docs/providers/aws/events/websocket.md b/docs/providers/aws/events/websocket.md index 798ab837d8b..e801391e572 100644 --- a/docs/providers/aws/events/websocket.md +++ b/docs/providers/aws/events/websocket.md @@ -76,9 +76,10 @@ service: serverless-ws-test provider: name: aws runtime: nodejs12.x - websocketsApiName: custom-websockets-api-name - websocketsApiRouteSelectionExpression: $request.body.action # custom routes are selected by the value of the action property in the body - websocketsDescription: Custom Serverless Websockets + websockets: + apiName: custom-websockets-api-name + apiRouteSelectionExpression: $request.body.action # custom routes are selected by the value of the action property in the body + description: Custom Serverless Websockets functions: connectionHandler: diff --git a/docs/providers/aws/guide/serverless.yml.md b/docs/providers/aws/guide/serverless.yml.md index 721caf1fd1a..b40a0028956 100644 --- a/docs/providers/aws/guide/serverless.yml.md +++ b/docs/providers/aws/guide/serverless.yml.md @@ -238,11 +238,12 @@ provider: # Endpoint type for API Gateway REST API: edge or regional (default: edge) endpointType: regional # Use a custom name for the websockets API - websocketsApiName: custom-websockets-api-name - # custom route selection expression - websocketsApiRouteSelectionExpression: $request.body.route - # Use a custom description for the websockets API - websocketsDescription: Custom Serverless Websockets + websockets: + apiName: custom-websockets-api-name + # custom route selection expression + apiRouteSelectionExpression: $request.body.route + # Use a custom description for the websockets API + description: Custom Serverless Websockets # Optional API Gateway REST API global config apiGateway: # Attach to an externally created REST API via its ID: diff --git a/lib/plugins/aws/lib/naming.js b/lib/plugins/aws/lib/naming.js index a32c4edbc60..405126a7927 100644 --- a/lib/plugins/aws/lib/naming.js +++ b/lib/plugins/aws/lib/naming.js @@ -208,10 +208,10 @@ module.exports = { // Websockets API getWebsocketsApiName() { if ( - this.provider.serverless.service.provider.websocketsApiName && - typeof this.provider.serverless.service.provider.websocketsApiName === 'string' + this.provider.serverless.service.provider.websockets.apiName && + typeof this.provider.serverless.service.provider.websockets.apiName === 'string' ) { - return `${this.provider.serverless.service.provider.websocketsApiName}`; + return `${this.provider.serverless.service.provider.websockets.apiName}`; } return `${this.provider.getStage()}-${this.provider.serverless.service.service}-websockets`; }, diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/api.js b/lib/plugins/aws/package/compile/events/websockets/lib/api.js index b4c39638357..548c5689da0 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/api.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/api.js @@ -14,7 +14,7 @@ module.exports = { this.websocketsApiLogicalId = this.provider.naming.getWebsocketsApiLogicalId(); const RouteSelectionExpression = - this.serverless.service.provider.websocketsApiRouteSelectionExpression || + this.serverless.service.provider.websockets.apiRouteSelectionExpression || '$request.body.action'; _.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, { @@ -24,7 +24,7 @@ module.exports = { Name: this.provider.naming.getWebsocketsApiName(), RouteSelectionExpression, Description: - this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', + this.serverless.service.provider.websockets.description || 'Serverless Websockets', ProtocolType: 'WEBSOCKET', }, }, diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js b/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js index 60cf98780e4..8e218fd671e 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js @@ -35,7 +35,7 @@ module.exports = { Properties: { ApiId: this.provider.getApiGatewayWebsocketApiId(), Description: - this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', + this.serverless.service.provider.websockets.description || 'Serverless Websockets', }, }, }); diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js index 837f1e09054..c5707e99091 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js @@ -31,7 +31,7 @@ module.exports = { // DeploymentId is generated at deployment.js file StageName: this.provider.getStage(), Description: - this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', + this.serverless.service.provider.websockets.description || 'Serverless Websockets', }, }; diff --git a/lib/plugins/aws/provider.js b/lib/plugins/aws/provider.js index 1a5ef46b335..484f60126bd 100644 --- a/lib/plugins/aws/provider.js +++ b/lib/plugins/aws/provider.js @@ -1195,9 +1195,15 @@ class AwsProvider { vpc: { $ref: '#/definitions/awsLambdaVpcConfig' }, vpcEndpointIds: { $ref: '#/definitions/awsCfArrayInstruction' }, versionFunctions: { $ref: '#/definitions/awsLambdaVersioning' }, - websocketsApiName: { type: 'string' }, - websocketsApiRouteSelectionExpression: { type: 'string' }, - websocketsDescription: { type: 'string' }, + websockets: { + type: 'object', + properties: { + apiName: { type: 'string' }, + apiRouteSelectionExpression: { type: 'string' }, + description: { type: 'string' }, + }, + additionalProperties: false, + }, }, }, function: { diff --git a/test/unit/lib/plugins/aws/lib/naming.test.js b/test/unit/lib/plugins/aws/lib/naming.test.js index 1c62257e763..c3d57d543f3 100644 --- a/test/unit/lib/plugins/aws/lib/naming.test.js +++ b/test/unit/lib/plugins/aws/lib/naming.test.js @@ -233,7 +233,7 @@ describe('#naming()', () => { }); }); - describe('#getWebsocketsApiName()', () => { + describe('#get()', () => { it('should return the composition of stage & service name if custom name not provided', () => { serverless.service.service = 'myService'; expect(sdk.naming.getWebsocketsApiName()).to.equal( @@ -242,7 +242,7 @@ describe('#naming()', () => { }); it('should return the custom api name if provided', () => { - serverless.service.provider.websocketsApiName = 'app-dev-websockets-testApi'; + serverless.service.provider.websockets.apiName = 'app-dev-websockets-testApi'; serverless.service.service = 'myService'; serverless.service.provider.stage = sdk.naming.provider.getStage(); expect(sdk.naming.getWebsocketsApiName()).to.equal('app-dev-websockets-testApi'); From 7578f22ef4bd6a43034cf6c44ef785f4358ba8b8 Mon Sep 17 00:00:00 2001 From: BillConley01 Date: Thu, 14 Apr 2022 11:57:42 -0400 Subject: [PATCH 2/5] checks for websocket object --- lib/plugins/aws/lib/naming.js | 9 ++++++--- .../package/compile/events/websockets/lib/api.js | 16 +++++++++++----- .../compile/events/websockets/lib/deployment.js | 5 +++-- .../compile/events/websockets/lib/stage.js | 5 +++-- lib/plugins/aws/provider.js | 3 +++ test/unit/lib/plugins/aws/lib/naming.test.js | 2 +- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/lib/plugins/aws/lib/naming.js b/lib/plugins/aws/lib/naming.js index 405126a7927..24711b5409d 100644 --- a/lib/plugins/aws/lib/naming.js +++ b/lib/plugins/aws/lib/naming.js @@ -207,11 +207,14 @@ module.exports = { // Websockets API getWebsocketsApiName() { + if (_.get(this.provider.serverless.service.provider.websockets)) { + return `${this.provider.serverless.service.provider.websockets.apiName}`; + } if ( - this.provider.serverless.service.provider.websockets.apiName && - typeof this.provider.serverless.service.provider.websockets.apiName === 'string' + this.provider.serverless.service.provider.websocketsApiName && + typeof this.provider.serverless.service.provider.websocketsApiName === 'string' ) { - return `${this.provider.serverless.service.provider.websockets.apiName}`; + return `${this.provider.serverless.service.provider.websocketsApiName}`; } return `${this.provider.getStage()}-${this.provider.serverless.service.service}-websockets`; }, diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/api.js b/lib/plugins/aws/package/compile/events/websockets/lib/api.js index 548c5689da0..4e34697d86b 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/api.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/api.js @@ -13,9 +13,14 @@ module.exports = { this.websocketsApiLogicalId = this.provider.naming.getWebsocketsApiLogicalId(); - const RouteSelectionExpression = - this.serverless.service.provider.websockets.apiRouteSelectionExpression || - '$request.body.action'; + const RouteSelectionExpression = _.get( + this.provider, + 'serverless.service.provider.websockets.routeSelectionExpression' + ) + ? this.serverless.service.provider.websockets.routeSelectionExpression || + '$request.body.action' + : this.serverless.service.provider.websocketsRouteSelectionExpression || + '$request.body.action'; _.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, { [this.websocketsApiLogicalId]: { @@ -23,8 +28,9 @@ module.exports = { Properties: { Name: this.provider.naming.getWebsocketsApiName(), RouteSelectionExpression, - Description: - this.serverless.service.provider.websockets.description || 'Serverless Websockets', + Description: this.serverless.service.provider.websockets + ? this.serverless.service.provider.websockets.description + : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', ProtocolType: 'WEBSOCKET', }, }, diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js b/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js index 8e218fd671e..ef54d86efc5 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js @@ -34,8 +34,9 @@ module.exports = { DependsOn: dependentResourceIds, Properties: { ApiId: this.provider.getApiGatewayWebsocketApiId(), - Description: - this.serverless.service.provider.websockets.description || 'Serverless Websockets', + Description: this.serverless.service.provider.websockets + ? this.serverless.service.provider.websockets.description + : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', }, }, }); diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js index c5707e99091..43e4af05dad 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js @@ -30,8 +30,9 @@ module.exports = { ApiId: this.provider.getApiGatewayWebsocketApiId(), // DeploymentId is generated at deployment.js file StageName: this.provider.getStage(), - Description: - this.serverless.service.provider.websockets.description || 'Serverless Websockets', + Description: this.serverless.service.provider.websockets + ? this.serverless.service.provider.websockets.description + : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', }, }; diff --git a/lib/plugins/aws/provider.js b/lib/plugins/aws/provider.js index 484f60126bd..bec5f417809 100644 --- a/lib/plugins/aws/provider.js +++ b/lib/plugins/aws/provider.js @@ -1195,6 +1195,9 @@ class AwsProvider { vpc: { $ref: '#/definitions/awsLambdaVpcConfig' }, vpcEndpointIds: { $ref: '#/definitions/awsCfArrayInstruction' }, versionFunctions: { $ref: '#/definitions/awsLambdaVersioning' }, + websocketsApiName: { type: 'string' }, + websocketsApiRouteSelectionExpression: { type: 'string' }, + websocketsDescription: { type: 'string' }, websockets: { type: 'object', properties: { diff --git a/test/unit/lib/plugins/aws/lib/naming.test.js b/test/unit/lib/plugins/aws/lib/naming.test.js index c3d57d543f3..efd365d0454 100644 --- a/test/unit/lib/plugins/aws/lib/naming.test.js +++ b/test/unit/lib/plugins/aws/lib/naming.test.js @@ -242,7 +242,7 @@ describe('#naming()', () => { }); it('should return the custom api name if provided', () => { - serverless.service.provider.websockets.apiName = 'app-dev-websockets-testApi'; + serverless.service.provider.websocketsApiName = 'app-dev-websockets-testApi'; serverless.service.service = 'myService'; serverless.service.provider.stage = sdk.naming.provider.getStage(); expect(sdk.naming.getWebsocketsApiName()).to.equal('app-dev-websockets-testApi'); From 1dd2ec3215bffc85ecfb2d9d9b311759315d706c Mon Sep 17 00:00:00 2001 From: BillConley01 Date: Sat, 30 Apr 2022 14:29:04 -0400 Subject: [PATCH 3/5] default values for instances websockets properties are not defined. default values for instances websockets properties are not defined. --- docs/deprecations.md | 16 ++++++++++++++++ docs/providers/aws/guide/serverless.yml.md | 14 +++++++------- lib/plugins/aws/lib/naming.js | 5 ++++- .../package/compile/events/websockets/lib/api.js | 2 +- .../compile/events/websockets/lib/stage.js | 2 +- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/docs/deprecations.md b/docs/deprecations.md index 086a97d7c5f..3c3c10e7087 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -36,6 +36,22 @@ Note: - The `serverless.yml` setting is ineffective for deprecations reported before the configuration is read. - `SLS_DEPRECATION_DISABLE` and `disabledDeprecations` remain respected, and no errors will be thrown for mentioned deprecation codes. +
 
+ +## Grouping websockets settings under `provider.websockets` + +Deprecation code: `PROVIDER_WEBSOCKETS_SETTINGS_v3` + +Websockets-related settings of _provider_ including `websocketsApiName`, `websocketsApiRouteSelectionExpression` and `websocketsDescription` are also now supported at `websockets` property. Refer to the [Websocket Guide](/docs/providers/aws/events/websocket.md). + +- `provider.websocketsApiName` -> `provider.iam.role` +- `provider.websocketsApiRouteSelectionExpression` -> `provider.websockets.apiRouteSelectionExpression` +- `provider.websocketsDescription` -> `provider.websockets.description` + +In addition `iam.role.permissionBoundary` can also be set at `iam.role.permissionsBoundary` (which matches CloudFormation property name). + +Starting with v4.0.0 old versions of settings will no longer be supported +
 
## Property `variablesResolutionMode` diff --git a/docs/providers/aws/guide/serverless.yml.md b/docs/providers/aws/guide/serverless.yml.md index b40a0028956..ca658e79895 100644 --- a/docs/providers/aws/guide/serverless.yml.md +++ b/docs/providers/aws/guide/serverless.yml.md @@ -237,13 +237,6 @@ provider: apiName: custom-api-name # Endpoint type for API Gateway REST API: edge or regional (default: edge) endpointType: regional - # Use a custom name for the websockets API - websockets: - apiName: custom-websockets-api-name - # custom route selection expression - apiRouteSelectionExpression: $request.body.route - # Use a custom description for the websockets API - description: Custom Serverless Websockets # Optional API Gateway REST API global config apiGateway: # Attach to an externally created REST API via its ID: @@ -311,6 +304,13 @@ provider: name: GlobalModel # Optional: Description of the API Gateway model description: 'A global model that can be referenced in functions' + # Use a custom name for the websockets API + websockets: + apiName: custom-websockets-api-name + # custom route selection expression + apiRouteSelectionExpression: $request.body.route + # Use a custom description for the websockets API + description: Custom Serverless Websockets ``` ### ALB diff --git a/lib/plugins/aws/lib/naming.js b/lib/plugins/aws/lib/naming.js index 24711b5409d..feb6696a615 100644 --- a/lib/plugins/aws/lib/naming.js +++ b/lib/plugins/aws/lib/naming.js @@ -208,7 +208,10 @@ module.exports = { // Websockets API getWebsocketsApiName() { if (_.get(this.provider.serverless.service.provider.websockets)) { - return `${this.provider.serverless.service.provider.websockets.apiName}`; + return ( + `${this.provider.serverless.service.provider.websockets.apiName}` || + `${this.provider.getStage()}-${this.provider.serverless.service.service}-websockets` + ); } if ( this.provider.serverless.service.provider.websocketsApiName && diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/api.js b/lib/plugins/aws/package/compile/events/websockets/lib/api.js index 4e34697d86b..dd54f262f88 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/api.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/api.js @@ -29,7 +29,7 @@ module.exports = { Name: this.provider.naming.getWebsocketsApiName(), RouteSelectionExpression, Description: this.serverless.service.provider.websockets - ? this.serverless.service.provider.websockets.description + ? this.serverless.service.provider.websockets.description || 'Serverless Websockets' : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', ProtocolType: 'WEBSOCKET', }, diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js index 43e4af05dad..f83e03fc84b 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js @@ -31,7 +31,7 @@ module.exports = { // DeploymentId is generated at deployment.js file StageName: this.provider.getStage(), Description: this.serverless.service.provider.websockets - ? this.serverless.service.provider.websockets.description + ? this.serverless.service.provider.websockets.description || 'Serverless Websockets' : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets', }, }; From 9183f305f2fabc451751d07f0cf8d40442f10eec Mon Sep 17 00:00:00 2001 From: BillConley01 Date: Sat, 30 Apr 2022 14:37:51 -0400 Subject: [PATCH 4/5] fix typo --- docs/deprecations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deprecations.md b/docs/deprecations.md index 3c3c10e7087..22161b06f17 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -44,7 +44,7 @@ Deprecation code: `PROVIDER_WEBSOCKETS_SETTINGS_v3` Websockets-related settings of _provider_ including `websocketsApiName`, `websocketsApiRouteSelectionExpression` and `websocketsDescription` are also now supported at `websockets` property. Refer to the [Websocket Guide](/docs/providers/aws/events/websocket.md). -- `provider.websocketsApiName` -> `provider.iam.role` +- `provider.websocketsApiName` -> `provider.websockets.apiName` - `provider.websocketsApiRouteSelectionExpression` -> `provider.websockets.apiRouteSelectionExpression` - `provider.websocketsDescription` -> `provider.websockets.description` From 6f85676ce1c7550ba8f382cb89875f6714ed30d7 Mon Sep 17 00:00:00 2001 From: BillConley01 Date: Sat, 30 Apr 2022 14:38:49 -0400 Subject: [PATCH 5/5] typo fix --- docs/deprecations.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/deprecations.md b/docs/deprecations.md index 22161b06f17..3c43134f1f2 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -48,8 +48,6 @@ Websockets-related settings of _provider_ including `websocketsApiName`, `websoc - `provider.websocketsApiRouteSelectionExpression` -> `provider.websockets.apiRouteSelectionExpression` - `provider.websocketsDescription` -> `provider.websockets.description` -In addition `iam.role.permissionBoundary` can also be set at `iam.role.permissionsBoundary` (which matches CloudFormation property name). - Starting with v4.0.0 old versions of settings will no longer be supported