diff --git a/packages/@aws-cdk/aws-ecs-patterns/lib/ecs/scheduled-ecs-task.ts b/packages/@aws-cdk/aws-ecs-patterns/lib/ecs/scheduled-ecs-task.ts index 6f28112031fab..b9b851ab7144f 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/lib/ecs/scheduled-ecs-task.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/lib/ecs/scheduled-ecs-task.ts @@ -21,7 +21,7 @@ export interface ScheduledEc2TaskProps { * * @see http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html */ - readonly scheduleExpression: string; + readonly schedule: events.Schedule; /** * The CMD value to pass to the container. A string with commands delimited by commas. @@ -106,7 +106,7 @@ export class ScheduledEc2Task extends cdk.Construct { // An EventRule that describes the event trigger (in this case a scheduled run) const eventRule = new events.Rule(this, 'ScheduledEventRule', { - scheduleExpression: props.scheduleExpression, + schedule: props.schedule, }); eventRule.addTarget(eventRuleTarget); } diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.lit.ts b/packages/@aws-cdk/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.lit.ts index 91e8777fce627..080e00e1919ee 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.lit.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/test/ec2/integ.scheduled-ecs-task.lit.ts @@ -1,5 +1,6 @@ import ec2 = require('@aws-cdk/aws-ec2'); import ecs = require('@aws-cdk/aws-ecs'); +import events = require('@aws-cdk/aws-events'); import cdk = require('@aws-cdk/cdk'); import { ScheduledEc2Task } from '../../lib'; @@ -26,7 +27,7 @@ class EventStack extends cdk.Stack { memoryLimitMiB: 512, cpu: 1, environment: { name: 'TRIGGER', value: 'CloudWatch Events' }, - scheduleExpression: 'rate(1 minute)' + schedule: events.Schedule.rate(1, events.TimeUnit.Minute), }); /// !hide } diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/ec2/test.scheduled-ecs-task.ts b/packages/@aws-cdk/aws-ecs-patterns/test/ec2/test.scheduled-ecs-task.ts index 9ba2198d421d6..d1c4ba987318c 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/test/ec2/test.scheduled-ecs-task.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/test/ec2/test.scheduled-ecs-task.ts @@ -1,6 +1,7 @@ import { expect, haveResource } from '@aws-cdk/assert'; import ec2 = require('@aws-cdk/aws-ec2'); import ecs = require('@aws-cdk/aws-ecs'); +import events = require('@aws-cdk/aws-events'); import cdk = require('@aws-cdk/cdk'); import { Test } from 'nodeunit'; import { ScheduledEc2Task } from '../../lib'; @@ -19,7 +20,7 @@ export = { cluster, image: ecs.ContainerImage.fromRegistry('henk'), memoryLimitMiB: 512, - scheduleExpression: 'rate(1 minute)' + schedule: events.Schedule.expression('rate(1 minute)') }); // THEN @@ -85,7 +86,7 @@ export = { memoryLimitMiB: 512, cpu: 2, environment: { name: 'TRIGGER', value: 'CloudWatch Events' }, - scheduleExpression: 'rate(1 minute)' + schedule: events.Schedule.expression('rate(1 minute)') }); // THEN @@ -159,7 +160,7 @@ export = { cluster, image: ecs.ContainerImage.fromRegistry('henk'), memoryReservationMiB: 512, - scheduleExpression: 'rate(1 minute)' + schedule: events.Schedule.expression('rate(1 minute)') }); // THEN @@ -208,7 +209,7 @@ export = { image: ecs.ContainerImage.fromRegistry('henk'), memoryReservationMiB: 512, command: ["-c", "4", "amazon.com"], - scheduleExpression: 'rate(1 minute)' + schedule: events.Schedule.expression('rate(1 minute)') }); // THEN diff --git a/packages/@aws-cdk/aws-events-targets/test/codebuild/codebuild.test.ts b/packages/@aws-cdk/aws-events-targets/test/codebuild/codebuild.test.ts index cfe94306d06d3..c0c422f747021 100644 --- a/packages/@aws-cdk/aws-events-targets/test/codebuild/codebuild.test.ts +++ b/packages/@aws-cdk/aws-events-targets/test/codebuild/codebuild.test.ts @@ -8,7 +8,9 @@ test('use codebuild project as an eventrule target', () => { // GIVEN const stack = new Stack(); const project = new codebuild.PipelineProject(stack, 'MyProject'); - const rule = new events.Rule(stack, 'Rule', { scheduleExpression: 'rate(1 min)' }); + const rule = new events.Rule(stack, 'Rule', { + schedule: events.Schedule.expression('rate(1 min)') + }); // WHEN rule.addTarget(new targets.CodeBuildProject(project)); diff --git a/packages/@aws-cdk/aws-events-targets/test/codepipeline/integ.pipeline-event-target.ts b/packages/@aws-cdk/aws-events-targets/test/codepipeline/integ.pipeline-event-target.ts index fa95c28002bea..32d81c33dc046 100644 --- a/packages/@aws-cdk/aws-events-targets/test/codepipeline/integ.pipeline-event-target.ts +++ b/packages/@aws-cdk/aws-events-targets/test/codepipeline/integ.pipeline-event-target.ts @@ -43,7 +43,7 @@ pipeline.addStage({ }); new events.Rule(stack, 'rule', { - scheduleExpression: 'rate(1 minute)', + schedule: events.Schedule.expression('rate(1 minute)'), targets: [new targets.CodePipeline(pipeline)] }); diff --git a/packages/@aws-cdk/aws-events-targets/test/codepipeline/pipeline.test.ts b/packages/@aws-cdk/aws-events-targets/test/codepipeline/pipeline.test.ts index 455fd47fcf0a1..52126d994a8fe 100644 --- a/packages/@aws-cdk/aws-events-targets/test/codepipeline/pipeline.test.ts +++ b/packages/@aws-cdk/aws-events-targets/test/codepipeline/pipeline.test.ts @@ -31,7 +31,9 @@ test('use codebuild project as an eventrule target', () => { artifactBounds: { minInputs: 1, maxInputs: 1 , minOutputs: 1, maxOutputs: 1, }})] }); - const rule = new events.Rule(stack, 'rule', { scheduleExpression: 'rate(1 min)' }); + const rule = new events.Rule(stack, 'rule', { + schedule: events.Schedule.expression('rate(1 minute)'), + }); // WHEN rule.addTarget(new targets.CodePipeline(pipeline)); diff --git a/packages/@aws-cdk/aws-events-targets/test/ecs/event-rule-target.test.ts b/packages/@aws-cdk/aws-events-targets/test/ecs/event-rule-target.test.ts index e26094f0354f8..d5e08d6995d9e 100644 --- a/packages/@aws-cdk/aws-events-targets/test/ecs/event-rule-target.test.ts +++ b/packages/@aws-cdk/aws-events-targets/test/ecs/event-rule-target.test.ts @@ -21,7 +21,7 @@ test("Can use EC2 taskdef as EventRule target", () => { }); const rule = new events.Rule(stack, 'Rule', { - scheduleExpression: 'rate(1 minute)', + schedule: events.Schedule.expression('rate(1 min)') }); // WHEN @@ -69,7 +69,7 @@ test("Can use Fargate taskdef as EventRule target", () => { }); const rule = new events.Rule(stack, 'Rule', { - scheduleExpression: 'rate(1 minute)', + schedule: events.Schedule.expression('rate(1 min)') }); // WHEN diff --git a/packages/@aws-cdk/aws-events-targets/test/ecs/integ.event-ec2-task.lit.ts b/packages/@aws-cdk/aws-events-targets/test/ecs/integ.event-ec2-task.lit.ts index 9b5ee8fccfbff..2fa77dbe3d1e7 100644 --- a/packages/@aws-cdk/aws-events-targets/test/ecs/integ.event-ec2-task.lit.ts +++ b/packages/@aws-cdk/aws-events-targets/test/ecs/integ.event-ec2-task.lit.ts @@ -32,7 +32,7 @@ class EventStack extends cdk.Stack { // An Rule that describes the event trigger (in this case a scheduled run) const rule = new events.Rule(this, 'Rule', { - scheduleExpression: 'rate(1 minute)', + schedule: events.Schedule.rate(1, events.TimeUnit.Minute), }); // Use EcsTask as the target of the Rule diff --git a/packages/@aws-cdk/aws-events-targets/test/ecs/integ.event-fargate-task.ts b/packages/@aws-cdk/aws-events-targets/test/ecs/integ.event-fargate-task.ts index 8c286054620e1..473e451e3911b 100644 --- a/packages/@aws-cdk/aws-events-targets/test/ecs/integ.event-fargate-task.ts +++ b/packages/@aws-cdk/aws-events-targets/test/ecs/integ.event-fargate-task.ts @@ -28,7 +28,7 @@ class EventStack extends cdk.Stack { // A rule that describes the event trigger (in this case a scheduled run) const rule = new events.Rule(this, 'Rule', { - scheduleExpression: 'rate(1 minute)', + schedule: events.Schedule.rate(1, events.TimeUnit.Minute), }); // Use EcsTask as the target of the Rule diff --git a/packages/@aws-cdk/aws-events-targets/test/lambda/integ.events.ts b/packages/@aws-cdk/aws-events-targets/test/lambda/integ.events.ts index 1cb1ba0c003ae..44c0e12893f54 100644 --- a/packages/@aws-cdk/aws-events-targets/test/lambda/integ.events.ts +++ b/packages/@aws-cdk/aws-events-targets/test/lambda/integ.events.ts @@ -13,10 +13,14 @@ const fn = new lambda.Function(stack, 'MyFunc', { code: lambda.Code.inline(`exports.handler = ${handler.toString()}`) }); -const timer = new events.Rule(stack, 'Timer', { scheduleExpression: 'rate(1 minute)' }); +const timer = new events.Rule(stack, 'Timer', { + schedule: events.Schedule.rate(1, events.TimeUnit.Minute), +}); timer.addTarget(new targets.LambdaFunction(fn)); -const timer2 = new events.Rule(stack, 'Timer2', { scheduleExpression: 'rate(2 minutes)' }); +const timer2 = new events.Rule(stack, 'Timer2', { + schedule: events.Schedule.rate(2, events.TimeUnit.Minute), +}); timer2.addTarget(new targets.LambdaFunction(fn)); app.synth(); diff --git a/packages/@aws-cdk/aws-events-targets/test/lambda/lambda.test.ts b/packages/@aws-cdk/aws-events-targets/test/lambda/lambda.test.ts index edef10526eef6..3f1dec6280d5f 100644 --- a/packages/@aws-cdk/aws-events-targets/test/lambda/lambda.test.ts +++ b/packages/@aws-cdk/aws-events-targets/test/lambda/lambda.test.ts @@ -8,8 +8,12 @@ test('use lambda as an event rule target', () => { // GIVEN const stack = new cdk.Stack(); const fn = newTestLambda(stack); - const rule1 = new events.Rule(stack, 'Rule', { scheduleExpression: 'rate(1 minute)' }); - const rule2 = new events.Rule(stack, 'Rule2', { scheduleExpression: 'rate(5 minutes)' }); + const rule1 = new events.Rule(stack, 'Rule', { + schedule: events.Schedule.rate(1, events.TimeUnit.Minute), + }); + const rule2 = new events.Rule(stack, 'Rule2', { + schedule: events.Schedule.rate(5, events.TimeUnit.Minute), + }); // WHEN rule1.addTarget(new targets.LambdaFunction(fn)); diff --git a/packages/@aws-cdk/aws-events-targets/test/sns/integ.sns-event-rule-target.ts b/packages/@aws-cdk/aws-events-targets/test/sns/integ.sns-event-rule-target.ts index f5c8903779af5..244d7d9aec39d 100644 --- a/packages/@aws-cdk/aws-events-targets/test/sns/integ.sns-event-rule-target.ts +++ b/packages/@aws-cdk/aws-events-targets/test/sns/integ.sns-event-rule-target.ts @@ -16,7 +16,7 @@ const stack = new cdk.Stack(app, 'aws-cdk-sns-event-target'); const topic = new sns.Topic(stack, 'MyTopic'); const event = new events.Rule(stack, 'EveryMinute', { - scheduleExpression: 'rate(1 minute)' + schedule: events.Schedule.rate(1, events.TimeUnit.Minute), }); const queue = new sqs.Queue(stack, 'MyQueue'); diff --git a/packages/@aws-cdk/aws-events-targets/test/sns/sns.test.ts b/packages/@aws-cdk/aws-events-targets/test/sns/sns.test.ts index 868255b475e55..389cbe801b559 100644 --- a/packages/@aws-cdk/aws-events-targets/test/sns/sns.test.ts +++ b/packages/@aws-cdk/aws-events-targets/test/sns/sns.test.ts @@ -9,7 +9,7 @@ test('sns topic as an event rule target', () => { const stack = new Stack(); const topic = new sns.Topic(stack, 'MyTopic'); const rule = new events.Rule(stack, 'MyRule', { - scheduleExpression: 'rate(1 hour)', + schedule: events.Schedule.rate(1, events.TimeUnit.Hour), }); // WHEN @@ -51,7 +51,9 @@ test('multiple uses of a topic as a target results in a single policy statement' // WHEN for (let i = 0; i < 5; ++i) { - const rule = new events.Rule(stack, `Rule${i}`, { scheduleExpression: 'rate(1 hour)' }); + const rule = new events.Rule(stack, `Rule${i}`, { + schedule: events.Schedule.rate(1, events.TimeUnit.Hour), + }); rule.addTarget(new targets.SnsTopic(topic)); } diff --git a/packages/@aws-cdk/aws-events-targets/test/sqs/integ.sqs-event-rule-target.ts b/packages/@aws-cdk/aws-events-targets/test/sqs/integ.sqs-event-rule-target.ts index c45554ca0c51c..6a0f14cd63a10 100644 --- a/packages/@aws-cdk/aws-events-targets/test/sqs/integ.sqs-event-rule-target.ts +++ b/packages/@aws-cdk/aws-events-targets/test/sqs/integ.sqs-event-rule-target.ts @@ -13,7 +13,7 @@ const app = new cdk.App(); const stack = new cdk.Stack(app, 'aws-cdk-sqs-event-target'); const event = new events.Rule(stack, 'MyRule', { - scheduleExpression: 'rate(1 minute)', + schedule: events.Schedule.rate(1, events.TimeUnit.Minute), }); const queue = new sqs.Queue(stack, 'MyQueue'); diff --git a/packages/@aws-cdk/aws-events-targets/test/sqs/sqs.test.ts b/packages/@aws-cdk/aws-events-targets/test/sqs/sqs.test.ts index 5d109a07df444..388cf21e60af9 100644 --- a/packages/@aws-cdk/aws-events-targets/test/sqs/sqs.test.ts +++ b/packages/@aws-cdk/aws-events-targets/test/sqs/sqs.test.ts @@ -9,7 +9,7 @@ test('sns topic as an event rule target', () => { const stack = new Stack(); const queue = new sqs.Queue(stack, 'MyQueue'); const rule = new events.Rule(stack, 'MyRule', { - scheduleExpression: 'rate(1 hour)', + schedule: events.Schedule.rate(1, events.TimeUnit.Hour), }); // WHEN @@ -74,7 +74,9 @@ test('multiple uses of a queue as a target results in multi policy statement bec // WHEN for (let i = 0; i < 2; ++i) { - const rule = new events.Rule(stack, `Rule${i}`, { scheduleExpression: 'rate(1 hour)' }); + const rule = new events.Rule(stack, `Rule${i}`, { + schedule: events.Schedule.rate(1, events.TimeUnit.Hour), + }); rule.addTarget(new targets.SqsQueue(queue)); } diff --git a/packages/@aws-cdk/aws-events-targets/test/stepfunctions/statemachine.test.ts b/packages/@aws-cdk/aws-events-targets/test/stepfunctions/statemachine.test.ts index 5e29cd47b046c..902efb7ee5ed3 100644 --- a/packages/@aws-cdk/aws-events-targets/test/stepfunctions/statemachine.test.ts +++ b/packages/@aws-cdk/aws-events-targets/test/stepfunctions/statemachine.test.ts @@ -8,7 +8,7 @@ test('State machine can be used as Event Rule target', () => { // GIVEN const stack = new cdk.Stack(); const rule = new events.Rule(stack, 'Rule', { - scheduleExpression: 'rate(1 minute)' + schedule: events.Schedule.rate(1, events.TimeUnit.Minute), }); const stateMachine = new sfn.StateMachine(stack, 'SM', { definition: new sfn.Wait(stack, 'Hello', { duration: sfn.WaitDuration.seconds(10) }) diff --git a/packages/@aws-cdk/aws-events/lib/event-pattern.ts b/packages/@aws-cdk/aws-events/lib/event-pattern.ts index 49e2e2ea3f96b..bdd586f7e0e78 100644 --- a/packages/@aws-cdk/aws-events/lib/event-pattern.ts +++ b/packages/@aws-cdk/aws-events/lib/event-pattern.ts @@ -30,12 +30,16 @@ export interface EventPattern { /** * By default, this is set to 0 (zero) in all events. + * + * @default - No filtering on version */ readonly version?: string[]; /** * A unique value is generated for every event. This can be helpful in * tracing events as they move through rules to targets, and are processed. + * + * @default - No filtering on id */ readonly id?: string[]; @@ -44,6 +48,8 @@ export interface EventPattern { * that appear in the detail field. * * Represents the "detail-type" event field. + * + * @default - No filtering on detail type */ readonly detailType?: string[]; @@ -58,11 +64,14 @@ export interface EventPattern { * CloudFront is aws.cloudfront. * * @see http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces + * @default - No filtering on source */ readonly source?: string[]; /** * The 12-digit number identifying an AWS account. + * + * @default - No filtering on account */ readonly account?: string[]; @@ -71,11 +80,15 @@ export interface EventPattern { * the event. If the event spans a time interval, the service might choose * to report the start time, so this value can be noticeably before the time * the event is actually received. + * + * @default - No filtering on time */ readonly time?: string[]; /** * Identifies the AWS region where the event originated. + * + * @default - No filtering on region */ readonly region?: string[]; @@ -88,12 +101,16 @@ export interface EventPattern { * instance ARNs, Auto Scaling events include ARNs for both instances and * Auto Scaling groups, but API calls with AWS CloudTrail do not include * resource ARNs. + * + * @default - No filtering on resource */ readonly resources?: string[]; /** * A JSON object, whose content is at the discretion of the service * originating the event. + * + * @default - No filtering on detail */ - readonly detail?: any; + readonly detail?: {[key: string]: any}; } diff --git a/packages/@aws-cdk/aws-events/lib/index.ts b/packages/@aws-cdk/aws-events/lib/index.ts index 0409be7ae29d5..c7815e08b1c64 100644 --- a/packages/@aws-cdk/aws-events/lib/index.ts +++ b/packages/@aws-cdk/aws-events/lib/index.ts @@ -3,6 +3,7 @@ export * from './rule'; export * from './rule-ref'; export * from './target'; export * from './event-pattern'; +export * from './schedule'; export * from './on-event-options'; // AWS::Events CloudFormation Resources: diff --git a/packages/@aws-cdk/aws-events/lib/rule.ts b/packages/@aws-cdk/aws-events/lib/rule.ts index 271490f69e2b0..8e2b5ef7c6665 100644 --- a/packages/@aws-cdk/aws-events/lib/rule.ts +++ b/packages/@aws-cdk/aws-events/lib/rule.ts @@ -2,6 +2,7 @@ import { Construct, Lazy, Resource } from '@aws-cdk/cdk'; import { EventPattern } from './event-pattern'; import { CfnRule } from './events.generated'; import { IRule } from './rule-ref'; +import { Schedule } from './schedule'; import { IRuleTarget } from './target'; import { mergeEventPattern } from './util'; @@ -39,7 +40,7 @@ export interface RuleProps { * * @default - None. */ - readonly scheduleExpression?: string; + readonly schedule?: Schedule; /** * Describes which events CloudWatch Events routes to the specified target. @@ -104,7 +105,7 @@ export class Rule extends Resource implements IRule { this.ruleArn = resource.attrArn; this.addEventPattern(props.eventPattern); - this.scheduleExpression = props.scheduleExpression; + this.scheduleExpression = props.schedule && props.schedule.expressionString; for (const target of props.targets || []) { this.addTarget(target); @@ -189,7 +190,7 @@ export class Rule extends Resource implements IRule { protected validate() { if (Object.keys(this.eventPattern).length === 0 && !this.scheduleExpression) { - return [ `Either 'eventPattern' or 'scheduleExpression' must be defined` ]; + return [ `Either 'eventPattern' or 'schedule' must be defined` ]; } return [ ]; diff --git a/packages/@aws-cdk/aws-events/lib/schedule.ts b/packages/@aws-cdk/aws-events/lib/schedule.ts new file mode 100644 index 0000000000000..766c3a0bd91ec --- /dev/null +++ b/packages/@aws-cdk/aws-events/lib/schedule.ts @@ -0,0 +1,132 @@ +/** + * Schedule for scheduled event rules + */ +export abstract class Schedule { + /** + * Construct a schedule from a literal schedule expression + * + * @param expression The expression to use. Must be in a format that Cloudwatch Events will recognize + */ + public static expression(expression: string): Schedule { + return new LiteralSchedule(expression); + } + + /** + * Construct a schedule from an interval and a time unit + */ + public static rate(interval: number, unit: TimeUnit): Schedule { + const unitStr = interval !== 1 ? `${unit}s` : unit; + + return new LiteralSchedule(`rate(${interval} ${unitStr})`); + } + + /** + * Create a schedule from a set of cron fields + */ + public static cron(options: CronOptions): Schedule { + if (options.weekDay !== undefined && options.day !== undefined) { + throw new Error(`Cannot supply both 'day' and 'weekDay', use at most one`); + } + + const minute = fallback(options.minute, '*'); + const hour = fallback(options.hour, '*'); + const month = fallback(options.month, '*'); + const year = fallback(options.year, '*'); + + // Weekday defaults to '?' if not supplied. If it is supplied, day must become '?' + const day = fallback(options.day, options.weekDay !== undefined ? '?' : '*'); + const weekDay = fallback(options.weekDay, '?'); + + return new LiteralSchedule(`cron(${minute} ${hour} ${day} ${month} ${weekDay} ${year})`); + } + + /** + * Retrieve the expression for this schedule + */ + public abstract readonly expressionString: string; + + protected constructor() { + } +} + +/** + * What unit to interpret the rate in + */ +export enum TimeUnit { + /** + * The rate is in minutes + */ + Minute = 'minute', + + /** + * The rate is in hours + */ + Hour = 'hour', + + /** + * The rate is in days + */ + Day = 'day' +} + +/** + * Options to configure a cron expression + * + * All fields are strings so you can use complex expresions. Absence of + * a field implies '*' or '?', whichever one is appropriate. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions + */ +export interface CronOptions { + /** + * The minute to run this rule at + * + * @default - Every minute + */ + readonly minute?: string; + + /** + * The hour to run this rule at + * + * @default - Every hour + */ + readonly hour?: string; + + /** + * The day of the month to run this rule at + * + * @default - Every day of the month + */ + readonly day?: string; + + /** + * The month to run this rule at + * + * @default - Every month + */ + readonly month?: string; + + /** + * The year to run this rule at + * + * @default - Every year + */ + readonly year?: string; + + /** + * The day of the week to run this rule at + * + * @default - Any day of the week + */ + readonly weekDay?: string; +} + +class LiteralSchedule extends Schedule { + constructor(public readonly expressionString: string) { + super(); + } +} + +function fallback(x: T | undefined, def: T): T { + return x === undefined ? def : x; +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-events/test/test.input.ts b/packages/@aws-cdk/aws-events/test/test.input.ts index 4fe918f32e245..e5034d6e6fe47 100644 --- a/packages/@aws-cdk/aws-events/test/test.input.ts +++ b/packages/@aws-cdk/aws-events/test/test.input.ts @@ -2,7 +2,7 @@ import { expect, haveResourceLike } from '@aws-cdk/assert'; import cdk = require('@aws-cdk/cdk'); import { Stack } from '@aws-cdk/cdk'; import { Test } from 'nodeunit'; -import { IRuleTarget, RuleTargetInput } from '../lib'; +import { IRuleTarget, RuleTargetInput, Schedule, TimeUnit } from '../lib'; import { Rule } from '../lib/rule'; export = { @@ -11,7 +11,7 @@ export = { // GIVEN const stack = new Stack(); const rule = new Rule(stack, 'Rule', { - scheduleExpression: 'rate(1 minute)' + schedule: Schedule.rate(1, TimeUnit.Minute), }); // WHEN @@ -34,7 +34,7 @@ export = { // GIVEN const stack = new Stack(); const rule = new Rule(stack, 'Rule', { - scheduleExpression: 'rate(1 minute)' + schedule: Schedule.rate(1, TimeUnit.Minute), }); // WHEN @@ -56,7 +56,7 @@ export = { // GIVEN const stack = new Stack(); const rule = new Rule(stack, 'Rule', { - scheduleExpression: 'rate(1 minute)' + schedule: Schedule.rate(1, TimeUnit.Minute), }); // WHEN @@ -78,7 +78,7 @@ export = { // GIVEN const stack = new Stack(); const rule = new Rule(stack, 'Rule', { - scheduleExpression: 'rate(1 minute)' + schedule: Schedule.rate(1, TimeUnit.Minute), }); const world = cdk.Lazy.stringValue({ produce: () => 'world' }); diff --git a/packages/@aws-cdk/aws-events/test/test.rule.ts b/packages/@aws-cdk/aws-events/test/test.rule.ts index 5ed5cba222f5b..184ad3cb64479 100644 --- a/packages/@aws-cdk/aws-events/test/test.rule.ts +++ b/packages/@aws-cdk/aws-events/test/test.rule.ts @@ -4,7 +4,7 @@ import { ServicePrincipal } from '@aws-cdk/aws-iam'; import cdk = require('@aws-cdk/cdk'); import { Stack } from '@aws-cdk/cdk'; import { Test } from 'nodeunit'; -import { EventField, IRule, IRuleTarget, RuleTargetInput } from '../lib'; +import { EventField, IRule, IRuleTarget, RuleTargetInput, Schedule, TimeUnit } from '../lib'; import { Rule } from '../lib/rule'; // tslint:disable:object-literal-key-quotes @@ -14,7 +14,7 @@ export = { const stack = new cdk.Stack(); new Rule(stack, 'MyRule', { - scheduleExpression: 'rate(10 minutes)' + schedule: Schedule.rate(10, TimeUnit.Minute), }); expect(stack).toMatch({ @@ -37,8 +37,8 @@ export = { // WHEN new Rule(stack, 'MyRule', { - ruleName: 'PhysicalName', - scheduleExpression: 'rate(10 minutes)' + ruleName: 'PhysicalName', + schedule: Schedule.rate(10, TimeUnit.Minute), }); // THEN @@ -97,7 +97,7 @@ export = { const app = new cdk.App(); const stack = new cdk.Stack(app, 'MyStack'); new Rule(stack, 'Rule'); - test.throws(() => app.synth(), /Either 'eventPattern' or 'scheduleExpression' must be defined/); + test.throws(() => app.synth(), /Either 'eventPattern' or 'schedule' must be defined/); test.done(); }, @@ -174,7 +174,7 @@ export = { const rule = new Rule(stack, 'EventRule', { targets: [ t1 ], - scheduleExpression: 'rate(5 minutes)' + schedule: Schedule.rate(5, TimeUnit.Minute), }); rule.addTarget(t2); @@ -215,7 +215,9 @@ export = { 'input template can contain tokens'(test: Test) { const stack = new cdk.Stack(); - const rule = new Rule(stack, 'EventRule', { scheduleExpression: 'rate(1 minute)' }); + const rule = new Rule(stack, 'EventRule', { + schedule: Schedule.rate(1, TimeUnit.Minute), + }); // a plain string should just be stringified (i.e. double quotes added and escaped) rule.addTarget({ @@ -298,7 +300,9 @@ export = { // GIVEN const stack = new cdk.Stack(); - const rule = new Rule(stack, 'EventRule', { scheduleExpression: 'rate(1 minute)' }); + const rule = new Rule(stack, 'EventRule', { + schedule: Schedule.rate(1, TimeUnit.Minute), + }); const role = new iam.Role(stack, 'SomeRole', { assumedBy: new ServicePrincipal('nobody') @@ -372,7 +376,7 @@ export = { // WHEN new Rule(stack, 'Rule', { - scheduleExpression: 'foom', + schedule: Schedule.expression('foom'), enabled: false }); @@ -388,7 +392,7 @@ export = { // GIVEN const stack = new cdk.Stack(); const rule = new Rule(stack, 'Rule', { - scheduleExpression: 'foom', + schedule: Schedule.expression('foom'), enabled: false }); rule.addTarget(new SomeTarget()); diff --git a/packages/@aws-cdk/aws-events/test/test.schedule.ts b/packages/@aws-cdk/aws-events/test/test.schedule.ts new file mode 100644 index 0000000000000..bb3bfabfde834 --- /dev/null +++ b/packages/@aws-cdk/aws-events/test/test.schedule.ts @@ -0,0 +1,32 @@ +import { Test } from 'nodeunit'; +import events = require('../lib'); + +export = { + 'cron expressions day and dow are mutex: given weekday'(test: Test) { + // Run every 10 minutes Monday through Friday + test.equal('cron(0/10 * ? * MON-FRI *)', events.Schedule.cron({ + minute: '0/10', + weekDay: 'MON-FRI' + }).expressionString); + test.done(); + }, + + 'cron expressions day and dow are mutex: given month day'(test: Test) { + // Run at 8:00 am (UTC) every 1st day of the month + test.equal('cron(0 8 1 * ? *)', events.Schedule.cron({ + minute: '0', + hour: '8', + day: '1', + }).expressionString); + test.done(); + }, + + 'cron expressions day and dow are mutex: given neither'(test: Test) { + // Run at 10:00 am (UTC) every day + test.equal('cron(0 10 * * ? *)', events.Schedule.cron({ + minute: '0', + hour: '10', + }).expressionString); + test.done(); + }, +};