cdk-factory 0.20.4__tar.gz → 0.21.0__tar.gz

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.
Files changed (173) hide show
  1. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/PKG-INFO +1 -1
  2. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/pyproject.toml +1 -1
  3. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/rds.py +12 -5
  4. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/rds/rds_stack.py +7 -4
  5. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/route53/route53_stack.py +63 -125
  6. cdk_factory-0.21.0/src/cdk_factory/version.py +1 -0
  7. cdk_factory-0.20.4/src/cdk_factory/version.py +0 -1
  8. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/.gitignore +0 -0
  9. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/.windsurfrules +0 -0
  10. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/LICENSE +0 -0
  11. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/README.md +0 -0
  12. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/REFACTORING_PLAN.md +0 -0
  13. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/archive/README.md +0 -0
  14. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/archive/migrate_to_enhanced_ssm.py +0 -0
  15. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/examples/json-imports/README.md +0 -0
  16. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/examples/separate-api-gateway/README.md +0 -0
  17. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/examples/separate-api-gateway/api-gateway-stack.json +0 -0
  18. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/examples/separate-api-gateway/config.json +0 -0
  19. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/examples/separate-api-gateway/lambda-stack.json +0 -0
  20. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/mypy.ini +0 -0
  21. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/publish_to_pypi.py +0 -0
  22. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/publish_to_pypi.sh +0 -0
  23. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/pysetup.py +0 -0
  24. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/pysetup.sh +0 -0
  25. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/requirements.dev.txt +0 -0
  26. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/requirements.tests.txt +0 -0
  27. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/requirements.txt +0 -0
  28. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/run-checks.sh +0 -0
  29. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/run-tests-clean-venv.sh +0 -0
  30. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/run-tests.sh +0 -0
  31. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/scripts/cloudfront-cleanup.sh +0 -0
  32. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/__init__.py +0 -0
  33. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/app.py +0 -0
  34. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/builds/README.md +0 -0
  35. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/cdk.json +0 -0
  36. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/cli.py +0 -0
  37. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/commands/command_loader.py +0 -0
  38. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/base_config.py +0 -0
  39. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/cdk_config.py +0 -0
  40. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/deployment.py +0 -0
  41. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/deployment_wave.py +0 -0
  42. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/devops.py +0 -0
  43. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
  44. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
  45. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/management.py +0 -0
  46. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/pipeline.py +0 -0
  47. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
  48. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/_resources.py +0 -0
  49. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/acm.py +0 -0
  50. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
  51. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/apigateway_route_config.py +0 -0
  52. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
  53. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
  54. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
  55. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
  56. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
  57. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
  58. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/cognito.py +0 -0
  59. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/docker.py +0 -0
  60. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
  61. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/ecr.py +0 -0
  62. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/ecs_cluster.py +0 -0
  63. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/ecs_service.py +0 -0
  64. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
  65. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/lambda_edge.py +0 -0
  66. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
  67. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
  68. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
  69. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/load_balancer.py +0 -0
  70. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/monitoring.py +0 -0
  71. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
  72. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
  73. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
  74. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/route53.py +0 -0
  75. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
  76. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/rum.py +0 -0
  77. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/s3.py +0 -0
  78. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/security_group.py +0 -0
  79. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/security_group_full_stack.py +0 -0
  80. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/sqs.py +0 -0
  81. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/resources/vpc.py +0 -0
  82. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/stack.py +0 -0
  83. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/configurations/workload.py +0 -0
  84. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
  85. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
  86. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
  87. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
  88. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
  89. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
  90. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
  91. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
  92. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
  93. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
  94. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
  95. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/interfaces/istack.py +0 -0
  96. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
  97. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/interfaces/networked_stack_mixin.py +0 -0
  98. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/interfaces/standardized_ssm_mixin.py +0 -0
  99. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/interfaces/vpc_provider_mixin.py +0 -0
  100. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/lambdas/edge/ip_gate/handler.py +0 -0
  101. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/lambdas/health_handler.py +0 -0
  102. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/pipeline/path_utils.py +0 -0
  103. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/pipeline/pipeline_factory.py +0 -0
  104. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/pipeline/security/policies.py +0 -0
  105. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/pipeline/security/roles.py +0 -0
  106. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/pipeline/stage.py +0 -0
  107. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack/istack.py +0 -0
  108. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack/stack_factory.py +0 -0
  109. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack/stack_module_loader.py +0 -0
  110. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack/stack_module_registry.py +0 -0
  111. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack/stack_modules.py +0 -0
  112. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/__init__.py +0 -0
  113. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/acm/__init__.py +0 -0
  114. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/acm/acm_stack.py +0 -0
  115. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
  116. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
  117. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack.py +0 -0
  118. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
  119. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/buckets/README.md +0 -0
  120. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
  121. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/cloudfront/__init__.py +0 -0
  122. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/cloudfront/cloudfront_stack.py +0 -0
  123. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
  124. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
  125. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
  126. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/ecr/README.md +0 -0
  127. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
  128. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/ecs/__init__.py +0 -0
  129. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/ecs/ecs_cluster_stack.py +0 -0
  130. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/ecs/ecs_service_stack.py +0 -0
  131. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/__init__.py +0 -0
  132. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/functions/README.md +0 -0
  133. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/functions/log_retention_manager/__init__.py +0 -0
  134. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/functions/log_retention_manager/app.py +0 -0
  135. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/functions/log_retention_manager/edge_log_retention.py +0 -0
  136. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/functions/log_retention_manager/requirements.txt +0 -0
  137. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/functions/log_retention_manager/test.py +0 -0
  138. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/lambda_edge_log_retention_stack.py +0 -0
  139. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py +0 -0
  140. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
  141. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +0 -0
  142. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/monitoring/__init__.py +0 -0
  143. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/monitoring/monitoring_stack.py +0 -0
  144. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
  145. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
  146. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/rum/__init__.py +0 -0
  147. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/rum/rum_stack.py +0 -0
  148. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
  149. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
  150. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
  151. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
  152. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/stack_base.py +0 -0
  153. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
  154. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/vpc/vpc_stack.py +0 -0
  155. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stack_library/websites/static_website_stack.py +0 -0
  156. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
  157. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/templates/README.md +0 -0
  158. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/templates/app.py.template +0 -0
  159. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/templates/cdk.json.template +0 -0
  160. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/api_gateway_integration_utility.py +0 -0
  161. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/commandline_args.py +0 -0
  162. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/configuration_loader.py +0 -0
  163. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/docker_utilities.py +0 -0
  164. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/environment_services.py +0 -0
  165. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/file_operations.py +0 -0
  166. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/git_utilities.py +0 -0
  167. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
  168. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
  169. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utilities/os_execute.py +0 -0
  170. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
  171. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/validation/config_validator.py +0 -0
  172. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/cdk_factory/workload/workload_factory.py +0 -0
  173. {cdk_factory-0.20.4 → cdk_factory-0.21.0}/src/handlers/test/handler.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.20.4
3
+ Version: 0.21.0
4
4
  Summary: CDK Factory. A QuickStarter and best practices setup for CDK projects
5
5
  Author-email: Eric Wilson <eric.wilson@geekcafe.com>
6
6
  License: MIT License
@@ -33,7 +33,7 @@ markers = [
33
33
  [project]
34
34
 
35
35
  name = "cdk_factory"
36
- version = "0.20.4"
36
+ version = "0.21.0"
37
37
  authors = [
38
38
  { name="Eric Wilson", email="eric.wilson@geekcafe.com" }
39
39
  ]
@@ -118,15 +118,22 @@ class RdsConfig(EnhancedBaseConfig):
118
118
  return self.__config.get("instance_class", "t3.micro")
119
119
 
120
120
  @property
121
- def database_name(self) -> str:
122
- """Name of the database to create (sanitized for RDS requirements)"""
123
- raw_name = self.__config.get("database_name", "appdb")
121
+ def database_name(self) -> str | None:
122
+ """
123
+ Name of the database to create (sanitized for RDS requirements)
124
+ Optional and not required
125
+ """
126
+ raw_name = self.__config.get("database_name")
127
+ if not raw_name:
128
+ return None
124
129
  return self._sanitize_database_name(raw_name)
125
130
 
126
131
  @property
127
- def username(self) -> str:
132
+ def master_username(self) -> str:
128
133
  """Master username for the database (sanitized for RDS requirements)"""
129
- raw_username = self.__config.get("username", "appuser")
134
+ raw_username = self.__config.get("master_username")
135
+ if not raw_username:
136
+ raise ValueError("No master username found. Please add the master username to the config.")
130
137
  return self._sanitize_username(raw_username)
131
138
 
132
139
  @property
@@ -67,6 +67,9 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
67
67
  self.workload = workload
68
68
 
69
69
  self.rds_config = RdsConfig(stack_config.dictionary.get("rds", {}), deployment)
70
+ # Use stable construct ID to prevent CloudFormation logical ID changes on pipeline rename
71
+ # The construct ID determines the CloudFormation logical ID, not the physical resource names
72
+ stable_db_id = f"{deployment.workload_name}-{deployment.environment}-rds-instance"
70
73
  db_name = deployment.build_resource_name(self.rds_config.name)
71
74
 
72
75
  # Setup standardized SSM integration
@@ -89,7 +92,7 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
89
92
  if self.rds_config.existing_instance_id:
90
93
  self.db_instance = self._import_existing_db(db_name)
91
94
  else:
92
- self.db_instance = self._create_db_instance(db_name)
95
+ self.db_instance = self._create_db_instance(db_name, stable_db_id)
93
96
 
94
97
  # Add outputs
95
98
  self._add_outputs(db_name)
@@ -162,7 +165,7 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
162
165
  else:
163
166
  raise ValueError("No subnets available in VPC for RDS instance")
164
167
 
165
- def _create_db_instance(self, db_name: str) -> rds.DatabaseInstance:
168
+ def _create_db_instance(self, db_name: str, stable_db_id: str) -> rds.DatabaseInstance:
166
169
  """Create a new RDS instance"""
167
170
  # Configure subnet group
168
171
  # If we have subnet IDs from SSM, create a DB subnet group explicitly
@@ -232,7 +235,7 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
232
235
  "vpc": self.vpc,
233
236
  "instance_type": instance_type,
234
237
  "credentials": rds.Credentials.from_generated_secret(
235
- username=self.rds_config.username,
238
+ username=self.rds_config.master_username,
236
239
  secret_name=self.rds_config.secret_name,
237
240
  ),
238
241
  "database_name": self.rds_config.database_name,
@@ -264,7 +267,7 @@ class RdsStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
264
267
  else:
265
268
  db_props["vpc_subnets"] = subnets
266
269
 
267
- db_instance = rds.DatabaseInstance(self, db_name, **db_props)
270
+ db_instance = rds.DatabaseInstance(self, stable_db_id, **db_props)
268
271
 
269
272
  # Add tags
270
273
  for key, value in self.rds_config.tags.items():
@@ -50,6 +50,7 @@ class Route53Stack(IStack, StandardizedSsmMixin):
50
50
  self.certificate = None
51
51
  self.records = {}
52
52
  self._local_cache = {} # Cache for reusing distributions
53
+ self._missing_configurations = []
53
54
 
54
55
  def build(self, stack_config: StackConfig, deployment: DeploymentConfig, workload: WorkloadConfig) -> None:
55
56
  """Build the Route53 stack"""
@@ -142,7 +143,7 @@ class Route53Stack(IStack, StandardizedSsmMixin):
142
143
 
143
144
  return self._local_cache[cache_key]
144
145
 
145
- def _get_or_create_alb_target(self, record_name: str, target_value: str, hosted_zone_id: str, security_group_id: str, load_balancer_dns_name: str) -> targets.LoadBalancerTarget:
146
+ def _get_or_create_alb_target(self, record_name: str, target_value: str, load_balancer_zone_id: str, security_group_id: str, load_balancer_dns_name: str) -> targets.LoadBalancerTarget:
146
147
  """Get or create a CloudFront distribution, reusing if already created"""
147
148
  # Create a unique cache key from distribution domain and ID
148
149
  cache_key = f"{record_name}-alb"
@@ -153,7 +154,7 @@ class Route53Stack(IStack, StandardizedSsmMixin):
153
154
  elbv2.ApplicationLoadBalancer.from_application_load_balancer_attributes(
154
155
  self, f"ALB-{record_name}",
155
156
  load_balancer_arn=target_value,
156
- load_balancer_canonical_hosted_zone_id=hosted_zone_id,
157
+ load_balancer_canonical_hosted_zone_id=load_balancer_zone_id,
157
158
  security_group_id=security_group_id,
158
159
  load_balancer_dns_name=load_balancer_dns_name,
159
160
 
@@ -167,46 +168,32 @@ class Route53Stack(IStack, StandardizedSsmMixin):
167
168
  def _create_dns_records_new(self) -> None:
168
169
  """Create DNS records based on configuration - generic implementation"""
169
170
 
170
- missing_configurations = []
171
+
171
172
 
172
173
  for record in self.route53_config.records:
173
- record_name = record.get("name", "")
174
- record_type = record.get("type", "")
174
+ t = record.get("type")
175
+ record_name = self._get_resolved_value(config=record, key="name", record_type=t)
176
+ record_type = self._get_resolved_value(config=record, key="type", record_type=t)
177
+
175
178
 
176
- if not record_name or not record_type:
177
- message = f"Record missing name or type: {record}"
178
- logger.warning(message)
179
- missing_configurations.append(message)
180
- continue
181
179
 
182
180
  # Handle alias records
183
181
  if "alias" in record:
184
182
  alias_config = record["alias"]
185
- target_type = alias_config.get("target_type", "")
186
- target_value = alias_config.get("target_value", "")
187
- hosted_zone_id = alias_config.get("hosted_zone_id", "")
188
183
 
189
- unique_id = f"{record_name}-{record_type}-target-value"
190
- # Handle SSM parameter references in target_value
191
- target_value = self.resolve_ssm_value(self, target_value, unique_id=unique_id)
184
+ target_type = self._get_resolved_value(config=alias_config, key="target_type", record_type=record_type)
185
+ target_value = self._get_resolved_value(config=alias_config, key="target_value", record_type=record_type)
186
+
187
+
192
188
 
193
- if not target_type or not target_value:
194
- message = f"Alias record missing target_type or target_value: {record}"
195
- logger.warning(message)
196
- missing_configurations.append(message)
197
- continue
198
189
 
199
190
  # Create appropriate target based on type
200
191
  alias_target = None
201
192
  if target_type == "cloudfront":
202
193
  # CloudFront distribution target
203
194
  distribution_domain = target_value
204
- distribution_id = alias_config.get("distribution_id", "")
205
- if not distribution_id:
206
- message = f"Alias record missing distribution_id: {record}"
207
- logger.warning(message)
208
- missing_configurations.append(message)
209
- continue
195
+ distribution_id = self._get_resolved_value(config=alias_config, key="distribution_id", record_type=record_type)
196
+
210
197
 
211
198
  # Get or create the distribution (reuses if already created)
212
199
  distribution = self._get_or_create_cloudfront_distribution(distribution_domain, distribution_id)
@@ -216,25 +203,13 @@ class Route53Stack(IStack, StandardizedSsmMixin):
216
203
  elif target_type == "loadbalancer" or target_type == "alb" or target_type == "elbv2":
217
204
  # ALB alias target using imported load balancer attributes
218
205
 
219
- security_group_id=alias_config.get("security_group_id", "")
206
+ security_group_id=self._get_resolved_value(config=alias_config, key="security_group_id", record_type=record_type)
207
+ load_balancer_dns_name = self._get_resolved_value(config=alias_config, key="load_balancer_dns_name", record_type=record_type)
208
+ load_balancer_zone_id = self._get_resolved_value(config=alias_config, key="load_balancer_zone_id", record_type=record_type)
220
209
 
221
- unique_id = f"{record_name}-{record_type}-sg-id"
222
- # Handle SSM parameter references in target_value
223
- security_group_id = self.resolve_ssm_value(self, security_group_id, unique_id=unique_id)
224
-
225
- load_balancer_dns_name = alias_config.get("load_balancer_dns_name", "")
226
210
 
227
- unique_id = f"{record_name}-{record_type}-load-balancer-dns-name"
228
- # Handle SSM parameter references in target_value
229
- load_balancer_dns_name = self.resolve_ssm_value(self, load_balancer_dns_name, unique_id=unique_id)
230
-
231
- if not security_group_id or not load_balancer_dns_name:
232
- message = f"Alias record missing security_group_id or load_balancer_dns_name: {record}"
233
- logger.warning(message)
234
- missing_configurations.append(message)
235
- continue
236
-
237
- target = self._get_or_create_alb_target(record_name, target_value, hosted_zone_id, security_group_id, load_balancer_dns_name)
211
+
212
+ target = self._get_or_create_alb_target(record_name, target_value, load_balancer_zone_id, security_group_id, load_balancer_dns_name)
238
213
 
239
214
  alias_target = route53.RecordTarget.from_alias(target)
240
215
 
@@ -244,22 +219,27 @@ class Route53Stack(IStack, StandardizedSsmMixin):
244
219
  missing_configurations.append(message)
245
220
  continue
246
221
 
247
- # Create the alias record
248
- route53.ARecord(
249
- self,
250
- f"AliasRecord-{record_name}-{record_type}",
251
- zone=self.hosted_zone,
252
- record_name=record_name,
253
- target=alias_target,
254
- ttl=cdk.Duration.seconds(record.get("ttl", 300))
255
- ) if record_type == "A" else route53.AaaaRecord(
256
- self,
257
- f"AliasRecord-{record_name}-{record_type}",
258
- zone=self.hosted_zone,
222
+ route_53_record = None
223
+ id = f"AliasRecord-{record_name}-{record_type}"
224
+ print(f"creating record {id}")
225
+ if record_type == "A":
226
+ route_53_record = route53.ARecord(
227
+ self,
228
+ id,
229
+ zone=self.hosted_zone,
259
230
  record_name=record_name,
260
231
  target=alias_target,
261
232
  ttl=cdk.Duration.seconds(record.get("ttl", 300))
262
233
  )
234
+ elif record_type == "AAAA":
235
+ route_53_record = route53.AaaaRecord(
236
+ self,
237
+ id,
238
+ zone=self.hosted_zone,
239
+ record_name=record_name,
240
+ target=alias_target,
241
+ ttl=cdk.Duration.seconds(record.get("ttl", 300))
242
+ )
263
243
 
264
244
  # Handle standard records with values
265
245
  elif "values" in record:
@@ -352,89 +332,47 @@ class Route53Stack(IStack, StandardizedSsmMixin):
352
332
  else:
353
333
  message = f"Unsupported record type: {record_type}"
354
334
  logger.warning(message)
355
- missing_configurations.append(message)
335
+ self._missing_configurations.append(message)
356
336
  continue
357
337
 
358
338
  else:
359
339
  message = f"Record missing 'alias' or 'values' configuration: {record}"
360
340
  logger.warning(message)
361
- missing_configurations.append(message)
341
+ self._missing_configurations.append(message)
362
342
  continue
363
343
 
364
- if missing_configurations and len(missing_configurations) > 0:
344
+ if self._missing_configurations and len(self._missing_configurations) > 0:
365
345
  # print all missing configurations
366
346
  print("Missing configurations:")
367
- for message in missing_configurations:
347
+ for message in self._missing_configurations:
368
348
  print(message)
369
349
 
370
- messages = "\n".join(missing_configurations)
350
+ messages = "\n".join(self._missing_configurations)
371
351
  raise ValueError(f"Missing Configurations:\n{messages}")
372
352
 
373
- def _create_dns_records_old(self) -> None:
374
- """Create DNS records based on configuration"""
375
- # Create alias records
376
- for alias_record in self.route53_config.aliases:
377
- record_name = alias_record.get("name", "")
378
- target_type = alias_record.get("target_type", "")
379
- target_value = alias_record.get("target_value", "")
380
-
381
- # target value needs to handle SSM parameters
382
- if "{{ssm:" in target_value and "}}" in target_value:
383
- # Extract SSM parameter path from template like {{ssm:/path/to/parameter}}
384
- ssm_path = target_value.split("{{ssm:")[1].split("}}")[0]
385
- target_value = self.get_ssm_imported_value(ssm_path)
353
+ def _get_resolved_value(self, *, config: dict, key: str, required: bool = True, record_type: str = "" ) -> str:
354
+
355
+ value = config.get(key, "")
356
+ x = str(value).replace("{", "").replace("}", "").replace(":", "")
357
+ unique_id = f"{key}-id-{record_type}-{x}"
386
358
 
387
- if not record_name or not target_type or not target_value:
388
- continue
389
-
390
- # Determine the alias target
391
- alias_target = None
392
- if target_type == "alb":
393
- # Get the ALB from the workload if available
394
- if hasattr(self.workload, "load_balancer"):
395
- alb = self.workload.load_balancer
396
- alias_target = route53.RecordTarget.from_alias(targets.LoadBalancerTarget(alb))
397
- else:
398
- # Try to get ALB from target value
399
- alb = elbv2.ApplicationLoadBalancer.from_lookup(
400
- self,
401
- f"ALB-{record_name}",
402
- load_balancer_arn=target_value
403
- )
404
- alias_target = route53.RecordTarget.from_alias(targets.LoadBalancerTarget(alb))
405
- elif target_type == "cloudfront":
406
- # For CloudFront, we would need the distribution
407
- # This is a simplified implementation
408
- pass
409
-
410
- if alias_target:
411
- record = route53.ARecord(
412
- self,
413
- f"AliasRecord-{record_name}",
414
- zone=self.hosted_zone,
415
- record_name=record_name,
416
- target=alias_target
417
- )
418
- self.records[record_name] = record
419
-
420
- # Create CNAME records
421
- for cname_record in self.route53_config.cname_records:
422
- record_name = cname_record.get("name", "")
423
- target_domain = cname_record.get("target_domain", "")
424
- ttl = cname_record.get("ttl", 300)
425
-
426
- if not record_name or not target_domain:
427
- continue
428
-
429
- record = route53.CnameRecord(
430
- self,
431
- f"CnameRecord-{record_name}",
432
- zone=self.hosted_zone,
433
- record_name=record_name,
434
- domain_name=target_domain,
435
- ttl=cdk.Duration.seconds(ttl)
436
- )
437
- self.records[record_name] = record
359
+ if unique_id in self._local_cache:
360
+ return self._local_cache[unique_id]
361
+
362
+
363
+
364
+ # Handle SSM parameter references in target_value
365
+ value = self.resolve_ssm_value(self, value, unique_id=unique_id)
366
+
367
+ if required and not value:
368
+ self._missing_configurations.append(f"Missing required value for key: {key}")
369
+
370
+ self._local_cache[unique_id] = value
371
+
372
+
373
+ return value
374
+
375
+
438
376
 
439
377
  def _add_outputs(self) -> None:
440
378
  """Add CloudFormation outputs for the Route53 resources"""
@@ -0,0 +1 @@
1
+ __version__ = "0.21.0"
@@ -1 +0,0 @@
1
- __version__ = "0.20.4"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes