Add resource property validation framework to SAM translator. #3805
Add resource property validation framework to SAM translator. #3805vicheey wants to merge 12 commits intoaws:developfrom
Conversation
|
The Tests failed because of lower coverage percentage. (94.82% instead of 95%). Added validation logic push the overall total line increase and lower the coverage percentage. Low coverage files: Removing deprecated and unused |
|
Current usage analysis: What IS being used: However, we cannot delete this file yet because this public facing interface might be used by package consuming this package. |
188db2a to
b52c322
Compare
| # def get_property_validation_rules(self) -> Optional[PropertyRules]: | ||
| # """Override to provide PropertyRules validation for SAM Function.""" | ||
| # TODO: To enable these rules, we need to update translator test input/output files to property configure template | ||
| # to avoid fail-fast. eg: test with DeploymentPreference without AutoPublishAlias would fail fast before reaching testing state | ||
| # from samtranslator.internal.schema_source.aws_serverless_function import Properties as FunctionProperties | ||
| # return (PropertyRules(FunctionProperties) | ||
| # .addMutuallyExclusive("ImageUri", "InlineCode", "CodeUri") | ||
| # .addConditionalInclusive("DeploymentPreference", ["AutoPublishAlias"]) | ||
| # .addConditionalInclusive("ProvisionedConcurrencyConfig", ["AutoPublishAlias"]) | ||
| # .addConditionalInclusive("PackageType=Zip", ["Runtime", "Handler"]) | ||
| # .addConditionalInclusive("PackageType=Image", ["ImageUri"]) | ||
| # .addConditionalExclusive("PackageType=Zip", ["ImageUri", "ImageConfig"]) | ||
| # .addConditionalExclusive("PackageType=Image", ["Runtime", "Handler", "Layers"])) | ||
| # return None | ||
|
|
There was a problem hiding this comment.
Do we plan to leave this here, commented out?
| # TODO: Skip pass schema_class=aws_serverless_function.Properties to skip schema validation for now. | ||
| # - adding this now would required update error message in error error_function_*_test.py | ||
| # - add this when we can verify that changing error message would not break customers | ||
| # self.validate_before_transform(schema_class=aws_serverless_function.Properties) |
There was a problem hiding this comment.
what is this validate_before_transform that appears here? Is it defined somewhere else?
| missing = [prop for prop in target_props if not self._check_property_condition(validated_model, prop)] | ||
| if missing: | ||
| missing_props = ", ".join(f"'{p}'" for p in missing) | ||
| return f"'{source_props[0]}' requires all of: {missing_props}." |
There was a problem hiding this comment.
is source_props only of length 1?
If so, can you change line 101 to just take the first one from source_props instead of loop over the array?
Or if we want to still keep it extensible, we would have to change this error here to point to the all the source_props (or the right one), instead of just using source_props[0]
There was a problem hiding this comment.
same for conditional_exclusive
| mock_attr1 = Mock() | ||
| mock_attr2 = Mock() | ||
| mock_attr1.return_value = "value1" | ||
| mock_attr2.return_value = "value2" |
There was a problem hiding this comment.
Not necessary (and I don't know how much it's used in other places, but you can also set the return value right away:
mock_attr1 = Mock(return_value="value1")
mock_attr2 = Mock(return_value="value2")
| if rule_type == RuleType.MUTUALLY_EXCLUSIVE: | ||
| return self._validate_mutually_exclusive(validated_model, source_props) | ||
| if rule_type == RuleType.CONDITIONAL_EXCLUSIVE: | ||
| return self._validate_conditional_exclusive(validated_model, source_props, target_props) | ||
| if rule_type == RuleType.MUTUALLY_INCLUSIVE: | ||
| return self._validate_mutually_inclusive(validated_model, source_props) | ||
| if rule_type == RuleType.CONDITIONAL_INCLUSIVE: | ||
| return self._validate_conditional_inclusive(validated_model, source_props, target_props) | ||
| return None |
There was a problem hiding this comment.
consider making the rule a class, so we can do
| if rule_type == RuleType.MUTUALLY_EXCLUSIVE: | |
| return self._validate_mutually_exclusive(validated_model, source_props) | |
| if rule_type == RuleType.CONDITIONAL_EXCLUSIVE: | |
| return self._validate_conditional_exclusive(validated_model, source_props, target_props) | |
| if rule_type == RuleType.MUTUALLY_INCLUSIVE: | |
| return self._validate_mutually_inclusive(validated_model, source_props) | |
| if rule_type == RuleType.CONDITIONAL_INCLUSIVE: | |
| return self._validate_conditional_inclusive(validated_model, source_props, target_props) | |
| return None | |
| return self.rule.validate() |
Issue #, if available
None
Description of changes
This PR introduces a comprehensive validation framework for SAM resource properties, and enhancing the translator's ability to catch configuration errors early in the deployment process.
validation
Description of how you validated changes
Checklist
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.