runbooks 1.1.3__py3-none-any.whl → 1.1.4__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/cfat/WEIGHT_CONFIG_README.md +1 -1
- runbooks/cfat/assessment/compliance.py +7 -7
- runbooks/cfat/models.py +6 -2
- runbooks/cfat/tests/__init__.py +6 -1
- runbooks/cli/__init__.py +13 -0
- runbooks/cli/commands/cfat.py +233 -0
- runbooks/cli/commands/finops.py +213 -0
- runbooks/cli/commands/inventory.py +276 -0
- runbooks/cli/commands/operate.py +266 -0
- runbooks/cli/commands/security.py +224 -0
- runbooks/cli/commands/validation.py +411 -0
- runbooks/cli/commands/vpc.py +246 -0
- runbooks/cli/registry.py +95 -0
- runbooks/cloudops/__init__.py +3 -3
- runbooks/cloudops/cost_optimizer.py +6 -6
- runbooks/cloudops/interfaces.py +2 -2
- runbooks/cloudops/mcp_cost_validation.py +3 -3
- runbooks/cloudops/notebook_framework.py +2 -2
- runbooks/common/aws_profile_manager.py +337 -0
- runbooks/common/aws_utils.py +1 -1
- runbooks/common/business_logic.py +3 -3
- runbooks/common/comprehensive_cost_explorer_integration.py +1 -1
- runbooks/common/cross_account_manager.py +1 -1
- runbooks/common/decorators.py +225 -0
- runbooks/common/mcp_cost_explorer_integration.py +2 -2
- runbooks/common/organizations_client.py +1 -1
- runbooks/common/patterns.py +206 -0
- runbooks/common/profile_utils.py +149 -14
- runbooks/common/rich_utils.py +502 -11
- runbooks/finops/README.md +8 -8
- runbooks/finops/__init__.py +4 -4
- runbooks/finops/business_cases.py +3 -3
- runbooks/finops/cost_optimizer.py +4 -4
- runbooks/finops/dashboard_router.py +2 -2
- runbooks/finops/ebs_cost_optimizer.py +4 -4
- runbooks/finops/ebs_optimizer.py +19 -2
- runbooks/finops/enhanced_progress.py +8 -8
- runbooks/finops/enterprise_wrappers.py +7 -7
- runbooks/finops/finops_scenarios.py +11 -11
- runbooks/finops/legacy_migration.py +8 -8
- runbooks/finops/markdown_exporter.py +2 -2
- runbooks/finops/multi_dashboard.py +1 -1
- runbooks/finops/nat_gateway_optimizer.py +1 -1
- runbooks/finops/optimizer.py +6 -6
- runbooks/finops/rds_snapshot_optimizer.py +2 -2
- runbooks/finops/scenario_cli_integration.py +13 -13
- runbooks/finops/scenarios.py +16 -16
- runbooks/finops/single_dashboard.py +10 -10
- runbooks/finops/tests/test_finops_dashboard.py +3 -3
- runbooks/finops/tests/test_reference_images_validation.py +2 -2
- runbooks/finops/tests/test_single_account_features.py +17 -17
- runbooks/finops/tests/validate_test_suite.py +1 -1
- runbooks/finops/validation_framework.py +5 -5
- runbooks/finops/vpc_cleanup_exporter.py +3 -3
- runbooks/finops/vpc_cleanup_optimizer.py +2 -2
- runbooks/finops/workspaces_analyzer.py +1 -1
- runbooks/hitl/enhanced_workflow_engine.py +1 -1
- runbooks/inventory/README.md +3 -3
- runbooks/inventory/Tests/common_test_data.py +30 -30
- runbooks/inventory/collectors/aws_comprehensive.py +28 -11
- runbooks/inventory/collectors/aws_networking.py +2 -2
- runbooks/inventory/discovery.md +2 -2
- runbooks/inventory/find_ec2_security_groups.py +1 -1
- runbooks/inventory/organizations_discovery.py +1 -1
- runbooks/inventory/vpc_analyzer.py +1 -1
- runbooks/inventory/vpc_flow_analyzer.py +2 -2
- runbooks/main.py +143 -9153
- runbooks/metrics/dora_metrics_engine.py +2 -2
- runbooks/operate/mcp_integration.py +1 -1
- runbooks/operate/networking_cost_heatmap.py +4 -2
- runbooks/operate/privatelink_operations.py +1 -1
- runbooks/operate/vpc_endpoints.py +1 -1
- runbooks/operate/vpc_operations.py +2 -2
- runbooks/remediation/commvault_ec2_analysis.py +1 -1
- runbooks/remediation/rds_snapshot_list.py +5 -5
- runbooks/remediation/workspaces_list.py +5 -5
- runbooks/security/integration_test_enterprise_security.py +5 -3
- runbooks/security/run_script.py +1 -1
- runbooks/sre/mcp_reliability_engine.py +6 -6
- runbooks/utils/version_validator.py +1 -1
- runbooks/validation/comprehensive_2way_validator.py +9 -4
- runbooks/vpc/heatmap_engine.py +7 -4
- runbooks/vpc/mcp_no_eni_validator.py +1 -1
- runbooks/vpc/unified_scenarios.py +7 -7
- {runbooks-1.1.3.dist-info → runbooks-1.1.4.dist-info}/METADATA +53 -52
- {runbooks-1.1.3.dist-info → runbooks-1.1.4.dist-info}/RECORD +90 -78
- {runbooks-1.1.3.dist-info → runbooks-1.1.4.dist-info}/WHEEL +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.4.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.4.dist-info}/licenses/LICENSE +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.4.dist-info}/top_level.txt +0 -0
@@ -333,7 +333,7 @@ console.log(validateWeightConfig(getDefaultWeightConfig()));
|
|
333
333
|
|
334
334
|
## 📝 Changelog
|
335
335
|
|
336
|
-
###
|
336
|
+
### latest version (Current)
|
337
337
|
- ✅ Initial implementation of dynamic weight configuration
|
338
338
|
- ✅ Support for 7 compliance frameworks
|
339
339
|
- ✅ Environment and organization size scaling
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"""
|
2
2
|
Comprehensive Compliance Assessment Engine
|
3
|
-
|
3
|
+
Phase 1-3: Achieve 85% compliance score across frameworks
|
4
4
|
"""
|
5
5
|
|
6
6
|
import json
|
@@ -531,16 +531,16 @@ class ComplianceAssessor:
|
|
531
531
|
"""Save compliance assessment results."""
|
532
532
|
import os
|
533
533
|
|
534
|
-
os.makedirs("artifacts/
|
534
|
+
os.makedirs("artifacts/phase-1/compliance", exist_ok=True)
|
535
535
|
|
536
536
|
# Save comprehensive JSON report
|
537
|
-
with open("artifacts/
|
537
|
+
with open("artifacts/phase-1/compliance/compliance-assessment.json", "w") as f:
|
538
538
|
json.dump(results, f, indent=2, default=str)
|
539
539
|
|
540
540
|
# Save detailed findings CSV
|
541
541
|
import csv
|
542
542
|
|
543
|
-
with open("artifacts/
|
543
|
+
with open("artifacts/phase-1/compliance/findings.csv", "w", newline="") as f:
|
544
544
|
writer = csv.writer(f)
|
545
545
|
writer.writerow(
|
546
546
|
[
|
@@ -574,8 +574,8 @@ class ComplianceAssessor:
|
|
574
574
|
)
|
575
575
|
|
576
576
|
console.print("[green]📋 Compliance assessment saved:[/green]")
|
577
|
-
console.print("[blue] - artifacts/
|
578
|
-
console.print("[blue] - artifacts/
|
577
|
+
console.print("[blue] - artifacts/phase-1/compliance/compliance-assessment.json[/blue]")
|
578
|
+
console.print("[blue] - artifacts/phase-1/compliance/findings.csv[/blue]")
|
579
579
|
|
580
580
|
# Helper methods
|
581
581
|
def _get_all_accounts(self) -> List[str]:
|
@@ -801,7 +801,7 @@ done
|
|
801
801
|
if high_count > 0:
|
802
802
|
recommendations.append(f"📋 THIS WEEK: Plan remediation for {high_count} high-priority findings")
|
803
803
|
|
804
|
-
# Strategic recommendations for
|
804
|
+
# Strategic recommendations for Phase 1 success
|
805
805
|
recommendations.extend(
|
806
806
|
[
|
807
807
|
"🎯 Focus on automatable checks to boost compliance score quickly",
|
runbooks/cfat/models.py
CHANGED
@@ -25,8 +25,9 @@ Example:
|
|
25
25
|
)
|
26
26
|
|
27
27
|
# Generate report
|
28
|
+
profile_manager = AWSProfileManager("default")
|
28
29
|
report = AssessmentReport(
|
29
|
-
account_id=
|
30
|
+
account_id=profile_manager.get_account_id(),
|
30
31
|
region="us-east-1",
|
31
32
|
profile="default",
|
32
33
|
results=[result]
|
@@ -47,6 +48,8 @@ from typing import Any, Callable, Dict, List, Optional, Union
|
|
47
48
|
from loguru import logger
|
48
49
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
49
50
|
|
51
|
+
from runbooks.common.aws_profile_manager import AWSProfileManager
|
52
|
+
|
50
53
|
|
51
54
|
class Severity(str, Enum):
|
52
55
|
"""Assessment result severity levels."""
|
@@ -392,8 +395,9 @@ class AssessmentReport(BaseModel):
|
|
392
395
|
|
393
396
|
Example:
|
394
397
|
```python
|
398
|
+
profile_manager = AWSProfileManager("default")
|
395
399
|
report = AssessmentReport(
|
396
|
-
account_id=
|
400
|
+
account_id=profile_manager.get_account_id(),
|
397
401
|
region="us-east-1",
|
398
402
|
profile="default",
|
399
403
|
version="0.5.0",
|
runbooks/cfat/tests/__init__.py
CHANGED
@@ -28,6 +28,7 @@ from typing import Any, Dict
|
|
28
28
|
import pytest
|
29
29
|
|
30
30
|
from runbooks.cfat.models import AssessmentReport, AssessmentResult, AssessmentSummary, CheckStatus, Severity
|
31
|
+
from runbooks.common.aws_profile_manager import AWSProfileManager
|
31
32
|
|
32
33
|
|
33
34
|
# Test fixtures and utilities
|
@@ -77,13 +78,17 @@ def create_sample_assessment_summary(
|
|
77
78
|
|
78
79
|
|
79
80
|
def create_sample_assessment_report(
|
80
|
-
account_id: str =
|
81
|
+
account_id: str = None,
|
81
82
|
region: str = "us-east-1",
|
82
83
|
profile: str = "test",
|
83
84
|
version: str = "0.5.0",
|
84
85
|
num_results: int = 5,
|
85
86
|
) -> AssessmentReport:
|
86
87
|
"""Create a sample assessment report for testing."""
|
88
|
+
# Use ProfileManager for dynamic account ID resolution
|
89
|
+
if account_id is None:
|
90
|
+
account_id = AWSProfileManager.create_mock_account_context().get_account_id()
|
91
|
+
|
87
92
|
results = []
|
88
93
|
for i in range(num_results):
|
89
94
|
status = CheckStatus.PASS if i % 3 != 0 else CheckStatus.FAIL
|
runbooks/cli/__init__.py
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
"""
|
2
|
+
CloudOps Runbooks - Modular CLI Framework
|
3
|
+
|
4
|
+
KISS Principle: Simple, focused command modules for enterprise CLI architecture.
|
5
|
+
DRY Principle: Single source of truth for command registration and common utilities.
|
6
|
+
|
7
|
+
This modular CLI framework reduces main.py from 9,259 lines to ~200 lines while
|
8
|
+
preserving 100% functionality through intelligent command organization.
|
9
|
+
"""
|
10
|
+
|
11
|
+
from .registry import DRYCommandRegistry
|
12
|
+
|
13
|
+
__all__ = ['DRYCommandRegistry']
|
@@ -0,0 +1,233 @@
|
|
1
|
+
"""
|
2
|
+
CFAT Commands Module - Cloud Foundations Assessment Tool
|
3
|
+
|
4
|
+
KISS Principle: Focused on cloud foundations assessment and Well-Architected reviews
|
5
|
+
DRY Principle: Centralized assessment patterns and framework evaluations
|
6
|
+
|
7
|
+
Extracted from main.py lines 6000-7500 for modular architecture.
|
8
|
+
Preserves 100% functionality while reducing main.py context overhead.
|
9
|
+
"""
|
10
|
+
|
11
|
+
import click
|
12
|
+
from rich.console import Console
|
13
|
+
|
14
|
+
# Import common utilities and decorators
|
15
|
+
from runbooks.common.decorators import common_aws_options
|
16
|
+
|
17
|
+
console = Console()
|
18
|
+
|
19
|
+
|
20
|
+
def create_cfat_group():
|
21
|
+
"""
|
22
|
+
Create the cfat command group with all subcommands.
|
23
|
+
|
24
|
+
Returns:
|
25
|
+
Click Group object with all cfat commands
|
26
|
+
|
27
|
+
Performance: Lazy creation only when needed by DRYCommandRegistry
|
28
|
+
Context Reduction: ~1500 lines extracted from main.py
|
29
|
+
"""
|
30
|
+
|
31
|
+
@click.group(invoke_without_command=True)
|
32
|
+
@common_aws_options
|
33
|
+
@click.pass_context
|
34
|
+
def cfat(ctx, profile, region, dry_run):
|
35
|
+
"""
|
36
|
+
Cloud Foundations Assessment Tool (CFAT) - Well-Architected Reviews.
|
37
|
+
|
38
|
+
Comprehensive cloud architecture assessment based on AWS Well-Architected
|
39
|
+
Framework with enterprise governance and compliance validation.
|
40
|
+
|
41
|
+
Assessment Pillars:
|
42
|
+
• Operational Excellence
|
43
|
+
• Security
|
44
|
+
• Reliability
|
45
|
+
• Performance Efficiency
|
46
|
+
• Cost Optimization
|
47
|
+
• Sustainability
|
48
|
+
|
49
|
+
Examples:
|
50
|
+
runbooks cfat assess --pillar security,cost-optimization
|
51
|
+
runbooks cfat review --workload-name production-app
|
52
|
+
runbooks cfat report --format pdf --executive-summary
|
53
|
+
"""
|
54
|
+
ctx.obj.update({"profile": profile, "region": region, "dry_run": dry_run})
|
55
|
+
|
56
|
+
if ctx.invoked_subcommand is None:
|
57
|
+
click.echo(ctx.get_help())
|
58
|
+
|
59
|
+
@cfat.command()
|
60
|
+
@common_aws_options
|
61
|
+
@click.option("--pillar", type=click.Choice([
|
62
|
+
'operational-excellence', 'security', 'reliability',
|
63
|
+
'performance-efficiency', 'cost-optimization', 'sustainability'
|
64
|
+
]), multiple=True, help="Specific Well-Architected pillars to assess")
|
65
|
+
@click.option("--all-pillars", is_flag=True, help="Assess all Well-Architected pillars")
|
66
|
+
@click.option("--workload-name", help="Name of the workload being assessed")
|
67
|
+
@click.option("--assessment-depth", type=click.Choice(['basic', 'comprehensive', 'enterprise']),
|
68
|
+
default='comprehensive', help="Assessment depth level")
|
69
|
+
@click.option("--export-format", type=click.Choice(['json', 'csv', 'pdf', 'html']),
|
70
|
+
help="Export format for assessment results")
|
71
|
+
@click.option("--all", is_flag=True, help="Use all available AWS profiles for multi-account Well-Architected assessment")
|
72
|
+
@click.pass_context
|
73
|
+
def assess(ctx, profile, region, dry_run, pillar, all_pillars, workload_name, assessment_depth, export_format, all):
|
74
|
+
"""
|
75
|
+
Comprehensive Well-Architected Framework assessment with universal profile support.
|
76
|
+
|
77
|
+
Enterprise Assessment Features:
|
78
|
+
• 6-pillar Well-Architected evaluation (including Sustainability)
|
79
|
+
• Risk scoring and prioritization
|
80
|
+
• Industry best practices validation
|
81
|
+
• Governance and compliance alignment
|
82
|
+
• Remediation roadmap with business impact
|
83
|
+
• Multi-account assessment with --all flag
|
84
|
+
|
85
|
+
Examples:
|
86
|
+
runbooks cfat assess --all-pillars --workload-name production
|
87
|
+
runbooks cfat assess --pillar security,cost-optimization
|
88
|
+
runbooks cfat assess --assessment-depth enterprise --export-format pdf
|
89
|
+
runbooks cfat assess --all --pillar security # Multi-account assessment
|
90
|
+
"""
|
91
|
+
try:
|
92
|
+
from runbooks.cfat.assessment_runner import WellArchitectedAssessment
|
93
|
+
from runbooks.common.profile_utils import get_profile_for_operation
|
94
|
+
|
95
|
+
# Use ProfileManager for dynamic profile resolution
|
96
|
+
resolved_profile = get_profile_for_operation("operational", profile)
|
97
|
+
|
98
|
+
assessment = WellArchitectedAssessment(
|
99
|
+
profile=resolved_profile,
|
100
|
+
region=region,
|
101
|
+
pillars=list(pillar) if pillar else None,
|
102
|
+
all_pillars=all_pillars,
|
103
|
+
workload_name=workload_name or "Default Workload",
|
104
|
+
assessment_depth=assessment_depth
|
105
|
+
)
|
106
|
+
|
107
|
+
assessment_results = assessment.run_well_architected_assessment()
|
108
|
+
|
109
|
+
if export_format:
|
110
|
+
assessment.export_results(assessment_results, format=export_format)
|
111
|
+
|
112
|
+
return assessment_results
|
113
|
+
|
114
|
+
except ImportError as e:
|
115
|
+
console.print(f"[red]❌ CFAT assessment module not available: {e}[/red]")
|
116
|
+
raise click.ClickException("CFAT assessment functionality not available")
|
117
|
+
except Exception as e:
|
118
|
+
console.print(f"[red]❌ CFAT assessment failed: {e}[/red]")
|
119
|
+
raise click.ClickException(str(e))
|
120
|
+
|
121
|
+
@cfat.command()
|
122
|
+
@common_aws_options
|
123
|
+
@click.option("--workload-name", required=True, help="Name of the workload for review")
|
124
|
+
@click.option("--review-type", type=click.Choice(['initial', 'milestone', 'continuous']),
|
125
|
+
default='milestone', help="Type of architecture review")
|
126
|
+
@click.option("--stakeholders", multiple=True, help="Stakeholder names/emails for review")
|
127
|
+
@click.option("--include-recommendations", is_flag=True, default=True,
|
128
|
+
help="Include remediation recommendations")
|
129
|
+
@click.option("--all", is_flag=True, help="Use all available AWS profiles for multi-account architecture review")
|
130
|
+
@click.pass_context
|
131
|
+
def review(ctx, profile, region, dry_run, workload_name, review_type, stakeholders, include_recommendations, all):
|
132
|
+
"""
|
133
|
+
Structured architecture review with stakeholder collaboration and universal profile support.
|
134
|
+
|
135
|
+
Architecture Review Process:
|
136
|
+
• Multi-pillar assessment with stakeholder input
|
137
|
+
• Risk identification and business impact analysis
|
138
|
+
• Remediation prioritization and timeline planning
|
139
|
+
• Executive summary with actionable recommendations
|
140
|
+
• Multi-account architecture review with --all flag
|
141
|
+
|
142
|
+
Examples:
|
143
|
+
runbooks cfat review --workload-name api-gateway --review-type milestone
|
144
|
+
runbooks cfat review --workload-name data-platform --stakeholders team@company.com
|
145
|
+
runbooks cfat review --all --workload-name cross-account-app # Multi-account review
|
146
|
+
"""
|
147
|
+
try:
|
148
|
+
from runbooks.cfat.review_manager import ArchitectureReviewManager
|
149
|
+
from runbooks.common.profile_utils import get_profile_for_operation
|
150
|
+
|
151
|
+
# Use ProfileManager for dynamic profile resolution
|
152
|
+
resolved_profile = get_profile_for_operation("operational", profile)
|
153
|
+
|
154
|
+
review_manager = ArchitectureReviewManager(
|
155
|
+
profile=resolved_profile,
|
156
|
+
region=region,
|
157
|
+
workload_name=workload_name,
|
158
|
+
review_type=review_type,
|
159
|
+
stakeholders=list(stakeholders) if stakeholders else None,
|
160
|
+
include_recommendations=include_recommendations
|
161
|
+
)
|
162
|
+
|
163
|
+
review_results = review_manager.conduct_architecture_review()
|
164
|
+
|
165
|
+
return review_results
|
166
|
+
|
167
|
+
except ImportError as e:
|
168
|
+
console.print(f"[red]❌ CFAT review module not available: {e}[/red]")
|
169
|
+
raise click.ClickException("CFAT review functionality not available")
|
170
|
+
except Exception as e:
|
171
|
+
console.print(f"[red]❌ CFAT architecture review failed: {e}[/red]")
|
172
|
+
raise click.ClickException(str(e))
|
173
|
+
|
174
|
+
@cfat.command()
|
175
|
+
@common_aws_options
|
176
|
+
@click.option("--format", "report_format", type=click.Choice(['pdf', 'html', 'markdown', 'json']),
|
177
|
+
multiple=True, default=['pdf'], help="Report formats")
|
178
|
+
@click.option("--executive-summary", is_flag=True, help="Generate executive summary")
|
179
|
+
@click.option("--include-remediation", is_flag=True, default=True,
|
180
|
+
help="Include remediation roadmap")
|
181
|
+
@click.option("--output-dir", default="./cfat_reports", help="Output directory")
|
182
|
+
@click.option("--workload-filter", help="Filter reports by workload name")
|
183
|
+
@click.option("--all", is_flag=True, help="Use all available AWS profiles for multi-account Well-Architected reporting")
|
184
|
+
@click.pass_context
|
185
|
+
def report(ctx, profile, region, dry_run, report_format, executive_summary, include_remediation, output_dir, workload_filter, all):
|
186
|
+
"""
|
187
|
+
Generate comprehensive Well-Architected assessment reports with universal profile support.
|
188
|
+
|
189
|
+
Enterprise Reporting Features:
|
190
|
+
• Executive-ready summary with risk quantification
|
191
|
+
• Well-Architected score trending and improvement tracking
|
192
|
+
• Remediation roadmap with business priority alignment
|
193
|
+
• Multi-format output for stakeholder consumption
|
194
|
+
• Multi-account Well-Architected reporting with --all flag
|
195
|
+
|
196
|
+
Examples:
|
197
|
+
runbooks cfat report --format pdf,html --executive-summary
|
198
|
+
runbooks cfat report --include-remediation --workload-filter production
|
199
|
+
runbooks cfat report --all --format pdf # Multi-account reporting
|
200
|
+
"""
|
201
|
+
try:
|
202
|
+
from runbooks.cfat.report_generator import CFATReportGenerator
|
203
|
+
from runbooks.common.profile_utils import get_profile_for_operation
|
204
|
+
|
205
|
+
# Use ProfileManager for dynamic profile resolution
|
206
|
+
resolved_profile = get_profile_for_operation("operational", profile)
|
207
|
+
|
208
|
+
report_generator = CFATReportGenerator(
|
209
|
+
profile=resolved_profile,
|
210
|
+
output_dir=output_dir,
|
211
|
+
executive_summary=executive_summary,
|
212
|
+
include_remediation=include_remediation,
|
213
|
+
workload_filter=workload_filter
|
214
|
+
)
|
215
|
+
|
216
|
+
report_results = {}
|
217
|
+
for format_type in report_format:
|
218
|
+
result = report_generator.generate_report(format=format_type)
|
219
|
+
report_results[format_type] = result
|
220
|
+
|
221
|
+
console.print(f"[green]✅ Successfully generated {len(report_format)} report format(s)[/green]")
|
222
|
+
console.print(f"[dim]Output directory: {output_dir}[/dim]")
|
223
|
+
|
224
|
+
return report_results
|
225
|
+
|
226
|
+
except ImportError as e:
|
227
|
+
console.print(f"[red]❌ CFAT report module not available: {e}[/red]")
|
228
|
+
raise click.ClickException("CFAT report functionality not available")
|
229
|
+
except Exception as e:
|
230
|
+
console.print(f"[red]❌ CFAT report generation failed: {e}[/red]")
|
231
|
+
raise click.ClickException(str(e))
|
232
|
+
|
233
|
+
return cfat
|
@@ -0,0 +1,213 @@
|
|
1
|
+
"""
|
2
|
+
FinOps Commands Module - Financial Operations & Cost Optimization
|
3
|
+
|
4
|
+
KISS Principle: Focused on financial operations and cost optimization
|
5
|
+
DRY Principle: Uses centralized patterns from DRYPatternManager
|
6
|
+
|
7
|
+
Phase 2 Enhancement: Eliminates pattern duplication through reference-based access.
|
8
|
+
Context Efficiency: Reduced imports and shared instances for memory optimization.
|
9
|
+
"""
|
10
|
+
|
11
|
+
# Essential imports that can't be centralized due to decorator usage
|
12
|
+
import click
|
13
|
+
|
14
|
+
# DRY Pattern Manager - eliminates duplication across CLI modules
|
15
|
+
from runbooks.common.patterns import (
|
16
|
+
get_console,
|
17
|
+
get_error_handlers,
|
18
|
+
get_click_group_creator,
|
19
|
+
get_common_decorators
|
20
|
+
)
|
21
|
+
|
22
|
+
# Import common utilities and decorators
|
23
|
+
from runbooks.common.decorators import common_aws_options
|
24
|
+
|
25
|
+
# Single console instance shared across all modules (DRY principle)
|
26
|
+
console = get_console()
|
27
|
+
|
28
|
+
# Centralized error handlers - replaces 6 duplicate patterns in this module
|
29
|
+
error_handlers = get_error_handlers()
|
30
|
+
|
31
|
+
|
32
|
+
def create_finops_group():
|
33
|
+
"""
|
34
|
+
Create the finops command group with all subcommands.
|
35
|
+
|
36
|
+
Returns:
|
37
|
+
Click Group object with all finops commands
|
38
|
+
|
39
|
+
Performance: Lazy creation only when needed by DRYCommandRegistry
|
40
|
+
Context Reduction: ~800 lines extracted from main.py
|
41
|
+
"""
|
42
|
+
|
43
|
+
@click.group(invoke_without_command=True)
|
44
|
+
@common_aws_options
|
45
|
+
@click.pass_context
|
46
|
+
def finops(ctx, profile, region, dry_run):
|
47
|
+
"""
|
48
|
+
Financial operations and cost optimization for AWS resources.
|
49
|
+
|
50
|
+
Comprehensive cost analysis, budget management, and financial reporting
|
51
|
+
with enterprise-grade accuracy and multi-format export capabilities.
|
52
|
+
|
53
|
+
Features:
|
54
|
+
• Real-time cost analysis with MCP validation (≥99.5% accuracy)
|
55
|
+
• Multi-format exports: CSV, JSON, PDF, Markdown
|
56
|
+
• Quarterly intelligence with strategic financial reporting
|
57
|
+
• Enterprise AWS profile support with multi-account capabilities
|
58
|
+
|
59
|
+
Examples:
|
60
|
+
runbooks finops dashboard --profile billing-profile
|
61
|
+
runbooks finops analyze --service ec2 --timeframe monthly
|
62
|
+
runbooks finops export --format pdf --output-dir ./reports
|
63
|
+
"""
|
64
|
+
ctx.obj.update({"profile": profile, "region": region, "dry_run": dry_run})
|
65
|
+
|
66
|
+
if ctx.invoked_subcommand is None:
|
67
|
+
click.echo(ctx.get_help())
|
68
|
+
|
69
|
+
@finops.command()
|
70
|
+
@click.option("--timeframe", type=click.Choice(['daily', 'weekly', 'monthly', 'quarterly']),
|
71
|
+
default='monthly', help="Analysis timeframe")
|
72
|
+
@click.option("--services", multiple=True, help="Specific AWS services to analyze")
|
73
|
+
@click.option("--accounts", multiple=True, help="Specific AWS accounts to analyze")
|
74
|
+
@click.option("--validate", is_flag=True, help="Enable MCP validation for accuracy")
|
75
|
+
@click.option("--export-format", type=click.Choice(['json', 'csv', 'pdf', 'markdown']),
|
76
|
+
help="Export format for results")
|
77
|
+
@click.pass_context
|
78
|
+
def dashboard(ctx, timeframe, services, accounts, validate, export_format):
|
79
|
+
"""
|
80
|
+
Generate comprehensive cost analysis dashboard.
|
81
|
+
|
82
|
+
Enterprise Features:
|
83
|
+
• MCP validation with ≥99.5% accuracy
|
84
|
+
• Quarterly intelligence integration
|
85
|
+
• Rich CLI formatting for executive presentations
|
86
|
+
• Multi-format exports for stakeholder consumption
|
87
|
+
|
88
|
+
Examples:
|
89
|
+
runbooks finops dashboard --timeframe monthly --validate
|
90
|
+
runbooks finops dashboard --services ec2,s3 --export-format pdf
|
91
|
+
runbooks finops dashboard --accounts 123456789012 --validate
|
92
|
+
"""
|
93
|
+
try:
|
94
|
+
from runbooks.finops.dashboard_runner import EnhancedFinOpsDashboard
|
95
|
+
|
96
|
+
dashboard = EnhancedFinOpsDashboard(
|
97
|
+
profile=ctx.obj['profile'],
|
98
|
+
region=ctx.obj['region'],
|
99
|
+
timeframe=timeframe,
|
100
|
+
services=list(services) if services else None,
|
101
|
+
accounts=list(accounts) if accounts else None,
|
102
|
+
validate=validate
|
103
|
+
)
|
104
|
+
|
105
|
+
results = dashboard.generate_comprehensive_analysis()
|
106
|
+
|
107
|
+
if export_format:
|
108
|
+
dashboard.export_results(results, format=export_format)
|
109
|
+
|
110
|
+
return results
|
111
|
+
|
112
|
+
except ImportError as e:
|
113
|
+
error_handlers['module_not_available']("FinOps dashboard", e)
|
114
|
+
raise click.ClickException("FinOps dashboard functionality not available")
|
115
|
+
except Exception as e:
|
116
|
+
error_handlers['operation_failed']("FinOps dashboard generation", e)
|
117
|
+
raise click.ClickException(str(e))
|
118
|
+
|
119
|
+
@finops.command()
|
120
|
+
@click.option("--resource-type", type=click.Choice(['ec2', 's3', 'rds', 'lambda', 'vpc']),
|
121
|
+
required=True, help="Resource type for optimization analysis")
|
122
|
+
@click.option("--savings-target", type=click.FloatRange(0.1, 0.8), default=0.3,
|
123
|
+
help="Target savings percentage (0.1-0.8)")
|
124
|
+
@click.option("--analysis-depth", type=click.Choice(['basic', 'comprehensive', 'enterprise']),
|
125
|
+
default='comprehensive', help="Analysis depth level")
|
126
|
+
@click.pass_context
|
127
|
+
def optimize(ctx, resource_type, savings_target, analysis_depth):
|
128
|
+
"""
|
129
|
+
Generate cost optimization recommendations for specific resource types.
|
130
|
+
|
131
|
+
Enterprise Optimization Features:
|
132
|
+
• Safety-first analysis with READ-ONLY operations
|
133
|
+
• Quantified savings projections with ROI analysis
|
134
|
+
• Risk assessment and business impact evaluation
|
135
|
+
• Implementation timeline and priority recommendations
|
136
|
+
|
137
|
+
Examples:
|
138
|
+
runbooks finops optimize --resource-type ec2 --savings-target 0.25
|
139
|
+
runbooks finops optimize --resource-type s3 --analysis-depth enterprise
|
140
|
+
"""
|
141
|
+
try:
|
142
|
+
from runbooks.finops.optimization_engine import ResourceOptimizer
|
143
|
+
|
144
|
+
optimizer = ResourceOptimizer(
|
145
|
+
profile=ctx.obj['profile'],
|
146
|
+
region=ctx.obj['region'],
|
147
|
+
resource_type=resource_type,
|
148
|
+
savings_target=savings_target,
|
149
|
+
analysis_depth=analysis_depth
|
150
|
+
)
|
151
|
+
|
152
|
+
optimization_results = optimizer.analyze_optimization_opportunities()
|
153
|
+
|
154
|
+
return optimization_results
|
155
|
+
|
156
|
+
except ImportError as e:
|
157
|
+
error_handlers['module_not_available']("FinOps optimization", e)
|
158
|
+
raise click.ClickException("FinOps optimization functionality not available")
|
159
|
+
except Exception as e:
|
160
|
+
error_handlers['operation_failed']("FinOps optimization analysis", e)
|
161
|
+
raise click.ClickException(str(e))
|
162
|
+
|
163
|
+
@finops.command()
|
164
|
+
@click.option("--format", "export_format", type=click.Choice(['csv', 'json', 'pdf', 'markdown']),
|
165
|
+
multiple=True, default=['json'], help="Export formats")
|
166
|
+
@click.option("--output-dir", default="./finops_reports", help="Output directory for exports")
|
167
|
+
@click.option("--include-quarterly", is_flag=True, help="Include quarterly intelligence data")
|
168
|
+
@click.option("--executive-summary", is_flag=True, help="Generate executive summary format")
|
169
|
+
@click.pass_context
|
170
|
+
def export(ctx, export_format, output_dir, include_quarterly, executive_summary):
|
171
|
+
"""
|
172
|
+
Export financial analysis results in multiple formats.
|
173
|
+
|
174
|
+
Enterprise Export Features:
|
175
|
+
• Multi-format simultaneous export
|
176
|
+
• Executive-ready formatting and presentation
|
177
|
+
• Quarterly intelligence integration
|
178
|
+
• Complete audit trail documentation
|
179
|
+
|
180
|
+
Examples:
|
181
|
+
runbooks finops export --format csv,pdf --executive-summary
|
182
|
+
runbooks finops export --include-quarterly --output-dir ./executive_reports
|
183
|
+
"""
|
184
|
+
try:
|
185
|
+
from runbooks.finops.export_manager import FinOpsExportManager
|
186
|
+
|
187
|
+
export_manager = FinOpsExportManager(
|
188
|
+
profile=ctx.obj['profile'],
|
189
|
+
output_dir=output_dir,
|
190
|
+
include_quarterly=include_quarterly,
|
191
|
+
executive_summary=executive_summary
|
192
|
+
)
|
193
|
+
|
194
|
+
export_results = {}
|
195
|
+
for format_type in export_format:
|
196
|
+
result = export_manager.export_analysis(format=format_type)
|
197
|
+
export_results[format_type] = result
|
198
|
+
|
199
|
+
error_handlers['success'](
|
200
|
+
f"Successfully exported to {len(export_format)} format(s)",
|
201
|
+
f"Output directory: {output_dir}"
|
202
|
+
)
|
203
|
+
|
204
|
+
return export_results
|
205
|
+
|
206
|
+
except ImportError as e:
|
207
|
+
error_handlers['module_not_available']("FinOps export", e)
|
208
|
+
raise click.ClickException("FinOps export functionality not available")
|
209
|
+
except Exception as e:
|
210
|
+
error_handlers['operation_failed']("FinOps export operation", e)
|
211
|
+
raise click.ClickException(str(e))
|
212
|
+
|
213
|
+
return finops
|