terraconstructs 0.0.22 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +104400 -90067
- package/go.mod +2 -1
- package/go.sum +2 -0
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-construct.js +1 -1
- package/lib/aws/aws-stack.js +1 -1
- package/lib/aws/aws-tags.js +2 -2
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.js +4 -5
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +5 -5
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +3 -3
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +1 -1
- package/lib/aws/cloudwatch/metric.js +4 -4
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/private/metric-util.js +1 -2
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +1 -1
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.js +1 -1
- package/lib/aws/compute/activity.js +1 -1
- package/lib/aws/compute/alb/application-listener-action.js +1 -1
- package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
- package/lib/aws/compute/alb/application-listener-rule.js +1 -1
- package/lib/aws/compute/alb/application-listener.js +2 -4
- package/lib/aws/compute/alb/application-load-balancer.js +2 -4
- package/lib/aws/compute/alb/application-target-group.js +1 -1
- package/lib/aws/compute/alb/conditions.js +1 -1
- package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
- package/lib/aws/compute/alb/trust-store.js +1 -1
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
- package/lib/aws/compute/autoscaling-common/index.d.ts +3 -0
- package/lib/aws/compute/autoscaling-common/index.js +21 -0
- package/lib/aws/compute/autoscaling-common/interval-utils.d.ts +21 -0
- package/lib/aws/compute/autoscaling-common/interval-utils.js +213 -0
- package/lib/aws/compute/autoscaling-common/test-utils.d.ts +21 -0
- package/lib/aws/compute/autoscaling-common/test-utils.js +94 -0
- package/lib/aws/compute/autoscaling-common/types.d.ts +34 -0
- package/lib/aws/compute/autoscaling-common/types.js +3 -0
- package/lib/aws/compute/base-scalable-attribute.d.ts +74 -0
- package/lib/aws/compute/base-scalable-attribute.js +58 -0
- package/lib/aws/compute/bastion-host.js +1 -1
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
- package/lib/aws/compute/client-vpn-endpoint.js +2 -2
- package/lib/aws/compute/client-vpn-route.js +2 -2
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.js +1 -1
- package/lib/aws/compute/ec2-util.js +1 -4
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +3 -3
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +1 -1
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +7 -8
- package/lib/aws/compute/function-destinations/event-bridge.js +3 -3
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.js +1 -1
- package/lib/aws/compute/index.d.ts +7 -0
- package/lib/aws/compute/index.js +11 -2
- package/lib/aws/compute/instance-types.js +1 -1
- package/lib/aws/compute/instance.js +1 -1
- package/lib/aws/compute/ip-addresses.js +2 -2
- package/lib/aws/compute/ipam.js +1 -1
- package/lib/aws/compute/key-pair.js +1 -1
- package/lib/aws/compute/launch-template.js +2 -2
- package/lib/aws/compute/lb-shared/base-listener.js +1 -1
- package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
- package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +31 -31
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +1 -1
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +4 -4
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +1 -1
- package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
- package/lib/aws/compute/lb-shared/util.js +1 -2
- package/lib/aws/compute/lb-targets/alb-target.js +3 -3
- package/lib/aws/compute/lb-targets/instance-target.js +2 -2
- package/lib/aws/compute/lb-targets/ip-target.js +1 -1
- package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
- package/lib/aws/compute/load-balancer.js +3 -3
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
- package/lib/aws/compute/machine-image/common.js +1 -1
- package/lib/aws/compute/machine-image/machine-image.js +8 -8
- package/lib/aws/compute/machine-image/utils.js +6 -6
- package/lib/aws/compute/nat.js +5 -5
- package/lib/aws/compute/network-acl-types.js +2 -2
- package/lib/aws/compute/network-acl.js +3 -3
- package/lib/aws/compute/nlb/network-listener-action.js +1 -1
- package/lib/aws/compute/nlb/network-listener.js +2 -3
- package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
- package/lib/aws/compute/nlb/network-target-group.js +1 -1
- package/lib/aws/compute/peer.js +1 -1
- package/lib/aws/compute/placement-group.js +1 -1
- package/lib/aws/compute/port.js +1 -1
- package/lib/aws/compute/prefix-list.js +1 -1
- package/lib/aws/compute/private/context-stub.js +2 -2
- package/lib/aws/compute/route.js +11 -11
- package/lib/aws/compute/scalable-target.d.ts +197 -0
- package/lib/aws/compute/scalable-target.js +168 -0
- package/lib/aws/compute/schedule.d.ts +81 -0
- package/lib/aws/compute/schedule.js +145 -0
- package/lib/aws/compute/security-group.js +4 -4
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.js +4 -4
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +7 -7
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +4 -4
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +1 -1
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/step-scaling-action.d.ts +148 -0
- package/lib/aws/compute/step-scaling-action.js +109 -0
- package/lib/aws/compute/step-scaling-policy.d.ts +132 -0
- package/lib/aws/compute/step-scaling-policy.js +153 -0
- package/lib/aws/compute/subnet-v2.js +2 -2
- package/lib/aws/compute/subnet.js +1 -1
- package/lib/aws/compute/target-tracking-scaling-policy.d.ts +262 -0
- package/lib/aws/compute/target-tracking-scaling-policy.js +234 -0
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +1 -1
- package/lib/aws/compute/user-data.js +3 -3
- package/lib/aws/compute/volume.js +2 -2
- package/lib/aws/compute/vpc-endpoint-service.js +1 -1
- package/lib/aws/compute/vpc-endpoint.js +6 -6
- package/lib/aws/compute/vpc-flow-logs.js +4 -4
- package/lib/aws/compute/vpc-v2-base.js +1 -1
- package/lib/aws/compute/vpc-v2.js +2 -2
- package/lib/aws/compute/vpc.d.ts +1 -1
- package/lib/aws/compute/vpc.js +10 -16
- package/lib/aws/compute/vpn.js +4 -7
- package/lib/aws/compute/windows-versions.js +1 -2
- package/lib/aws/edge/certificate.js +1 -1
- package/lib/aws/edge/distribution.js +4 -5
- package/lib/aws/edge/dns-alias-record-targets.js +3 -3
- package/lib/aws/edge/dns-record.js +13 -13
- package/lib/aws/edge/dns-zone.js +1 -1
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +3 -3
- package/lib/aws/edge/response-headers-policy.js +1 -1
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +3 -4
- package/lib/aws/iam/group.js +1 -1
- package/lib/aws/iam/instance-profile.js +1 -1
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +3 -3
- package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.js +1 -1
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +20 -20
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.js +2 -2
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/user.js +1 -1
- package/lib/aws/network/simple-ipv4-vpc.js +1 -1
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.js +4 -4
- package/lib/aws/notify/archive.js +1 -1
- package/lib/aws/notify/connection.js +7 -7
- package/lib/aws/notify/event-bus.js +3 -3
- package/lib/aws/notify/event-pattern.js +1 -1
- package/lib/aws/notify/input.js +2 -2
- package/lib/aws/notify/kinesis-stream.js +1 -1
- package/lib/aws/notify/notification-rule.js +1 -1
- package/lib/aws/notify/policy.js +1 -1
- package/lib/aws/notify/queue-config.generated.d.ts +12 -12
- package/lib/aws/notify/queue-config.generated.js +1 -1
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.js +1 -1
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +1 -1
- package/lib/aws/notify/schedule.js +1 -1
- package/lib/aws/notify/subscription-filter.js +1 -1
- package/lib/aws/notify/subscription.js +4 -4
- package/lib/aws/notify/subscriptions/email.js +1 -1
- package/lib/aws/notify/subscriptions/lambda.js +1 -1
- package/lib/aws/notify/subscriptions/sms.js +1 -1
- package/lib/aws/notify/subscriptions/sqs.js +1 -1
- package/lib/aws/notify/subscriptions/url.js +1 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +3 -3
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/targets/util.js +2 -2
- package/lib/aws/notify/topic-base.js +1 -1
- package/lib/aws/notify/topic.js +1 -1
- package/lib/aws/provider-config.generated.d.ts +33 -33
- package/lib/aws/provider-config.generated.js +1 -1
- package/lib/aws/storage/billing.d.ts +62 -0
- package/lib/aws/storage/billing.js +49 -0
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +3 -3
- package/lib/aws/storage/bucket.js +2 -2
- package/lib/aws/storage/capacity.d.ts +96 -0
- package/lib/aws/storage/capacity.js +103 -0
- package/lib/aws/storage/cors-config.generated.d.ts +3 -3
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/dynamodb-canned-metrics.generated.d.ts +493 -0
- package/lib/aws/storage/dynamodb-canned-metrics.generated.js +263 -0
- package/lib/aws/storage/dynamodb-perms.d.ts +8 -0
- package/lib/aws/storage/dynamodb-perms.js +45 -0
- package/lib/aws/storage/encryption.d.ts +54 -0
- package/lib/aws/storage/encryption.js +116 -0
- package/lib/aws/storage/index.d.ts +6 -0
- package/lib/aws/storage/index.js +10 -1
- package/lib/aws/storage/lifecycle-config.generated.d.ts +7 -7
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +1 -1
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.js +1 -1
- package/lib/aws/storage/parameter.js +2 -2
- package/lib/aws/storage/scalable-attribute-api.d.ts +36 -0
- package/lib/aws/storage/scalable-attribute-api.js +3 -0
- package/lib/aws/storage/scalable-table-attribute.d.ts +32 -0
- package/lib/aws/storage/scalable-table-attribute.js +48 -0
- package/lib/aws/storage/shared.d.ts +419 -0
- package/lib/aws/storage/shared.js +161 -0
- package/lib/aws/storage/table.d.ts +536 -0
- package/lib/aws/storage/table.js +1054 -0
- package/lib/aws/storage/website-config.generated.d.ts +5 -5
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/construct-base.js +2 -2
- package/lib/duration.js +1 -1
- package/lib/expiration.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/size.js +1 -1
- package/lib/stack-base.js +1 -1
- package/lib/terra-func.js +1 -1
- package/lib/time-zone.d.ts +724 -0
- package/lib/time-zone.js +737 -0
- package/package.json +14 -13
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { appautoscalingScheduledAction } from "@cdktf/provider-aws";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { Schedule } from "./schedule";
|
|
4
|
+
import { BasicStepScalingPolicyProps, StepScalingPolicy } from "./step-scaling-policy";
|
|
5
|
+
import { BasicTargetTrackingScalingPolicyProps, TargetTrackingScalingPolicy } from "./target-tracking-scaling-policy";
|
|
6
|
+
import { TimeZone } from "../../time-zone";
|
|
7
|
+
import { AwsConstructBase, AwsConstructProps, IAwsConstruct } from "../aws-construct";
|
|
8
|
+
import * as iam from "../iam";
|
|
9
|
+
/**
|
|
10
|
+
* Represents a Application Auto Scaling Scalable Target
|
|
11
|
+
*/
|
|
12
|
+
export interface IScalableTarget extends IAwsConstruct {
|
|
13
|
+
/**
|
|
14
|
+
* The ID of the Scalable Target.
|
|
15
|
+
* This is typically in the format: service-namespace/resource-id/scalable-dimension
|
|
16
|
+
* @attribute
|
|
17
|
+
*/
|
|
18
|
+
readonly scalableTargetId: string;
|
|
19
|
+
/**
|
|
20
|
+
* The IAM role that allows Application Auto Scaling to modify your scalable target.
|
|
21
|
+
*/
|
|
22
|
+
readonly role?: iam.IRole;
|
|
23
|
+
/**
|
|
24
|
+
* The resource identifier to associate with this scalable target.
|
|
25
|
+
*/
|
|
26
|
+
readonly resourceId: string;
|
|
27
|
+
/**
|
|
28
|
+
* The scalable dimension that's associated with the scalable target.
|
|
29
|
+
*/
|
|
30
|
+
readonly scalableDimension: string;
|
|
31
|
+
/**
|
|
32
|
+
* The namespace of the AWS service that provides the resource.
|
|
33
|
+
*/
|
|
34
|
+
readonly serviceNamespace: ServiceNamespace;
|
|
35
|
+
/**
|
|
36
|
+
* Add a policy statement to the role's policy document.
|
|
37
|
+
* @param statement The policy statement to add
|
|
38
|
+
*/
|
|
39
|
+
addToRolePolicy(statement: iam.PolicyStatement): void;
|
|
40
|
+
/**
|
|
41
|
+
* Scale out or in based on time.
|
|
42
|
+
* @param id The ID of the scheduled action
|
|
43
|
+
* @param action The scaling schedule
|
|
44
|
+
*/
|
|
45
|
+
scaleOnSchedule(id: string, action: ScalingSchedule): appautoscalingScheduledAction.AppautoscalingScheduledAction;
|
|
46
|
+
/**
|
|
47
|
+
* Scale out or in, in response to a metric.
|
|
48
|
+
* @param id The ID of the scaling policy
|
|
49
|
+
* @param props The properties for the step scaling policy
|
|
50
|
+
*/
|
|
51
|
+
scaleOnMetric(id: string, props: BasicStepScalingPolicyProps): StepScalingPolicy;
|
|
52
|
+
/**
|
|
53
|
+
* Scale out or in in order to keep a metric around a target value.
|
|
54
|
+
* @param id The ID of the scaling policy
|
|
55
|
+
* @param props The properties for the target tracking scaling policy
|
|
56
|
+
*/
|
|
57
|
+
scaleToTrackMetric(id: string, props: BasicTargetTrackingScalingPolicyProps): TargetTrackingScalingPolicy;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Properties for a scalable target
|
|
61
|
+
*/
|
|
62
|
+
export interface ScalableTargetProps extends AwsConstructProps {
|
|
63
|
+
/**
|
|
64
|
+
* The minimum value that Application Auto Scaling can use to scale a target during a scaling activity.
|
|
65
|
+
*/
|
|
66
|
+
readonly minCapacity: number;
|
|
67
|
+
/**
|
|
68
|
+
* The maximum value that Application Auto Scaling can use to scale a target during a scaling activity.
|
|
69
|
+
*/
|
|
70
|
+
readonly maxCapacity: number;
|
|
71
|
+
/**
|
|
72
|
+
* Role that allows Application Auto Scaling to modify your scalable target.
|
|
73
|
+
*
|
|
74
|
+
* @default A role is automatically created
|
|
75
|
+
*/
|
|
76
|
+
readonly role?: iam.IRole;
|
|
77
|
+
/**
|
|
78
|
+
* The resource identifier to associate with this scalable target.
|
|
79
|
+
*
|
|
80
|
+
* This string consists of the resource type and unique identifier.
|
|
81
|
+
*
|
|
82
|
+
* Example value: `service/ecsStack-MyECSCluster-AB12CDE3F4GH/ecsStack-MyECSService-AB12CDE3F4GH`
|
|
83
|
+
*
|
|
84
|
+
* @see https://docs.aws.amazon.com/autoscaling/application/APIReference/API_RegisterScalableTarget.html
|
|
85
|
+
*/
|
|
86
|
+
readonly resourceId: string;
|
|
87
|
+
/**
|
|
88
|
+
* The scalable dimension that's associated with the scalable target.
|
|
89
|
+
*
|
|
90
|
+
* Specify the service namespace, resource type, and scaling property.
|
|
91
|
+
*
|
|
92
|
+
* Example value: `ecs:service:DesiredCount`
|
|
93
|
+
* @see https://docs.aws.amazon.com/autoscaling/application/APIReference/API_ScalingPolicy.html
|
|
94
|
+
*/
|
|
95
|
+
readonly scalableDimension: string;
|
|
96
|
+
/**
|
|
97
|
+
* The namespace of the AWS service that provides the resource or
|
|
98
|
+
* custom-resource for a resource provided by your own application or
|
|
99
|
+
* service.
|
|
100
|
+
*
|
|
101
|
+
* For valid AWS service namespace values, see the RegisterScalableTarget
|
|
102
|
+
* action in the Application Auto Scaling API Reference.
|
|
103
|
+
*
|
|
104
|
+
* @see https://docs.aws.amazon.com/autoscaling/application/APIReference/API_RegisterScalableTarget.html
|
|
105
|
+
*/
|
|
106
|
+
readonly serviceNamespace: ServiceNamespace;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Define a scalable target
|
|
110
|
+
*
|
|
111
|
+
* @resource aws_appautoscaling_target
|
|
112
|
+
*/
|
|
113
|
+
export declare class ScalableTarget extends AwsConstructBase implements IScalableTarget {
|
|
114
|
+
static fromScalableTargetId(scope: Construct, id: string, scalableTargetId: string): IScalableTarget;
|
|
115
|
+
readonly scalableTargetId: string;
|
|
116
|
+
readonly role?: iam.IRole;
|
|
117
|
+
readonly resourceId: string;
|
|
118
|
+
readonly scalableDimension: string;
|
|
119
|
+
readonly serviceNamespace: ServiceNamespace;
|
|
120
|
+
private readonly targetResource;
|
|
121
|
+
constructor(scope: Construct, id: string, props: ScalableTargetProps);
|
|
122
|
+
get outputs(): Record<string, any>;
|
|
123
|
+
addToRolePolicy(statement: iam.PolicyStatement): void;
|
|
124
|
+
scaleOnSchedule(scheduleId: string, action: ScalingSchedule): appautoscalingScheduledAction.AppautoscalingScheduledAction;
|
|
125
|
+
scaleOnMetric(policyId: string, props: BasicStepScalingPolicyProps): StepScalingPolicy;
|
|
126
|
+
scaleToTrackMetric(policyId: string, props: BasicTargetTrackingScalingPolicyProps): TargetTrackingScalingPolicy;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* A scheduled scaling action
|
|
130
|
+
*/
|
|
131
|
+
export interface ScalingSchedule {
|
|
132
|
+
/**
|
|
133
|
+
* When to perform this action.
|
|
134
|
+
*/
|
|
135
|
+
readonly schedule: Schedule;
|
|
136
|
+
/**
|
|
137
|
+
* When this scheduled action becomes active.
|
|
138
|
+
*
|
|
139
|
+
* @default The rule is activate immediately
|
|
140
|
+
*/
|
|
141
|
+
readonly startTime?: Date;
|
|
142
|
+
/**
|
|
143
|
+
* When this scheduled action expires.
|
|
144
|
+
*
|
|
145
|
+
* @default The rule never expires.
|
|
146
|
+
*/
|
|
147
|
+
readonly endTime?: Date;
|
|
148
|
+
/**
|
|
149
|
+
* The new minimum capacity.
|
|
150
|
+
*
|
|
151
|
+
* During the scheduled time, if the current capacity is below the minimum
|
|
152
|
+
* capacity, Application Auto Scaling scales out to the minimum capacity.
|
|
153
|
+
*
|
|
154
|
+
* At least one of maxCapacity and minCapacity must be supplied.
|
|
155
|
+
*
|
|
156
|
+
* @default No new minimum capacity
|
|
157
|
+
*/
|
|
158
|
+
readonly minCapacity?: number;
|
|
159
|
+
/**
|
|
160
|
+
* The new maximum capacity.
|
|
161
|
+
*
|
|
162
|
+
* During the scheduled time, the current capacity is above the maximum
|
|
163
|
+
* capacity, Application Auto Scaling scales in to the maximum capacity.
|
|
164
|
+
*
|
|
165
|
+
* At least one of maxCapacity and minCapacity must be supplied.
|
|
166
|
+
*
|
|
167
|
+
* @default No new maximum capacity
|
|
168
|
+
*/
|
|
169
|
+
readonly maxCapacity?: number;
|
|
170
|
+
/**
|
|
171
|
+
* The time zone used when referring to the date and time of a scheduled action,
|
|
172
|
+
* when the scheduled action uses an at or cron expression.
|
|
173
|
+
*
|
|
174
|
+
* @default - UTC
|
|
175
|
+
*/
|
|
176
|
+
readonly timeZone?: TimeZone;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* The service that supports Application AutoScaling
|
|
180
|
+
*/
|
|
181
|
+
export declare enum ServiceNamespace {
|
|
182
|
+
ECS = "ecs",
|
|
183
|
+
ELASTIC_MAP_REDUCE = "elasticmapreduce",
|
|
184
|
+
EC2 = "ec2",
|
|
185
|
+
APPSTREAM = "appstream",
|
|
186
|
+
DYNAMODB = "dynamodb",
|
|
187
|
+
RDS = "rds",
|
|
188
|
+
SAGEMAKER = "sagemaker",
|
|
189
|
+
CUSTOM_RESOURCE = "custom-resource",
|
|
190
|
+
LAMBDA = "lambda",
|
|
191
|
+
COMPREHEND = "comprehend",
|
|
192
|
+
KAFKA = "kafka",
|
|
193
|
+
ELASTICACHE = "elasticache",
|
|
194
|
+
NEPTUNE = "neptune",
|
|
195
|
+
CASSANDRA = "cassandra",
|
|
196
|
+
WORKSPACES = "workspaces"
|
|
197
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ServiceNamespace = exports.ScalableTarget = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// https://github.com/aws/aws-cdk/blob/v2.168.0/packages/aws-cdk-lib/aws-applicationautoscaling/lib/scalable-target.ts
|
|
7
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
8
|
+
const step_scaling_policy_1 = require("./step-scaling-policy");
|
|
9
|
+
const target_tracking_scaling_policy_1 = require("./target-tracking-scaling-policy");
|
|
10
|
+
const token_1 = require("../../token");
|
|
11
|
+
const aws_construct_1 = require("../aws-construct");
|
|
12
|
+
const iam = require("../iam");
|
|
13
|
+
/**
|
|
14
|
+
* Define a scalable target
|
|
15
|
+
*
|
|
16
|
+
* @resource aws_appautoscaling_target
|
|
17
|
+
*/
|
|
18
|
+
class ScalableTarget extends aws_construct_1.AwsConstructBase {
|
|
19
|
+
static fromScalableTargetId(scope, id, scalableTargetId) {
|
|
20
|
+
// Assuming scalableTargetId is in the format: serviceNamespace/resourceId/scalableDimension
|
|
21
|
+
const parts = scalableTargetId.split("/");
|
|
22
|
+
if (parts.length < 3) {
|
|
23
|
+
throw new Error("Invalid scalableTargetId format. Expected serviceNamespace/resourceId/scalableDimension");
|
|
24
|
+
}
|
|
25
|
+
const serviceNamespace = parts[0];
|
|
26
|
+
const scalableDimension = parts[parts.length - 1];
|
|
27
|
+
const resourceId = parts.slice(1, -1).join("/");
|
|
28
|
+
class Import extends aws_construct_1.AwsConstructBase {
|
|
29
|
+
constructor(s, i) {
|
|
30
|
+
super(s, i, {
|
|
31
|
+
environmentFromArn: `arn:aws:application-autoscaling:${aws_construct_1.AwsConstructBase.isConstruct(s) ? s.env.region : "unknown"}:${aws_construct_1.AwsConstructBase.isConstruct(s) ? s.env.account : "unknown"}:scalable-target/${scalableTargetId}`,
|
|
32
|
+
});
|
|
33
|
+
this.scalableTargetId = scalableTargetId;
|
|
34
|
+
this.resourceId = resourceId;
|
|
35
|
+
this.scalableDimension = scalableDimension;
|
|
36
|
+
this.serviceNamespace = serviceNamespace;
|
|
37
|
+
// Role is not directly importable with just the target ID, it would need to be imported separately or ARN provided.
|
|
38
|
+
// For simplicity, we'll represent it as an unmodifiable imported role placeholder.
|
|
39
|
+
this.role = iam.Role.fromRoleArn(this, "ImportedRole", "arn:aws:iam::unknown:role/unknownapplicationautoscalingrole", { mutable: false });
|
|
40
|
+
}
|
|
41
|
+
get outputs() {
|
|
42
|
+
return { scalableTargetId: this.scalableTargetId };
|
|
43
|
+
}
|
|
44
|
+
addToRolePolicy(_statement) {
|
|
45
|
+
throw new Error("Cannot add to policy of an imported ScalableTarget role like this.");
|
|
46
|
+
}
|
|
47
|
+
scaleOnSchedule(_actionId, _action) {
|
|
48
|
+
throw new Error("Cannot add scheduled action to an imported ScalableTarget.");
|
|
49
|
+
}
|
|
50
|
+
scaleOnMetric(_policyId, _props) {
|
|
51
|
+
throw new Error("Cannot add step scaling policy to an imported ScalableTarget.");
|
|
52
|
+
}
|
|
53
|
+
scaleToTrackMetric(_policyId, _props) {
|
|
54
|
+
throw new Error("Cannot add target tracking policy to an imported ScalableTarget.");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return new Import(scope, id);
|
|
58
|
+
}
|
|
59
|
+
constructor(scope, id, props) {
|
|
60
|
+
super(scope, id, props);
|
|
61
|
+
(0, token_1.withResolved)(props.maxCapacity, (max) => {
|
|
62
|
+
if (max < 0) {
|
|
63
|
+
throw new Error(`maxCapacity cannot be negative, got: ${props.maxCapacity}`);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
(0, token_1.withResolved)(props.minCapacity, (min) => {
|
|
67
|
+
if (min < 0) {
|
|
68
|
+
throw new Error(`minCapacity cannot be negative, got: ${props.minCapacity}`);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
(0, token_1.withResolved)(props.minCapacity, props.maxCapacity, (min, max) => {
|
|
72
|
+
if (max < min) {
|
|
73
|
+
throw new Error(`minCapacity (${props.minCapacity}) should be lower than maxCapacity (${props.maxCapacity})`);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// For DynamoDB autoscaling, use service-linked roles when no explicit role is provided
|
|
77
|
+
// This allows Terraform to automatically manage the appropriate service-linked role
|
|
78
|
+
// rather than creating a custom IAM role that may have incorrect ARN format
|
|
79
|
+
this.role = props.role;
|
|
80
|
+
const targetConfig = {
|
|
81
|
+
maxCapacity: props.maxCapacity,
|
|
82
|
+
minCapacity: props.minCapacity,
|
|
83
|
+
resourceId: props.resourceId,
|
|
84
|
+
scalableDimension: props.scalableDimension,
|
|
85
|
+
serviceNamespace: props.serviceNamespace,
|
|
86
|
+
};
|
|
87
|
+
// Only include roleArn if a role is explicitly provided
|
|
88
|
+
// When omitted, Terraform will use appropriate service-linked roles
|
|
89
|
+
if (this.role) {
|
|
90
|
+
targetConfig.roleArn = this.role.roleArn;
|
|
91
|
+
}
|
|
92
|
+
this.targetResource = new provider_aws_1.appautoscalingTarget.AppautoscalingTarget(this, "Resource", targetConfig);
|
|
93
|
+
this.scalableTargetId = this.targetResource.id;
|
|
94
|
+
this.resourceId = props.resourceId;
|
|
95
|
+
this.scalableDimension = props.scalableDimension;
|
|
96
|
+
this.serviceNamespace = props.serviceNamespace;
|
|
97
|
+
}
|
|
98
|
+
get outputs() {
|
|
99
|
+
return {
|
|
100
|
+
scalableTargetId: this.scalableTargetId,
|
|
101
|
+
roleArn: this.role?.roleArn,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
addToRolePolicy(statement) {
|
|
105
|
+
if (!this.role) {
|
|
106
|
+
throw new Error("Cannot add policy to role when using service-linked roles. " +
|
|
107
|
+
"Provide an explicit role in ScalableTargetProps if you need to add custom policies.");
|
|
108
|
+
}
|
|
109
|
+
this.role.addToPrincipalPolicy(statement);
|
|
110
|
+
}
|
|
111
|
+
scaleOnSchedule(scheduleId, action) {
|
|
112
|
+
if (action.minCapacity === undefined && action.maxCapacity === undefined) {
|
|
113
|
+
throw new Error(`You must supply at least one of minCapacity or maxCapacity, got ${JSON.stringify(action)}`);
|
|
114
|
+
}
|
|
115
|
+
action.schedule._bind(this);
|
|
116
|
+
return new provider_aws_1.appautoscalingScheduledAction.AppautoscalingScheduledAction(this, scheduleId, {
|
|
117
|
+
name: scheduleId,
|
|
118
|
+
serviceNamespace: this.serviceNamespace,
|
|
119
|
+
resourceId: this.resourceId,
|
|
120
|
+
scalableDimension: this.scalableDimension,
|
|
121
|
+
schedule: action.schedule.expressionString,
|
|
122
|
+
startTime: action.startTime?.toISOString(),
|
|
123
|
+
endTime: action.endTime?.toISOString(),
|
|
124
|
+
scalableTargetAction: {
|
|
125
|
+
maxCapacity: action.maxCapacity?.toString(),
|
|
126
|
+
minCapacity: action.minCapacity?.toString(),
|
|
127
|
+
},
|
|
128
|
+
timezone: action.timeZone?.timezoneName,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
scaleOnMetric(policyId, props) {
|
|
132
|
+
return new step_scaling_policy_1.StepScalingPolicy(this, policyId, {
|
|
133
|
+
...props,
|
|
134
|
+
scalingTarget: this,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
scaleToTrackMetric(policyId, props) {
|
|
138
|
+
return new target_tracking_scaling_policy_1.TargetTrackingScalingPolicy(this, policyId, {
|
|
139
|
+
...props,
|
|
140
|
+
scalingTarget: this,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.ScalableTarget = ScalableTarget;
|
|
145
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
146
|
+
ScalableTarget[_a] = { fqn: "terraconstructs.aws.compute.ScalableTarget", version: "0.0.24" };
|
|
147
|
+
/**
|
|
148
|
+
* The service that supports Application AutoScaling
|
|
149
|
+
*/
|
|
150
|
+
var ServiceNamespace;
|
|
151
|
+
(function (ServiceNamespace) {
|
|
152
|
+
ServiceNamespace["ECS"] = "ecs";
|
|
153
|
+
ServiceNamespace["ELASTIC_MAP_REDUCE"] = "elasticmapreduce";
|
|
154
|
+
ServiceNamespace["EC2"] = "ec2";
|
|
155
|
+
ServiceNamespace["APPSTREAM"] = "appstream";
|
|
156
|
+
ServiceNamespace["DYNAMODB"] = "dynamodb";
|
|
157
|
+
ServiceNamespace["RDS"] = "rds";
|
|
158
|
+
ServiceNamespace["SAGEMAKER"] = "sagemaker";
|
|
159
|
+
ServiceNamespace["CUSTOM_RESOURCE"] = "custom-resource";
|
|
160
|
+
ServiceNamespace["LAMBDA"] = "lambda";
|
|
161
|
+
ServiceNamespace["COMPREHEND"] = "comprehend";
|
|
162
|
+
ServiceNamespace["KAFKA"] = "kafka";
|
|
163
|
+
ServiceNamespace["ELASTICACHE"] = "elasticache";
|
|
164
|
+
ServiceNamespace["NEPTUNE"] = "neptune";
|
|
165
|
+
ServiceNamespace["CASSANDRA"] = "cassandra";
|
|
166
|
+
ServiceNamespace["WORKSPACES"] = "workspaces";
|
|
167
|
+
})(ServiceNamespace || (exports.ServiceNamespace = ServiceNamespace = {}));
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGFibGUtdGFyZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9jb21wdXRlL3NjYWxhYmxlLXRhcmdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNIQUFzSDtBQUV0SCxzREFHNkI7QUFHN0IsK0RBRytCO0FBQy9CLHFGQUcwQztBQUUxQyx1Q0FBMkM7QUFDM0Msb0RBSTBCO0FBQzFCLDhCQUE4QjtBQTZIOUI7Ozs7R0FJRztBQUNILE1BQWEsY0FDWCxTQUFRLGdDQUFnQjtJQUdqQixNQUFNLENBQUMsb0JBQW9CLENBQ2hDLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixnQkFBd0I7UUFFeEIsNEZBQTRGO1FBQzVGLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FDYix5RkFBeUYsQ0FDMUYsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQXFCLENBQUM7UUFDdEQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVoRCxNQUFNLE1BQU8sU0FBUSxnQ0FBZ0I7WUFPbkMsWUFBWSxDQUFZLEVBQUUsQ0FBUztnQkFDakMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQ1Ysa0JBQWtCLEVBQUUsbUNBQW1DLGdDQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBc0IsQ0FBQyxHQUFHLENBQUMs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QTRDO1FBRTVDLE9BQU8sSUFBSSw0REFBMkIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3JELEdBQUcsS0FBSztZQUNSLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBdE5ILHdDQXVOQzs7O0FBMEREOztHQUVHO0FBQ0gsSUFBWSxnQkFnQlg7QUFoQkQsV0FBWSxnQkFBZ0I7SUFDMUIsK0JBQVcsQ0FBQTtJQUNYLDJEQUF1QyxDQUFBO0lBQ3ZDLCtCQUFXLENBQUE7SUFDWCwyQ0FBdUIsQ0FBQTtJQUN2Qix5Q0FBcUIsQ0FBQTtJQUNyQiwrQkFBVyxDQUFBO0lBQ1gsMkNBQXVCLENBQUE7SUFDdkIsdURBQW1DLENBQUE7SUFDbkMscUNBQWlCLENBQUE7SUFDakIsNkNBQXlCLENBQUE7SUFDekIsbUNBQWUsQ0FBQTtJQUNmLCtDQUEyQixDQUFBO0lBQzNCLHVDQUFtQixDQUFBO0lBQ25CLDJDQUF1QixDQUFBO0lBQ3ZCLDZDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFoQlcsZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFnQjNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTY4LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWFwcGxpY2F0aW9uYXV0b3NjYWxpbmcvbGliL3NjYWxhYmxlLXRhcmdldC50c1xuXG5pbXBvcnQge1xuICBhcHBhdXRvc2NhbGluZ1RhcmdldCxcbiAgYXBwYXV0b3NjYWxpbmdTY2hlZHVsZWRBY3Rpb24sXG59IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgU2NoZWR1bGUgfSBmcm9tIFwiLi9zY2hlZHVsZVwiO1xuaW1wb3J0IHtcbiAgQmFzaWNTdGVwU2NhbGluZ1BvbGljeVByb3BzLFxuICBTdGVwU2NhbGluZ1BvbGljeSxcbn0gZnJvbSBcIi4vc3RlcC1zY2FsaW5nLXBvbGljeVwiO1xuaW1wb3J0IHtcbiAgQmFzaWNUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3lQcm9wcyxcbiAgVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5LFxufSBmcm9tIFwiLi90YXJnZXQtdHJhY2tpbmctc2NhbGluZy1wb2xpY3lcIjtcbmltcG9ydCB7IFRpbWVab25lIH0gZnJvbSBcIi4uLy4uL3RpbWUtem9uZVwiO1xuaW1wb3J0IHsgd2l0aFJlc29sdmVkIH0gZnJvbSBcIi4uLy4uL3Rva2VuXCI7XG5pbXBvcnQge1xuICBBd3NDb25zdHJ1Y3RCYXNlLFxuICBBd3NDb25zdHJ1Y3RQcm9wcyxcbiAgSUF3c0NvbnN0cnVjdCxcbn0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiLi4vaWFtXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIEFwcGxpY2F0aW9uIEF1dG8gU2NhbGluZyBTY2FsYWJsZSBUYXJnZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2NhbGFibGVUYXJnZXQgZXh0ZW5kcyBJQXdzQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgU2NhbGFibGUgVGFyZ2V0LlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSBpbiB0aGUgZm9ybWF0OiBzZXJ2aWNlLW5hbWVzcGFjZS9yZXNvdXJjZS1pZC9zY2FsYWJsZS1kaW1lbnNpb25cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2NhbGFibGVUYXJnZXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdGhhdCBhbGxvd3MgQXBwbGljYXRpb24gQXV0byBTY2FsaW5nIHRvIG1vZGlmeSB5b3VyIHNjYWxhYmxlIHRhcmdldC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBpZGVudGlmaWVyIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgc2NhbGFibGUgdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NhbGFibGUgZGltZW5zaW9uIHRoYXQncyBhc3NvY2lhdGVkIHdpdGggdGhlIHNjYWxhYmxlIHRhcmdldC5cbiAgICovXG4gIHJlYWRvbmx5IHNjYWxhYmxlRGltZW5zaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIEFXUyBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgdGhlIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZTtcblxuICAvKipcbiAgICogQWRkIGEgcG9saWN5IHN0YXRlbWVudCB0byB0aGUgcm9sZSdzIHBvbGljeSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHN0YXRlbWVudCBUaGUgcG9saWN5IHN0YXRlbWVudCB0byBhZGRcbiAgICovXG4gIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTY2FsZSBvdXQgb3IgaW4gYmFzZWQgb24gdGltZS5cbiAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGFjdGlvblxuICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBzY2FsaW5nIHNjaGVkdWxlXG4gICAqL1xuICBzY2FsZU9uU2NoZWR1bGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhY3Rpb246IFNjYWxpbmdTY2hlZHVsZSxcbiAgKTogYXBwYXV0b3NjYWxpbmdTY2hlZHVsZWRBY3Rpb24uQXBwYXV0b3NjYWxpbmdTY2hlZHVsZWRBY3Rpb247XG5cbiAgLyoqXG4gICAqIFNjYWxlIG91dCBvciBpbiwgaW4gcmVzcG9uc2UgdG8gYSBtZXRyaWMuXG4gICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIHNjYWxpbmcgcG9saWN5XG4gICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIHN0ZXAgc2NhbGluZyBwb2xpY3lcbiAgICovXG4gIHNjYWxlT25NZXRyaWMoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQmFzaWNTdGVwU2NhbGluZ1BvbGljeVByb3BzLFxuICApOiBTdGVwU2NhbGluZ1BvbGljeTtcblxuICAvKipcbiAgICogU2NhbGUgb3V0IG9yIGluIGluIG9yZGVyIHRvIGtlZXAgYSBtZXRyaWMgYXJvdW5kIGEgdGFyZ2V0IHZhbHVlLlxuICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBzY2FsaW5nIHBvbGljeVxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSB0YXJnZXQgdHJhY2tpbmcgc2NhbGluZyBwb2xpY3lcbiAgICovXG4gIHNjYWxlVG9UcmFja01ldHJpYyhcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBCYXNpY1RhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeVByb3BzLFxuICApOiBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3k7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBzY2FsYWJsZSB0YXJnZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FsYWJsZVRhcmdldFByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gdmFsdWUgdGhhdCBBcHBsaWNhdGlvbiBBdXRvIFNjYWxpbmcgY2FuIHVzZSB0byBzY2FsZSBhIHRhcmdldCBkdXJpbmcgYSBzY2FsaW5nIGFjdGl2aXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgbWluQ2FwYWNpdHk6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdmFsdWUgdGhhdCBBcHBsaWNhdGlvbiBBdXRvIFNjYWxpbmcgY2FuIHVzZSB0byBzY2FsZSBhIHRhcmdldCBkdXJpbmcgYSBzY2FsaW5nIGFjdGl2aXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q2FwYWNpdHk6IG51bWJlcjtcblxuICAvKipcbiAgICogUm9sZSB0aGF0IGFsbG93cyBBcHBsaWNhdGlvbiBBdXRvIFNjYWxpbmcgdG8gbW9kaWZ5IHlvdXIgc2NhbGFibGUgdGFyZ2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBBIHJvbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgaWRlbnRpZmllciB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHNjYWxhYmxlIHRhcmdldC5cbiAgICpcbiAgICogVGhpcyBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIHJlc291cmNlIHR5cGUgYW5kIHVuaXF1ZSBpZGVudGlmaWVyLlxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgc2VydmljZS9lY3NTdGFjay1NeUVDU0NsdXN0ZXItQUIxMkNERTNGNEdIL2Vjc1N0YWNrLU15RUNTU2VydmljZS1BQjEyQ0RFM0Y0R0hgXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F1dG9zY2FsaW5nL2FwcGxpY2F0aW9uL0FQSVJlZmVyZW5jZS9BUElfUmVnaXN0ZXJTY2FsYWJsZVRhcmdldC5odG1sXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzY2FsYWJsZSBkaW1lbnNpb24gdGhhdCdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NhbGFibGUgdGFyZ2V0LlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoZSBzZXJ2aWNlIG5hbWVzcGFjZSwgcmVzb3VyY2UgdHlwZSwgYW5kIHNjYWxpbmcgcHJvcGVydHkuXG4gICAqXG4gICAqIEV4YW1wbGUgdmFsdWU6IGBlY3M6c2VydmljZTpEZXNpcmVkQ291bnRgXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F1dG9zY2FsaW5nL2FwcGxpY2F0aW9uL0FQSVJlZmVyZW5jZS9BUElfU2NhbGluZ1BvbGljeS5odG1sXG4gICAqL1xuICByZWFkb25seSBzY2FsYWJsZURpbWVuc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBBV1Mgc2VydmljZSB0aGF0IHByb3ZpZGVzIHRoZSByZXNvdXJjZSBvclxuICAgKiBjdXN0b20tcmVzb3VyY2UgZm9yIGEgcmVzb3VyY2UgcHJvdmlkZWQgYnkgeW91ciBvd24gYXBwbGljYXRpb24gb3JcbiAgICogc2VydmljZS5cbiAgICpcbiAgICogRm9yIHZhbGlkIEFXUyBzZXJ2aWNlIG5hbWVzcGFjZSB2YWx1ZXMsIHNlZSB0aGUgUmVnaXN0ZXJTY2FsYWJsZVRhcmdldFxuICAgKiBhY3Rpb24gaW4gdGhlIEFwcGxpY2F0aW9uIEF1dG8gU2NhbGluZyBBUEkgUmVmZXJlbmNlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdXRvc2NhbGluZy9hcHBsaWNhdGlvbi9BUElSZWZlcmVuY2UvQVBJX1JlZ2lzdGVyU2NhbGFibGVUYXJnZXQuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZTtcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBzY2FsYWJsZSB0YXJnZXRcbiAqXG4gKiBAcmVzb3VyY2UgYXdzX2FwcGF1dG9zY2FsaW5nX3RhcmdldFxuICovXG5leHBvcnQgY2xhc3MgU2NhbGFibGVUYXJnZXRcbiAgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlXG4gIGltcGxlbWVudHMgSVNjYWxhYmxlVGFyZ2V0XG57XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNjYWxhYmxlVGFyZ2V0SWQoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHNjYWxhYmxlVGFyZ2V0SWQ6IHN0cmluZyxcbiAgKTogSVNjYWxhYmxlVGFyZ2V0IHtcbiAgICAvLyBBc3N1bWluZyBzY2FsYWJsZVRhcmdldElkIGlzIGluIHRoZSBmb3JtYXQ6IHNlcnZpY2VOYW1lc3BhY2UvcmVzb3VyY2VJZC9zY2FsYWJsZURpbWVuc2lvblxuICAgIGNvbnN0IHBhcnRzID0gc2NhbGFibGVUYXJnZXRJZC5zcGxpdChcIi9cIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIHNjYWxhYmxlVGFyZ2V0SWQgZm9ybWF0LiBFeHBlY3RlZCBzZXJ2aWNlTmFtZXNwYWNlL3Jlc291cmNlSWQvc2NhbGFibGVEaW1lbnNpb25cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2VOYW1lc3BhY2UgPSBwYXJ0c1swXSBhcyBTZXJ2aWNlTmFtZXNwYWNlO1xuICAgIGNvbnN0IHNjYWxhYmxlRGltZW5zaW9uID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IHBhcnRzLnNsaWNlKDEsIC0xKS5qb2luKFwiL1wiKTtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJU2NhbGFibGVUYXJnZXQge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHNjYWxhYmxlVGFyZ2V0SWQgPSBzY2FsYWJsZVRhcmdldElkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSByZXNvdXJjZUlkID0gcmVzb3VyY2VJZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzY2FsYWJsZURpbWVuc2lvbiA9IHNjYWxhYmxlRGltZW5zaW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2VOYW1lc3BhY2UgPSBzZXJ2aWNlTmFtZXNwYWNlO1xuXG4gICAgICBjb25zdHJ1Y3RvcihzOiBDb25zdHJ1Y3QsIGk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihzLCBpLCB7XG4gICAgICAgICAgZW52aXJvbm1lbnRGcm9tQXJuOiBgYXJuOmF3czphcHBsaWNhdGlvbi1hdXRvc2NhbGluZzoke0F3c0NvbnN0cnVjdEJhc2UuaXNDb25zdHJ1Y3QocykgPyAocyBhcyBBd3NDb25zdHJ1Y3RCYXNlKS5lbnYucmVnaW9uIDogXCJ1bmtub3duXCJ9OiR7QXdzQ29uc3RydWN0QmFzZS5pc0NvbnN0cnVjdChzKSA/IChzIGFzIEF3c0NvbnN0cnVjdEJhc2UpLmVudi5hY2NvdW50IDogXCJ1bmtub3duXCJ9OnNjYWxhYmxlLXRhcmdldC8ke3NjYWxhYmxlVGFyZ2V0SWR9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFJvbGUgaXMgbm90IGRpcmVjdGx5IGltcG9ydGFibGUgd2l0aCBqdXN0IHRoZSB0YXJnZXQgSUQsIGl0IHdvdWxkIG5lZWQgdG8gYmUgaW1wb3J0ZWQgc2VwYXJhdGVseSBvciBBUk4gcHJvdmlkZWQuXG4gICAgICAgIC8vIEZvciBzaW1wbGljaXR5LCB3ZSdsbCByZXByZXNlbnQgaXQgYXMgYW4gdW5tb2RpZmlhYmxlIGltcG9ydGVkIHJvbGUgcGxhY2Vob2xkZXIuXG4gICAgICAgIHRoaXMucm9sZSA9IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJJbXBvcnRlZFJvbGVcIixcbiAgICAgICAgICBcImFybjphd3M6aWFtOjp1bmtub3duOnJvbGUvdW5rbm93bmFwcGxpY2F0aW9uYXV0b3NjYWxpbmdyb2xlXCIsXG4gICAgICAgICAgeyBtdXRhYmxlOiBmYWxzZSB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIHJldHVybiB7IHNjYWxhYmxlVGFyZ2V0SWQ6IHRoaXMuc2NhbGFibGVUYXJnZXRJZCB9O1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgYWRkVG9Sb2xlUG9saWN5KF9zdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGFkZCB0byBwb2xpY3kgb2YgYW4gaW1wb3J0ZWQgU2NhbGFibGVUYXJnZXQgcm9sZSBsaWtlIHRoaXMuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBzY2FsZU9uU2NoZWR1bGUoXG4gICAgICAgIF9hY3Rpb25JZDogc3RyaW5nLFxuICAgICAgICBfYWN0aW9uOiBTY2FsaW5nU2NoZWR1bGUsXG4gICAgICApOiBhcHBhdXRvc2NhbGluZ1NjaGVkdWxlZEFjdGlvbi5BcHBhdXRvc2NhbGluZ1NjaGVkdWxlZEFjdGlvbiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCBhZGQgc2NoZWR1bGVkIGFjdGlvbiB0byBhbiBpbXBvcnRlZCBTY2FsYWJsZVRhcmdldC5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIHNjYWxlT25NZXRyaWMoXG4gICAgICAgIF9wb2xpY3lJZDogc3RyaW5nLFxuICAgICAgICBfcHJvcHM6IEJhc2ljU3RlcFNjYWxpbmdQb2xpY3lQcm9wcyxcbiAgICAgICk6IFN0ZXBTY2FsaW5nUG9saWN5IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGFkZCBzdGVwIHNjYWxpbmcgcG9saWN5IHRvIGFuIGltcG9ydGVkIFNjYWxhYmxlVGFyZ2V0LlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgc2NhbGVUb1RyYWNrTWV0cmljKFxuICAgICAgICBfcG9saWN5SWQ6IHN0cmluZyxcbiAgICAgICAgX3Byb3BzOiBCYXNpY1RhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeVByb3BzLFxuICAgICAgKTogVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGFkZCB0YXJnZXQgdHJhY2tpbmcgcG9saWN5IHRvIGFuIGltcG9ydGVkIFNjYWxhYmxlVGFyZ2V0LlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHNjYWxhYmxlVGFyZ2V0SWQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzY2FsYWJsZURpbWVuc2lvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZU5hbWVzcGFjZTogU2VydmljZU5hbWVzcGFjZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldFJlc291cmNlOiBhcHBhdXRvc2NhbGluZ1RhcmdldC5BcHBhdXRvc2NhbGluZ1RhcmdldDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2NhbGFibGVUYXJnZXRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgd2l0aFJlc29sdmVkKHByb3BzLm1heENhcGFjaXR5LCAobWF4KSA9PiB7XG4gICAgICBpZiAobWF4IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYG1heENhcGFjaXR5IGNhbm5vdCBiZSBuZWdhdGl2ZSwgZ290OiAke3Byb3BzLm1heENhcGFjaXR5fWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB3aXRoUmVzb2x2ZWQocHJvcHMubWluQ2FwYWNpdHksIChtaW4pID0+IHtcbiAgICAgIGlmIChtaW4gPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgbWluQ2FwYWNpdHkgY2Fubm90IGJlIG5lZ2F0aXZlLCBnb3Q6ICR7cHJvcHMubWluQ2FwYWNpdHl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdpdGhSZXNvbHZlZChwcm9wcy5taW5DYXBhY2l0eSwgcHJvcHMubWF4Q2FwYWNpdHksIChtaW4sIG1heCkgPT4ge1xuICAgICAgaWYgKG1heCA8IG1pbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYG1pbkNhcGFjaXR5ICgke3Byb3BzLm1pbkNhcGFjaXR5fSkgc2hvdWxkIGJlIGxvd2VyIHRoYW4gbWF4Q2FwYWNpdHkgKCR7cHJvcHMubWF4Q2FwYWNpdHl9KWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBGb3IgRHluYW1vREIgYXV0b3NjYWxpbmcsIHVzZSBzZXJ2aWNlLWxpbmtlZCByb2xlcyB3aGVuIG5vIGV4cGxpY2l0IHJvbGUgaXMgcHJvdmlkZWRcbiAgICAvLyBUaGlzIGFsbG93cyBUZXJyYWZvcm0gdG8gYXV0b21hdGljYWxseSBtYW5hZ2UgdGhlIGFwcHJvcHJpYXRlIHNlcnZpY2UtbGlua2VkIHJvbGVcbiAgICAvLyByYXRoZXIgdGhhbiBjcmVhdGluZyBhIGN1c3RvbSBJQU0gcm9sZSB0aGF0IG1heSBoYXZlIGluY29ycmVjdCBBUk4gZm9ybWF0XG4gICAgdGhpcy5yb2xlID0gcHJvcHMucm9sZTtcblxuICAgIGNvbnN0IHRhcmdldENvbmZpZzogYW55ID0ge1xuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5LFxuICAgICAgbWluQ2FwYWNpdHk6IHByb3BzLm1pbkNhcGFjaXR5LFxuICAgICAgcmVzb3VyY2VJZDogcHJvcHMucmVzb3VyY2VJZCxcbiAgICAgIHNjYWxhYmxlRGltZW5zaW9uOiBwcm9wcy5zY2FsYWJsZURpbWVuc2lvbixcbiAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IHByb3BzLnNlcnZpY2VOYW1lc3BhY2UsXG4gICAgfTtcblxuICAgIC8vIE9ubHkgaW5jbHVkZSByb2xlQXJuIGlmIGEgcm9sZSBpcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgLy8gV2hlbiBvbWl0dGVkLCBUZXJyYWZvcm0gd2lsbCB1c2UgYXBwcm9wcmlhdGUgc2VydmljZS1saW5rZWQgcm9sZXNcbiAgICBpZiAodGhpcy5yb2xlKSB7XG4gICAgICB0YXJnZXRDb25maWcucm9sZUFybiA9IHRoaXMucm9sZS5yb2xlQXJuO1xuICAgIH1cblxuICAgIHRoaXMudGFyZ2V0UmVzb3VyY2UgPSBuZXcgYXBwYXV0b3NjYWxpbmdUYXJnZXQuQXBwYXV0b3NjYWxpbmdUYXJnZXQoXG4gICAgICB0aGlzLFxuICAgICAgXCJSZXNvdXJjZVwiLFxuICAgICAgdGFyZ2V0Q29uZmlnLFxuICAgICk7XG5cbiAgICB0aGlzLnNjYWxhYmxlVGFyZ2V0SWQgPSB0aGlzLnRhcmdldFJlc291cmNlLmlkO1xuICAgIHRoaXMucmVzb3VyY2VJZCA9IHByb3BzLnJlc291cmNlSWQ7XG4gICAgdGhpcy5zY2FsYWJsZURpbWVuc2lvbiA9IHByb3BzLnNjYWxhYmxlRGltZW5zaW9uO1xuICAgIHRoaXMuc2VydmljZU5hbWVzcGFjZSA9IHByb3BzLnNlcnZpY2VOYW1lc3BhY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjYWxhYmxlVGFyZ2V0SWQ6IHRoaXMuc2NhbGFibGVUYXJnZXRJZCxcbiAgICAgIHJvbGVBcm46IHRoaXMucm9sZT8ucm9sZUFybixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMucm9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBhZGQgcG9saWN5IHRvIHJvbGUgd2hlbiB1c2luZyBzZXJ2aWNlLWxpbmtlZCByb2xlcy4gXCIgK1xuICAgICAgICAgIFwiUHJvdmlkZSBhbiBleHBsaWNpdCByb2xlIGluIFNjYWxhYmxlVGFyZ2V0UHJvcHMgaWYgeW91IG5lZWQgdG8gYWRkIGN1c3RvbSBwb2xpY2llcy5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgcHVibGljIHNjYWxlT25TY2hlZHVsZShcbiAgICBzY2hlZHVsZUlkOiBzdHJpbmcsXG4gICAgYWN0aW9uOiBTY2FsaW5nU2NoZWR1bGUsXG4gICk6IGFwcGF1dG9zY2FsaW5nU2NoZWR1bGVkQWN0aW9uLkFwcGF1dG9zY2FsaW5nU2NoZWR1bGVkQWN0aW9uIHtcbiAgICBpZiAoYWN0aW9uLm1pbkNhcGFjaXR5ID09PSB1bmRlZmluZWQgJiYgYWN0aW9uLm1heENhcGFjaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgb2YgbWluQ2FwYWNpdHkgb3IgbWF4Q2FwYWNpdHksIGdvdCAke0pTT04uc3RyaW5naWZ5KGFjdGlvbil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYWN0aW9uLnNjaGVkdWxlLl9iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIG5ldyBhcHBhdXRvc2NhbGluZ1NjaGVkdWxlZEFjdGlvbi5BcHBhdXRvc2NhbGluZ1NjaGVkdWxlZEFjdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBzY2hlZHVsZUlkLFxuICAgICAge1xuICAgICAgICBuYW1lOiBzY2hlZHVsZUlkLFxuICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiB0aGlzLnNlcnZpY2VOYW1lc3BhY2UsXG4gICAgICAgIHJlc291cmNlSWQ6IHRoaXMucmVzb3VyY2VJZCxcbiAgICAgICAgc2NhbGFibGVEaW1lbnNpb246IHRoaXMuc2NhbGFibGVEaW1lbnNpb24sXG4gICAgICAgIHNjaGVkdWxlOiBhY3Rpb24uc2NoZWR1bGUuZXhwcmVzc2lvblN0cmluZyxcbiAgICAgICAgc3RhcnRUaW1lOiBhY3Rpb24uc3RhcnRUaW1lPy50b0lTT1N0cmluZygpLFxuICAgICAgICBlbmRUaW1lOiBhY3Rpb24uZW5kVGltZT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgc2NhbGFibGVUYXJnZXRBY3Rpb246IHtcbiAgICAgICAgICBtYXhDYXBhY2l0eTogYWN0aW9uLm1heENhcGFjaXR5Py50b1N0cmluZygpLFxuICAgICAgICAgIG1pbkNhcGFjaXR5OiBhY3Rpb24ubWluQ2FwYWNpdHk/LnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWV6b25lOiBhY3Rpb24udGltZVpvbmU/LnRpbWV6b25lTmFtZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzY2FsZU9uTWV0cmljKFxuICAgIHBvbGljeUlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEJhc2ljU3RlcFNjYWxpbmdQb2xpY3lQcm9wcyxcbiAgKTogU3RlcFNjYWxpbmdQb2xpY3kge1xuICAgIHJldHVybiBuZXcgU3RlcFNjYWxpbmdQb2xpY3kodGhpcywgcG9saWN5SWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc2NhbGluZ1RhcmdldDogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzY2FsZVRvVHJhY2tNZXRyaWMoXG4gICAgcG9saWN5SWQ6IHN0cmluZyxcbiAgICBwcm9wczogQmFzaWNUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3lQcm9wcyxcbiAgKTogVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5IHtcbiAgICByZXR1cm4gbmV3IFRhcmdldFRyYWNraW5nU2NhbGluZ1BvbGljeSh0aGlzLCBwb2xpY3lJZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBzY2FsaW5nVGFyZ2V0OiB0aGlzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBzY2hlZHVsZWQgc2NhbGluZyBhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FsaW5nU2NoZWR1bGUge1xuICAvKipcbiAgICogV2hlbiB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU6IFNjaGVkdWxlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgc2NoZWR1bGVkIGFjdGlvbiBiZWNvbWVzIGFjdGl2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIHJ1bGUgaXMgYWN0aXZhdGUgaW1tZWRpYXRlbHlcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGltZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBzY2hlZHVsZWQgYWN0aW9uIGV4cGlyZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSBydWxlIG5ldmVyIGV4cGlyZXMuXG4gICAqL1xuICByZWFkb25seSBlbmRUaW1lPzogRGF0ZTtcblxuICAvKipcbiAgICogVGhlIG5ldyBtaW5pbXVtIGNhcGFjaXR5LlxuICAgKlxuICAgKiBEdXJpbmcgdGhlIHNjaGVkdWxlZCB0aW1lLCBpZiB0aGUgY3VycmVudCBjYXBhY2l0eSBpcyBiZWxvdyB0aGUgbWluaW11bVxuICAgKiBjYXBhY2l0eSwgQXBwbGljYXRpb24gQXV0byBTY2FsaW5nIHNjYWxlcyBvdXQgdG8gdGhlIG1pbmltdW0gY2FwYWNpdHkuXG4gICAqXG4gICAqIEF0IGxlYXN0IG9uZSBvZiBtYXhDYXBhY2l0eSBhbmQgbWluQ2FwYWNpdHkgbXVzdCBiZSBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gbmV3IG1pbmltdW0gY2FwYWNpdHlcbiAgICovXG4gIHJlYWRvbmx5IG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IG1heGltdW0gY2FwYWNpdHkuXG4gICAqXG4gICAqIER1cmluZyB0aGUgc2NoZWR1bGVkIHRpbWUsIHRoZSBjdXJyZW50IGNhcGFjaXR5IGlzIGFib3ZlIHRoZSBtYXhpbXVtXG4gICAqIGNhcGFjaXR5LCBBcHBsaWNhdGlvbiBBdXRvIFNjYWxpbmcgc2NhbGVzIGluIHRvIHRoZSBtYXhpbXVtIGNhcGFjaXR5LlxuICAgKlxuICAgKiBBdCBsZWFzdCBvbmUgb2YgbWF4Q2FwYWNpdHkgYW5kIG1pbkNhcGFjaXR5IG11c3QgYmUgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIG5ldyBtYXhpbXVtIGNhcGFjaXR5XG4gICAqL1xuICByZWFkb25seSBtYXhDYXBhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRpbWUgem9uZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIHRoZSBkYXRlIGFuZCB0aW1lIG9mIGEgc2NoZWR1bGVkIGFjdGlvbixcbiAgICogd2hlbiB0aGUgc2NoZWR1bGVkIGFjdGlvbiB1c2VzIGFuIGF0IG9yIGNyb24gZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBVVENcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVab25lPzogVGltZVpvbmU7XG59XG5cbi8qKlxuICogVGhlIHNlcnZpY2UgdGhhdCBzdXBwb3J0cyBBcHBsaWNhdGlvbiBBdXRvU2NhbGluZ1xuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTmFtZXNwYWNlIHtcbiAgRUNTID0gXCJlY3NcIixcbiAgRUxBU1RJQ19NQVBfUkVEVUNFID0gXCJlbGFzdGljbWFwcmVkdWNlXCIsXG4gIEVDMiA9IFwiZWMyXCIsXG4gIEFQUFNUUkVBTSA9IFwiYXBwc3RyZWFtXCIsXG4gIERZTkFNT0RCID0gXCJkeW5hbW9kYlwiLFxuICBSRFMgPSBcInJkc1wiLFxuICBTQUdFTUFLRVIgPSBcInNhZ2VtYWtlclwiLFxuICBDVVNUT01fUkVTT1VSQ0UgPSBcImN1c3RvbS1yZXNvdXJjZVwiLFxuICBMQU1CREEgPSBcImxhbWJkYVwiLFxuICBDT01QUkVIRU5EID0gXCJjb21wcmVoZW5kXCIsXG4gIEtBRktBID0gXCJrYWZrYVwiLFxuICBFTEFTVElDQUNIRSA9IFwiZWxhc3RpY2FjaGVcIixcbiAgTkVQVFVORSA9IFwibmVwdHVuZVwiLFxuICBDQVNTQU5EUkEgPSBcImNhc3NhbmRyYVwiLFxuICBXT1JLU1BBQ0VTID0gXCJ3b3Jrc3BhY2VzXCIsXG59XG4iXX0=
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { Duration } from "../../duration";
|
|
3
|
+
/**
|
|
4
|
+
* Schedule for scheduled scaling actions
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class Schedule {
|
|
7
|
+
/**
|
|
8
|
+
* Construct a schedule from a literal schedule expression
|
|
9
|
+
*
|
|
10
|
+
* @param expression The expression to use. Must be in a format that Application AutoScaling will recognize
|
|
11
|
+
*/
|
|
12
|
+
static expression(expression: string): Schedule;
|
|
13
|
+
/**
|
|
14
|
+
* Construct a schedule from an interval and a time unit
|
|
15
|
+
*/
|
|
16
|
+
static rate(duration: Duration): Schedule;
|
|
17
|
+
/**
|
|
18
|
+
* Construct a Schedule from a moment in time
|
|
19
|
+
*/
|
|
20
|
+
static at(moment: Date): Schedule;
|
|
21
|
+
/**
|
|
22
|
+
* Create a schedule from a set of cron fields
|
|
23
|
+
*/
|
|
24
|
+
static cron(options: CronOptions): Schedule;
|
|
25
|
+
/**
|
|
26
|
+
* Retrieve the expression for this schedule
|
|
27
|
+
*/
|
|
28
|
+
abstract readonly expressionString: string;
|
|
29
|
+
protected constructor();
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
abstract _bind(scope: Construct): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Options to configure a cron expression
|
|
38
|
+
*
|
|
39
|
+
* All fields are strings so you can use complex expressions. Absence of
|
|
40
|
+
* a field implies '*' or '?', whichever one is appropriate.
|
|
41
|
+
*
|
|
42
|
+
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions
|
|
43
|
+
*/
|
|
44
|
+
export interface CronOptions {
|
|
45
|
+
/**
|
|
46
|
+
* The minute to run this rule at
|
|
47
|
+
*
|
|
48
|
+
* @default - Every minute
|
|
49
|
+
*/
|
|
50
|
+
readonly minute?: string;
|
|
51
|
+
/**
|
|
52
|
+
* The hour to run this rule at
|
|
53
|
+
*
|
|
54
|
+
* @default - Every hour
|
|
55
|
+
*/
|
|
56
|
+
readonly hour?: string;
|
|
57
|
+
/**
|
|
58
|
+
* The day of the month to run this rule at
|
|
59
|
+
*
|
|
60
|
+
* @default - Every day of the month
|
|
61
|
+
*/
|
|
62
|
+
readonly day?: string;
|
|
63
|
+
/**
|
|
64
|
+
* The month to run this rule at
|
|
65
|
+
*
|
|
66
|
+
* @default - Every month
|
|
67
|
+
*/
|
|
68
|
+
readonly month?: string;
|
|
69
|
+
/**
|
|
70
|
+
* The year to run this rule at
|
|
71
|
+
*
|
|
72
|
+
* @default - Every year
|
|
73
|
+
*/
|
|
74
|
+
readonly year?: string;
|
|
75
|
+
/**
|
|
76
|
+
* The day of the week to run this rule at
|
|
77
|
+
*
|
|
78
|
+
* @default - Any day of the week
|
|
79
|
+
*/
|
|
80
|
+
readonly weekDay?: string;
|
|
81
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Schedule = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// https://github.com/aws/aws-cdk/blob/v2.168.0/packages/aws-cdk-lib/aws-applicationautoscaling/lib/schedule.ts
|
|
7
|
+
const cdktf_1 = require("cdktf");
|
|
8
|
+
// TODO Adupt ValidationError is available, otherwise use standard Error
|
|
9
|
+
// - https://github.com/aws/aws-cdk/pull/33382/
|
|
10
|
+
// - https://github.com/aws/aws-cdk/pull/33045
|
|
11
|
+
// import { UnscopedValidationError } from "../../errors";
|
|
12
|
+
/**
|
|
13
|
+
* Schedule for scheduled scaling actions
|
|
14
|
+
*/
|
|
15
|
+
class Schedule {
|
|
16
|
+
/**
|
|
17
|
+
* Construct a schedule from a literal schedule expression
|
|
18
|
+
*
|
|
19
|
+
* @param expression The expression to use. Must be in a format that Application AutoScaling will recognize
|
|
20
|
+
*/
|
|
21
|
+
static expression(expression) {
|
|
22
|
+
return new LiteralSchedule(expression);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Construct a schedule from an interval and a time unit
|
|
26
|
+
*/
|
|
27
|
+
static rate(duration) {
|
|
28
|
+
if (duration.isUnresolved()) {
|
|
29
|
+
const validDurationUnit = [
|
|
30
|
+
"minute",
|
|
31
|
+
"minutes",
|
|
32
|
+
"hour",
|
|
33
|
+
"hours",
|
|
34
|
+
"day",
|
|
35
|
+
"days",
|
|
36
|
+
];
|
|
37
|
+
if (!validDurationUnit.includes(duration.unitLabel())) {
|
|
38
|
+
// throw new UnscopedValidationError(
|
|
39
|
+
throw new Error("Allowed units for scheduling are: 'minute', 'minutes', 'hour', 'hours', 'day' or 'days'");
|
|
40
|
+
}
|
|
41
|
+
return new LiteralSchedule(`rate(${duration.formatTokenToNumber()})`);
|
|
42
|
+
}
|
|
43
|
+
if (duration.toSeconds() === 0) {
|
|
44
|
+
// throw new UnscopedValidationError(
|
|
45
|
+
throw new Error("Duration cannot be 0");
|
|
46
|
+
}
|
|
47
|
+
let rate = maybeRate(duration.toDays({ integral: false }), "day");
|
|
48
|
+
if (rate === undefined) {
|
|
49
|
+
rate = maybeRate(duration.toHours({ integral: false }), "hour");
|
|
50
|
+
}
|
|
51
|
+
if (rate === undefined) {
|
|
52
|
+
rate = makeRate(duration.toMinutes({ integral: true }), "minute");
|
|
53
|
+
}
|
|
54
|
+
return new LiteralSchedule(rate);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Construct a Schedule from a moment in time
|
|
58
|
+
*/
|
|
59
|
+
static at(moment) {
|
|
60
|
+
return new LiteralSchedule(`at(${formatISO(moment)})`);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a schedule from a set of cron fields
|
|
64
|
+
*/
|
|
65
|
+
static cron(options) {
|
|
66
|
+
if (options.weekDay !== undefined && options.day !== undefined) {
|
|
67
|
+
// throw new UnscopedValidationError(
|
|
68
|
+
throw new Error("Cannot supply both 'day' and 'weekDay', use at most one");
|
|
69
|
+
}
|
|
70
|
+
const minute = fallback(options.minute, "*");
|
|
71
|
+
const hour = fallback(options.hour, "*");
|
|
72
|
+
const month = fallback(options.month, "*");
|
|
73
|
+
const year = fallback(options.year, "*");
|
|
74
|
+
// Weekday defaults to '?' if not supplied. If it is supplied, day must become '?'
|
|
75
|
+
const day = fallback(options.day, options.weekDay !== undefined ? "?" : "*");
|
|
76
|
+
const weekDay = fallback(options.weekDay, "?");
|
|
77
|
+
return new (class extends Schedule {
|
|
78
|
+
constructor() {
|
|
79
|
+
super(...arguments);
|
|
80
|
+
this.expressionString = `cron(${minute} ${hour} ${day} ${month} ${weekDay} ${year})`;
|
|
81
|
+
}
|
|
82
|
+
_bind(scope) {
|
|
83
|
+
if (!options.minute) {
|
|
84
|
+
// "@aws-cdk/aws-applicationautoscaling:defaultRunEveryMinute",
|
|
85
|
+
cdktf_1.Annotations.of(scope).addWarning("cron: If you don't pass 'minute', by default the event runs every minute. Pass 'minute: '*'' if that's what you intend, or 'minute: 0' to run once per hour instead.");
|
|
86
|
+
}
|
|
87
|
+
return new LiteralSchedule(this.expressionString);
|
|
88
|
+
}
|
|
89
|
+
})();
|
|
90
|
+
}
|
|
91
|
+
constructor() { }
|
|
92
|
+
}
|
|
93
|
+
exports.Schedule = Schedule;
|
|
94
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
95
|
+
Schedule[_a] = { fqn: "terraconstructs.aws.compute.Schedule", version: "0.0.24" };
|
|
96
|
+
class LiteralSchedule extends Schedule {
|
|
97
|
+
constructor(expressionString) {
|
|
98
|
+
super();
|
|
99
|
+
this.expressionString = expressionString;
|
|
100
|
+
}
|
|
101
|
+
_bind() { }
|
|
102
|
+
}
|
|
103
|
+
function fallback(x, def) {
|
|
104
|
+
return x === undefined ? def : x;
|
|
105
|
+
}
|
|
106
|
+
function formatISO(date) {
|
|
107
|
+
if (!date) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
return (date.getUTCFullYear() +
|
|
111
|
+
"-" +
|
|
112
|
+
pad(date.getUTCMonth() + 1) +
|
|
113
|
+
"-" +
|
|
114
|
+
pad(date.getUTCDate()) +
|
|
115
|
+
"T" +
|
|
116
|
+
pad(date.getUTCHours()) +
|
|
117
|
+
":" +
|
|
118
|
+
pad(date.getUTCMinutes()) +
|
|
119
|
+
":" +
|
|
120
|
+
pad(date.getUTCSeconds()));
|
|
121
|
+
function pad(num) {
|
|
122
|
+
if (num < 10) {
|
|
123
|
+
return "0" + num;
|
|
124
|
+
}
|
|
125
|
+
return num;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Return the rate if the rate is whole number
|
|
130
|
+
*/
|
|
131
|
+
function maybeRate(interval, singular) {
|
|
132
|
+
if (interval === 0 || !Number.isInteger(interval)) {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
return makeRate(interval, singular);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Return 'rate(${interval} ${singular}(s))` for the interval
|
|
139
|
+
*/
|
|
140
|
+
function makeRate(interval, singular) {
|
|
141
|
+
return interval === 1
|
|
142
|
+
? `rate(1 ${singular})`
|
|
143
|
+
: `rate(${interval} ${singular}s)`;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvc2NoZWR1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrR0FBK0c7QUFFL0csaUNBQW9DO0FBR3BDLHdFQUF3RTtBQUN4RSwrQ0FBK0M7QUFDL0MsOENBQThDO0FBQzlDLDBEQUEwRDtBQUUxRDs7R0FFRztBQUNILE1BQXNCLFFBQVE7SUFDNUI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBa0I7UUFDekMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWtCO1FBQ25DLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDNUIsTUFBTSxpQkFBaUIsR0FBRztnQkFDeEIsUUFBUTtnQkFDUixTQUFTO2dCQUNULE1BQU07Z0JBQ04sT0FBTztnQkFDUCxLQUFLO2dCQUNMLE1BQU07YUFDUCxDQUFDO1lBQ0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxxQ0FBcUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQ2IseUZBQXlGLENBQzFGLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxJQUFJLGVBQWUsQ0FBQyxRQUFRLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IscUNBQXFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMs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Q3ZCLENBQUMsQ0FBQyxRQUFRLFFBQVEsSUFBSSxRQUFRLElBQUksQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTY4LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWFwcGxpY2F0aW9uYXV0b3NjYWxpbmcvbGliL3NjaGVkdWxlLnRzXG5cbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiLi4vLi4vZHVyYXRpb25cIjtcbi8vIFRPRE8gQWR1cHQgVmFsaWRhdGlvbkVycm9yIGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBzdGFuZGFyZCBFcnJvclxuLy8gLSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8zMzM4Mi9cbi8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3B1bGwvMzMwNDVcbi8vIGltcG9ydCB7IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuXG4vKipcbiAqIFNjaGVkdWxlIGZvciBzY2hlZHVsZWQgc2NhbGluZyBhY3Rpb25zXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTY2hlZHVsZSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBzY2hlZHVsZSBmcm9tIGEgbGl0ZXJhbCBzY2hlZHVsZSBleHByZXNzaW9uXG4gICAqXG4gICAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIHVzZS4gTXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IEFwcGxpY2F0aW9uIEF1dG9TY2FsaW5nIHdpbGwgcmVjb2duaXplXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2NoZWR1bGUge1xuICAgIHJldHVybiBuZXcgTGl0ZXJhbFNjaGVkdWxlKGV4cHJlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHNjaGVkdWxlIGZyb20gYW4gaW50ZXJ2YWwgYW5kIGEgdGltZSB1bml0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJhdGUoZHVyYXRpb246IER1cmF0aW9uKTogU2NoZWR1bGUge1xuICAgIGlmIChkdXJhdGlvbi5pc1VucmVzb2x2ZWQoKSkge1xuICAgICAgY29uc3QgdmFsaWREdXJhdGlvblVuaXQgPSBbXG4gICAgICAgIFwibWludXRlXCIsXG4gICAgICAgIFwibWludXRlc1wiLFxuICAgICAgICBcImhvdXJcIixcbiAgICAgICAgXCJob3Vyc1wiLFxuICAgICAgICBcImRheVwiLFxuICAgICAgICBcImRheXNcIixcbiAgICAgIF07XG4gICAgICBpZiAoIXZhbGlkRHVyYXRpb25Vbml0LmluY2x1ZGVzKGR1cmF0aW9uLnVuaXRMYWJlbCgpKSkge1xuICAgICAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkFsbG93ZWQgdW5pdHMgZm9yIHNjaGVkdWxpbmcgYXJlOiAnbWludXRlJywgJ21pbnV0ZXMnLCAnaG91cicsICdob3VycycsICdkYXknIG9yICdkYXlzJ1wiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsU2NoZWR1bGUoYHJhdGUoJHtkdXJhdGlvbi5mb3JtYXRUb2tlblRvTnVtYmVyKCl9KWApO1xuICAgIH1cbiAgICBpZiAoZHVyYXRpb24udG9TZWNvbmRzKCkgPT09IDApIHtcbiAgICAgIC8vIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkR1cmF0aW9uIGNhbm5vdCBiZSAwXCIpO1xuICAgIH1cblxuICAgIGxldCByYXRlID0gbWF5YmVSYXRlKGR1cmF0aW9uLnRvRGF5cyh7IGludGVncmFsOiBmYWxzZSB9KSwgXCJkYXlcIik7XG4gICAgaWYgKHJhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmF0ZSA9IG1heWJlUmF0ZShkdXJhdGlvbi50b0hvdXJzKHsgaW50ZWdyYWw6IGZhbHNlIH0pLCBcImhvdXJcIik7XG4gICAgfVxuICAgIGlmIChyYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJhdGUgPSBtYWtlUmF0ZShkdXJhdGlvbi50b01pbnV0ZXMoeyBpbnRlZ3JhbDogdHJ1ZSB9KSwgXCJtaW51dGVcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTGl0ZXJhbFNjaGVkdWxlKHJhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIFNjaGVkdWxlIGZyb20gYSBtb21lbnQgaW4gdGltZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhdChtb21lbnQ6IERhdGUpOiBTY2hlZHVsZSB7XG4gICAgcmV0dXJuIG5ldyBMaXRlcmFsU2NoZWR1bGUoYGF0KCR7Zm9ybWF0SVNPKG1vbWVudCl9KWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNjaGVkdWxlIGZyb20gYSBzZXQgb2YgY3JvbiBmaWVsZHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JvbihvcHRpb25zOiBDcm9uT3B0aW9ucyk6IFNjaGVkdWxlIHtcbiAgICBpZiAob3B0aW9ucy53ZWVrRGF5ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kYXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBzdXBwbHkgYm90aCAnZGF5JyBhbmQgJ3dlZWtEYXknLCB1c2UgYXQgbW9zdCBvbmVcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbWludXRlID0gZmFsbGJhY2sob3B0aW9ucy5taW51dGUsIFwiKlwiKTtcbiAgICBjb25zdCBob3VyID0gZmFsbGJhY2sob3B0aW9ucy5ob3VyLCBcIipcIik7XG4gICAgY29uc3QgbW9udGggPSBmYWxsYmFjayhvcHRpb25zLm1vbnRoLCBcIipcIik7XG4gICAgY29uc3QgeWVhciA9IGZhbGxiYWNrKG9wdGlvbnMueWVhciwgXCIqXCIpO1xuXG4gICAgLy8gV2Vla2RheSBkZWZhdWx0cyB0byAnPycgaWYgbm90IHN1cHBsaWVkLiBJZiBpdCBpcyBzdXBwbGllZCwgZGF5IG11c3QgYmVjb21lICc/J1xuICAgIGNvbnN0IGRheSA9IGZhbGxiYWNrKFxuICAgICAgb3B0aW9ucy5kYXksXG4gICAgICBvcHRpb25zLndlZWtEYXkgIT09IHVuZGVmaW5lZCA/IFwiP1wiIDogXCIqXCIsXG4gICAgKTtcbiAgICBjb25zdCB3ZWVrRGF5ID0gZmFsbGJhY2sob3B0aW9ucy53ZWVrRGF5LCBcIj9cIik7XG5cbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIFNjaGVkdWxlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBleHByZXNzaW9uU3RyaW5nOiBzdHJpbmcgPSBgY3Jvbigke21pbnV0ZX0gJHtob3VyfSAke2RheX0gJHttb250aH0gJHt3ZWVrRGF5fSAke3llYXJ9KWA7XG4gICAgICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCkge1xuICAgICAgICBpZiAoIW9wdGlvbnMubWludXRlKSB7XG4gICAgICAgICAgLy8gXCJAYXdzLWNkay9hd3MtYXBwbGljYXRpb25hdXRvc2NhbGluZzpkZWZhdWx0UnVuRXZlcnlNaW51dGVcIixcbiAgICAgICAgICBBbm5vdGF0aW9ucy5vZihzY29wZSkuYWRkV2FybmluZyhcbiAgICAgICAgICAgIFwiY3JvbjogSWYgeW91IGRvbid0IHBhc3MgJ21pbnV0ZScsIGJ5IGRlZmF1bHQgdGhlIGV2ZW50IHJ1bnMgZXZlcnkgbWludXRlLiBQYXNzICdtaW51dGU6ICcqJycgaWYgdGhhdCdzIHdoYXQgeW91IGludGVuZCwgb3IgJ21pbnV0ZTogMCcgdG8gcnVuIG9uY2UgcGVyIGhvdXIgaW5zdGVhZC5cIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFNjaGVkdWxlKHRoaXMuZXhwcmVzc2lvblN0cmluZyk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZXhwcmVzc2lvbiBmb3IgdGhpcyBzY2hlZHVsZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGV4cHJlc3Npb25TdHJpbmc6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZChzY29wZTogQ29uc3RydWN0KTogdm9pZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGNvbmZpZ3VyZSBhIGNyb24gZXhwcmVzc2lvblxuICpcbiAqIEFsbCBmaWVsZHMgYXJlIHN0cmluZ3Mgc28geW91IGNhbiB1c2UgY29tcGxleCBleHByZXNzaW9ucy4gQWJzZW5jZSBvZlxuICogYSBmaWVsZCBpbXBsaWVzICcqJyBvciAnPycsIHdoaWNoZXZlciBvbmUgaXMgYXBwcm9wcmlhdGUuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvZXZlbnRzL1NjaGVkdWxlZEV2ZW50cy5odG1sI0Nyb25FeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBtaW51dGUgdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5IG1pbnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWludXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG91ciB0byBydW4gdGhpcyBydWxlIGF0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXZlcnkgaG91clxuICAgKi9cbiAgcmVhZG9ubHkgaG91cj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5IGRheSBvZiB0aGUgbW9udGhcbiAgICovXG4gIHJlYWRvbmx5IGRheT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vbnRoIHRvIHJ1biB0aGlzIHJ1bGUgYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBFdmVyeSBtb250aFxuICAgKi9cbiAgcmVhZG9ubHkgbW9udGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB5ZWFyIHRvIHJ1biB0aGlzIHJ1bGUgYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBFdmVyeSB5ZWFyXG4gICAqL1xuICByZWFkb25seSB5ZWFyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHJ1biB0aGlzIHJ1bGUgYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBBbnkgZGF5IG9mIHRoZSB3ZWVrXG4gICAqL1xuICByZWFkb25seSB3ZWVrRGF5Pzogc3RyaW5nO1xufVxuXG5jbGFzcyBMaXRlcmFsU2NoZWR1bGUgZXh0ZW5kcyBTY2hlZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBleHByZXNzaW9uU3RyaW5nOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIF9iaW5kKCkge31cbn1cblxuZnVuY3Rpb24gZmFsbGJhY2s8VD4oeDogVCB8IHVuZGVmaW5lZCwgZGVmOiBUKTogVCB7XG4gIHJldHVybiB4ID09PSB1bmRlZmluZWQgPyBkZWYgOiB4O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRJU08oZGF0ZT86IERhdGUpIHtcbiAgaWYgKCFkYXRlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgZGF0ZS5nZXRVVENGdWxsWWVhcigpICtcbiAgICBcIi1cIiArXG4gICAgcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpICtcbiAgICBcIi1cIiArXG4gICAgcGFkKGRhdGUuZ2V0VVRDRGF0ZSgpKSArXG4gICAgXCJUXCIgK1xuICAgIHBhZChkYXRlLmdldFVUQ0hvdXJzKCkpICtcbiAgICBcIjpcIiArXG4gICAgcGFkKGRhdGUuZ2V0VVRDTWludXRlcygpKSArXG4gICAgXCI6XCIgK1xuICAgIHBhZChkYXRlLmdldFVUQ1NlY29uZHMoKSlcbiAgKTtcblxuICBmdW5jdGlvbiBwYWQobnVtOiBudW1iZXIpIHtcbiAgICBpZiAobnVtIDwgMTApIHtcbiAgICAgIHJldHVybiBcIjBcIiArIG51bTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcmF0ZSBpZiB0aGUgcmF0ZSBpcyB3aG9sZSBudW1iZXJcbiAqL1xuZnVuY3Rpb24gbWF5YmVSYXRlKGludGVydmFsOiBudW1iZXIsIHNpbmd1bGFyOiBzdHJpbmcpIHtcbiAgaWYgKGludGVydmFsID09PSAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGludGVydmFsKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1ha2VSYXRlKGludGVydmFsLCBzaW5ndWxhcik7XG59XG5cbi8qKlxuICogUmV0dXJuICdyYXRlKCR7aW50ZXJ2YWx9ICR7c2luZ3VsYXJ9KHMpKWAgZm9yIHRoZSBpbnRlcnZhbFxuICovXG5mdW5jdGlvbiBtYWtlUmF0ZShpbnRlcnZhbDogbnVtYmVyLCBzaW5ndWxhcjogc3RyaW5nKSB7XG4gIHJldHVybiBpbnRlcnZhbCA9PT0gMVxuICAgID8gYHJhdGUoMSAke3Npbmd1bGFyfSlgXG4gICAgOiBgcmF0ZSgke2ludGVydmFsfSAke3Npbmd1bGFyfXMpYDtcbn1cbiJdfQ==
|