-
Notifications
You must be signed in to change notification settings - Fork 4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(sqs): does not print all failed validations for Queue props (#33070)
### Issue #33098 Closes #33098. ### Reason for this change When initializing a new SQS Queue, props validation throws an error at the first validation issue encountered. If there are multiple validation issues, the user is only informed of the first one. ### Description of changes Using `validateAllProps` presents all validation errors to the user at once. If `redriveAllowPolicy` is enabled, the policy will also be evaluated in the same way. ### Describe any new or updated permissions being added No permissions changes. ### Description of how you validated changes Adjusted and added unit tests. Ran integration tests. ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
- Loading branch information
Showing
4 changed files
with
137 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
import { Construct } from 'constructs'; | ||
import { Queue, QueueProps, RedriveAllowPolicy, RedrivePermission } from './index'; | ||
import { Token } from '../../core'; | ||
import { validateAllProps, ValidationRule } from '../../core/lib/helpers-internal'; | ||
|
||
function validateRange(value: number | undefined, minValue: number, maxValue: number): boolean { | ||
return value !== undefined && !Token.isUnresolved(value) && (value < minValue || value > maxValue); | ||
} | ||
|
||
const queueValidationRules: ValidationRule<QueueProps>[] = [ | ||
{ | ||
condition: (props) => validateRange(props.deliveryDelay?.toSeconds(), 0, 900), | ||
message: (props) => `delivery delay must be between 0 and 900 seconds, but ${props.deliveryDelay?.toSeconds()} was provided`, | ||
}, | ||
{ | ||
condition: (props) => validateRange(props.maxMessageSizeBytes, 1_024, 262_144), | ||
message: (props) => `maximum message size must be between 1,024 and 262,144 bytes, but ${props.maxMessageSizeBytes} was provided`, | ||
}, | ||
{ | ||
condition: (props) => validateRange(props.retentionPeriod?.toSeconds(), 60, 1_209_600), | ||
message: (props) => `message retention period must be between 60 and 1,209,600 seconds, but ${props.retentionPeriod?.toSeconds()} was provided`, | ||
}, | ||
{ | ||
condition: (props) => validateRange(props.receiveMessageWaitTime?.toSeconds(), 0, 20), | ||
message: (props) => `receive wait time must be between 0 and 20 seconds, but ${props.receiveMessageWaitTime?.toSeconds()} was provided`, | ||
}, | ||
{ | ||
condition: (props) => validateRange(props.visibilityTimeout?.toSeconds(), 0, 43_200), | ||
message: (props) => `visibility timeout must be between 0 and 43,200 seconds, but ${props.visibilityTimeout?.toSeconds()} was provided`, | ||
}, | ||
{ | ||
condition: (props) => validateRange(props.deadLetterQueue?.maxReceiveCount, 1, Number.MAX_SAFE_INTEGER), | ||
message: (props) => `dead letter target maximum receive count must be 1 or more, but ${props.deadLetterQueue?.maxReceiveCount} was provided`, | ||
}, | ||
]; | ||
|
||
const redriveValidationRules: ValidationRule<RedriveAllowPolicy>[] = [ | ||
{ | ||
condition: ({ redrivePermission, sourceQueues }) => | ||
redrivePermission === RedrivePermission.BY_QUEUE && (!sourceQueues || sourceQueues.length === 0), | ||
message: () => 'At least one source queue must be specified when RedrivePermission is set to \'byQueue\'', | ||
}, | ||
{ | ||
condition: ({ redrivePermission, sourceQueues }) => | ||
!!(redrivePermission === RedrivePermission.BY_QUEUE && sourceQueues && sourceQueues.length > 10), | ||
message: () => 'Up to 10 sourceQueues can be specified. Set RedrivePermission to \'allowAll\' to specify more', | ||
}, | ||
{ | ||
condition: ({ redrivePermission, sourceQueues }) => | ||
!!((redrivePermission === RedrivePermission.ALLOW_ALL || redrivePermission === RedrivePermission.DENY_ALL) && sourceQueues), | ||
message: () => 'sourceQueues cannot be configured when RedrivePermission is set to \'allowAll\' or \'denyAll\'', | ||
}, | ||
]; | ||
|
||
export function validateQueueProps(scope: Construct, props: QueueProps) { | ||
validateAllProps(scope, Queue.name, props, queueValidationRules); | ||
} | ||
|
||
export function validateRedriveAllowPolicy(scope: Construct, policy: RedriveAllowPolicy) { | ||
validateAllProps(scope, Queue.name, policy, redriveValidationRules); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters