runbooks 1.1.4__py3-none-any.whl → 1.1.6__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 (273) 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/assessment/compliance.py +1 -1
  8. runbooks/cfat/assessment/runner.py +1 -0
  9. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  10. runbooks/cli/__init__.py +1 -1
  11. runbooks/cli/commands/cfat.py +64 -23
  12. runbooks/cli/commands/finops.py +1005 -54
  13. runbooks/cli/commands/inventory.py +135 -91
  14. runbooks/cli/commands/operate.py +9 -36
  15. runbooks/cli/commands/security.py +42 -18
  16. runbooks/cli/commands/validation.py +432 -18
  17. runbooks/cli/commands/vpc.py +81 -17
  18. runbooks/cli/registry.py +22 -10
  19. runbooks/cloudops/__init__.py +20 -27
  20. runbooks/cloudops/base.py +96 -107
  21. runbooks/cloudops/cost_optimizer.py +544 -542
  22. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  23. runbooks/cloudops/interfaces.py +224 -225
  24. runbooks/cloudops/lifecycle_manager.py +5 -4
  25. runbooks/cloudops/mcp_cost_validation.py +252 -235
  26. runbooks/cloudops/models.py +78 -53
  27. runbooks/cloudops/monitoring_automation.py +5 -4
  28. runbooks/cloudops/notebook_framework.py +177 -213
  29. runbooks/cloudops/security_enforcer.py +125 -159
  30. runbooks/common/accuracy_validator.py +17 -12
  31. runbooks/common/aws_pricing.py +349 -326
  32. runbooks/common/aws_pricing_api.py +211 -212
  33. runbooks/common/aws_profile_manager.py +40 -36
  34. runbooks/common/aws_utils.py +74 -79
  35. runbooks/common/business_logic.py +126 -104
  36. runbooks/common/cli_decorators.py +36 -60
  37. runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
  38. runbooks/common/cross_account_manager.py +197 -204
  39. runbooks/common/date_utils.py +27 -39
  40. runbooks/common/decorators.py +29 -19
  41. runbooks/common/dry_run_examples.py +173 -208
  42. runbooks/common/dry_run_framework.py +157 -155
  43. runbooks/common/enhanced_exception_handler.py +15 -4
  44. runbooks/common/enhanced_logging_example.py +50 -64
  45. runbooks/common/enhanced_logging_integration_example.py +65 -37
  46. runbooks/common/env_utils.py +16 -16
  47. runbooks/common/error_handling.py +40 -38
  48. runbooks/common/lazy_loader.py +41 -23
  49. runbooks/common/logging_integration_helper.py +79 -86
  50. runbooks/common/mcp_cost_explorer_integration.py +476 -493
  51. runbooks/common/mcp_integration.py +99 -79
  52. runbooks/common/memory_optimization.py +140 -118
  53. runbooks/common/module_cli_base.py +37 -58
  54. runbooks/common/organizations_client.py +175 -193
  55. runbooks/common/patterns.py +23 -25
  56. runbooks/common/performance_monitoring.py +67 -71
  57. runbooks/common/performance_optimization_engine.py +283 -274
  58. runbooks/common/profile_utils.py +111 -37
  59. runbooks/common/rich_utils.py +315 -141
  60. runbooks/common/sre_performance_suite.py +177 -186
  61. runbooks/enterprise/__init__.py +1 -1
  62. runbooks/enterprise/logging.py +144 -106
  63. runbooks/enterprise/security.py +187 -204
  64. runbooks/enterprise/validation.py +43 -56
  65. runbooks/finops/__init__.py +26 -30
  66. runbooks/finops/account_resolver.py +1 -1
  67. runbooks/finops/advanced_optimization_engine.py +980 -0
  68. runbooks/finops/automation_core.py +268 -231
  69. runbooks/finops/business_case_config.py +184 -179
  70. runbooks/finops/cli.py +660 -139
  71. runbooks/finops/commvault_ec2_analysis.py +157 -164
  72. runbooks/finops/compute_cost_optimizer.py +336 -320
  73. runbooks/finops/config.py +20 -20
  74. runbooks/finops/cost_optimizer.py +484 -618
  75. runbooks/finops/cost_processor.py +332 -214
  76. runbooks/finops/dashboard_runner.py +1006 -172
  77. runbooks/finops/ebs_cost_optimizer.py +991 -657
  78. runbooks/finops/elastic_ip_optimizer.py +317 -257
  79. runbooks/finops/enhanced_mcp_integration.py +340 -0
  80. runbooks/finops/enhanced_progress.py +32 -29
  81. runbooks/finops/enhanced_trend_visualization.py +3 -2
  82. runbooks/finops/enterprise_wrappers.py +223 -285
  83. runbooks/finops/executive_export.py +203 -160
  84. runbooks/finops/helpers.py +130 -288
  85. runbooks/finops/iam_guidance.py +1 -1
  86. runbooks/finops/infrastructure/__init__.py +80 -0
  87. runbooks/finops/infrastructure/commands.py +506 -0
  88. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  89. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  90. runbooks/finops/markdown_exporter.py +337 -174
  91. runbooks/finops/mcp_validator.py +1952 -0
  92. runbooks/finops/nat_gateway_optimizer.py +1512 -481
  93. runbooks/finops/network_cost_optimizer.py +657 -587
  94. runbooks/finops/notebook_utils.py +226 -188
  95. runbooks/finops/optimization_engine.py +1136 -0
  96. runbooks/finops/optimizer.py +19 -23
  97. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  98. runbooks/finops/reservation_optimizer.py +427 -363
  99. runbooks/finops/scenario_cli_integration.py +64 -65
  100. runbooks/finops/scenarios.py +1277 -438
  101. runbooks/finops/schemas.py +218 -182
  102. runbooks/finops/snapshot_manager.py +2289 -0
  103. runbooks/finops/types.py +3 -3
  104. runbooks/finops/validation_framework.py +259 -265
  105. runbooks/finops/vpc_cleanup_exporter.py +189 -144
  106. runbooks/finops/vpc_cleanup_optimizer.py +591 -573
  107. runbooks/finops/workspaces_analyzer.py +171 -182
  108. runbooks/integration/__init__.py +89 -0
  109. runbooks/integration/mcp_integration.py +1920 -0
  110. runbooks/inventory/CLAUDE.md +816 -0
  111. runbooks/inventory/__init__.py +2 -2
  112. runbooks/inventory/aws_decorators.py +2 -3
  113. runbooks/inventory/check_cloudtrail_compliance.py +2 -4
  114. runbooks/inventory/check_controltower_readiness.py +152 -151
  115. runbooks/inventory/check_landingzone_readiness.py +85 -84
  116. runbooks/inventory/cloud_foundations_integration.py +144 -149
  117. runbooks/inventory/collectors/aws_comprehensive.py +1 -1
  118. runbooks/inventory/collectors/aws_networking.py +109 -99
  119. runbooks/inventory/collectors/base.py +4 -0
  120. runbooks/inventory/core/collector.py +495 -313
  121. runbooks/inventory/core/formatter.py +11 -0
  122. runbooks/inventory/draw_org_structure.py +8 -9
  123. runbooks/inventory/drift_detection_cli.py +69 -96
  124. runbooks/inventory/ec2_vpc_utils.py +2 -2
  125. runbooks/inventory/find_cfn_drift_detection.py +5 -7
  126. runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
  127. runbooks/inventory/find_cfn_stackset_drift.py +5 -6
  128. runbooks/inventory/find_ec2_security_groups.py +48 -42
  129. runbooks/inventory/find_landingzone_versions.py +4 -6
  130. runbooks/inventory/find_vpc_flow_logs.py +7 -9
  131. runbooks/inventory/inventory_mcp_cli.py +48 -46
  132. runbooks/inventory/inventory_modules.py +103 -91
  133. runbooks/inventory/list_cfn_stacks.py +9 -10
  134. runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
  135. runbooks/inventory/list_cfn_stackset_operations.py +79 -57
  136. runbooks/inventory/list_cfn_stacksets.py +8 -10
  137. runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
  138. runbooks/inventory/list_ds_directories.py +65 -53
  139. runbooks/inventory/list_ec2_availability_zones.py +2 -4
  140. runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
  141. runbooks/inventory/list_ec2_instances.py +23 -28
  142. runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
  143. runbooks/inventory/list_elbs_load_balancers.py +22 -20
  144. runbooks/inventory/list_enis_network_interfaces.py +26 -33
  145. runbooks/inventory/list_guardduty_detectors.py +2 -4
  146. runbooks/inventory/list_iam_policies.py +2 -4
  147. runbooks/inventory/list_iam_roles.py +5 -7
  148. runbooks/inventory/list_iam_saml_providers.py +4 -6
  149. runbooks/inventory/list_lambda_functions.py +38 -38
  150. runbooks/inventory/list_org_accounts.py +6 -8
  151. runbooks/inventory/list_org_accounts_users.py +55 -44
  152. runbooks/inventory/list_rds_db_instances.py +31 -33
  153. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  154. runbooks/inventory/list_route53_hosted_zones.py +3 -5
  155. runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
  156. runbooks/inventory/list_sns_topics.py +2 -4
  157. runbooks/inventory/list_ssm_parameters.py +4 -7
  158. runbooks/inventory/list_vpc_subnets.py +2 -4
  159. runbooks/inventory/list_vpcs.py +7 -10
  160. runbooks/inventory/mcp_inventory_validator.py +554 -468
  161. runbooks/inventory/mcp_vpc_validator.py +359 -442
  162. runbooks/inventory/organizations_discovery.py +63 -55
  163. runbooks/inventory/recover_cfn_stack_ids.py +7 -8
  164. runbooks/inventory/requirements.txt +0 -1
  165. runbooks/inventory/rich_inventory_display.py +35 -34
  166. runbooks/inventory/run_on_multi_accounts.py +3 -5
  167. runbooks/inventory/unified_validation_engine.py +281 -253
  168. runbooks/inventory/verify_ec2_security_groups.py +1 -1
  169. runbooks/inventory/vpc_analyzer.py +735 -697
  170. runbooks/inventory/vpc_architecture_validator.py +293 -348
  171. runbooks/inventory/vpc_dependency_analyzer.py +384 -380
  172. runbooks/inventory/vpc_flow_analyzer.py +1 -1
  173. runbooks/main.py +49 -34
  174. runbooks/main_final.py +91 -60
  175. runbooks/main_minimal.py +22 -10
  176. runbooks/main_optimized.py +131 -100
  177. runbooks/main_ultra_minimal.py +7 -2
  178. runbooks/mcp/__init__.py +36 -0
  179. runbooks/mcp/integration.py +679 -0
  180. runbooks/monitoring/performance_monitor.py +9 -4
  181. runbooks/operate/dynamodb_operations.py +3 -1
  182. runbooks/operate/ec2_operations.py +145 -137
  183. runbooks/operate/iam_operations.py +146 -152
  184. runbooks/operate/networking_cost_heatmap.py +29 -8
  185. runbooks/operate/rds_operations.py +223 -254
  186. runbooks/operate/s3_operations.py +107 -118
  187. runbooks/operate/vpc_operations.py +646 -616
  188. runbooks/remediation/base.py +1 -1
  189. runbooks/remediation/commons.py +10 -7
  190. runbooks/remediation/commvault_ec2_analysis.py +70 -66
  191. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  192. runbooks/remediation/multi_account.py +24 -21
  193. runbooks/remediation/rds_snapshot_list.py +86 -60
  194. runbooks/remediation/remediation_cli.py +92 -146
  195. runbooks/remediation/universal_account_discovery.py +83 -79
  196. runbooks/remediation/workspaces_list.py +46 -41
  197. runbooks/security/__init__.py +19 -0
  198. runbooks/security/assessment_runner.py +1150 -0
  199. runbooks/security/baseline_checker.py +812 -0
  200. runbooks/security/cloudops_automation_security_validator.py +509 -535
  201. runbooks/security/compliance_automation_engine.py +17 -17
  202. runbooks/security/config/__init__.py +2 -2
  203. runbooks/security/config/compliance_config.py +50 -50
  204. runbooks/security/config_template_generator.py +63 -76
  205. runbooks/security/enterprise_security_framework.py +1 -1
  206. runbooks/security/executive_security_dashboard.py +519 -508
  207. runbooks/security/multi_account_security_controls.py +959 -1210
  208. runbooks/security/real_time_security_monitor.py +422 -444
  209. runbooks/security/security_baseline_tester.py +1 -1
  210. runbooks/security/security_cli.py +143 -112
  211. runbooks/security/test_2way_validation.py +439 -0
  212. runbooks/security/two_way_validation_framework.py +852 -0
  213. runbooks/sre/production_monitoring_framework.py +167 -177
  214. runbooks/tdd/__init__.py +15 -0
  215. runbooks/tdd/cli.py +1071 -0
  216. runbooks/utils/__init__.py +14 -17
  217. runbooks/utils/logger.py +7 -2
  218. runbooks/utils/version_validator.py +50 -47
  219. runbooks/validation/__init__.py +6 -6
  220. runbooks/validation/cli.py +9 -3
  221. runbooks/validation/comprehensive_2way_validator.py +745 -704
  222. runbooks/validation/mcp_validator.py +906 -228
  223. runbooks/validation/terraform_citations_validator.py +104 -115
  224. runbooks/validation/terraform_drift_detector.py +461 -454
  225. runbooks/vpc/README.md +617 -0
  226. runbooks/vpc/__init__.py +8 -1
  227. runbooks/vpc/analyzer.py +577 -0
  228. runbooks/vpc/cleanup_wrapper.py +476 -413
  229. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  230. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  231. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  232. runbooks/vpc/config.py +92 -97
  233. runbooks/vpc/cost_engine.py +411 -148
  234. runbooks/vpc/cost_explorer_integration.py +553 -0
  235. runbooks/vpc/cross_account_session.py +101 -106
  236. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  237. runbooks/vpc/eni_gate_validator.py +961 -0
  238. runbooks/vpc/heatmap_engine.py +185 -160
  239. runbooks/vpc/mcp_no_eni_validator.py +680 -639
  240. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  241. runbooks/vpc/networking_wrapper.py +15 -8
  242. runbooks/vpc/pdca_remediation_planner.py +528 -0
  243. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  244. runbooks/vpc/runbooks_adapter.py +1167 -241
  245. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  246. runbooks/vpc/test_data_loader.py +358 -0
  247. runbooks/vpc/tests/conftest.py +314 -4
  248. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  249. runbooks/vpc/tests/test_cost_engine.py +0 -2
  250. runbooks/vpc/topology_generator.py +326 -0
  251. runbooks/vpc/unified_scenarios.py +1297 -1124
  252. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  253. runbooks-1.1.6.dist-info/METADATA +327 -0
  254. runbooks-1.1.6.dist-info/RECORD +489 -0
  255. runbooks/finops/README.md +0 -414
  256. runbooks/finops/accuracy_cross_validator.py +0 -647
  257. runbooks/finops/business_cases.py +0 -950
  258. runbooks/finops/dashboard_router.py +0 -922
  259. runbooks/finops/ebs_optimizer.py +0 -973
  260. runbooks/finops/embedded_mcp_validator.py +0 -1629
  261. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  262. runbooks/finops/finops_dashboard.py +0 -584
  263. runbooks/finops/finops_scenarios.py +0 -1218
  264. runbooks/finops/legacy_migration.py +0 -730
  265. runbooks/finops/multi_dashboard.py +0 -1519
  266. runbooks/finops/single_dashboard.py +0 -1113
  267. runbooks/finops/unlimited_scenarios.py +0 -393
  268. runbooks-1.1.4.dist-info/METADATA +0 -800
  269. runbooks-1.1.4.dist-info/RECORD +0 -468
  270. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
  271. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
  272. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
  273. {runbooks-1.1.4.dist-info → runbooks-1.1.6.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
+ }