Skip to content
This repository has been archived by the owner on Aug 19, 2020. It is now read-only.

Commit

Permalink
fix serialize issue with new rpdk libray
Browse files Browse the repository at this point in the history
  • Loading branch information
eduardomourar committed May 25, 2020
1 parent 0a859db commit 17ac272
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 35 deletions.
2 changes: 1 addition & 1 deletion .npmrc
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# optional = false
save = true
save = false
2 changes: 1 addition & 1 deletion .rpdk-config
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
"testEntrypoint": "dist/handlers.testEntrypoint",
"settings": {
"useDocker": false,
"buildCommand": "npm run build && NPM_CONFIG_OPTIONAL=0 sam build --build-dir ./build --debug"
"buildCommand": "npm run build && NPM_CONFIG_OPTIONAL=0 NPM_CONFIG_FUND=0 sam build --build-dir ./build --debug"
}
}
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ This CloudFormation Resource Provider sets an IAM Password Policy for a target A
7. Use [this template](./sample.yml) to deploy a sample password policy resource

> Don't modify [models.ts](./src/models.ts) by hand, any modifications will be overwritten when the `generate` or `package` commands are run.
Keep in mind, during runtime all logs will be delivered to CloudWatch except those used with `debug` method.
51 changes: 42 additions & 9 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"prepack": "npm run build",
"start": "sam local start-lambda",
"test": "cfn test",
"submit": "npm run build && cfn submit"
"package": "cfn submit --dry-run -vv",
"submit": "cfn submit --set-default -vv"
},
"repository": {
"type": "git",
Expand All @@ -27,7 +28,7 @@
"npm": ">=6.0.0"
},
"dependencies": {
"cfn-rpdk": "https://github.com/eduardomourar/cloudformation-cli-typescript-plugin/releases/download/v0.1.1/cfn-rpdk-0.1.1.tgz",
"cfn-rpdk": "https://github.com/eduardomourar/cloudformation-cli-typescript-plugin/releases/download/v0.1.2/cfn-rpdk-0.1.2.tgz",
"reflect-metadata": "^0.1.13",
"typedjson": "^1.5.1",
"uuid": "^7.0.3"
Expand All @@ -38,6 +39,6 @@
"typescript": "^3.8.3"
},
"optionalDependencies": {
"aws-sdk": "^2.656.0"
"aws-sdk": "~2.631.0"
}
}
65 changes: 44 additions & 21 deletions src/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
toJson,
TypedJSON,
} from 'typedjson';
import { IAM } from 'aws-sdk';
import { config, IAM } from 'aws-sdk';
import { v4 as uuidv4 } from 'uuid';
import {
Action,
Expand All @@ -24,15 +24,25 @@ import { ResourceModel } from './models';
// Use this logger to forward log messages to CloudWatch Logs.
const LOGGER = console;

/*
// The following can be used for debugging AWS SDK
config.logger = LOGGER;
Error.stackTraceLimit = Infinity;
*/

const parseBoolean = (value: string | boolean): boolean => {
if (value !== undefined && value !== null) {
return !!JSON.parse(String(value).toLowerCase());
}
};

const parseInteger = (value: string | number): number => {
if (value && typeof value === 'string') {
return Number.parseInt(value, 10);
if (value !== undefined && value !== null) {
if (typeof value === 'string') {
return Number.parseInt(value, 10);
} else if (typeof value === 'number') {
return Math.trunc(value);
}
}
};

Expand Down Expand Up @@ -69,7 +79,7 @@ class PasswordPolicy extends ResourceModel {

public toObject(): any {
const serializer = new TypedJSON(PasswordPolicy);
return serializer.toPlainJson(this);
return JSON.parse(JSON.stringify(serializer.toPlainJson(this)));
}
}

Expand All @@ -91,7 +101,7 @@ const retrievePasswordPolicy = async (
if (session instanceof SessionProxy) {
const client = session.client('IAM') as IAM;
const response = await client.getAccountPasswordPolicy().promise();
// LOGGER.debug('getAccountPasswordPolicy response', JSON.stringify(response));
// LOGGER.debug('getAccountPasswordPolicy response', response);
model = PasswordPolicy.fromObject(response.PasswordPolicy);
model.ResourceId = resourceId || logicalResourceId;
LOGGER.info(
Expand Down Expand Up @@ -134,9 +144,9 @@ const upsertPasswordPolicy = async (
const client = session.client('IAM') as IAM;
const params = model.toObject();
delete params['ResourceId'];
// LOGGER.debug('updateAccountPasswordPolicy params', JSON.stringify(params));
// LOGGER.debug('updateAccountPasswordPolicy params', params);
const response = await client.updateAccountPasswordPolicy(params).promise();
// LOGGER.debug('updateAccountPasswordPolicy response', JSON.stringify(response));
// LOGGER.debug('updateAccountPasswordPolicy response', response);
if (!model.ResourceId) {
model.ResourceId = uuidv4();
}
Expand Down Expand Up @@ -169,16 +179,18 @@ class Resource extends BaseResource<ResourceModel> {
request: ResourceHandlerRequest<ResourceModel>,
callbackContext: Map<string, any>
): Promise<ProgressEvent> {
request.desiredResourceState = PasswordPolicy.fromObject(request.desiredResourceState);
request.previousResourceState = PasswordPolicy.fromObject(request.previousResourceState);
// LOGGER.debug('CREATE request', request);
let model: PasswordPolicy = PasswordPolicy.fromObject(request.desiredResourceState);
let model: PasswordPolicy = request.desiredResourceState;
const progress: ProgressEvent<PasswordPolicy> = ProgressEvent.builder()
.status(OperationStatus.InProgress)
.resourceModel(model)
.build() as ProgressEvent<PasswordPolicy>;
model = await upsertPasswordPolicy(session, model, request.logicalResourceIdentifier);
progress.resourceModel = model;
progress.status = OperationStatus.Success;
LOGGER.debug('CREATE progress', progress.toObject());
LOGGER.info('CREATE progress', progress.toObject());
return progress;
}

Expand All @@ -196,8 +208,10 @@ class Resource extends BaseResource<ResourceModel> {
request: ResourceHandlerRequest<ResourceModel>,
callbackContext: Map<string, any>
): Promise<ProgressEvent> {
// LOGGER.debug('UPDATE request', JSON.stringify(request));
let model: PasswordPolicy = PasswordPolicy.fromObject(request.desiredResourceState);
request.desiredResourceState = PasswordPolicy.fromObject(request.desiredResourceState);
request.previousResourceState = PasswordPolicy.fromObject(request.previousResourceState);
// LOGGER.debug('UPDATE request', request);
let model: PasswordPolicy = request.desiredResourceState;
const progress: ProgressEvent<PasswordPolicy> = ProgressEvent.builder()
.status(OperationStatus.InProgress)
.resourceModel(model)
Expand All @@ -208,9 +222,12 @@ class Resource extends BaseResource<ResourceModel> {
request.logicalResourceIdentifier
);
model = await upsertPasswordPolicy(session, model, request.logicalResourceIdentifier);
// LOGGER.debug('UPDATE model', model);
progress.resourceModel = model;
progress.status = OperationStatus.Success;
LOGGER.debug('UPDATE progress', progress.toObject());
// progress.callbackContext = new Map<string, any>();
// callbackContext.set('RequestId', 'e9899120-8e56-11ea-bfb5-02722d612c06');
LOGGER.info('UPDATE progress', progress.toObject());
return progress;
}

Expand All @@ -229,8 +246,10 @@ class Resource extends BaseResource<ResourceModel> {
request: ResourceHandlerRequest<ResourceModel>,
callbackContext: Map<string, any>
): Promise<ProgressEvent> {
// LOGGER.debug('DELETE request', JSON.stringify(request));
let model: PasswordPolicy = PasswordPolicy.fromObject(request.desiredResourceState);
request.desiredResourceState = PasswordPolicy.fromObject(request.desiredResourceState);
request.previousResourceState = PasswordPolicy.fromObject(request.previousResourceState);
// LOGGER.debug('DELETE request', request);
let model: PasswordPolicy = request.desiredResourceState;
const progress: ProgressEvent<PasswordPolicy> = ProgressEvent.builder()
.status(OperationStatus.InProgress)
.resourceModel(model)
Expand All @@ -244,7 +263,7 @@ class Resource extends BaseResource<ResourceModel> {
if (session instanceof SessionProxy) {
const client = session.client('IAM') as IAM;
const response = await client.deleteAccountPasswordPolicy().promise();
// LOGGER.debug('deleteAccountPasswordPolicy response', JSON.stringify(response));
// LOGGER.debug('deleteAccountPasswordPolicy response', response);
LOGGER.info(
this.typeName,
`[${model.ResourceId}] [${request.logicalResourceIdentifier}]`,
Expand All @@ -256,7 +275,7 @@ class Resource extends BaseResource<ResourceModel> {
throw new exceptions.InternalFailure(err.message);
}
progress.status = OperationStatus.Success;
LOGGER.debug('DELETE progress', progress.toObject());
LOGGER.info('DELETE progress', progress.toObject());
return progress;
}

Expand All @@ -274,7 +293,9 @@ class Resource extends BaseResource<ResourceModel> {
request: ResourceHandlerRequest<ResourceModel>,
callbackContext: Map<string, any>
): Promise<ProgressEvent> {
// LOGGER.debug('READ request', JSON.stringify(request));
request.desiredResourceState = PasswordPolicy.fromObject(request.desiredResourceState);
request.previousResourceState = PasswordPolicy.fromObject(request.previousResourceState);
// LOGGER.debug('READ request', request);
const model: PasswordPolicy = await retrievePasswordPolicy(
session,
request.desiredResourceState.ResourceId,
Expand All @@ -284,7 +305,7 @@ class Resource extends BaseResource<ResourceModel> {
.status(OperationStatus.Success)
.resourceModel(model)
.build() as ProgressEvent<PasswordPolicy>;
LOGGER.debug('READ progress', progress.toObject());
LOGGER.info('READ progress', progress.toObject());
return progress;
}

Expand All @@ -302,7 +323,9 @@ class Resource extends BaseResource<ResourceModel> {
request: ResourceHandlerRequest<ResourceModel>,
callbackContext: Map<string, any>
): Promise<ProgressEvent> {
// LOGGER.debug('LIST request', JSON.stringify(request));
request.desiredResourceState = PasswordPolicy.fromObject(request.desiredResourceState);
request.previousResourceState = PasswordPolicy.fromObject(request.previousResourceState);
// LOGGER.debug('LIST request', request);
const models: Array<PasswordPolicy> = [];
try {
const model: PasswordPolicy = await retrievePasswordPolicy(
Expand All @@ -320,15 +343,15 @@ class Resource extends BaseResource<ResourceModel> {
.status(OperationStatus.Success)
.resourceModels(models)
.build() as ProgressEvent<PasswordPolicy>;
LOGGER.debug('LIST progress', progress.toObject());
LOGGER.info('LIST progress', progress.toObject());
return progress;
}
}

const resource = new Resource(PasswordPolicy.TYPE_NAME, PasswordPolicy);

export const entrypoint = (...args: [any, any]) => {
// // LOGGER.debug('entrypoint input', ...args);
// LOGGER.debug('entrypoint input', ...args);
return resource.entrypoint(...args);
}

Expand Down

0 comments on commit 17ac272

Please sign in to comment.