runbooks 1.1.2__tar.gz → 1.1.3__tar.gz
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-1.1.2/src/runbooks.egg-info → runbooks-1.1.3}/PKG-INFO +1 -1
- {runbooks-1.1.2 → runbooks-1.1.3}/pyproject.toml +1 -1
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/__init__.py +1 -1
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/cost_optimizer.py +158 -22
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/business_logic.py +1 -1
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/rich_utils.py +5 -5
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/README.md +3 -3
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/cli.py +169 -103
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/embedded_mcp_validator.py +101 -23
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/finops_scenarios.py +90 -16
- runbooks-1.1.3/src/runbooks/finops/rds_snapshot_optimizer.py +1389 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/vpc_cleanup_optimizer.py +1 -1
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/workspaces_analyzer.py +30 -12
- runbooks-1.1.3/src/runbooks/inventory/list_rds_snapshots_aggregator.py +745 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main.py +309 -38
- {runbooks-1.1.2 → runbooks-1.1.3/src/runbooks.egg-info}/PKG-INFO +1 -1
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/SOURCES.txt +2 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/LICENSE +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/MANIFEST.in +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/setup.cfg +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/conftest.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/__init__.py.backup +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/__init___optimized.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/__main__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/_platform/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/_platform/core/runbooks_wrapper.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/base.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/WEIGHT_CONFIG_README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/app.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/asana-import.csv +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/cfat-checks.csv +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/cfat.txt +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/collectors.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/compliance.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/jira-import.csv +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/runner.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/assessment/validators.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/cli.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/cloud_foundations_assessment.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/asana-import.csv +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cfat-checks.csv +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cfat.txt +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/checks-output.png +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cloudshell-console-run.png +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cloudshell-download.png +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/cloudshell-output.png +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/downloadfile.png +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/jira-import.csv +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/open-cloudshell.png +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/docs/report-header.png +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/models.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/package-lock.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/package.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/report.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/reporting/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/reporting/exporters.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/reporting/formatters.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/reporting/templates.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/run-assessment.sh +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/runner.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-cloudtrail-existence.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-config-existence.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-control-tower.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-ec2-existence.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-iam-users.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-legacy-cur.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-org-cloudformation.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/check-vpc-existence.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/create-asanaimport.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/create-backlog.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/create-jiraimport.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/create-report.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/define-account-type.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-enabled-org-policy-types.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-enabled-org-services.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-idc-info.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-org-da-accounts.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-org-details.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-org-member-accounts.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-org-ous.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/get-regions.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/actions/zip-assessment.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/src/types/index.d.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_cli.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_models.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_reporting.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tests/test_weight_configuration.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/tsconfig.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/webpack.config.cjs +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cfat/weight_config.ts +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/base.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/infrastructure_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/interfaces.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/lifecycle_manager.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/mcp_cost_validation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/models.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/monitoring_automation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/notebook_framework.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/cloudops/security_enforcer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/accuracy_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/aws_pricing.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/aws_pricing_api.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/aws_utils.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/cli_decorators.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/comprehensive_cost_explorer_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/context_logger.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/cross_account_manager.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/cross_module_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/date_utils.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/dry_run_examples.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/dry_run_framework.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/enhanced_exception_handler.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/enhanced_logging_example.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/enhanced_logging_integration_example.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/enterprise_audit_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/env_utils.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/error_handling.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/lazy_loader.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/logger.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/logging_integration_helper.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/mcp_cost_explorer_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/mcp_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/memory_optimization.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/module_cli_base.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/organizations_client.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/performance_monitor.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/performance_monitoring.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/performance_optimization_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/profile_utils.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/common/sre_performance_suite.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/config.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/error_handling.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/logging.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/multi_tenant.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/security.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/enterprise/validation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/feedback/user_feedback_collector.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/account_resolver.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/accuracy_cross_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/automation_core.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/aws_client.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/budget_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/business_case_config.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/business_cases.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/commvault_ec2_analysis.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/compute_cost_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/config.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/cost_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/cost_processor.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/dashboard_router.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/dashboard_runner.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/ebs_cost_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/ebs_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/elastic_ip_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/enhanced_dashboard_runner.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/enhanced_progress.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/enhanced_trend_visualization.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/enterprise_wrappers.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/executive_export.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/finops_dashboard.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/helpers.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/iam_guidance.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/legacy_migration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/main.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/markdown_exporter.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/multi_dashboard.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/nat_gateway_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/network_cost_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/notebook_utils.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/profile_processor.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/reservation_optimizer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/scenario_cli_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/scenarios.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/schemas.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/service_mapping.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/single_dashboard.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/run_comprehensive_tests.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/run_tests.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_finops_dashboard.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_performance.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_performance_benchmarks.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_reference_images_validation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/test_single_account_features.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/tests/validate_test_suite.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/types.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/unlimited_scenarios.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/validation_framework.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/visualisations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/finops/vpc_cleanup_exporter.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/hitl/enhanced_workflow_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/.gitignore +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/ArgumentsClass.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/LandingZone/delete_lz.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/common_test_data.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/common_test_functions.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/script_test_data.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/setup.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/src.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_Inventory_Modules.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_cfn_describe_stacks.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_ec2_describe_instances.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_lambda_list_functions.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_moto_integration_example.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/Tests/test_org_list_accounts.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/account_class.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/all_my_instances_wrapper.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/aws_decorators.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/check_cloudtrail_compliance.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/check_controltower_readiness.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/check_landingzone_readiness.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/cloud_foundations_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/aws_comprehensive.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/aws_compute.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/aws_management.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/aws_networking.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/base.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/collectors/enterprise_scale.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/core/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/core/collector.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/core/formatter.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/discovery.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/draw_org_structure.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/drift_detection_cli.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/ec2_vpc_utils.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_cfn_drift_detection.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_cfn_orphaned_stacks.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_cfn_stackset_drift.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_ec2_security_groups.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_landingzone_versions.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/find_vpc_flow_logs.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/inventory.sh +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/inventory_mcp_cli.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/inventory_modules.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_cfn_stacks.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_cfn_stackset_operation_results.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_cfn_stackset_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_cfn_stacksets.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_config_recorders_delivery_channels.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ds_directories.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ec2_availability_zones.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ec2_ebs_volumes.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ec2_instances.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ecs_clusters_and_tasks.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_elbs_load_balancers.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_enis_network_interfaces.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_guardduty_detectors.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_iam_policies.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_iam_roles.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_iam_saml_providers.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_lambda_functions.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_org_accounts.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_org_accounts_users.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_rds_db_instances.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_route53_hosted_zones.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_servicecatalog_provisioned_products.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_sns_topics.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_ssm_parameters.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_vpc_subnets.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/list_vpcs.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/mcp_inventory_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/mcp_vpc_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/models/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/models/account.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/models/inventory.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/models/resource.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/organizations_discovery.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/recover_cfn_stack_ids.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/requirements.txt +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/rich_inventory_display.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/run_on_multi_accounts.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/unified_validation_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/utils/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/utils/aws_helpers.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/utils/threading_utils.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/utils/validation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/verify_ec2_security_groups.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/vpc_analyzer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/vpc_architecture_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/vpc_dependency_analyzer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/inventory/vpc_flow_analyzer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main_final.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main_minimal.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main_optimized.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/main_ultra_minimal.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/metrics/dora_metrics_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/monitoring/performance_monitor.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/base.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/cloudformation_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/cloudwatch_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/deployment_framework.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/deployment_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/dynamodb_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/ec2_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/executive_dashboard.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/iam_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/mcp_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/nat_gateway_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/networking_cost_heatmap.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/privatelink_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/rds_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/s3_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/tagging_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/tags.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/vpc_endpoints.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/operate/vpc_operations.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/Tests/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/Tests/update_policy.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/acm_cert_expired_unused.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/acm_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/api_gateway_list.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/base.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cloudtrail_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cloudtrail_s3_modifications.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cognito_active_users.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cognito_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/cognito_user_password_reset.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/commons.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/commvault_ec2_analysis.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/config/accounts_example.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/dynamodb_optimize.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/dynamodb_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/dynamodb_server_side_encryption.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_public_ips.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_subnet_disable_auto_ip_assignment.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_unattached_ebs_volumes.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/ec2_unused_security_groups.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/kms_enable_key_rotation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/kms_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/lambda_list.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/lambda_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/multi_account.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/rds_instance_list.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/rds_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/rds_snapshot_list.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/remediation_cli.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/requirements.txt +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_block_public_access.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_bucket_public_access.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_disable_static_website_hosting.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_downloader.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_enable_access_logging.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_encryption.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_force_ssl_secure_policy.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_list.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_object_search.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/s3_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/scan_for_phrase.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/universal_account_discovery.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/vpc_remediation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/remediation/workspaces_list.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/account_level_bucket_public_access.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/alternate_contacts.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/bucket_public_access.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/cloudwatch_alarm_configuration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/direct_attached_policy.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/guardduty_enabled.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/iam_password_policy.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/iam_user_mfa.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/multi_region_instance_usage.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/multi_region_trail.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/root_access_key.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/root_mfa.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/root_usage.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/trail_enabled.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/checklist/trusted_advisor.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/cloudops_automation_security_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/compliance_automation.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/compliance_automation_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config/compliance_config.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config/compliance_weights_example.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config-origin.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/config_template_generator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/enterprise_security_framework.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/enterprise_security_policies.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/executive_security_dashboard.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/integration_test_enterprise_security.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/module_security_integrator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/multi_account_security_controls.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/permission.json +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/real_time_security_monitor.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_generator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_template_en.html +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_template_jp.html +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_template_kr.html +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/report_template_vn.html +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/run_script.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/security_baseline_tester.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/security_cli.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/security_export.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/common.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/enums.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/language.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/level_const.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/security/utils/permission_list.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/mcp_reliability_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/performance_optimization_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/production_monitoring_framework.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/sre/reliability_monitoring_framework.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/utils/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/utils/logger.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/utils/version_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/benchmark.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/cli.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/comprehensive_2way_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/mcp_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/terraform_citations_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/validation/terraform_drift_detector.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/README.md +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/cleanup_wrapper.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/config.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/cost_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/cross_account_session.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/heatmap_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/manager_interface.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/mcp_no_eni_validator.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/networking_wrapper.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/performance_optimized_analyzer.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/rich_formatters.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/runbooks_adapter.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/__init__.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/conftest.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/test_cli_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/test_config.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/test_cost_engine.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/tests/test_networking_wrapper.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/unified_scenarios.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks/vpc/vpc_cleanup_integration.py +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/dependency_links.txt +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/entry_points.txt +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/requires.txt +0 -0
- {runbooks-1.1.2 → runbooks-1.1.3}/src/runbooks.egg-info/top_level.txt +0 -0
@@ -13,7 +13,7 @@
|
|
13
13
|
## Metadata: https://docs.astral.sh/uv/concepts/projects/config/
|
14
14
|
name = "runbooks"
|
15
15
|
## Enhanced with AWS Operations integration, unified CLI architecture, and comprehensive service operations
|
16
|
-
version = "1.1.
|
16
|
+
version = "1.1.3"
|
17
17
|
description = "CloudOps Automation Toolkit with Enhanced Cloud Foundations Assessment for DevOps and SRE teams."
|
18
18
|
readme = "README.md"
|
19
19
|
requires-python = ">=3.11,<3.14"
|
@@ -61,7 +61,7 @@ s3_ops = S3Operations()
|
|
61
61
|
|
62
62
|
# Centralized Version Management - Single Source of Truth
|
63
63
|
# All modules MUST import __version__ from this location
|
64
|
-
__version__ = "1.1.
|
64
|
+
__version__ = "1.1.3"
|
65
65
|
|
66
66
|
# Fallback for legacy importlib.metadata usage during transition
|
67
67
|
try:
|
@@ -20,6 +20,7 @@ Source Notebooks:
|
|
20
20
|
"""
|
21
21
|
|
22
22
|
import asyncio
|
23
|
+
import json
|
23
24
|
import time
|
24
25
|
from typing import Dict, List, Optional, Any, Tuple
|
25
26
|
import boto3
|
@@ -64,25 +65,31 @@ class CostOptimizer(CloudOpsBase):
|
|
64
65
|
"""
|
65
66
|
|
66
67
|
def __init__(
|
67
|
-
self,
|
68
|
-
profile: str = "default",
|
68
|
+
self,
|
69
|
+
profile: str = "default",
|
69
70
|
dry_run: bool = True,
|
70
|
-
execution_mode: ExecutionMode = ExecutionMode.DRY_RUN
|
71
|
+
execution_mode: ExecutionMode = ExecutionMode.DRY_RUN,
|
72
|
+
region: str = "us-east-1"
|
71
73
|
):
|
72
74
|
"""
|
73
75
|
Initialize Cost Optimizer with enterprise patterns.
|
74
|
-
|
76
|
+
|
75
77
|
Args:
|
76
78
|
profile: AWS profile (typically billing profile for cost data)
|
77
79
|
dry_run: Enable safe analysis mode (default True)
|
78
80
|
execution_mode: Execution mode for operations
|
81
|
+
region: AWS region for operations (default us-east-1)
|
79
82
|
"""
|
80
83
|
super().__init__(profile, dry_run, execution_mode)
|
81
|
-
|
82
|
-
|
84
|
+
|
85
|
+
# Initialize region attribute
|
86
|
+
self.region = region
|
87
|
+
|
88
|
+
from runbooks import __version__
|
89
|
+
print_header("CloudOps Cost Optimizer", __version__)
|
83
90
|
print_info(f"Execution mode: {execution_mode.value}")
|
84
91
|
print_info(f"Profile: {profile}")
|
85
|
-
|
92
|
+
|
86
93
|
if dry_run:
|
87
94
|
print_warning("🛡️ DRY RUN MODE: No resources will be modified")
|
88
95
|
|
@@ -1220,7 +1227,7 @@ class CostOptimizer(CloudOpsBase):
|
|
1220
1227
|
CostOptimizationResult with WorkSpaces cleanup analysis
|
1221
1228
|
"""
|
1222
1229
|
operation_name = "WorkSpaces Cost Optimization"
|
1223
|
-
print_header(f"🏢 {operation_name}
|
1230
|
+
print_header(f"🏢 {operation_name}")
|
1224
1231
|
|
1225
1232
|
# Import existing workspaces analyzer
|
1226
1233
|
try:
|
@@ -1349,20 +1356,70 @@ class CostOptimizer(CloudOpsBase):
|
|
1349
1356
|
with create_progress_bar() as progress:
|
1350
1357
|
task = progress.add_task("Analyzing RDS manual snapshots...", total=100)
|
1351
1358
|
|
1352
|
-
# Step 1: Discover manual RDS snapshots
|
1359
|
+
# Step 1: Discover manual RDS snapshots using proven AWS Config aggregator method
|
1353
1360
|
all_manual_snapshots = []
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1364
|
-
|
1365
|
-
|
1361
|
+
|
1362
|
+
try:
|
1363
|
+
# Use AWS Config aggregator to discover all RDS snapshots across organization
|
1364
|
+
config_client = self.session.client('config', region_name='ap-southeast-2')
|
1365
|
+
|
1366
|
+
# Get all RDS snapshots via AWS Config aggregator (proven method)
|
1367
|
+
response = config_client.select_aggregate_resource_config(
|
1368
|
+
Expression="SELECT configuration, accountId, awsRegion WHERE resourceType = 'AWS::RDS::DBSnapshot'",
|
1369
|
+
ConfigurationAggregatorName='organization-aggregator',
|
1370
|
+
MaxResults=100 # AWS limit is 100
|
1371
|
+
)
|
1372
|
+
|
1373
|
+
print_info(f"Found {len(response.get('Results', []))} RDS snapshots via AWS Config aggregator")
|
1374
|
+
|
1375
|
+
# Process snapshots found by Config aggregator
|
1376
|
+
for result in response.get('Results', []):
|
1377
|
+
try:
|
1378
|
+
resource_data = json.loads(result)
|
1379
|
+
config_data = resource_data.get('configuration', {})
|
1380
|
+
|
1381
|
+
# Handle case where configuration might be a string
|
1382
|
+
if isinstance(config_data, str):
|
1383
|
+
config_data = json.loads(config_data)
|
1384
|
+
|
1385
|
+
# Filter for manual snapshots only
|
1386
|
+
if config_data.get('snapshotType') == 'manual':
|
1387
|
+
# Create snapshot object compatible with describe_db_snapshots format
|
1388
|
+
snapshot = {
|
1389
|
+
'DBSnapshotIdentifier': config_data.get('dBSnapshotIdentifier'),
|
1390
|
+
'SnapshotCreateTime': datetime.fromisoformat(config_data.get('snapshotCreateTime', '').replace('Z', '+00:00')) if config_data.get('snapshotCreateTime') else datetime.now(),
|
1391
|
+
'AllocatedStorage': config_data.get('allocatedStorage', 0),
|
1392
|
+
'DBInstanceIdentifier': config_data.get('dBInstanceIdentifier'),
|
1393
|
+
'SnapshotType': config_data.get('snapshotType'),
|
1394
|
+
'Status': config_data.get('status', 'available'),
|
1395
|
+
'Engine': config_data.get('engine'),
|
1396
|
+
'EngineVersion': config_data.get('engineVersion')
|
1397
|
+
}
|
1398
|
+
all_manual_snapshots.append(snapshot)
|
1399
|
+
except Exception as e:
|
1400
|
+
print_warning(f"Error processing snapshot from Config: {e}")
|
1401
|
+
|
1402
|
+
print_success(f"Successfully processed {len(all_manual_snapshots)} manual snapshots from Config aggregator")
|
1403
|
+
|
1404
|
+
except Exception as e:
|
1405
|
+
print_warning(f"AWS Config aggregator query failed, falling back to regional discovery: {e}")
|
1406
|
+
|
1407
|
+
# Fallback to regional discovery if Config aggregator fails
|
1408
|
+
regions = ['us-east-1', 'us-west-2', 'ap-southeast-2', 'eu-west-1', 'ap-southeast-1'] # Extended regions
|
1409
|
+
|
1410
|
+
for region in regions:
|
1411
|
+
regional_client = self.session.client('rds', region_name=region)
|
1412
|
+
try:
|
1413
|
+
# Get all manual snapshots in this region
|
1414
|
+
paginator = regional_client.get_paginator('describe_db_snapshots')
|
1415
|
+
page_iterator = paginator.paginate(SnapshotType='manual')
|
1416
|
+
|
1417
|
+
for page in page_iterator:
|
1418
|
+
all_manual_snapshots.extend(page.get('DBSnapshots', []))
|
1419
|
+
|
1420
|
+
print_info(f"Found {len([s for s in all_manual_snapshots if 'region' not in s])} manual snapshots in {region}")
|
1421
|
+
except Exception as e:
|
1422
|
+
print_warning(f"Could not access region {region}: {e}")
|
1366
1423
|
|
1367
1424
|
progress.update(task, advance=40)
|
1368
1425
|
|
@@ -1376,7 +1433,86 @@ class CostOptimizer(CloudOpsBase):
|
|
1376
1433
|
|
1377
1434
|
progress.update(task, advance=70)
|
1378
1435
|
|
1379
|
-
# Step 3:
|
1436
|
+
# Step 3: Use enhanced RDS snapshot optimizer for consistent results
|
1437
|
+
try:
|
1438
|
+
from runbooks.finops.rds_snapshot_optimizer import EnhancedRDSSnapshotOptimizer
|
1439
|
+
|
1440
|
+
print_info("🔧 Using enhanced RDS snapshot optimization logic...")
|
1441
|
+
enhanced_optimizer = EnhancedRDSSnapshotOptimizer(profile=self.profile, dry_run=dry_run)
|
1442
|
+
|
1443
|
+
if enhanced_optimizer.initialize_session():
|
1444
|
+
# Discover all snapshots (not just manual)
|
1445
|
+
all_snapshots = enhanced_optimizer.discover_snapshots_via_config_aggregator()
|
1446
|
+
|
1447
|
+
if all_snapshots:
|
1448
|
+
# Run enhanced optimization analysis
|
1449
|
+
optimization_results = enhanced_optimizer.analyze_optimization_opportunities(
|
1450
|
+
all_snapshots, age_threshold=snapshot_age_threshold_days
|
1451
|
+
)
|
1452
|
+
|
1453
|
+
# Use comprehensive scenario for realistic savings
|
1454
|
+
comprehensive_scenario = optimization_results['optimization_scenarios']['comprehensive']
|
1455
|
+
|
1456
|
+
# Create resource impacts for comprehensive scenario
|
1457
|
+
resource_impacts = []
|
1458
|
+
for snapshot in comprehensive_scenario['snapshots']:
|
1459
|
+
resource_impacts.append(
|
1460
|
+
ResourceImpact(
|
1461
|
+
resource_type="rds-snapshot",
|
1462
|
+
resource_id=snapshot.get('DBSnapshotIdentifier', 'unknown'),
|
1463
|
+
region=snapshot.get('Region', 'unknown'),
|
1464
|
+
account_id=snapshot.get('AccountId', 'unknown'),
|
1465
|
+
estimated_monthly_cost=snapshot.get('EstimatedMonthlyCost', 0.0),
|
1466
|
+
projected_savings=snapshot.get('EstimatedMonthlyCost', 0.0),
|
1467
|
+
risk_level=RiskLevel.MEDIUM,
|
1468
|
+
modification_required=True,
|
1469
|
+
resource_name=f"RDS Snapshot {snapshot.get('DBSnapshotIdentifier', 'unknown')}",
|
1470
|
+
estimated_downtime=0.0
|
1471
|
+
)
|
1472
|
+
)
|
1473
|
+
|
1474
|
+
progress.update(task, advance=100)
|
1475
|
+
|
1476
|
+
return CostOptimizationResult(
|
1477
|
+
scenario=BusinessScenario.COST_OPTIMIZATION,
|
1478
|
+
scenario_name=operation_name,
|
1479
|
+
execution_timestamp=datetime.now(),
|
1480
|
+
execution_mode=self.execution_mode,
|
1481
|
+
execution_time=30.0,
|
1482
|
+
success=True,
|
1483
|
+
error_message=None,
|
1484
|
+
resources_analyzed=optimization_results['total_snapshots'],
|
1485
|
+
resources_impacted=resource_impacts,
|
1486
|
+
business_metrics=self.create_business_metrics(
|
1487
|
+
total_savings=optimization_results['potential_monthly_savings'],
|
1488
|
+
overall_risk=RiskLevel.MEDIUM
|
1489
|
+
),
|
1490
|
+
recommendations=[
|
1491
|
+
f"Review {optimization_results['cleanup_candidates']} snapshots older than {snapshot_age_threshold_days} days",
|
1492
|
+
f"Potential annual savings: ${optimization_results['potential_annual_savings']:,.2f}",
|
1493
|
+
"Consider implementing automated retention policies",
|
1494
|
+
"Review backup requirements before deletion"
|
1495
|
+
],
|
1496
|
+
# CostOptimizationResult specific fields
|
1497
|
+
current_monthly_spend=optimization_results.get('current_monthly_spend', 0.0),
|
1498
|
+
optimized_monthly_spend=optimization_results.get('current_monthly_spend', 0.0) - optimization_results['potential_monthly_savings'],
|
1499
|
+
savings_percentage=(optimization_results['potential_monthly_savings'] / max(optimization_results.get('current_monthly_spend', 1), 1)) * 100,
|
1500
|
+
annual_savings=optimization_results['potential_annual_savings'],
|
1501
|
+
total_monthly_savings=optimization_results['potential_monthly_savings'],
|
1502
|
+
affected_resources=optimization_results['cleanup_candidates'],
|
1503
|
+
resource_impacts=resource_impacts
|
1504
|
+
)
|
1505
|
+
else:
|
1506
|
+
print_warning("No snapshots discovered via enhanced optimizer")
|
1507
|
+
|
1508
|
+
except ImportError as e:
|
1509
|
+
print_warning(f"Enhanced optimizer not available, using legacy logic: {e}")
|
1510
|
+
except Exception as e:
|
1511
|
+
print_warning(f"Enhanced optimizer failed, using legacy logic: {e}")
|
1512
|
+
|
1513
|
+
# Fallback to legacy calculation for compatibility
|
1514
|
+
print_info("Using legacy optimization calculation...")
|
1515
|
+
# Step 3: Calculate estimated savings (legacy)
|
1380
1516
|
# Based on JIRA data: $5K-24K range for manual snapshots
|
1381
1517
|
total_size_gb = sum(snapshot.get('AllocatedStorage', 0) for snapshot in old_snapshots)
|
1382
1518
|
estimated_monthly_savings = total_size_gb * 0.05 # ~$0.05/GB-month for snapshots
|
@@ -189,7 +189,7 @@ class UniversalBusinessLogic:
|
|
189
189
|
# Apply proven profile management patterns
|
190
190
|
selected_profile = get_profile_for_operation("operational", profile)
|
191
191
|
|
192
|
-
print_header(f"{resource_type.title()} {operation.title()}", f"v1.
|
192
|
+
print_header(f"{resource_type.title()} {operation.title()}", f"v1.1.2 - {self.module_name}")
|
193
193
|
print_info(f"Using profile: {selected_profile}")
|
194
194
|
|
195
195
|
# Standard operation tracking
|
@@ -611,14 +611,14 @@ def create_columns(items: List[Any], equal: bool = True, expand: bool = True) ->
|
|
611
611
|
# Manager's Cost Optimization Scenario Formatting Functions
|
612
612
|
def format_workspaces_analysis(workspaces_data: Dict[str, Any], target_savings: int = 12518) -> Panel:
|
613
613
|
"""
|
614
|
-
Format WorkSpaces cost analysis for manager's
|
615
|
-
|
614
|
+
Format WorkSpaces cost analysis for manager's priority scenario.
|
615
|
+
|
616
616
|
Based on manager's requirement for $12,518 annual savings through
|
617
617
|
cleanup of unused WorkSpaces with zero usage in last 6 months.
|
618
|
-
|
618
|
+
|
619
619
|
Args:
|
620
620
|
workspaces_data: Dictionary containing WorkSpaces cost and utilization data
|
621
|
-
target_savings: Annual savings target (default: $12,518
|
621
|
+
target_savings: Annual savings target (default: $12,518)
|
622
622
|
|
623
623
|
Returns:
|
624
624
|
Rich Panel with formatted WorkSpaces analysis
|
@@ -654,7 +654,7 @@ def format_workspaces_analysis(workspaces_data: Dict[str, Any], target_savings:
|
|
654
654
|
|
655
655
|
[{status_style}]{status}[/]"""
|
656
656
|
|
657
|
-
return Panel(content, title="[bright_cyan]
|
657
|
+
return Panel(content, title="[bright_cyan]WorkSpaces Cost Optimization[/bright_cyan]",
|
658
658
|
border_style="bright_green" if target_achievement >= 90 else "yellow")
|
659
659
|
|
660
660
|
|
@@ -25,9 +25,9 @@ runbooks finops --help # View all functionality
|
|
25
25
|
runbooks finops --scenario workspaces --profile PROFILE # WorkSpaces optimization
|
26
26
|
runbooks finops --scenario nat-gateway --profile PROFILE # NAT Gateway optimization
|
27
27
|
runbooks finops --scenario elastic-ip --profile PROFILE # Elastic IP management
|
28
|
-
runbooks finops --scenario ebs --profile PROFILE
|
29
|
-
runbooks finops --scenario snapshots --profile PROFILE
|
30
|
-
runbooks finops --scenario
|
28
|
+
runbooks finops --scenario ebs-optimization --profile PROFILE # EBS optimization
|
29
|
+
runbooks finops --scenario rds-snapshots --profile PROFILE # RDS snapshots cleanup
|
30
|
+
runbooks finops --scenario backup-investigation --profile PROFILE # Backup analysis
|
31
31
|
runbooks finops --scenario vpc-cleanup --profile PROFILE # VPC cleanup
|
32
32
|
|
33
33
|
# AWS Cost Explorer metrics (working)
|
@@ -228,7 +228,7 @@ def main() -> int:
|
|
228
228
|
parser.add_argument(
|
229
229
|
"--scenario",
|
230
230
|
type=str,
|
231
|
-
help="Business scenario analysis (workspaces, snapshots,
|
231
|
+
help="Business scenario analysis (workspaces, rds-snapshots, backup-investigation, nat-gateway, elastic-ip, ebs-optimization, vpc-cleanup)",
|
232
232
|
)
|
233
233
|
parser.add_argument(
|
234
234
|
"--help-scenario",
|
@@ -272,93 +272,58 @@ def main() -> int:
|
|
272
272
|
|
273
273
|
console.print(f"[bold cyan]🎯 Executing Business Scenario: {args.scenario}[/bold cyan]")
|
274
274
|
|
275
|
-
#
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
from runbooks.finops.
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
def execute_elastic_ip_scenario():
|
328
|
-
# Create a simplified elastic IP scenario execution
|
329
|
-
print_info("Elastic IP optimization scenario analysis")
|
330
|
-
# Use enterprise profile resolution: User > Environment > Default
|
331
|
-
profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
|
332
|
-
return {"scenario": "elastic-ip", "status": "completed", "profile": profile_param}
|
333
|
-
|
334
|
-
# Map scenarios to execution functions
|
335
|
-
scenario_map = {
|
336
|
-
'workspaces': execute_workspaces_scenario,
|
337
|
-
'snapshots': execute_snapshots_scenario,
|
338
|
-
'commvault': execute_commvault_scenario,
|
339
|
-
'nat-gateway': execute_nat_gateway_scenario,
|
340
|
-
'ebs': execute_ebs_scenario,
|
341
|
-
'vpc-cleanup': execute_vpc_cleanup_scenario,
|
342
|
-
'elastic-ip': execute_elastic_ip_scenario,
|
343
|
-
}
|
344
|
-
|
345
|
-
if args.scenario not in scenario_map:
|
346
|
-
print_error(f"Unknown scenario: '{args.scenario}'")
|
347
|
-
print_info("Available scenarios: " + ", ".join(scenario_map.keys()))
|
348
|
-
return 1
|
349
|
-
|
350
|
-
# Execute scenario
|
351
|
-
scenario_func = scenario_map[args.scenario]
|
352
|
-
result = scenario_func()
|
353
|
-
|
354
|
-
print_success(f"✅ Scenario '{args.scenario}' completed successfully")
|
355
|
-
|
356
|
-
# Export results if requested
|
357
|
-
if args.report_type and result:
|
358
|
-
from runbooks.finops.helpers import export_scenario_results
|
359
|
-
export_scenario_results(result, args.scenario, args.report_type, args.dir)
|
360
|
-
|
361
|
-
return 0
|
275
|
+
# CRITICAL FIX: Handle --all flag for scenarios by using dashboard router logic
|
276
|
+
if hasattr(args, "all") and args.all:
|
277
|
+
print_info("🔍 --all flag detected: Integrating with dashboard router for organization discovery")
|
278
|
+
|
279
|
+
# Use dashboard router to handle --all flag and get profiles
|
280
|
+
from runbooks.finops.dashboard_router import create_dashboard_router
|
281
|
+
router = create_dashboard_router()
|
282
|
+
use_case, routing_config = router.detect_use_case(args)
|
283
|
+
|
284
|
+
# Extract profiles from routing config
|
285
|
+
profiles_to_use = routing_config.get("profiles_to_analyze", [])
|
286
|
+
if not profiles_to_use:
|
287
|
+
print_error("--all flag failed to discover any profiles")
|
288
|
+
return 1
|
289
|
+
|
290
|
+
print_success(f"Discovered {len(profiles_to_use)} profiles for scenario execution")
|
291
|
+
|
292
|
+
# Execute scenario across all discovered profiles
|
293
|
+
all_results = []
|
294
|
+
for profile in profiles_to_use:
|
295
|
+
print_info(f"Executing scenario '{args.scenario}' for profile: {profile}")
|
296
|
+
|
297
|
+
# Create a copy of args with single profile for execution
|
298
|
+
single_profile_args = argparse.Namespace(**vars(args))
|
299
|
+
single_profile_args.profiles = [profile]
|
300
|
+
single_profile_args.all = False # Disable --all for individual execution
|
301
|
+
|
302
|
+
# Execute scenario with single profile (recursive call but with all=False)
|
303
|
+
result = _execute_single_scenario(single_profile_args)
|
304
|
+
if result:
|
305
|
+
all_results.append(result)
|
306
|
+
|
307
|
+
# Combine results and export if requested
|
308
|
+
combined_result = {
|
309
|
+
"scenario": args.scenario,
|
310
|
+
"status": "completed",
|
311
|
+
"profiles_analyzed": len(profiles_to_use),
|
312
|
+
"individual_results": all_results,
|
313
|
+
"organization_scope": use_case == "organization_wide"
|
314
|
+
}
|
315
|
+
|
316
|
+
print_success(f"✅ Scenario '{args.scenario}' completed for {len(profiles_to_use)} profiles")
|
317
|
+
|
318
|
+
# Export results if requested
|
319
|
+
if args.report_type and combined_result:
|
320
|
+
from runbooks.finops.helpers import export_scenario_results
|
321
|
+
export_scenario_results(combined_result, args.scenario, args.report_type, args.dir)
|
322
|
+
|
323
|
+
return 0
|
324
|
+
else:
|
325
|
+
# Handle single profile execution (existing logic)
|
326
|
+
return _execute_single_scenario(args)
|
362
327
|
|
363
328
|
except ImportError as e:
|
364
329
|
console.print(f"[red]❌ Scenario '{args.scenario}' not available: {e}[/red]")
|
@@ -367,26 +332,127 @@ def main() -> int:
|
|
367
332
|
console.print(f"[red]❌ Scenario execution failed: {e}[/red]")
|
368
333
|
return 1
|
369
334
|
|
335
|
+
|
336
|
+
def _execute_single_scenario(args: argparse.Namespace) -> int:
|
337
|
+
"""Execute a scenario for a single profile (internal helper function)."""
|
338
|
+
import argparse
|
339
|
+
from runbooks.common.rich_utils import print_header, print_success, print_error, print_info
|
340
|
+
from runbooks.common.profile_utils import get_profile_for_operation
|
341
|
+
|
342
|
+
def execute_workspaces_scenario():
|
343
|
+
from runbooks.finops.scenarios import finops_workspaces
|
344
|
+
# Use enterprise profile resolution: User > Environment > Default
|
345
|
+
profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
|
346
|
+
return finops_workspaces(profile=profile_param)
|
347
|
+
|
348
|
+
def execute_snapshots_scenario():
|
349
|
+
from runbooks.finops.scenarios import finops_snapshots
|
350
|
+
# Use enterprise profile resolution: User > Environment > Default
|
351
|
+
profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
|
352
|
+
return finops_snapshots(profile=profile_param)
|
353
|
+
|
354
|
+
def execute_commvault_scenario():
|
355
|
+
from runbooks.finops.scenarios import finops_commvault
|
356
|
+
# Use enterprise profile resolution: User > Environment > Default
|
357
|
+
profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
|
358
|
+
return finops_commvault(profile=profile_param)
|
359
|
+
|
360
|
+
def execute_nat_gateway_scenario():
|
361
|
+
from runbooks.finops.nat_gateway_optimizer import nat_gateway_optimizer
|
362
|
+
# Use enterprise profile resolution: User > Environment > Default
|
363
|
+
profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
|
364
|
+
regions = args.regions if args.regions else ['us-east-1']
|
365
|
+
# Call the CLI function with default parameters
|
366
|
+
nat_gateway_optimizer(
|
367
|
+
profile=profile_param,
|
368
|
+
regions=regions,
|
369
|
+
dry_run=True,
|
370
|
+
export_format='json',
|
371
|
+
output_file=None,
|
372
|
+
usage_threshold_days=7
|
373
|
+
)
|
374
|
+
return {"scenario": "nat-gateway", "status": "completed", "profile": profile_param}
|
375
|
+
|
376
|
+
def execute_ebs_scenario():
|
377
|
+
# Create a simplified EBS scenario execution
|
378
|
+
print_info("EBS optimization scenario analysis")
|
379
|
+
# Use enterprise profile resolution: User > Environment > Default
|
380
|
+
profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
|
381
|
+
return {"scenario": "ebs", "status": "completed", "profile": profile_param}
|
382
|
+
|
383
|
+
def execute_vpc_cleanup_scenario():
|
384
|
+
# Create a simplified VPC cleanup scenario execution
|
385
|
+
print_info("VPC cleanup scenario analysis")
|
386
|
+
# Use enterprise profile resolution: User > Environment > Default
|
387
|
+
profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
|
388
|
+
return {"scenario": "vpc-cleanup", "status": "completed", "profile": profile_param}
|
389
|
+
|
390
|
+
def execute_elastic_ip_scenario():
|
391
|
+
# Create a simplified elastic IP scenario execution
|
392
|
+
print_info("Elastic IP optimization scenario analysis")
|
393
|
+
# Use enterprise profile resolution: User > Environment > Default
|
394
|
+
profile_param = get_profile_for_operation("billing", args.profiles[0] if args.profiles else None)
|
395
|
+
return {"scenario": "elastic-ip", "status": "completed", "profile": profile_param}
|
396
|
+
|
397
|
+
# Map scenarios to execution functions
|
398
|
+
scenario_map = {
|
399
|
+
'workspaces': execute_workspaces_scenario,
|
400
|
+
'rds-snapshots': execute_snapshots_scenario,
|
401
|
+
'backup-investigation': execute_commvault_scenario,
|
402
|
+
'nat-gateway': execute_nat_gateway_scenario,
|
403
|
+
'ebs-optimization': execute_ebs_scenario,
|
404
|
+
'vpc-cleanup': execute_vpc_cleanup_scenario,
|
405
|
+
'elastic-ip': execute_elastic_ip_scenario,
|
406
|
+
}
|
407
|
+
|
408
|
+
if args.scenario not in scenario_map:
|
409
|
+
print_error(f"Unknown scenario: '{args.scenario}'")
|
410
|
+
print_info("Available scenarios: " + ", ".join(scenario_map.keys()))
|
411
|
+
return 1
|
412
|
+
|
413
|
+
# Execute scenario
|
414
|
+
scenario_func = scenario_map[args.scenario]
|
415
|
+
result = scenario_func()
|
416
|
+
|
417
|
+
print_success(f"✅ Scenario '{args.scenario}' completed successfully")
|
418
|
+
|
419
|
+
# Export results if requested
|
420
|
+
if args.report_type and result:
|
421
|
+
from runbooks.finops.helpers import export_scenario_results
|
422
|
+
export_scenario_results(result, args.scenario, args.report_type, args.dir)
|
423
|
+
|
424
|
+
return 0
|
425
|
+
|
426
|
+
|
370
427
|
# Handle PDCA mode
|
371
428
|
if args.pdca or args.pdca_continuous:
|
372
|
-
|
373
|
-
|
374
|
-
|
429
|
+
try:
|
430
|
+
import asyncio
|
431
|
+
from runbooks.finops.pdca_engine import AutonomousPDCAEngine, PDCAThresholds
|
432
|
+
|
433
|
+
console.print("[bold bright_cyan]🤖 Launching Autonomous PDCA Engine...[/]")
|
434
|
+
|
435
|
+
# Configure PDCA thresholds
|
436
|
+
thresholds = PDCAThresholds(
|
437
|
+
max_risk_score=25,
|
438
|
+
max_cost_increase=10.0,
|
439
|
+
max_untagged_resources=50,
|
440
|
+
max_unused_eips=5,
|
441
|
+
max_budget_overruns=1,
|
442
|
+
)
|
375
443
|
|
376
|
-
|
444
|
+
# Initialize PDCA engine
|
445
|
+
artifacts_dir = args.dir or "artifacts"
|
377
446
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
max_cost_increase=10.0,
|
382
|
-
max_untagged_resources=50,
|
383
|
-
max_unused_eips=5,
|
384
|
-
max_budget_overruns=1,
|
385
|
-
)
|
447
|
+
# Ensure artifacts directory exists
|
448
|
+
import os
|
449
|
+
os.makedirs(artifacts_dir, exist_ok=True)
|
386
450
|
|
387
|
-
|
388
|
-
|
389
|
-
|
451
|
+
engine = AutonomousPDCAEngine(thresholds=thresholds, artifacts_dir=artifacts_dir)
|
452
|
+
except ImportError as e:
|
453
|
+
console.print(f"[red]❌ PDCA Engine not available: {e}[/]")
|
454
|
+
console.print("[yellow]💡 PDCA functionality requires additional setup[/]")
|
455
|
+
return 1
|
390
456
|
|
391
457
|
try:
|
392
458
|
# Determine execution mode
|