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.
- runbooks/__init__.py +31 -2
- runbooks/__init___optimized.py +18 -4
- runbooks/_platform/__init__.py +1 -5
- runbooks/_platform/core/runbooks_wrapper.py +141 -138
- runbooks/aws2/accuracy_validator.py +812 -0
- runbooks/base.py +7 -0
- runbooks/cfat/assessment/compliance.py +1 -1
- runbooks/cfat/assessment/runner.py +1 -0
- runbooks/cfat/cloud_foundations_assessment.py +227 -239
- runbooks/cli/__init__.py +1 -1
- runbooks/cli/commands/cfat.py +64 -23
- runbooks/cli/commands/finops.py +1005 -54
- runbooks/cli/commands/inventory.py +135 -91
- runbooks/cli/commands/operate.py +9 -36
- runbooks/cli/commands/security.py +42 -18
- runbooks/cli/commands/validation.py +432 -18
- runbooks/cli/commands/vpc.py +81 -17
- runbooks/cli/registry.py +22 -10
- runbooks/cloudops/__init__.py +20 -27
- runbooks/cloudops/base.py +96 -107
- runbooks/cloudops/cost_optimizer.py +544 -542
- runbooks/cloudops/infrastructure_optimizer.py +5 -4
- runbooks/cloudops/interfaces.py +224 -225
- runbooks/cloudops/lifecycle_manager.py +5 -4
- runbooks/cloudops/mcp_cost_validation.py +252 -235
- runbooks/cloudops/models.py +78 -53
- runbooks/cloudops/monitoring_automation.py +5 -4
- runbooks/cloudops/notebook_framework.py +177 -213
- runbooks/cloudops/security_enforcer.py +125 -159
- runbooks/common/accuracy_validator.py +17 -12
- runbooks/common/aws_pricing.py +349 -326
- runbooks/common/aws_pricing_api.py +211 -212
- runbooks/common/aws_profile_manager.py +40 -36
- runbooks/common/aws_utils.py +74 -79
- runbooks/common/business_logic.py +126 -104
- runbooks/common/cli_decorators.py +36 -60
- runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
- runbooks/common/cross_account_manager.py +197 -204
- runbooks/common/date_utils.py +27 -39
- runbooks/common/decorators.py +29 -19
- runbooks/common/dry_run_examples.py +173 -208
- runbooks/common/dry_run_framework.py +157 -155
- runbooks/common/enhanced_exception_handler.py +15 -4
- runbooks/common/enhanced_logging_example.py +50 -64
- runbooks/common/enhanced_logging_integration_example.py +65 -37
- runbooks/common/env_utils.py +16 -16
- runbooks/common/error_handling.py +40 -38
- runbooks/common/lazy_loader.py +41 -23
- runbooks/common/logging_integration_helper.py +79 -86
- runbooks/common/mcp_cost_explorer_integration.py +476 -493
- runbooks/common/mcp_integration.py +99 -79
- runbooks/common/memory_optimization.py +140 -118
- runbooks/common/module_cli_base.py +37 -58
- runbooks/common/organizations_client.py +175 -193
- runbooks/common/patterns.py +23 -25
- runbooks/common/performance_monitoring.py +67 -71
- runbooks/common/performance_optimization_engine.py +283 -274
- runbooks/common/profile_utils.py +111 -37
- runbooks/common/rich_utils.py +315 -141
- runbooks/common/sre_performance_suite.py +177 -186
- runbooks/enterprise/__init__.py +1 -1
- runbooks/enterprise/logging.py +144 -106
- runbooks/enterprise/security.py +187 -204
- runbooks/enterprise/validation.py +43 -56
- runbooks/finops/__init__.py +26 -30
- runbooks/finops/account_resolver.py +1 -1
- runbooks/finops/advanced_optimization_engine.py +980 -0
- runbooks/finops/automation_core.py +268 -231
- runbooks/finops/business_case_config.py +184 -179
- runbooks/finops/cli.py +660 -139
- runbooks/finops/commvault_ec2_analysis.py +157 -164
- runbooks/finops/compute_cost_optimizer.py +336 -320
- runbooks/finops/config.py +20 -20
- runbooks/finops/cost_optimizer.py +484 -618
- runbooks/finops/cost_processor.py +332 -214
- runbooks/finops/dashboard_runner.py +1006 -172
- runbooks/finops/ebs_cost_optimizer.py +991 -657
- runbooks/finops/elastic_ip_optimizer.py +317 -257
- runbooks/finops/enhanced_mcp_integration.py +340 -0
- runbooks/finops/enhanced_progress.py +32 -29
- runbooks/finops/enhanced_trend_visualization.py +3 -2
- runbooks/finops/enterprise_wrappers.py +223 -285
- runbooks/finops/executive_export.py +203 -160
- runbooks/finops/helpers.py +130 -288
- runbooks/finops/iam_guidance.py +1 -1
- runbooks/finops/infrastructure/__init__.py +80 -0
- runbooks/finops/infrastructure/commands.py +506 -0
- runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
- runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
- runbooks/finops/markdown_exporter.py +337 -174
- runbooks/finops/mcp_validator.py +1952 -0
- runbooks/finops/nat_gateway_optimizer.py +1512 -481
- runbooks/finops/network_cost_optimizer.py +657 -587
- runbooks/finops/notebook_utils.py +226 -188
- runbooks/finops/optimization_engine.py +1136 -0
- runbooks/finops/optimizer.py +19 -23
- runbooks/finops/rds_snapshot_optimizer.py +367 -411
- runbooks/finops/reservation_optimizer.py +427 -363
- runbooks/finops/scenario_cli_integration.py +64 -65
- runbooks/finops/scenarios.py +1277 -438
- runbooks/finops/schemas.py +218 -182
- runbooks/finops/snapshot_manager.py +2289 -0
- runbooks/finops/types.py +3 -3
- runbooks/finops/validation_framework.py +259 -265
- runbooks/finops/vpc_cleanup_exporter.py +189 -144
- runbooks/finops/vpc_cleanup_optimizer.py +591 -573
- runbooks/finops/workspaces_analyzer.py +171 -182
- runbooks/integration/__init__.py +89 -0
- runbooks/integration/mcp_integration.py +1920 -0
- runbooks/inventory/CLAUDE.md +816 -0
- runbooks/inventory/__init__.py +2 -2
- runbooks/inventory/aws_decorators.py +2 -3
- runbooks/inventory/check_cloudtrail_compliance.py +2 -4
- runbooks/inventory/check_controltower_readiness.py +152 -151
- runbooks/inventory/check_landingzone_readiness.py +85 -84
- runbooks/inventory/cloud_foundations_integration.py +144 -149
- runbooks/inventory/collectors/aws_comprehensive.py +1 -1
- runbooks/inventory/collectors/aws_networking.py +109 -99
- runbooks/inventory/collectors/base.py +4 -0
- runbooks/inventory/core/collector.py +495 -313
- runbooks/inventory/core/formatter.py +11 -0
- runbooks/inventory/draw_org_structure.py +8 -9
- runbooks/inventory/drift_detection_cli.py +69 -96
- runbooks/inventory/ec2_vpc_utils.py +2 -2
- runbooks/inventory/find_cfn_drift_detection.py +5 -7
- runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
- runbooks/inventory/find_cfn_stackset_drift.py +5 -6
- runbooks/inventory/find_ec2_security_groups.py +48 -42
- runbooks/inventory/find_landingzone_versions.py +4 -6
- runbooks/inventory/find_vpc_flow_logs.py +7 -9
- runbooks/inventory/inventory_mcp_cli.py +48 -46
- runbooks/inventory/inventory_modules.py +103 -91
- runbooks/inventory/list_cfn_stacks.py +9 -10
- runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
- runbooks/inventory/list_cfn_stackset_operations.py +79 -57
- runbooks/inventory/list_cfn_stacksets.py +8 -10
- runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
- runbooks/inventory/list_ds_directories.py +65 -53
- runbooks/inventory/list_ec2_availability_zones.py +2 -4
- runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
- runbooks/inventory/list_ec2_instances.py +23 -28
- runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
- runbooks/inventory/list_elbs_load_balancers.py +22 -20
- runbooks/inventory/list_enis_network_interfaces.py +26 -33
- runbooks/inventory/list_guardduty_detectors.py +2 -4
- runbooks/inventory/list_iam_policies.py +2 -4
- runbooks/inventory/list_iam_roles.py +5 -7
- runbooks/inventory/list_iam_saml_providers.py +4 -6
- runbooks/inventory/list_lambda_functions.py +38 -38
- runbooks/inventory/list_org_accounts.py +6 -8
- runbooks/inventory/list_org_accounts_users.py +55 -44
- runbooks/inventory/list_rds_db_instances.py +31 -33
- runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
- runbooks/inventory/list_route53_hosted_zones.py +3 -5
- runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
- runbooks/inventory/list_sns_topics.py +2 -4
- runbooks/inventory/list_ssm_parameters.py +4 -7
- runbooks/inventory/list_vpc_subnets.py +2 -4
- runbooks/inventory/list_vpcs.py +7 -10
- runbooks/inventory/mcp_inventory_validator.py +554 -468
- runbooks/inventory/mcp_vpc_validator.py +359 -442
- runbooks/inventory/organizations_discovery.py +63 -55
- runbooks/inventory/recover_cfn_stack_ids.py +7 -8
- runbooks/inventory/requirements.txt +0 -1
- runbooks/inventory/rich_inventory_display.py +35 -34
- runbooks/inventory/run_on_multi_accounts.py +3 -5
- runbooks/inventory/unified_validation_engine.py +281 -253
- runbooks/inventory/verify_ec2_security_groups.py +1 -1
- runbooks/inventory/vpc_analyzer.py +735 -697
- runbooks/inventory/vpc_architecture_validator.py +293 -348
- runbooks/inventory/vpc_dependency_analyzer.py +384 -380
- runbooks/inventory/vpc_flow_analyzer.py +1 -1
- runbooks/main.py +49 -34
- runbooks/main_final.py +91 -60
- runbooks/main_minimal.py +22 -10
- runbooks/main_optimized.py +131 -100
- runbooks/main_ultra_minimal.py +7 -2
- runbooks/mcp/__init__.py +36 -0
- runbooks/mcp/integration.py +679 -0
- runbooks/monitoring/performance_monitor.py +9 -4
- runbooks/operate/dynamodb_operations.py +3 -1
- runbooks/operate/ec2_operations.py +145 -137
- runbooks/operate/iam_operations.py +146 -152
- runbooks/operate/networking_cost_heatmap.py +29 -8
- runbooks/operate/rds_operations.py +223 -254
- runbooks/operate/s3_operations.py +107 -118
- runbooks/operate/vpc_operations.py +646 -616
- runbooks/remediation/base.py +1 -1
- runbooks/remediation/commons.py +10 -7
- runbooks/remediation/commvault_ec2_analysis.py +70 -66
- runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
- runbooks/remediation/multi_account.py +24 -21
- runbooks/remediation/rds_snapshot_list.py +86 -60
- runbooks/remediation/remediation_cli.py +92 -146
- runbooks/remediation/universal_account_discovery.py +83 -79
- runbooks/remediation/workspaces_list.py +46 -41
- runbooks/security/__init__.py +19 -0
- runbooks/security/assessment_runner.py +1150 -0
- runbooks/security/baseline_checker.py +812 -0
- runbooks/security/cloudops_automation_security_validator.py +509 -535
- runbooks/security/compliance_automation_engine.py +17 -17
- runbooks/security/config/__init__.py +2 -2
- runbooks/security/config/compliance_config.py +50 -50
- runbooks/security/config_template_generator.py +63 -76
- runbooks/security/enterprise_security_framework.py +1 -1
- runbooks/security/executive_security_dashboard.py +519 -508
- runbooks/security/multi_account_security_controls.py +959 -1210
- runbooks/security/real_time_security_monitor.py +422 -444
- runbooks/security/security_baseline_tester.py +1 -1
- runbooks/security/security_cli.py +143 -112
- runbooks/security/test_2way_validation.py +439 -0
- runbooks/security/two_way_validation_framework.py +852 -0
- runbooks/sre/production_monitoring_framework.py +167 -177
- runbooks/tdd/__init__.py +15 -0
- runbooks/tdd/cli.py +1071 -0
- runbooks/utils/__init__.py +14 -17
- runbooks/utils/logger.py +7 -2
- runbooks/utils/version_validator.py +50 -47
- runbooks/validation/__init__.py +6 -6
- runbooks/validation/cli.py +9 -3
- runbooks/validation/comprehensive_2way_validator.py +745 -704
- runbooks/validation/mcp_validator.py +906 -228
- runbooks/validation/terraform_citations_validator.py +104 -115
- runbooks/validation/terraform_drift_detector.py +461 -454
- runbooks/vpc/README.md +617 -0
- runbooks/vpc/__init__.py +8 -1
- runbooks/vpc/analyzer.py +577 -0
- runbooks/vpc/cleanup_wrapper.py +476 -413
- runbooks/vpc/cli_cloudtrail_commands.py +339 -0
- runbooks/vpc/cli_mcp_validation_commands.py +480 -0
- runbooks/vpc/cloudtrail_audit_integration.py +717 -0
- runbooks/vpc/config.py +92 -97
- runbooks/vpc/cost_engine.py +411 -148
- runbooks/vpc/cost_explorer_integration.py +553 -0
- runbooks/vpc/cross_account_session.py +101 -106
- runbooks/vpc/enhanced_mcp_validation.py +917 -0
- runbooks/vpc/eni_gate_validator.py +961 -0
- runbooks/vpc/heatmap_engine.py +185 -160
- runbooks/vpc/mcp_no_eni_validator.py +680 -639
- runbooks/vpc/nat_gateway_optimizer.py +358 -0
- runbooks/vpc/networking_wrapper.py +15 -8
- runbooks/vpc/pdca_remediation_planner.py +528 -0
- runbooks/vpc/performance_optimized_analyzer.py +219 -231
- runbooks/vpc/runbooks_adapter.py +1167 -241
- runbooks/vpc/tdd_red_phase_stubs.py +601 -0
- runbooks/vpc/test_data_loader.py +358 -0
- runbooks/vpc/tests/conftest.py +314 -4
- runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
- runbooks/vpc/tests/test_cost_engine.py +0 -2
- runbooks/vpc/topology_generator.py +326 -0
- runbooks/vpc/unified_scenarios.py +1297 -1124
- runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
- runbooks-1.1.6.dist-info/METADATA +327 -0
- runbooks-1.1.6.dist-info/RECORD +489 -0
- runbooks/finops/README.md +0 -414
- runbooks/finops/accuracy_cross_validator.py +0 -647
- runbooks/finops/business_cases.py +0 -950
- runbooks/finops/dashboard_router.py +0 -922
- runbooks/finops/ebs_optimizer.py +0 -973
- runbooks/finops/embedded_mcp_validator.py +0 -1629
- runbooks/finops/enhanced_dashboard_runner.py +0 -527
- runbooks/finops/finops_dashboard.py +0 -584
- runbooks/finops/finops_scenarios.py +0 -1218
- runbooks/finops/legacy_migration.py +0 -730
- runbooks/finops/multi_dashboard.py +0 -1519
- runbooks/finops/single_dashboard.py +0 -1113
- runbooks/finops/unlimited_scenarios.py +0 -393
- runbooks-1.1.4.dist-info/METADATA +0 -800
- runbooks-1.1.4.dist-info/RECORD +0 -468
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
- {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,
|
27
|
-
|
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,
|
31
|
-
|
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(
|
115
|
+
sts = self.session.client("sts")
|
102
116
|
identity = sts.get_caller_identity()
|
103
|
-
|
104
|
-
self.account_id = identity.get(
|
105
|
-
self.user_arn = identity.get(
|
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 =
|
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=
|
143
|
+
client = self.session.client(service_name, region_name="us-east-1")
|
130
144
|
response = client.describe_regions()
|
131
|
-
self.available_regions = [region[
|
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,
|
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,
|
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,
|
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
|
+
}
|