Skip to content

Commit

Permalink
fix(aws-ec2): CfnNetworkAclEntry.CidrBlock should be optional (aws#1565)
Browse files Browse the repository at this point in the history
The docs say this property is optional (exactly one of `CidrBlock`
and `ipv6CidrBlock` should be specified) but it's typed as `Required`
in the JSON schema.

Patch the schema until this is fixed upstream.

Fixes aws#1517.

Add MethodResponse support for aws-apigateway

Remove Dockerfile that was no longer needed

Update python base image from 3.6 to 3.6.5

Make the dockerfile work

Add MethodResponse support for aws-apigateway

Remove Dockerfile that was no longer needed

Update python base image from 3.6 to 3.6.5

Make the dockerfile work

Add MethodResponse to API Gateway Method.

Add some documentation to the MethodResponse properties. Update the test for MethodResponse with response models.

Fix some formatting and finish adding code documentation for MethodResponse.

Remove Dockerfile from this branch

Fix bad merge to methodresponse test.

Correct the MethodResponse response models documentation.

Add IModel type to reference when configuring a MethodResponse
  • Loading branch information
rix0rrr authored and john-shaskin committed Jan 23, 2019
1 parent 33c2a6d commit bf37f96
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 3 deletions.
2 changes: 2 additions & 0 deletions packages/@aws-cdk/aws-apigateway/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ export * from './stage';
export * from './integrations';
export * from './lambda-api';
export * from './vpc-link';
export * from './methodresponse';
export * from './model';

// AWS::ApiGateway CloudFormation Resources:
export * from './apigateway.generated';
38 changes: 36 additions & 2 deletions packages/@aws-cdk/aws-apigateway/lib/method.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import cdk = require('@aws-cdk/cdk');
import { CfnMethod, CfnMethodProps } from './apigateway.generated';
import { ConnectionType, Integration } from './integration';
import { MockIntegration } from './integrations/mock';
import { MethodResponse } from './methodresponse';
import { IRestApiResource } from './resource';
import { RestApi } from './restapi';
import { validateHttpMethod } from './util';
Expand Down Expand Up @@ -34,11 +35,15 @@ export interface MethodOptions {
*/
apiKeyRequired?: boolean;

/**
* The responses that can be sent to the client who calls the method.
*/
methodResponses?: MethodResponse[]

// TODO:
// - RequestValidatorId
// - RequestModels
// - RequestParameters
// - MethodResponses
requestParameters?: { [param: string]: boolean };
}

Expand Down Expand Up @@ -93,7 +98,8 @@ export class Method extends cdk.Construct {
authorizationType: options.authorizationType || defaultMethodOptions.authorizationType || AuthorizationType.None,
authorizerId: options.authorizerId || defaultMethodOptions.authorizerId,
requestParameters: options.requestParameters,
integration: this.renderIntegration(props.integration)
integration: this.renderIntegration(props.integration),
methodResponses: this.renderMethodResponses(options.methodResponses),
};

const resource = new CfnMethod(this, 'Resource', methodProps);
Expand Down Expand Up @@ -188,6 +194,34 @@ export class Method extends cdk.Construct {
credentials,
};
}

private renderMethodResponses(methodResponses: MethodResponse[] | undefined): CfnMethod.MethodResponseProperty[] | undefined {
if (!methodResponses) {
// Fall back to nothing
return undefined;
}

return methodResponses.map(mr => {
let responseModels: {[contentType: string]: string} | undefined;

if (mr.responseModels) {
responseModels = {};
for (const contentType in mr.responseModels) {
if (mr.responseModels.hasOwnProperty(contentType)) {
responseModels[contentType] = mr.responseModels[contentType].modelId;
}
}
}

const methodResponseProp = {
statusCode: mr.statusCode,
responseParameters: mr.responseParameters,
responseModels,
};

return methodResponseProp;
});
}
}

export enum AuthorizationType {
Expand Down
25 changes: 25 additions & 0 deletions packages/@aws-cdk/aws-apigateway/lib/methodresponse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { IModel } from './model';

export interface MethodResponse {

/**
* The method response's status code, which you map to an IntegrationResponse.
*/
statusCode: string;

/**
* Response parameters that API Gateway sends to the client that called a method.
* Specify response parameters as key-value pairs (string-to-Boolean maps), with
* a destination as the key and a Boolean as the value. Specify the destination
* using the following pattern: method.response.header.name, where the name is a
* valid, unique header name. The Boolean specifies whether a parameter is required.
*/
responseParameters?: { [destination: string]: boolean };

/**
* The resources used for the response's content type. Specify response models as
* key-value pairs (string-to-string maps), with a content type as the key and a Model
* resource name as the value.
*/
responseModels?: { [contentType: string]: IModel };
}
13 changes: 13 additions & 0 deletions packages/@aws-cdk/aws-apigateway/lib/model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
export interface IModel {
readonly modelId: string;
}

export class EmptyModel implements IModel {
public readonly modelId = 'Empty';
}

export class ErrorModel implements IModel {
public readonly modelId = 'Error';
}

// TODO: Implement Model, enabling management of custom models
59 changes: 58 additions & 1 deletion packages/@aws-cdk/aws-apigateway/test/test.method.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import iam = require('@aws-cdk/aws-iam');
import cdk = require('@aws-cdk/cdk');
import { Test } from 'nodeunit';
import apigateway = require('../lib');
import { ConnectionType } from '../lib';
import { ConnectionType, EmptyModel, ErrorModel } from '../lib';

export = {
'default setup'(test: Test) {
Expand Down Expand Up @@ -301,6 +301,63 @@ export = {

// THEN
test.throws(() => api.root.addMethod('GET', integration), /cannot set 'vpcLink' where 'connectionType' is INTERNET/);
test.done();
},

'methodResponse set one or more method responses via options'(test: Test) {
// GIVEN
const stack = new cdk.Stack();
const api = new apigateway.RestApi(stack, 'test-api', { deploy: false });

// WHEN
new apigateway.Method(stack, 'method-man', {
httpMethod: 'GET',
resource: api.root,
options: {
methodResponses: [{
statusCode: '200'
}, {
statusCode: "400",
responseParameters: {
'method.response.header.killerbees': false
}
}, {
statusCode: "500",
responseParameters: {
'method.response.header.errthing': true
},
responseModels: {
'application/json': new EmptyModel(),
'text/plain': new ErrorModel()
}
}
]
}
});

// THEN
expect(stack).to(haveResource('AWS::ApiGateway::Method', {
HttpMethod: 'GET',
MethodResponses: [{
StatusCode: "200"
}, {
StatusCode: "400",
ResponseParameters: {
'method.response.header.killerbees': false
}
}, {
StatusCode: "500",
ResponseParameters: {
'method.response.header.errthing': true
},
ResponseModels: {
'application/json': 'Empty',
'text/plain': 'Error'
}
}
]
}));

test.done();
}
};
19 changes: 19 additions & 0 deletions packages/@aws-cdk/aws-ec2/test/test.l1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import cdk = require('@aws-cdk/cdk');
import { Test } from 'nodeunit';
import ec2 = require('../lib');

export = {
'NetworkAclEntry CidrBlock should be optional'(test: Test) {
const stack = new cdk.Stack();

new ec2.CfnNetworkAclEntry(stack, 'ACL', {
// Note the conspicuous absence of cidrBlock
networkAclId: 'asdf',
protocol: 5,
ruleAction: 'action',
ruleNumber: 1
});

test.done();
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"ResourceTypes": {
"AWS::EC2::NetworkAclEntry": {
"patch": {
"description": "https://github.com/awslabs/aws-cdk/issues/1517",
"operations": [
{
"op": "add",
"path": "/Properties/CidrBlock/Required",
"value": false
}
]
}
}
}
}

0 comments on commit bf37f96

Please sign in to comment.