cdk-factory 0.18.15__py3-none-any.whl → 0.18.19__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.

Potentially problematic release.


This version of cdk-factory might be problematic. Click here for more details.

@@ -119,6 +119,7 @@ class StandardizedSsmMixin:
119
119
  """Export multiple resource values to SSM Parameter Store."""
120
120
  params = {}
121
121
 
122
+ invalid_export_keys = []
122
123
  # Only export parameters that are explicitly configured in ssm_exports
123
124
  if not hasattr(config, 'ssm_exports') or not config.ssm_exports:
124
125
  logger.debug("No SSM exports configured")
@@ -138,8 +139,17 @@ class StandardizedSsmMixin:
138
139
  )
139
140
  params[key] = param
140
141
  else:
142
+ invalid_export_keys.append(key)
141
143
  logger.warning(f"SSM export configured for '{key}' but no value found in resource_values")
142
144
 
145
+ if invalid_export_keys:
146
+ message = f"Export SSM Error\n🚨 SSM exports configured for '{invalid_export_keys}' but no values found in resource_values"
147
+ available_keys = list(resource_values.keys())
148
+ message = f"{message}\n✅ Available keys: {available_keys}"
149
+ message = f"{message}\n👉 Please update to the correct key or remove from the export list."
150
+ logger.warning(message)
151
+ raise ValueError(message)
152
+
143
153
  return params
144
154
 
145
155
  def normalize_resource_name(self, name: str, for_export: bool = False) -> str:
@@ -456,44 +456,42 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
456
456
  # Configure conditions
457
457
  conditions = []
458
458
 
459
- # Path patterns
460
- path_patterns = rule_config.get("path_patterns", [])
461
- if path_patterns:
462
- conditions.append(elbv2.ListenerCondition.path_patterns(path_patterns))
463
-
464
- # Host headers
465
- host_headers = rule_config.get("host_headers", [])
466
- if host_headers:
467
- conditions.append(elbv2.ListenerCondition.host_headers(host_headers))
468
-
469
- # HTTP headers
470
- http_headers = rule_config.get("http_headers", {})
471
- for header_name, header_values in http_headers.items():
472
- conditions.append(
473
- elbv2.ListenerCondition.http_header(header_name, header_values)
474
- )
475
-
476
- # Query strings
477
- query_strings = rule_config.get("query_strings", [])
478
- if query_strings:
479
- query_string_conditions = []
480
- for qs in query_strings:
481
- query_string_conditions.append(
482
- elbv2.QueryStringCondition(
483
- key=qs.get("key"), value=qs.get("value")
459
+ # Parse AWS ALB conditions format
460
+ aws_conditions = rule_config.get("conditions", [])
461
+ for condition in aws_conditions:
462
+ field = condition.get("field")
463
+ if field == "http-header" and "http_header_config" in condition:
464
+ header_config = condition["http_header_config"]
465
+ header_name = header_config.get("header_name")
466
+ header_values = header_config.get("values", [])
467
+ if header_name and header_values:
468
+ conditions.append(
469
+ elbv2.ListenerCondition.http_header(header_name, header_values)
484
470
  )
485
- )
486
- conditions.append(
487
- elbv2.ListenerCondition.query_strings(query_string_conditions)
488
- )
471
+ elif field == "path-pattern" and "values" in condition:
472
+ path_patterns = condition.get("values", [])
473
+ if path_patterns:
474
+ conditions.append(elbv2.ListenerCondition.path_patterns(path_patterns))
475
+ elif field == "host-header" and "values" in condition:
476
+ host_headers = condition.get("values", [])
477
+ if host_headers:
478
+ conditions.append(elbv2.ListenerCondition.host_headers(host_headers))
489
479
 
490
480
  # Configure actions
491
- target_group_name = rule_config.get("target_group")
492
- target_group = (
493
- self.target_groups.get(target_group_name) if target_group_name else None
494
- )
481
+ target_group = None
482
+
483
+ # Parse AWS ALB actions format
484
+ aws_actions = rule_config.get("actions", [])
485
+ for action in aws_actions:
486
+ if action.get("type") == "forward":
487
+ target_group_name = action.get("target_group")
488
+ target_group = (
489
+ self.target_groups.get(target_group_name) if target_group_name else None
490
+ )
491
+ break # Use first forward action
495
492
 
496
- if target_group:
493
+ # Validate that we have both conditions and target group before creating rule
494
+ if target_group and conditions:
497
495
  # Create rule with forward action
498
496
  elbv2.ApplicationListenerRule(
499
497
  self,
@@ -503,6 +501,15 @@ class LoadBalancerStack(IStack, VPCProviderMixin, StandardizedSsmMixin):
503
501
  conditions=conditions,
504
502
  target_groups=[target_group],
505
503
  )
504
+ elif not conditions:
505
+ logger.warning(
506
+ f"Skipping listener rule '{rule_id}' - no conditions defined. "
507
+ f"CDK requires at least one condition for every rule."
508
+ )
509
+ elif not target_group:
510
+ logger.warning(
511
+ f"Skipping listener rule '{rule_id}' - no valid target group found."
512
+ )
506
513
 
507
514
  def _add_ip_whitelist_rules(
508
515
  self,
cdk_factory/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.18.15"
1
+ __version__ = "0.18.19"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.18.15
3
+ Version: 0.18.19
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=hvl13OXw7KVmqmEI-w2lh8gFaEax1htj1PTjeMvE758,24
5
+ cdk_factory/version.py,sha256=uiLHk2KTGw3AhvUxFYieCKErlp7FSK2qsHhYB3akgoI,24
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=CtWT7Nhy73f0goQQG02jG7lsEucq5OrtZ0ltrp7XTFA,2884
69
- cdk_factory/interfaces/standardized_ssm_mixin.py,sha256=EcuW6Z1vBcBaK0b0nQRsmluBlr9SVHyZ_sWxVtv8JzM,25188
69
+ cdk_factory/interfaces/standardized_ssm_mixin.py,sha256=kbl8fTDSBBSUARnKjruYB7KEgsw1Xns7g6fI5Jh8Vio,25763
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
@@ -103,7 +103,7 @@ cdk_factory/stack_library/ecs/ecs_service_stack.py,sha256=NWBSB-0GTWa0rHDO2o2KTI
103
103
  cdk_factory/stack_library/lambda_edge/__init__.py,sha256=ByBJ_CWdc4UtTmFBZH-6pzBMNkjkdtE65AmnB0Fs6lM,156
104
104
  cdk_factory/stack_library/lambda_edge/lambda_edge_stack.py,sha256=C_h2Xb2_zaCGiw5otbeSozOLNbxaciMLo8FX_TQOAlw,16409
105
105
  cdk_factory/stack_library/load_balancer/__init__.py,sha256=wZpKw2OecLJGdF5mPayCYAEhu2H3c2gJFFIxwXftGDU,52
106
- cdk_factory/stack_library/load_balancer/load_balancer_stack.py,sha256=o0sxQIayyvOVBIiBrNpY5GvENqnWiYQ16_rn2CGA6yk,29900
106
+ cdk_factory/stack_library/load_balancer/load_balancer_stack.py,sha256=iiSxjuQOflF6_GLBS1xoK14fK2r47tpaI03EMvmE8V8,30693
107
107
  cdk_factory/stack_library/monitoring/__init__.py,sha256=k1G_KDx47Aw0UugaL99PN_TKlyLK4nkJVApCaAK7GJg,153
108
108
  cdk_factory/stack_library/monitoring/monitoring_stack.py,sha256=N_1YvEXE7fboH_S3kv_dSKZsufxMuPdFMjGzlNFpuSo,19283
109
109
  cdk_factory/stack_library/rds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -136,8 +136,8 @@ cdk_factory/utilities/os_execute.py,sha256=5Op0LY_8Y-pUm04y1k8MTpNrmQvcLmQHPQITE
136
136
  cdk_factory/utils/api_gateway_utilities.py,sha256=If7Xu5s_UxmuV-kL3JkXxPLBdSVUKoLtohm0IUFoiV8,4378
137
137
  cdk_factory/validation/config_validator.py,sha256=Pb0TkLiPFzUplBOgMorhRCVm08vEzZhRU5xXCDTa5CA,17602
138
138
  cdk_factory/workload/workload_factory.py,sha256=yDI3cRhVI5ELNDcJPLpk9UY54Uind1xQoV3spzT4z7E,6068
139
- cdk_factory-0.18.15.dist-info/METADATA,sha256=vb4LD2ZOosikdQobsV3l1SvopDwemZUJnaXVpxc02Fs,2452
140
- cdk_factory-0.18.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
141
- cdk_factory-0.18.15.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
142
- cdk_factory-0.18.15.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
143
- cdk_factory-0.18.15.dist-info/RECORD,,
139
+ cdk_factory-0.18.19.dist-info/METADATA,sha256=EG4aSnWY4A6-_gB8s4Q2EKPtRqhz3p-NjPbUMqcbJ8M,2452
140
+ cdk_factory-0.18.19.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
141
+ cdk_factory-0.18.19.dist-info/entry_points.txt,sha256=S1DPe0ORcdiwEALMN_WIo3UQrW_g4YdQCLEsc_b0Swg,53
142
+ cdk_factory-0.18.19.dist-info/licenses/LICENSE,sha256=NOtdOeLwg2il_XBJdXUPFPX8JlV4dqTdDGAd2-khxT8,1066
143
+ cdk_factory-0.18.19.dist-info/RECORD,,