packages/deploy-aws/src/seagull_app.ts
import { Role } from '@aws-cdk/aws-iam'
import { App } from '@aws-cdk/cdk'
import * as cfnDiff from '@aws-cdk/cloudformation-diff'
import * as cdk from 'aws-cdk'
import * as yaml from 'yaml'
import * as lib from './lib'
import { SeagullStack } from './seagull_stack'
import { OperationsProps } from './types'
export class SeagullApp extends App {
stack: SeagullStack
role?: Role
private projectName: string
constructor(props: OperationsProps) {
super()
const { projectName, stackProps } = props
this.projectName = projectName
this.stack = new SeagullStack(this, projectName, stackProps)
}
async deployStack() {
const sdk = new cdk.SDK({})
const synthStack = this.synthesizeStack(this.projectName)
const env = synthStack.environment
await cdk.bootstrapEnvironment(env, sdk, 'CDKToolkit', undefined)
const toolkitInfo = await cdk.loadToolkitInfo(env, sdk, 'CDKToolkit')
await cdk.deployStack({ sdk, stack: synthStack, toolkitInfo })
}
async destroyStack() {
const sdk = new cdk.SDK({})
const synthStack = this.synthesizeStack(this.projectName)
const env = synthStack.environment
await cdk.bootstrapEnvironment(env, sdk, 'CDKToolkit', undefined)
await cdk.destroyStack({ sdk, stack: synthStack })
}
async diffStack() {
const sdk = new cdk.SDK({})
const synthStack = this.synthesizeStack(this.projectName)
const cfn = await sdk.cloudFormation(synthStack.environment, 0)
const templateData = { StackName: synthStack.name }
const template = await cfn.getTemplate(templateData).promise()
const body = template.TemplateBody
const curTemplate = (body && yaml.parse(body, { schema: 'yaml-1.1' })) || {}
const logicalToPathMap = lib.createLogicalToPathMap(synthStack)
const diff = cfnDiff.diffTemplate(curTemplate, synthStack.template)
// tslint:disable-next-line:no-unused-expression
diff.isEmpty && lib.noChangesInDiff()
cfnDiff.formatDifferences(process.stdout, diff, logicalToPathMap)
}
}