cdk-factory 0.18.4__py3-none-any.whl → 0.18.5__py3-none-any.whl

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.
@@ -24,6 +24,8 @@ import os
24
24
  import re
25
25
  from typing import Dict, Any, Optional, List, Union
26
26
  from aws_cdk import aws_ssm as ssm
27
+ from aws_cdk import aws_ec2 as ec2
28
+ from aws_cdk import aws_ecs as ecs
27
29
  from constructs import Construct
28
30
  from aws_lambda_powertools import Logger
29
31
  from cdk_factory.configurations.deployment import DeploymentConfig
@@ -610,3 +612,40 @@ class SsmStandardValidator:
610
612
  errors.append(f"{context}: SSM path should use template variables: {path}")
611
613
 
612
614
  return errors
615
+
616
+
617
+ def parse_subnet_ids_from_ssm(self, subnet_ids_key: str = "subnet_ids") -> List[str]:
618
+ """
619
+ Helper function to parse subnet IDs from SSM imports.
620
+
621
+ This common pattern handles:
622
+ 1. Comma-separated subnet ID strings from SSM
623
+ 2. List of subnet IDs from SSM
624
+ 3. CDK Token resolution for deployment-time values
625
+
626
+ Args:
627
+ subnet_ids_key: The key used for subnet IDs in SSM imports (default: "subnet_ids")
628
+
629
+ Returns:
630
+ List of subnet IDs (empty list if not found or invalid format)
631
+ """
632
+ ssm_imports = self.get_all_ssm_imports()
633
+
634
+ if subnet_ids_key not in ssm_imports:
635
+ logger.warning(f"No subnet IDs found in SSM imports with key: {subnet_ids_key}")
636
+ return []
637
+
638
+ subnet_ids = ssm_imports[subnet_ids_key]
639
+
640
+ # Handle comma-separated string or list
641
+ if isinstance(subnet_ids, str):
642
+ # Split comma-separated string
643
+ parsed_ids = [sid.strip() for sid in subnet_ids.split(',') if sid.strip()]
644
+ logger.info(f"Parsed {len(parsed_ids)} subnet IDs from comma-separated string")
645
+ return parsed_ids
646
+ elif isinstance(subnet_ids, list):
647
+ logger.info(f"Using {len(subnet_ids)} subnet IDs from list")
648
+ return subnet_ids
649
+ else:
650
+ logger.warning(f"Unexpected subnet_ids type: {type(subnet_ids)}")
651
+ return []
@@ -212,8 +212,20 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
212
212
  """
213
213
  # Primary method: Use standardized SSM imports
214
214
  ssm_imports = self._get_ssm_imports()
215
+
215
216
  if "subnet_ids" in ssm_imports:
216
- return ssm_imports["subnet_ids"]
217
+ subnet_ids = ssm_imports["subnet_ids"]
218
+
219
+ # Handle comma-separated string or list
220
+ if isinstance(subnet_ids, str):
221
+ # Split comma-separated string
222
+ parsed_ids = [sid.strip() for sid in subnet_ids.split(',') if sid.strip()]
223
+ return parsed_ids
224
+ elif isinstance(subnet_ids, list):
225
+ return subnet_ids
226
+ else:
227
+ logger.warning(f"Unexpected subnet_ids type: {type(subnet_ids)}")
228
+ return []
217
229
 
218
230
  # Fallback: Use VPC provider mixin (backward compatibility)
219
231
  elif hasattr(self, '_get_subnets_from_provider'):
@@ -497,18 +509,21 @@ class AutoScalingStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
497
509
  # Get the underlying CloudFormation resource to add update policy
498
510
  cfn_asg = self.auto_scaling_group.node.default_child
499
511
 
500
- # Get existing update policy or create new one
501
- existing_policy = getattr(cfn_asg, 'update_policy', {})
512
+ # Get CDK's default policy first (if any)
513
+ default_policy = getattr(cfn_asg, 'update_policy', {})
502
514
 
503
- # Merge rolling update policy with existing policy
504
- existing_policy["AutoScalingRollingUpdate"] = {
505
- "MinInstancesInService": update_policy.get("min_instances_in_service", 1),
506
- "MaxBatchSize": update_policy.get("max_batch_size", 1),
507
- "PauseTime": f"PT{update_policy.get('pause_time', 300)}S"
515
+ # Merge with defaults, then use the robust add_override method
516
+ merged_policy = {
517
+ **default_policy, # Preserve CDK defaults
518
+ "AutoScalingRollingUpdate": {
519
+ "MinInstancesInService": update_policy.get("min_instances_in_service", 1),
520
+ "MaxBatchSize": update_policy.get("max_batch_size", 1),
521
+ "PauseTime": f"PT{update_policy.get('pause_time', 300)}S"
522
+ }
508
523
  }
509
524
 
510
- # Set the merged policy
511
- cfn_asg.update_policy = existing_policy
525
+ # Use the robust CDK-documented approach
526
+ cfn_asg.add_override("UpdatePolicy", merged_policy)
512
527
 
513
528
  logger.info("Added rolling update policy to Auto Scaling Group")
514
529
 
cdk_factory/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.18.4"
1
+ __version__ = "0.18.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.18.4
3
+ Version: 0.18.5
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
@@ -2,7 +2,7 @@ cdk_factory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  cdk_factory/app.py,sha256=RnX0-pwdTAPAdKJK_j13Zl8anf9zYKBwboR0KA8K8xM,10346
3
3
  cdk_factory/cdk.json,sha256=SKZKhJ2PBpFH78j-F8S3VDYW-lf76--Q2I3ON-ZIQfw,3106
4
4
  cdk_factory/cli.py,sha256=FGbCTS5dYCNsfp-etshzvFlGDCjC28r6rtzYbe7KoHI,6407
5
- cdk_factory/version.py,sha256=eFcwd1MYukWcWS9_p4d0HWJGW8jgPe27mOGuSygcjsY,23
5
+ cdk_factory/version.py,sha256=iPUl2pWX4a0MJCvP-avqrH4JfPv3yJGwmx8dAy0QJ40,23
6
6
  cdk_factory/builds/README.md,sha256=9BBWd7bXpyKdMU_g2UljhQwrC9i5O_Tvkb6oPvndoZk,90
7
7
  cdk_factory/commands/command_loader.py,sha256=QbLquuP_AdxtlxlDy-2IWCQ6D-7qa58aphnDPtp_uTs,3744
8
8
  cdk_factory/configurations/base_config.py,sha256=eJ3Pl3GWk1jVr_bYQaaWlw4_-ZiFGaiXllI_fOOX1i0,9323
@@ -66,7 +66,7 @@ cdk_factory/constructs/sqs/policies/sqs_policies.py,sha256=4p0G8G-fqNKSr68I55fvq
66
66
  cdk_factory/interfaces/istack.py,sha256=3xqGw5kNTt_KeLHdMxI7rIR0YORqcWQOqsacmDlTAv0,1167
67
67
  cdk_factory/interfaces/live_ssm_resolver.py,sha256=3FIr9a02SXqZmbFs3RT0WxczWEQR_CF7QSt7kWbDrVE,8163
68
68
  cdk_factory/interfaces/networked_stack_mixin.py,sha256=69pJp4IE1n_tdHh2UZQ08O6ZW-v5P4uJJ_fleNaj6Nw,2897
69
- cdk_factory/interfaces/standardized_ssm_mixin.py,sha256=-BT-K7mro2f3taS7biAm_oaxC7z2lurUfNUpryvahXk,22680
69
+ cdk_factory/interfaces/standardized_ssm_mixin.py,sha256=OVDzKjGWifT7jQuTdeQhEQM_FYkHlt3kcpMLF-fYHkg,24247
70
70
  cdk_factory/interfaces/vpc_provider_mixin.py,sha256=Kj0mmZd54NINprixJLs8zL-WWiSd0AQBtGdwNg8cz14,8207
71
71
  cdk_factory/lambdas/health_handler.py,sha256=dd40ykKMxWCFEIyp2ZdQvAGNjw_ylI9CSm1N24Hp2ME,196
72
72
  cdk_factory/lambdas/edge/ip_gate/handler.py,sha256=gUevgX462mqGYddtQIyJ1-Jk3oXhFmbmd46jlqjai9E,10657
@@ -87,7 +87,7 @@ cdk_factory/stack_library/acm/acm_stack.py,sha256=QJ3GkT17PmWoGkfO5Um02hvrfyJ9Hb
87
87
  cdk_factory/stack_library/api_gateway/api_gateway_stack.py,sha256=_wbPBsgh7FHq9cnL44CiuffBj3XCO5ErQx_yclxFsVY,39669
88
88
  cdk_factory/stack_library/auto_scaling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
89
  cdk_factory/stack_library/auto_scaling/auto_scaling_old.py,sha256=WvEwIao4KPOLa8e3zaQjxlTydCIK0GfgjZn4-CNyuF0,30135
90
- cdk_factory/stack_library/auto_scaling/auto_scaling_stack_standardized.py,sha256=y208T0Qxbkhc7RRgWtQWmuN01Rt-ABxvcW20LoOYevI,22089
90
+ cdk_factory/stack_library/auto_scaling/auto_scaling_stack_standardized.py,sha256=qF_-cs9gAYGCjlO4C0UE79526jpqhoz6SpEIN3h1t48,22720
91
91
  cdk_factory/stack_library/aws_lambdas/lambda_stack.py,sha256=SFbBPvvCopbyiuYtq-O5sQkFCf94Wzua6aDUXiFDSB4,26161
92
92
  cdk_factory/stack_library/buckets/README.md,sha256=XkK3UNVtRLE7NtUvbhCOBBYUYi8hlrrSaI1s3GJVrqI,78
93
93
  cdk_factory/stack_library/buckets/bucket_stack.py,sha256=SLoZqSffAqmeBBEVUQg54D_8Ad5UKdkjEAmKAVgAqQo,1778
@@ -137,8 +137,8 @@ cdk_factory/utilities/os_execute.py,sha256=5Op0LY_8Y-pUm04y1k8MTpNrmQvcLmQHPQITE
137
137
  cdk_factory/utils/api_gateway_utilities.py,sha256=If7Xu5s_UxmuV-kL3JkXxPLBdSVUKoLtohm0IUFoiV8,4378
138
138
  cdk_factory/validation/config_validator.py,sha256=Pb0TkLiPFzUplBOgMorhRCVm08vEzZhRU5xXCDTa5CA,17602
139
139
  cdk_factory/workload/workload_factory.py,sha256=yDI3cRhVI5ELNDcJPLpk9UY54Uind1xQoV3spzT4z7E,6068
140
- cdk_factory-0.18.4.dist-info/METADATA,sha256=ugv0E7xmz7lqhLPyUTOHkFFpLn3F65OwhAcvnzPuIu8,2451
141
- cdk_factory-0.18.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
142
- cdk_factory-0.18.4.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
143
- cdk_factory-0.18.4.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
144
- cdk_factory-0.18.4.dist-info/RECORD,,
140
+ cdk_factory-0.18.5.dist-info/METADATA,sha256=hRJbftyqnC8GtrySAlYFoXmf5AWDQcRXqx9gJQUtYy8,2451
141
+ cdk_factory-0.18.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
142
+ cdk_factory-0.18.5.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
143
+ cdk_factory-0.18.5.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
144
+ cdk_factory-0.18.5.dist-info/RECORD,,