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
runbooks/cloudops/base.py CHANGED
@@ -23,23 +23,39 @@ from dataclasses import dataclass
23
23
  from datetime import datetime
24
24
 
25
25
  from runbooks.common.rich_utils import (
26
- console, print_header, print_success, print_error, print_warning, print_info,
27
- create_table, create_progress_bar, format_cost, create_panel, STATUS_INDICATORS
26
+ console,
27
+ print_header,
28
+ print_success,
29
+ print_error,
30
+ print_warning,
31
+ print_info,
32
+ create_table,
33
+ create_progress_bar,
34
+ format_cost,
35
+ create_panel,
36
+ STATUS_INDICATORS,
28
37
  )
29
38
  from .models import (
30
- BusinessScenario, ExecutionMode, RiskLevel,
31
- ProfileConfiguration, CloudOpsExecutionResult, BusinessMetrics, ResourceImpact
39
+ BusinessScenario,
40
+ ExecutionMode,
41
+ RiskLevel,
42
+ ProfileConfiguration,
43
+ CloudOpsExecutionResult,
44
+ BusinessMetrics,
45
+ ResourceImpact,
32
46
  )
33
47
 
48
+
34
49
  @dataclass
35
50
  class PerformanceBenchmark:
36
51
  """Performance benchmarking for enterprise operations."""
52
+
37
53
  operation_name: str
38
54
  start_time: float
39
55
  end_time: Optional[float] = None
40
56
  success: bool = True
41
57
  error_message: Optional[str] = None
42
-
58
+
43
59
  @property
44
60
  def duration(self) -> float:
45
61
  """Calculate operation duration."""
@@ -47,10 +63,11 @@ class PerformanceBenchmark:
47
63
  return self.end_time - self.start_time
48
64
  return time.time() - self.start_time
49
65
 
66
+
50
67
  class CloudOpsBase:
51
68
  """
52
69
  Base class for all CloudOps automation scenarios.
53
-
70
+
54
71
  Provides enterprise-grade functionality including:
55
72
  - Rich CLI integration with consistent UX
56
73
  - Performance monitoring and benchmarking
@@ -58,16 +75,13 @@ class CloudOpsBase:
58
75
  - Error handling with business-focused messaging
59
76
  - Audit trail and logging
60
77
  """
61
-
78
+
62
79
  def __init__(
63
- self,
64
- profile: str = "default",
65
- dry_run: bool = True,
66
- execution_mode: ExecutionMode = ExecutionMode.DRY_RUN
80
+ self, profile: str = "default", dry_run: bool = True, execution_mode: ExecutionMode = ExecutionMode.DRY_RUN
67
81
  ):
68
82
  """
69
83
  Initialize CloudOps base class.
70
-
84
+
71
85
  Args:
72
86
  profile: AWS profile name for operations
73
87
  dry_run: Enable dry-run mode (safe analysis only)
@@ -76,89 +90,81 @@ class CloudOpsBase:
76
90
  self.profile = profile
77
91
  self.dry_run = dry_run
78
92
  self.execution_mode = execution_mode
79
-
93
+
80
94
  # Performance monitoring
81
95
  self.benchmarks: List[PerformanceBenchmark] = []
82
96
  self.session_start_time = time.time()
83
-
97
+
84
98
  # AWS session management
85
99
  self.session: Optional[boto3.Session] = None
86
100
  self.available_regions: List[str] = []
87
-
101
+
88
102
  # Business metrics collection
89
103
  self.resources_analyzed = 0
90
104
  self.resources_impacted: List[ResourceImpact] = []
91
-
105
+
92
106
  # Initialize AWS session
93
107
  self._initialize_aws_session()
94
-
108
+
95
109
  def _initialize_aws_session(self) -> None:
96
110
  """Initialize AWS session with profile validation."""
97
111
  try:
98
112
  self.session = boto3.Session(profile_name=self.profile)
99
-
113
+
100
114
  # Validate session by getting caller identity
101
- sts = self.session.client('sts')
115
+ sts = self.session.client("sts")
102
116
  identity = sts.get_caller_identity()
103
-
104
- self.account_id = identity.get('Account', 'unknown')
105
- self.user_arn = identity.get('Arn', 'unknown')
106
-
117
+
118
+ self.account_id = identity.get("Account", "unknown")
119
+ self.user_arn = identity.get("Arn", "unknown")
120
+
107
121
  print_success(f"AWS session initialized for profile: {self.profile}")
108
122
  print_info(f"Account ID: {self.account_id}")
109
-
123
+
110
124
  except ProfileNotFound:
111
125
  error_msg = f"AWS profile '{self.profile}' not found in local configuration"
112
126
  print_error(error_msg)
113
127
  raise ValueError(error_msg)
114
-
128
+
115
129
  except NoCredentialsError:
116
130
  error_msg = f"No valid credentials found for profile '{self.profile}'"
117
131
  print_error(error_msg)
118
132
  raise ValueError(error_msg)
119
-
133
+
120
134
  except ClientError as e:
121
135
  error_msg = f"AWS authentication failed for profile '{self.profile}': {str(e)}"
122
136
  print_error(error_msg)
123
137
  raise ValueError(error_msg)
124
-
125
- def _get_available_regions(self, service_name: str = 'ec2') -> List[str]:
138
+
139
+ def _get_available_regions(self, service_name: str = "ec2") -> List[str]:
126
140
  """Get available AWS regions for a service."""
127
141
  if not self.available_regions:
128
142
  try:
129
- client = self.session.client(service_name, region_name='us-east-1')
143
+ client = self.session.client(service_name, region_name="us-east-1")
130
144
  response = client.describe_regions()
131
- self.available_regions = [region['RegionName'] for region in response['Regions']]
145
+ self.available_regions = [region["RegionName"] for region in response["Regions"]]
132
146
  except Exception as e:
133
147
  print_warning(f"Could not fetch available regions: {str(e)}")
134
148
  # Fallback to common regions
135
- self.available_regions = [
136
- 'us-east-1', 'us-west-2', 'eu-west-1', 'ap-southeast-1'
137
- ]
149
+ self.available_regions = ["us-east-1", "us-west-2", "eu-west-1", "ap-southeast-1"]
138
150
  return self.available_regions
139
-
151
+
140
152
  def start_benchmark(self, operation_name: str) -> PerformanceBenchmark:
141
153
  """Start performance benchmarking for an operation."""
142
- benchmark = PerformanceBenchmark(
143
- operation_name=operation_name,
144
- start_time=time.time()
145
- )
154
+ benchmark = PerformanceBenchmark(operation_name=operation_name, start_time=time.time())
146
155
  self.benchmarks.append(benchmark)
147
156
  return benchmark
148
-
157
+
149
158
  def complete_benchmark(
150
- self,
151
- benchmark: PerformanceBenchmark,
152
- success: bool = True,
153
- error_message: Optional[str] = None
159
+ self, benchmark: PerformanceBenchmark, success: bool = True, error_message: Optional[str] = None
154
160
  ) -> None:
155
161
  """Complete performance benchmarking."""
156
162
  benchmark.end_time = time.time()
157
163
  benchmark.success = success
158
164
  benchmark.error_message = error_message
159
-
165
+
160
166
  duration = benchmark.duration
161
-
167
+
162
168
  # Rich CLI performance feedback
163
169
  if success:
164
170
  if duration < 30: # < 30s target for single account
@@ -169,47 +175,41 @@ class CloudOpsBase:
169
175
  print_error(f"⏰ {benchmark.operation_name} completed ({duration:.1f}s) - exceeds performance target")
170
176
  else:
171
177
  print_error(f"❌ {benchmark.operation_name} failed ({duration:.1f}s): {error_message}")
172
-
173
- async def execute_with_monitoring(
174
- self,
175
- operation_name: str,
176
- operation_func,
177
- *args,
178
- **kwargs
179
- ) -> Any:
178
+
179
+ async def execute_with_monitoring(self, operation_name: str, operation_func, *args, **kwargs) -> Any:
180
180
  """
181
181
  Execute an operation with comprehensive monitoring.
182
-
182
+
183
183
  Args:
184
184
  operation_name: Human-readable operation name
185
185
  operation_func: Async function to execute
186
186
  *args, **kwargs: Arguments to pass to operation_func
187
-
187
+
188
188
  Returns:
189
189
  Result of operation_func execution
190
190
  """
191
191
  benchmark = self.start_benchmark(operation_name)
192
-
192
+
193
193
  try:
194
194
  with console.status(f"[cyan]Executing {operation_name}..."):
195
195
  if asyncio.iscoroutinefunction(operation_func):
196
196
  result = await operation_func(*args, **kwargs)
197
197
  else:
198
198
  result = operation_func(*args, **kwargs)
199
-
199
+
200
200
  self.complete_benchmark(benchmark, success=True)
201
201
  return result
202
-
202
+
203
203
  except Exception as e:
204
204
  error_message = str(e)
205
205
  self.complete_benchmark(benchmark, success=False, error_message=error_message)
206
-
206
+
207
207
  # Rich CLI error display
208
208
  print_error(f"Operation failed: {operation_name}")
209
209
  print_error(f"Error details: {error_message}")
210
-
210
+
211
211
  raise
212
-
212
+
213
213
  def create_resource_impact(
214
214
  self,
215
215
  resource_type: str,
@@ -219,11 +219,11 @@ class CloudOpsBase:
219
219
  projected_savings: Optional[float] = None,
220
220
  risk_level: RiskLevel = RiskLevel.LOW,
221
221
  modification_required: bool = False,
222
- **kwargs
222
+ **kwargs,
223
223
  ) -> ResourceImpact:
224
224
  """
225
225
  Create a standardized ResourceImpact object.
226
-
226
+
227
227
  Args:
228
228
  resource_type: AWS resource type (e.g., 'nat-gateway', 'ec2-instance')
229
229
  resource_id: Unique resource identifier
@@ -233,7 +233,7 @@ class CloudOpsBase:
233
233
  risk_level: Risk level for modification
234
234
  modification_required: Whether resource needs modification
235
235
  **kwargs: Additional ResourceImpact fields
236
-
236
+
237
237
  Returns:
238
238
  ResourceImpact object with standardized business metrics
239
239
  """
@@ -246,18 +246,18 @@ class CloudOpsBase:
246
246
  projected_savings=projected_savings,
247
247
  risk_level=risk_level,
248
248
  modification_required=modification_required,
249
- **kwargs
249
+ **kwargs,
250
250
  )
251
-
251
+
252
252
  self.resources_impacted.append(impact)
253
253
  self.resources_analyzed += 1
254
-
254
+
255
255
  return impact
256
-
256
+
257
257
  def display_execution_summary(self, result: CloudOpsExecutionResult) -> None:
258
258
  """
259
259
  Display Rich CLI execution summary for business stakeholders.
260
-
260
+
261
261
  Args:
262
262
  result: CloudOpsExecutionResult with business metrics
263
263
  """
@@ -269,17 +269,17 @@ class CloudOpsBase:
269
269
  f"⏱️ Execution Time: {result.execution_time:.1f}s\n"
270
270
  f"🛡️ Risk Level: {result.business_metrics.overall_risk_level.value.title()}"
271
271
  )
272
-
272
+
273
273
  if result.business_metrics.roi_percentage:
274
274
  summary_content += f"\n📈 ROI: {result.business_metrics.roi_percentage:.1f}%"
275
-
275
+
276
276
  summary_panel = create_panel(
277
277
  summary_content,
278
278
  title="Executive Business Impact Summary",
279
- border_style="green" if result.success else "red"
279
+ border_style="green" if result.success else "red",
280
280
  )
281
281
  console.print(summary_panel)
282
-
282
+
283
283
  # Performance Benchmarks Table
284
284
  if self.benchmarks:
285
285
  perf_table = create_table(
@@ -287,14 +287,14 @@ class CloudOpsBase:
287
287
  columns=[
288
288
  {"name": "Operation", "style": "cyan"},
289
289
  {"name": "Duration", "style": "yellow"},
290
- {"name": "Status", "style": "green"}
291
- ]
290
+ {"name": "Status", "style": "green"},
291
+ ],
292
292
  )
293
-
293
+
294
294
  for benchmark in self.benchmarks:
295
295
  status_icon = "✅" if benchmark.success else "❌"
296
296
  duration_str = f"{benchmark.duration:.1f}s"
297
-
297
+
298
298
  # Color code performance
299
299
  if benchmark.duration < 30:
300
300
  duration_style = "green"
@@ -302,51 +302,45 @@ class CloudOpsBase:
302
302
  duration_style = "yellow"
303
303
  else:
304
304
  duration_style = "red"
305
-
305
+
306
306
  perf_table.add_row(
307
- benchmark.operation_name,
308
- f"[{duration_style}]{duration_str}[/{duration_style}]",
309
- status_icon
307
+ benchmark.operation_name, f"[{duration_style}]{duration_str}[/{duration_style}]", status_icon
310
308
  )
311
-
309
+
312
310
  console.print(perf_table)
313
-
311
+
314
312
  # Recommendations Display
315
313
  if result.recommendations:
316
314
  recommendations_text = "\n".join([f"• {rec}" for rec in result.recommendations])
317
- rec_panel = create_panel(
318
- recommendations_text,
319
- title="Strategic Recommendations",
320
- border_style="blue"
321
- )
315
+ rec_panel = create_panel(recommendations_text, title="Strategic Recommendations", border_style="blue")
322
316
  console.print(rec_panel)
323
-
317
+
324
318
  def create_business_metrics(
325
319
  self,
326
320
  total_savings: float = 0.0,
327
321
  implementation_cost: Optional[float] = None,
328
- overall_risk: RiskLevel = RiskLevel.LOW
322
+ overall_risk: RiskLevel = RiskLevel.LOW,
329
323
  ) -> BusinessMetrics:
330
324
  """
331
325
  Create standardized business metrics for executive reporting.
332
-
326
+
333
327
  Args:
334
328
  total_savings: Total projected monthly savings
335
329
  implementation_cost: One-time implementation cost
336
330
  overall_risk: Overall risk level for the operation
337
-
331
+
338
332
  Returns:
339
333
  BusinessMetrics object with calculated ROI and business impact
340
334
  """
341
335
  # Calculate ROI if implementation cost is provided
342
336
  roi_percentage = None
343
337
  payback_period = None
344
-
338
+
345
339
  if implementation_cost and implementation_cost > 0 and total_savings > 0:
346
340
  annual_savings = total_savings * 12
347
341
  roi_percentage = (annual_savings / implementation_cost - 1) * 100
348
342
  payback_period = int(implementation_cost / total_savings)
349
-
343
+
350
344
  return BusinessMetrics(
351
345
  total_monthly_savings=total_savings,
352
346
  implementation_cost=implementation_cost,
@@ -355,7 +349,7 @@ class CloudOpsBase:
355
349
  overall_risk_level=overall_risk,
356
350
  operational_efficiency_gain=self._calculate_operational_efficiency_gain(total_savings),
357
351
  manual_effort_reduction=self._calculate_manual_effort_reduction(),
358
- business_continuity_impact="minimal"
352
+ business_continuity_impact="minimal",
359
353
  )
360
354
 
361
355
  def _calculate_operational_efficiency_gain(self, total_savings: float) -> float:
@@ -369,7 +363,7 @@ class CloudOpsBase:
369
363
  Operational efficiency gain percentage
370
364
  """
371
365
  # Calculate efficiency based on actual operation benchmarks
372
- if hasattr(self, 'benchmarks') and self.benchmarks:
366
+ if hasattr(self, "benchmarks") and self.benchmarks:
373
367
  # Calculate average improvement from successful operations
374
368
  successful_ops = [b for b in self.benchmarks if b.success]
375
369
  if successful_ops:
@@ -398,7 +392,7 @@ class CloudOpsBase:
398
392
  Returns:
399
393
  Manual effort reduction percentage
400
394
  """
401
- if hasattr(self, 'benchmarks') and self.benchmarks:
395
+ if hasattr(self, "benchmarks") and self.benchmarks:
402
396
  # Calculate based on successful automated operations
403
397
  successful_ops = len([b for b in self.benchmarks if b.success])
404
398
  total_ops = len(self.benchmarks)
@@ -416,10 +410,10 @@ class CloudOpsBase:
416
410
  total_duration = time.time() - self.session_start_time
417
411
  successful_ops = sum(1 for b in self.benchmarks if b.success)
418
412
  failed_ops = len(self.benchmarks) - successful_ops
419
-
413
+
420
414
  return {
421
415
  "profile_used": self.profile,
422
- "account_id": getattr(self, 'account_id', 'unknown'),
416
+ "account_id": getattr(self, "account_id", "unknown"),
423
417
  "execution_mode": self.execution_mode.value,
424
418
  "total_session_duration": total_duration,
425
419
  "resources_analyzed": self.resources_analyzed,
@@ -427,12 +421,7 @@ class CloudOpsBase:
427
421
  "successful_operations": successful_ops,
428
422
  "failed_operations": failed_ops,
429
423
  "performance_benchmarks": [
430
- {
431
- "operation": b.operation_name,
432
- "duration": b.duration,
433
- "success": b.success,
434
- "error": b.error_message
435
- }
424
+ {"operation": b.operation_name, "duration": b.duration, "success": b.success, "error": b.error_message}
436
425
  for b in self.benchmarks
437
- ]
438
- }
426
+ ],
427
+ }