runbooks 1.1.3__py3-none-any.whl → 1.1.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.
Files changed (247) hide show
  1. runbooks/__init__.py +31 -2
  2. runbooks/__init___optimized.py +18 -4
  3. runbooks/_platform/__init__.py +1 -5
  4. runbooks/_platform/core/runbooks_wrapper.py +141 -138
  5. runbooks/aws2/accuracy_validator.py +812 -0
  6. runbooks/base.py +7 -0
  7. runbooks/cfat/WEIGHT_CONFIG_README.md +1 -1
  8. runbooks/cfat/assessment/compliance.py +8 -8
  9. runbooks/cfat/assessment/runner.py +1 -0
  10. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  11. runbooks/cfat/models.py +6 -2
  12. runbooks/cfat/tests/__init__.py +6 -1
  13. runbooks/cli/__init__.py +13 -0
  14. runbooks/cli/commands/cfat.py +274 -0
  15. runbooks/cli/commands/finops.py +1164 -0
  16. runbooks/cli/commands/inventory.py +379 -0
  17. runbooks/cli/commands/operate.py +239 -0
  18. runbooks/cli/commands/security.py +248 -0
  19. runbooks/cli/commands/validation.py +825 -0
  20. runbooks/cli/commands/vpc.py +310 -0
  21. runbooks/cli/registry.py +107 -0
  22. runbooks/cloudops/__init__.py +23 -30
  23. runbooks/cloudops/base.py +96 -107
  24. runbooks/cloudops/cost_optimizer.py +549 -547
  25. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  26. runbooks/cloudops/interfaces.py +226 -227
  27. runbooks/cloudops/lifecycle_manager.py +5 -4
  28. runbooks/cloudops/mcp_cost_validation.py +252 -235
  29. runbooks/cloudops/models.py +78 -53
  30. runbooks/cloudops/monitoring_automation.py +5 -4
  31. runbooks/cloudops/notebook_framework.py +179 -215
  32. runbooks/cloudops/security_enforcer.py +125 -159
  33. runbooks/common/accuracy_validator.py +11 -0
  34. runbooks/common/aws_pricing.py +349 -326
  35. runbooks/common/aws_pricing_api.py +211 -212
  36. runbooks/common/aws_profile_manager.py +341 -0
  37. runbooks/common/aws_utils.py +75 -80
  38. runbooks/common/business_logic.py +127 -105
  39. runbooks/common/cli_decorators.py +36 -60
  40. runbooks/common/comprehensive_cost_explorer_integration.py +456 -464
  41. runbooks/common/cross_account_manager.py +198 -205
  42. runbooks/common/date_utils.py +27 -39
  43. runbooks/common/decorators.py +235 -0
  44. runbooks/common/dry_run_examples.py +173 -208
  45. runbooks/common/dry_run_framework.py +157 -155
  46. runbooks/common/enhanced_exception_handler.py +15 -4
  47. runbooks/common/enhanced_logging_example.py +50 -64
  48. runbooks/common/enhanced_logging_integration_example.py +65 -37
  49. runbooks/common/env_utils.py +16 -16
  50. runbooks/common/error_handling.py +40 -38
  51. runbooks/common/lazy_loader.py +41 -23
  52. runbooks/common/logging_integration_helper.py +79 -86
  53. runbooks/common/mcp_cost_explorer_integration.py +478 -495
  54. runbooks/common/mcp_integration.py +63 -74
  55. runbooks/common/memory_optimization.py +140 -118
  56. runbooks/common/module_cli_base.py +37 -58
  57. runbooks/common/organizations_client.py +176 -194
  58. runbooks/common/patterns.py +204 -0
  59. runbooks/common/performance_monitoring.py +67 -71
  60. runbooks/common/performance_optimization_engine.py +283 -274
  61. runbooks/common/profile_utils.py +248 -39
  62. runbooks/common/rich_utils.py +643 -92
  63. runbooks/common/sre_performance_suite.py +177 -186
  64. runbooks/enterprise/__init__.py +1 -1
  65. runbooks/enterprise/logging.py +144 -106
  66. runbooks/enterprise/security.py +187 -204
  67. runbooks/enterprise/validation.py +43 -56
  68. runbooks/finops/__init__.py +29 -33
  69. runbooks/finops/account_resolver.py +1 -1
  70. runbooks/finops/advanced_optimization_engine.py +980 -0
  71. runbooks/finops/automation_core.py +268 -231
  72. runbooks/finops/business_case_config.py +184 -179
  73. runbooks/finops/cli.py +660 -139
  74. runbooks/finops/commvault_ec2_analysis.py +157 -164
  75. runbooks/finops/compute_cost_optimizer.py +336 -320
  76. runbooks/finops/config.py +20 -20
  77. runbooks/finops/cost_optimizer.py +488 -622
  78. runbooks/finops/cost_processor.py +332 -214
  79. runbooks/finops/dashboard_runner.py +1006 -172
  80. runbooks/finops/ebs_cost_optimizer.py +991 -657
  81. runbooks/finops/elastic_ip_optimizer.py +317 -257
  82. runbooks/finops/enhanced_mcp_integration.py +340 -0
  83. runbooks/finops/enhanced_progress.py +40 -37
  84. runbooks/finops/enhanced_trend_visualization.py +3 -2
  85. runbooks/finops/enterprise_wrappers.py +230 -292
  86. runbooks/finops/executive_export.py +203 -160
  87. runbooks/finops/helpers.py +130 -288
  88. runbooks/finops/iam_guidance.py +1 -1
  89. runbooks/finops/infrastructure/__init__.py +80 -0
  90. runbooks/finops/infrastructure/commands.py +506 -0
  91. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  92. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  93. runbooks/finops/markdown_exporter.py +338 -175
  94. runbooks/finops/mcp_validator.py +1952 -0
  95. runbooks/finops/nat_gateway_optimizer.py +1513 -482
  96. runbooks/finops/network_cost_optimizer.py +657 -587
  97. runbooks/finops/notebook_utils.py +226 -188
  98. runbooks/finops/optimization_engine.py +1136 -0
  99. runbooks/finops/optimizer.py +25 -29
  100. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  101. runbooks/finops/reservation_optimizer.py +427 -363
  102. runbooks/finops/scenario_cli_integration.py +77 -78
  103. runbooks/finops/scenarios.py +1278 -439
  104. runbooks/finops/schemas.py +218 -182
  105. runbooks/finops/snapshot_manager.py +2289 -0
  106. runbooks/finops/tests/test_finops_dashboard.py +3 -3
  107. runbooks/finops/tests/test_reference_images_validation.py +2 -2
  108. runbooks/finops/tests/test_single_account_features.py +17 -17
  109. runbooks/finops/tests/validate_test_suite.py +1 -1
  110. runbooks/finops/types.py +3 -3
  111. runbooks/finops/validation_framework.py +263 -269
  112. runbooks/finops/vpc_cleanup_exporter.py +191 -146
  113. runbooks/finops/vpc_cleanup_optimizer.py +593 -575
  114. runbooks/finops/workspaces_analyzer.py +171 -182
  115. runbooks/hitl/enhanced_workflow_engine.py +1 -1
  116. runbooks/integration/__init__.py +89 -0
  117. runbooks/integration/mcp_integration.py +1920 -0
  118. runbooks/inventory/CLAUDE.md +816 -0
  119. runbooks/inventory/README.md +3 -3
  120. runbooks/inventory/Tests/common_test_data.py +30 -30
  121. runbooks/inventory/__init__.py +2 -2
  122. runbooks/inventory/cloud_foundations_integration.py +144 -149
  123. runbooks/inventory/collectors/aws_comprehensive.py +28 -11
  124. runbooks/inventory/collectors/aws_networking.py +111 -101
  125. runbooks/inventory/collectors/base.py +4 -0
  126. runbooks/inventory/core/collector.py +495 -313
  127. runbooks/inventory/discovery.md +2 -2
  128. runbooks/inventory/drift_detection_cli.py +69 -96
  129. runbooks/inventory/find_ec2_security_groups.py +1 -1
  130. runbooks/inventory/inventory_mcp_cli.py +48 -46
  131. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  132. runbooks/inventory/mcp_inventory_validator.py +549 -465
  133. runbooks/inventory/mcp_vpc_validator.py +359 -442
  134. runbooks/inventory/organizations_discovery.py +56 -52
  135. runbooks/inventory/rich_inventory_display.py +33 -32
  136. runbooks/inventory/unified_validation_engine.py +278 -251
  137. runbooks/inventory/vpc_analyzer.py +733 -696
  138. runbooks/inventory/vpc_architecture_validator.py +293 -348
  139. runbooks/inventory/vpc_dependency_analyzer.py +382 -378
  140. runbooks/inventory/vpc_flow_analyzer.py +3 -3
  141. runbooks/main.py +152 -9147
  142. runbooks/main_final.py +91 -60
  143. runbooks/main_minimal.py +22 -10
  144. runbooks/main_optimized.py +131 -100
  145. runbooks/main_ultra_minimal.py +7 -2
  146. runbooks/mcp/__init__.py +36 -0
  147. runbooks/mcp/integration.py +679 -0
  148. runbooks/metrics/dora_metrics_engine.py +2 -2
  149. runbooks/monitoring/performance_monitor.py +9 -4
  150. runbooks/operate/dynamodb_operations.py +3 -1
  151. runbooks/operate/ec2_operations.py +145 -137
  152. runbooks/operate/iam_operations.py +146 -152
  153. runbooks/operate/mcp_integration.py +1 -1
  154. runbooks/operate/networking_cost_heatmap.py +33 -10
  155. runbooks/operate/privatelink_operations.py +1 -1
  156. runbooks/operate/rds_operations.py +223 -254
  157. runbooks/operate/s3_operations.py +107 -118
  158. runbooks/operate/vpc_endpoints.py +1 -1
  159. runbooks/operate/vpc_operations.py +648 -618
  160. runbooks/remediation/base.py +1 -1
  161. runbooks/remediation/commons.py +10 -7
  162. runbooks/remediation/commvault_ec2_analysis.py +71 -67
  163. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  164. runbooks/remediation/multi_account.py +24 -21
  165. runbooks/remediation/rds_snapshot_list.py +91 -65
  166. runbooks/remediation/remediation_cli.py +92 -146
  167. runbooks/remediation/universal_account_discovery.py +83 -79
  168. runbooks/remediation/workspaces_list.py +49 -44
  169. runbooks/security/__init__.py +19 -0
  170. runbooks/security/assessment_runner.py +1150 -0
  171. runbooks/security/baseline_checker.py +812 -0
  172. runbooks/security/cloudops_automation_security_validator.py +509 -535
  173. runbooks/security/compliance_automation_engine.py +17 -17
  174. runbooks/security/config/__init__.py +2 -2
  175. runbooks/security/config/compliance_config.py +50 -50
  176. runbooks/security/config_template_generator.py +63 -76
  177. runbooks/security/enterprise_security_framework.py +1 -1
  178. runbooks/security/executive_security_dashboard.py +519 -508
  179. runbooks/security/integration_test_enterprise_security.py +5 -3
  180. runbooks/security/multi_account_security_controls.py +959 -1210
  181. runbooks/security/real_time_security_monitor.py +422 -444
  182. runbooks/security/run_script.py +1 -1
  183. runbooks/security/security_baseline_tester.py +1 -1
  184. runbooks/security/security_cli.py +143 -112
  185. runbooks/security/test_2way_validation.py +439 -0
  186. runbooks/security/two_way_validation_framework.py +852 -0
  187. runbooks/sre/mcp_reliability_engine.py +6 -6
  188. runbooks/sre/production_monitoring_framework.py +167 -177
  189. runbooks/tdd/__init__.py +15 -0
  190. runbooks/tdd/cli.py +1071 -0
  191. runbooks/utils/__init__.py +14 -17
  192. runbooks/utils/logger.py +7 -2
  193. runbooks/utils/version_validator.py +51 -48
  194. runbooks/validation/__init__.py +6 -6
  195. runbooks/validation/cli.py +9 -3
  196. runbooks/validation/comprehensive_2way_validator.py +754 -708
  197. runbooks/validation/mcp_validator.py +906 -228
  198. runbooks/validation/terraform_citations_validator.py +104 -115
  199. runbooks/validation/terraform_drift_detector.py +447 -451
  200. runbooks/vpc/README.md +617 -0
  201. runbooks/vpc/__init__.py +8 -1
  202. runbooks/vpc/analyzer.py +577 -0
  203. runbooks/vpc/cleanup_wrapper.py +476 -413
  204. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  205. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  206. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  207. runbooks/vpc/config.py +92 -97
  208. runbooks/vpc/cost_engine.py +411 -148
  209. runbooks/vpc/cost_explorer_integration.py +553 -0
  210. runbooks/vpc/cross_account_session.py +101 -106
  211. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  212. runbooks/vpc/eni_gate_validator.py +961 -0
  213. runbooks/vpc/heatmap_engine.py +190 -162
  214. runbooks/vpc/mcp_no_eni_validator.py +681 -640
  215. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  216. runbooks/vpc/networking_wrapper.py +15 -8
  217. runbooks/vpc/pdca_remediation_planner.py +528 -0
  218. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  219. runbooks/vpc/runbooks_adapter.py +1167 -241
  220. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  221. runbooks/vpc/test_data_loader.py +358 -0
  222. runbooks/vpc/tests/conftest.py +314 -4
  223. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  224. runbooks/vpc/tests/test_cost_engine.py +0 -2
  225. runbooks/vpc/topology_generator.py +326 -0
  226. runbooks/vpc/unified_scenarios.py +1302 -1129
  227. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  228. runbooks-1.1.5.dist-info/METADATA +328 -0
  229. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/RECORD +233 -200
  230. runbooks/finops/README.md +0 -414
  231. runbooks/finops/accuracy_cross_validator.py +0 -647
  232. runbooks/finops/business_cases.py +0 -950
  233. runbooks/finops/dashboard_router.py +0 -922
  234. runbooks/finops/ebs_optimizer.py +0 -956
  235. runbooks/finops/embedded_mcp_validator.py +0 -1629
  236. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  237. runbooks/finops/finops_dashboard.py +0 -584
  238. runbooks/finops/finops_scenarios.py +0 -1218
  239. runbooks/finops/legacy_migration.py +0 -730
  240. runbooks/finops/multi_dashboard.py +0 -1519
  241. runbooks/finops/single_dashboard.py +0 -1113
  242. runbooks/finops/unlimited_scenarios.py +0 -393
  243. runbooks-1.1.3.dist-info/METADATA +0 -799
  244. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
  245. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
  246. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
  247. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/top_level.txt +0 -0
@@ -16,16 +16,17 @@ from botocore.exceptions import ClientError, BotoCoreError
16
16
  from runbooks.enterprise.logging import get_module_logger, EnterpriseRichLogger
17
17
 
18
18
 
19
- def create_enhanced_module_logger(module_name: str, log_level: Optional[str] = None,
20
- json_output: bool = False) -> EnterpriseRichLogger:
19
+ def create_enhanced_module_logger(
20
+ module_name: str, log_level: Optional[str] = None, json_output: bool = False
21
+ ) -> EnterpriseRichLogger:
21
22
  """
22
23
  Create an enhanced logger for a module with automatic level detection.
23
-
24
+
24
25
  Args:
25
- module_name: Name of the module (e.g., 'finops', 'inventory')
26
+ module_name: Name of the module (e.g., 'finops', 'inventory')
26
27
  log_level: Override log level, or None to use CLI/environment setting
27
28
  json_output: Enable JSON output for programmatic use
28
-
29
+
29
30
  Returns:
30
31
  Configured enhanced logger
31
32
  """
@@ -33,15 +34,15 @@ def create_enhanced_module_logger(module_name: str, log_level: Optional[str] = N
33
34
  if log_level is None:
34
35
  import os
35
36
  import sys
36
-
37
+
37
38
  # Check if we're in a CLI context
38
- log_level = os.getenv('RUNBOOKS_LOG_LEVEL', 'INFO')
39
-
39
+ log_level = os.getenv("RUNBOOKS_LOG_LEVEL", "INFO")
40
+
40
41
  # Check command line arguments for log level
41
42
  for arg in sys.argv:
42
- if arg.startswith('--log-level'):
43
- if '=' in arg:
44
- log_level = arg.split('=')[1].upper()
43
+ if arg.startswith("--log-level"):
44
+ if "=" in arg:
45
+ log_level = arg.split("=")[1].upper()
45
46
  else:
46
47
  # Next argument should be the level
47
48
  try:
@@ -51,35 +52,36 @@ def create_enhanced_module_logger(module_name: str, log_level: Optional[str] = N
51
52
  except (ValueError, IndexError):
52
53
  pass
53
54
  break
54
-
55
- return get_module_logger(module_name, level=log_level or 'INFO', json_output=json_output)
55
+
56
+ return get_module_logger(module_name, level=log_level or "INFO", json_output=json_output)
56
57
 
57
58
 
58
59
  def log_aws_operation(func: Callable) -> Callable:
59
60
  """
60
61
  Decorator to automatically log AWS operations with enhanced context.
61
-
62
+
62
63
  Usage:
63
64
  @log_aws_operation
64
65
  def describe_instances(session, region):
65
66
  client = session.client('ec2', region_name=region)
66
67
  return client.describe_instances()
67
68
  """
69
+
68
70
  @wraps(func)
69
71
  def wrapper(*args, **kwargs):
70
72
  # Try to extract module name from function
71
- module_name = func.__module__.split('.')[-1] if hasattr(func, '__module__') else 'unknown'
73
+ module_name = func.__module__.split(".")[-1] if hasattr(func, "__module__") else "unknown"
72
74
  logger = create_enhanced_module_logger(module_name)
73
-
75
+
74
76
  # Extract operation details from function name and arguments
75
77
  operation_name = func.__name__
76
- service_name = 'aws' # Default, could be improved by parsing function or args
77
-
78
+ service_name = "aws" # Default, could be improved by parsing function or args
79
+
78
80
  start_time = time.time()
79
81
  success = True
80
82
  result = None
81
83
  error_details = None
82
-
84
+
83
85
  try:
84
86
  result = func(*args, **kwargs)
85
87
  return result
@@ -90,7 +92,7 @@ def log_aws_operation(func: Callable) -> Callable:
90
92
  f"AWS operation failed: {operation_name}",
91
93
  solution=f"Check AWS permissions and service availability",
92
94
  aws_error=error_details,
93
- suggested_command=f"aws {service_name} {operation_name.replace('_', '-')} --help"
95
+ suggested_command=f"aws {service_name} {operation_name.replace('_', '-')} --help",
94
96
  )
95
97
  raise
96
98
  except Exception as e:
@@ -99,7 +101,7 @@ def log_aws_operation(func: Callable) -> Callable:
99
101
  logger.error_all(
100
102
  f"Operation failed: {operation_name}",
101
103
  solution="Check the error details above and verify inputs",
102
- aws_error=error_details
104
+ aws_error=error_details,
103
105
  )
104
106
  raise
105
107
  finally:
@@ -108,142 +110,142 @@ def log_aws_operation(func: Callable) -> Callable:
108
110
  resource_count = None
109
111
  # Try to extract resource count from result
110
112
  if isinstance(result, dict):
111
- if 'Reservations' in result:
112
- resource_count = sum(len(r.get('Instances', [])) for r in result['Reservations'])
113
- elif 'Buckets' in result:
114
- resource_count = len(result['Buckets'])
115
- elif isinstance(result.get('ResponseMetadata'), dict):
113
+ if "Reservations" in result:
114
+ resource_count = sum(len(r.get("Instances", [])) for r in result["Reservations"])
115
+ elif "Buckets" in result:
116
+ resource_count = len(result["Buckets"])
117
+ elif isinstance(result.get("ResponseMetadata"), dict):
116
118
  # It's an AWS response, try to count items
117
119
  for key, value in result.items():
118
- if isinstance(value, list) and key != 'ResponseMetadata':
120
+ if isinstance(value, list) and key != "ResponseMetadata":
119
121
  resource_count = len(value)
120
122
  break
121
-
123
+
122
124
  logger.log_aws_operation(
123
125
  operation=operation_name,
124
126
  service=service_name,
125
127
  duration=duration,
126
128
  success=True,
127
- resource_count=resource_count
129
+ resource_count=resource_count,
128
130
  )
129
-
131
+
130
132
  return wrapper
131
133
 
132
134
 
133
135
  def log_cost_operation(func: Callable) -> Callable:
134
136
  """
135
137
  Decorator to automatically log cost-related operations.
136
-
138
+
137
139
  Usage:
138
- @log_cost_operation
140
+ @log_cost_operation
139
141
  def analyze_monthly_costs(cost_data):
140
142
  # ... cost analysis logic ...
141
143
  return {"total_cost": 1500.0, "savings": 300.0}
142
144
  """
145
+
143
146
  @wraps(func)
144
147
  def wrapper(*args, **kwargs):
145
- module_name = func.__module__.split('.')[-1] if hasattr(func, '__module__') else 'finops'
148
+ module_name = func.__module__.split(".")[-1] if hasattr(func, "__module__") else "finops"
146
149
  logger = create_enhanced_module_logger(module_name)
147
-
150
+
148
151
  operation_name = func.__name__
149
152
  start_time = time.time()
150
-
153
+
151
154
  try:
152
155
  result = func(*args, **kwargs)
153
156
  duration = time.time() - start_time
154
-
157
+
155
158
  # Extract cost information from result
156
159
  cost_impact = None
157
160
  savings_opportunity = None
158
-
161
+
159
162
  if isinstance(result, dict):
160
- cost_impact = result.get('total_cost') or result.get('cost_impact')
161
- savings_opportunity = result.get('savings') or result.get('savings_opportunity')
162
-
163
+ cost_impact = result.get("total_cost") or result.get("cost_impact")
164
+ savings_opportunity = result.get("savings") or result.get("savings_opportunity")
165
+
163
166
  logger.log_cost_analysis(
164
- operation=operation_name,
165
- cost_impact=cost_impact,
166
- savings_opportunity=savings_opportunity
167
+ operation=operation_name, cost_impact=cost_impact, savings_opportunity=savings_opportunity
167
168
  )
168
-
169
+
169
170
  # Also log performance if it's slow
170
171
  logger.log_performance_metric(operation_name, duration)
171
-
172
+
172
173
  return result
173
-
174
+
174
175
  except Exception as e:
175
176
  logger.error_all(
176
177
  f"Cost analysis failed: {operation_name}",
177
178
  solution="Check input data format and AWS permissions",
178
- aws_error=str(e)
179
+ aws_error=str(e),
179
180
  )
180
181
  raise
181
-
182
+
182
183
  return wrapper
183
184
 
184
185
 
185
186
  def log_security_operation(func: Callable) -> Callable:
186
187
  """
187
188
  Decorator to automatically log security operations.
188
-
189
+
189
190
  Usage:
190
191
  @log_security_operation
191
192
  def scan_s3_permissions(bucket_name):
192
193
  # ... security scan logic ...
193
194
  return {"findings": [...], "severity": "medium"}
194
195
  """
196
+
195
197
  @wraps(func)
196
198
  def wrapper(*args, **kwargs):
197
- module_name = func.__module__.split('.')[-1] if hasattr(func, '__module__') else 'security'
199
+ module_name = func.__module__.split(".")[-1] if hasattr(func, "__module__") else "security"
198
200
  logger = create_enhanced_module_logger(module_name)
199
-
201
+
200
202
  operation_name = func.__name__
201
-
203
+
202
204
  try:
203
205
  result = func(*args, **kwargs)
204
-
206
+
205
207
  # Extract security findings from result
206
- if isinstance(result, dict) and 'findings' in result:
207
- findings = result['findings']
208
- severity = result.get('severity', 'medium')
209
-
208
+ if isinstance(result, dict) and "findings" in result:
209
+ findings = result["findings"]
210
+ severity = result.get("severity", "medium")
211
+
210
212
  if findings:
211
213
  for finding in findings:
212
214
  if isinstance(finding, dict):
213
215
  logger.log_security_finding(
214
- finding=finding.get('description', str(finding)),
215
- severity=finding.get('severity', severity),
216
- remediation_steps=finding.get('remediation_steps')
216
+ finding=finding.get("description", str(finding)),
217
+ severity=finding.get("severity", severity),
218
+ remediation_steps=finding.get("remediation_steps"),
217
219
  )
218
220
  else:
219
221
  logger.log_security_finding(str(finding), severity=severity)
220
222
  else:
221
223
  logger.info_standard(f"Security scan completed: {operation_name} (no findings)")
222
-
224
+
223
225
  return result
224
-
226
+
225
227
  except Exception as e:
226
228
  logger.error_all(
227
229
  f"Security operation failed: {operation_name}",
228
230
  solution="Check security scan configuration and permissions",
229
- aws_error=str(e)
231
+ aws_error=str(e),
230
232
  )
231
233
  raise
232
-
234
+
233
235
  return wrapper
234
236
 
235
237
 
236
238
  class LoggingMigrationHelper:
237
239
  """Helper class to assist with migrating existing modules to enhanced logging."""
238
-
240
+
239
241
  def __init__(self, module_name: str):
240
242
  self.module_name = module_name
241
243
  self.logger = create_enhanced_module_logger(module_name)
242
-
244
+
243
245
  def replace_print_statements(self, message: str, level: str = "info", **kwargs):
244
246
  """
245
247
  Replace print statements with appropriate logging calls.
246
-
248
+
247
249
  Args:
248
250
  message: The message to log
249
251
  level: Log level (debug, info, warning, error)
@@ -257,30 +259,21 @@ class LoggingMigrationHelper:
257
259
  self.logger.error_all(message, **kwargs)
258
260
  else:
259
261
  self.logger.info_standard(message, **kwargs)
260
-
262
+
261
263
  def log_operation_start(self, operation: str, **context):
262
264
  """Log the start of an operation."""
263
265
  return self.logger.operation_context(operation, **context)
264
-
265
- def log_aws_call(self, service: str, operation: str, duration: float = None,
266
- success: bool = True, **kwargs):
266
+
267
+ def log_aws_call(self, service: str, operation: str, duration: float = None, success: bool = True, **kwargs):
267
268
  """Log an AWS API call."""
268
269
  self.logger.log_aws_operation(
269
- operation=operation,
270
- service=service,
271
- duration=duration,
272
- success=success,
273
- **kwargs
270
+ operation=operation, service=service, duration=duration, success=success, **kwargs
274
271
  )
275
-
276
- def log_cost_finding(self, operation: str, cost: float = None, savings: float = None,
277
- recommendation: str = None):
272
+
273
+ def log_cost_finding(self, operation: str, cost: float = None, savings: float = None, recommendation: str = None):
278
274
  """Log a cost-related finding."""
279
275
  self.logger.log_cost_analysis(
280
- operation=operation,
281
- cost_impact=cost,
282
- savings_opportunity=savings,
283
- recommendation=recommendation
276
+ operation=operation, cost_impact=cost, savings_opportunity=savings, recommendation=recommendation
284
277
  )
285
278
 
286
279
 
@@ -298,7 +291,7 @@ def quick_log_error(module_name: str, message: str, solution: str = None, **kwar
298
291
 
299
292
 
300
293
  def quick_log_warning(module_name: str, message: str, recommendation: str = None, **kwargs):
301
- """Quick logging for warning messages."""
294
+ """Quick logging for warning messages."""
302
295
  logger = create_enhanced_module_logger(module_name)
303
296
  logger.warning_business(message, recommendation=recommendation, **kwargs)
304
297
 
@@ -328,7 +321,7 @@ def print_upgrade_checklist(module_name: str):
328
321
  print()
329
322
  print("4. Use context-aware logging methods:")
330
323
  print(f" • logger.debug_tech() - for technical details")
331
- print(f" • logger.info_standard() - for standard operations")
324
+ print(f" • logger.info_standard() - for standard operations")
332
325
  print(f" • logger.warning_business() - for business insights")
333
326
  print(f" • logger.error_all() - for errors with solutions")
334
327
  print()
@@ -341,4 +334,4 @@ def print_upgrade_checklist(module_name: str):
341
334
  print(f" with logger.operation_context('operation_name'):")
342
335
  print(f" # ... operation code ...")
343
336
  print()
344
- print("✅ After upgrade, users can control output with --log-level DEBUG|INFO|WARNING|ERROR")
337
+ print("✅ After upgrade, users can control output with --log-level DEBUG|INFO|WARNING|ERROR")