cloud-governance 1.1.367__tar.gz → 1.1.369__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.
- {cloud_governance-1.1.367/cloud_governance.egg-info → cloud_governance-1.1.369}/PKG-INFO +1 -1
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/postfix.py +6 -5
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/environment_variables.py +1 -1
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cost_over_usage.py +19 -9
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/run_zombie_non_cluster_policies.py +61 -29
- {cloud_governance-1.1.367 → cloud_governance-1.1.369/cloud_governance.egg-info}/PKG-INFO +1 -1
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/setup.py +1 -1
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/LICENSE +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/MANIFEST.in +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/README.md +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/aws_monitor_tickets.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/aws_tagging_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/collect_cro_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/cost_over_usage.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/monitor_cro_instances.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/run_cro.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/aws/ec2/tag_cro_instances.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/abstract_resource.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/azure_monitor_tickets.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/azure_tagging_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/collect_cro_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/cost_over_usage.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/monitor_cro_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/azure/resource_groups/tag_cro_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/common/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_collect_cro_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_cost_over_usage.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/clouds/common/abstract_tagging_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/common/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/common/abstract_monitor_tickets.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/common/cro_object.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/common/run_cro.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/monitor/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/monitor/cloud_monitor.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/utils/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/utils/common_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/utils/constant_variables.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/cloud_resource_orchestration/utils/elastic_search_queries.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/athena/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/athena/abstract_athena_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/athena/boto3_client_athena_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/athena/pyathena_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/cloudtrail/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/cloudtrail/cloudtrail_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/cloudwatch/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/cloudwatch/cloudwatch_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/cost_explorer/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/cost_explorer/cost_explorer_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/dynamodb/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/dynamodb/dynamodb_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/ec2/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/ec2/ec2_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/iam/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/iam/iam_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/price/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/price/price.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/price/resources_pricing.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/rds/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/rds/rds_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/resource_explorer/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/resource_explorer/resource_explorer_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/resource_tagging_api/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/resource_tagging_api/resource_tag_api_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/s3/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/s3/s3_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/savingsplan/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/savingsplan/savings_plans_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/sts/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/sts/sts_oprations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/support/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/support/support_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/utils/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/utils/common_methods.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/utils/utils.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/common/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/common/common_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/compute/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/compute/compute_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/compute/network_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/compute/resource_group_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/cost_management/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/cost_management/cost_management_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/monitor/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/monitor/monitor_management_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/subscriptions/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/azure/subscriptions/azure_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/cloudability/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/cloudability/cloudability_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/cloudability/templates/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/cloudability/templates/cloudability_dimensions.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/gcp/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/gcp/google_account.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/account/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/account/ibm_account.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/account/ibm_authenticator.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/classic/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/classic/classic_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/developer_tools/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/developer_tools/schematic_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/platform_services/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/platform_services/platform_service_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/tagging/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/tagging/global_tagging_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/vpc/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/vpc/vpc_infra_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/elasticsearch/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/elasticsearch/elastic_upload.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/elasticsearch/elasticsearch_exceptions.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/elasticsearch/elasticsearch_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/elasticsearch/modals/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/elasticsearch/modals/cost_usage_reports_data.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/elasticsearch/modals/policy_es_data.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/google_drive/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/google_drive/gcp_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/google_drive/google_drive_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/google_drive/upload_to_gsheet.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/jira/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/jira/jira.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/jira/jira_exceptions.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/jira/jira_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/ldap/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/ldap/ldap_search.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/logger/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/logger/init_logger.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/logger/logger_time_stamp.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/gmail.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/mail_message.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/templates/cro_monitor_budget_remain_alert.j2 +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/templates/cro_monitor_budget_remain_high_alert.j2 +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/templates/cro_request_for_manager_approval.j2 +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/templates/policy_alert_agg_message.j2 +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/pandas/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/pandas/pandas_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/tool/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/tool/tool.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/utils/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/utils/api_requests.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/utils/configs.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/utils/json_datetime_encoder.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/utils/utils.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/environment_variables_exceptions.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/es_uploader.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/main.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/main_common_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/main_oerations/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/main_oerations/main_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/run_cloud_resource_orchestration.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cleanup/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cleanup/database_idle.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cleanup/instance_idle.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cleanup/instance_run.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cleanup/unattached_volume.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cleanup/unused_nat_gateway.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cost_billing_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cost_explorer.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cost_explorer_payer_billings.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/ebs_in_use.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/ec2_stop.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/empty_roles.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/ip_unattached.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/monitor/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/monitor/cluster_run.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/monthly_report.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/optimize_resources_report.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/s3_inactive.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/skipped_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/spot_savings_analysis.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/zombie_cluster_resource.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/zombie_snapshots.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/azure/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/azure/cleanup/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/azure/cleanup/instance_idle.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/azure/cleanup/instance_run.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/azure/cleanup/ip_unattached.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/azure/cleanup/unattached_volume.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/azure/cleanup/unused_nat_gateway.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/azure/cost_billing_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/common_policies/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/common_policies/cloudability_cost_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/common_policies/send_aggregated_alerts.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/gcp/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/gcp/cost_billing_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/helpers/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/helpers/abstract_policy_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/helpers/aws/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/helpers/aws/aws_policy_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/helpers/azure/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/helpers/azure/azure_policy_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/helpers/cloudability_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/ibm/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/ibm/cost_billing_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/ibm/cost_usage_reports.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/ibm/ibm_cost_over_usage.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/ibm/ibm_cost_report.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/ibm/tag_baremetal.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/ibm/tag_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/ibm/tag_vm.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/cost_expenditure/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/cost_expenditure/cost_report_policies.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/cloudtrail_to_dynamodb.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/dynamodb_upload_data/upload_data_to_dynamodb.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_cluster/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_cluster/remove_cluster_tags.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_cluster/run_tag_cluster_resouces.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_cluster/tag_cluster_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_cluster/tag_cluster_resouces.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/non_cluster_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/remove_non_cluster_tags.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/run_tag_non_cluster_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/tag_non_cluster_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_non_cluster/update_na_tag_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_user/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_user/iam_user_tags.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_user/remove_user_tags.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_user/run_tag_iam_user.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/tag_user/tag_iam_user.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_cluster/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_ec2_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_iam_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_s3_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_cluster/run_zombie_cluster_resources.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_cluster/validate_zombies.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_cluster/zombie_cluster_common_methods.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/aws/zombie_non_cluster/zombie_non_cluster_polices.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/azure/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/azure/azure_policy_runner.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/gcp/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/gcp/gcp_policy_runner.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/gitleaks/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/gitleaks/gitleaks.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/ibm/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/ibm/ibm_operations/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/ibm/ibm_operations/ibm_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/ibm/ibm_operations/ibm_policy_runner.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/ibm/tagging/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_operations/ibm/tagging/tagging_operations.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/aws/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/aws/policy_runner.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/aws/upload_s3.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/azure/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/azure/policy_runner.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/common/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/common/abstract_policy_runner.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/common/abstract_upload.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/common_policy_runner.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/elasticsearch/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/elasticsearch/upload_elastic_search.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/ibm/__init__.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/policy_runners/ibm/policy_runner.py +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance.egg-info/SOURCES.txt +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance.egg-info/dependency_links.txt +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance.egg-info/not-zip-safe +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance.egg-info/requires.txt +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance.egg-info/top_level.txt +0 -0
- {cloud_governance-1.1.367 → cloud_governance-1.1.369}/setup.cfg +0 -0
{cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/mails/postfix.py
RENAMED
|
@@ -157,7 +157,7 @@ class Postfix:
|
|
|
157
157
|
if self.__mail_cc:
|
|
158
158
|
cc = self.__mail_cc
|
|
159
159
|
if not self.__ldap_search.get_user_details(user_name=to):
|
|
160
|
-
cc.
|
|
160
|
+
cc.extend(self.__default_admins)
|
|
161
161
|
response = {'ok': True}
|
|
162
162
|
to = self.prettify_to(to)
|
|
163
163
|
cc = self.prettify_cc(cc)
|
|
@@ -187,10 +187,11 @@ class Postfix:
|
|
|
187
187
|
# msg.add_header("Reply-To", self.reply_to)
|
|
188
188
|
# msg.add_header("User-Agent", self.reply_to)
|
|
189
189
|
if kwargs.get('filename'):
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
if os.path.exists(kwargs['filename']):
|
|
191
|
+
attachment = MIMEText(open(kwargs['filename']).read())
|
|
192
|
+
attachment.add_header('Content-Disposition', 'attachment',
|
|
193
|
+
filename=kwargs['filename'].split('/')[-1])
|
|
194
|
+
msg.attach(attachment)
|
|
194
195
|
if kwargs.get('mime_type'):
|
|
195
196
|
msg.attach(MIMEText(content, kwargs.get('mime_type')))
|
|
196
197
|
else:
|
{cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/main/environment_variables.py
RENAMED
|
@@ -277,7 +277,7 @@ class EnvironmentVariables:
|
|
|
277
277
|
self._environment_variables_dict['POLICY_ACTIONS_DAYS'] = literal_eval(
|
|
278
278
|
EnvironmentVariables.get_env('POLICY_ACTIONS_DAYS', '[]'))
|
|
279
279
|
self._environment_variables_dict['DEFAULT_ADMINS'] = literal_eval(
|
|
280
|
-
EnvironmentVariables.get_env('DEFAULT_ADMINS', '[]'))
|
|
280
|
+
EnvironmentVariables.get_env('DEFAULT_ADMINS', '["yinsong@redhat.com", "ebattat@redhat.com"]'))
|
|
281
281
|
self._environment_variables_dict['KERBEROS_USERS'] = literal_eval(
|
|
282
282
|
EnvironmentVariables.get_env('KERBEROS_USERS', '[]'))
|
|
283
283
|
self._environment_variables_dict['POLICIES_TO_ALERT'] = literal_eval(
|
{cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/policy/aws/cost_over_usage.py
RENAMED
|
@@ -51,11 +51,13 @@ class CostOverUsage:
|
|
|
51
51
|
if 'Instances' in resource:
|
|
52
52
|
if isinstance(resource['Instances'], list):
|
|
53
53
|
if resource.get('Instances')[0].get('LaunchTime'):
|
|
54
|
-
resource['Instances'] = sorted(resource['Instances'], key=itemgetter('LaunchTime'),
|
|
54
|
+
resource['Instances'] = sorted(resource['Instances'], key=itemgetter('LaunchTime'),
|
|
55
|
+
reverse=True)
|
|
55
56
|
resource_sort_list = []
|
|
56
57
|
for item in resource['Instances']:
|
|
57
58
|
if resource_sort_list:
|
|
58
|
-
if item['InstanceId'] not in [resource_dict['InstanceId'] for resource_dict in
|
|
59
|
+
if item['InstanceId'] not in [resource_dict['InstanceId'] for resource_dict in
|
|
60
|
+
resource_sort_list]:
|
|
59
61
|
resource_sort_list.append(item)
|
|
60
62
|
else:
|
|
61
63
|
resource_sort_list.append(item)
|
|
@@ -79,19 +81,24 @@ class CostOverUsage:
|
|
|
79
81
|
|
|
80
82
|
def aws_user_usage(self, days: int, cost_usage: int):
|
|
81
83
|
"""
|
|
82
|
-
This method
|
|
84
|
+
This method sends mail when cost_usage is greater than given cost usage in last specified days
|
|
83
85
|
@param cost_usage:
|
|
84
86
|
@param days:
|
|
85
87
|
@return:
|
|
86
88
|
"""
|
|
87
89
|
users = []
|
|
88
90
|
cc = []
|
|
89
|
-
user_data = self._elastic_upload.elastic_search_operations.get_index_hits(days=days,
|
|
91
|
+
user_data = self._elastic_upload.elastic_search_operations.get_index_hits(days=days,
|
|
92
|
+
index=self._elastic_upload.es_index)
|
|
90
93
|
user_data = self.aggregate_user_sum(user_data)
|
|
91
94
|
for user_usage in user_data:
|
|
92
95
|
user = user_usage['User']
|
|
93
96
|
if user_usage['Cost'] > cost_usage:
|
|
94
|
-
|
|
97
|
+
file_name = ""
|
|
98
|
+
if user_usage.get('Instances'):
|
|
99
|
+
used_instances = self.get_user_used_instances(user_used_list=user_usage.get('Instances'))
|
|
100
|
+
with open(file_name, 'w') as file:
|
|
101
|
+
json.dump(used_instances, file, indent=4)
|
|
95
102
|
ignore_user_mails = self._elastic_upload.literal_eval(self.__ignore_mails)
|
|
96
103
|
if user not in ignore_user_mails:
|
|
97
104
|
special_user_mails = self._elastic_upload.literal_eval(self._elastic_upload.special_user_mails)
|
|
@@ -99,13 +106,16 @@ class CostOverUsage:
|
|
|
99
106
|
ldap_data = self.__ldap.get_user_details(user_name=to)
|
|
100
107
|
name = to
|
|
101
108
|
file_name = os.path.join('/tmp', f'{to}_resource.json')
|
|
102
|
-
|
|
103
|
-
json.dump(used_instances, file, indent=4)
|
|
109
|
+
|
|
104
110
|
if ldap_data:
|
|
105
111
|
cc.append(f'{ldap_data.get("managerId")}@redhat.com')
|
|
106
112
|
name = ldap_data.get('displayName')
|
|
107
|
-
subject, body = self._elastic_upload.mail_message.aws_user_over_usage_cost(user=to,
|
|
108
|
-
|
|
113
|
+
subject, body = self._elastic_upload.mail_message.aws_user_over_usage_cost(user=to,
|
|
114
|
+
user_usage=user_usage[
|
|
115
|
+
'Cost'], name=name,
|
|
116
|
+
usage_cost=self.COST_USAGE_DOLLAR)
|
|
117
|
+
self._elastic_upload.postfix_mail.send_email_postfix(subject=subject, content=body, to=to, cc=cc,
|
|
118
|
+
filename=file_name)
|
|
109
119
|
users.append(to)
|
|
110
120
|
return users
|
|
111
121
|
|
|
@@ -20,7 +20,6 @@ from cloud_governance.policy.aws.zombie_cluster_resource import ZombieClusterRes
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class NonClusterZombiePolicy:
|
|
23
|
-
|
|
24
23
|
DAYS_TO_DELETE_RESOURCE = environment_variables.environment_variables_dict.get('DAYS_TO_DELETE_RESOURCE')
|
|
25
24
|
DAYS_TO_NOTIFY_ADMINS = 6
|
|
26
25
|
DAYS_TO_TRIGGER_RESOURCE_MAIL = 4
|
|
@@ -52,9 +51,10 @@ class NonClusterZombiePolicy:
|
|
|
52
51
|
self._mail_description = MailMessage()
|
|
53
52
|
self.__ldap_host_name = self.__environment_variables_dict.get('LDAP_HOST_NAME', '')
|
|
54
53
|
self._ldap = LdapSearch(ldap_host_name=self.__ldap_host_name)
|
|
55
|
-
self.__email_alert = self.__environment_variables_dict.get(
|
|
54
|
+
self.__email_alert = self.__environment_variables_dict.get(
|
|
55
|
+
'EMAIL_ALERT') if self.__environment_variables_dict.get('EMAIL_ALERT') else False
|
|
56
56
|
self.__manager_email_alert = self.__environment_variables_dict.get('MANAGER_EMAIL_ALERT')
|
|
57
|
-
self._admins = ['
|
|
57
|
+
self._admins = ['yinsong@redhat.com', 'ebattat@redhat.com']
|
|
58
58
|
self._es_upload = ElasticUpload()
|
|
59
59
|
self.resource_pricing = ResourcesPricing()
|
|
60
60
|
self._es_operations = ElasticSearchOperations()
|
|
@@ -138,7 +138,8 @@ class NonClusterZombiePolicy:
|
|
|
138
138
|
upload_data.append(resource_data)
|
|
139
139
|
return upload_data
|
|
140
140
|
|
|
141
|
-
def _get_resource_username(self, resource_id: str, resource_type: str, create_date: datetime = '',
|
|
141
|
+
def _get_resource_username(self, resource_id: str, resource_type: str, create_date: datetime = '',
|
|
142
|
+
event_type: str = ''):
|
|
142
143
|
"""
|
|
143
144
|
Get Username from the cloudtrail
|
|
144
145
|
@param create_date:
|
|
@@ -147,10 +148,13 @@ class NonClusterZombiePolicy:
|
|
|
147
148
|
@return:
|
|
148
149
|
"""
|
|
149
150
|
if event_type:
|
|
150
|
-
return self._cloudtrail.get_username_by_instance_id_and_time(start_time=create_date,
|
|
151
|
-
|
|
151
|
+
return self._cloudtrail.get_username_by_instance_id_and_time(start_time=create_date,
|
|
152
|
+
resource_id=resource_id,
|
|
153
|
+
resource_type=resource_type,
|
|
154
|
+
event_type=event_type)
|
|
152
155
|
else:
|
|
153
|
-
return self._cloudtrail.get_username_by_instance_id_and_time(start_time=create_date,
|
|
156
|
+
return self._cloudtrail.get_username_by_instance_id_and_time(start_time=create_date,
|
|
157
|
+
resource_id=resource_id,
|
|
154
158
|
resource_type=resource_type)
|
|
155
159
|
|
|
156
160
|
def _get_policy_value(self, tags: list):
|
|
@@ -174,27 +178,36 @@ class NonClusterZombiePolicy:
|
|
|
174
178
|
if self.__email_alert:
|
|
175
179
|
try:
|
|
176
180
|
special_user_mails = self._literal_eval(self._special_user_mails)
|
|
177
|
-
user, resource_name = self._get_tag_name_from_tags(tags=tags,
|
|
181
|
+
user, resource_name = self._get_tag_name_from_tags(tags=tags,
|
|
182
|
+
tag_name='User'), self._get_tag_name_from_tags(
|
|
178
183
|
tags=tags, tag_name='Name')
|
|
179
184
|
if not resource_name:
|
|
180
185
|
resource_name = self._get_tag_name_from_tags(tags=tags, tag_name='cg-Name')
|
|
181
186
|
to = user if user not in special_user_mails else special_user_mails[user]
|
|
182
187
|
ldap_data = self._ldap.get_user_details(user_name=to)
|
|
183
|
-
cc = [self._account_admin,
|
|
188
|
+
cc = [self._account_admin,
|
|
189
|
+
f'{ldap_data.get("managerId")}@redhat.com'] if self.__manager_email_alert else []
|
|
184
190
|
name = to
|
|
185
191
|
if ldap_data:
|
|
186
192
|
name = ldap_data.get('displayName')
|
|
187
193
|
subject, body = self._mail_description.resource_message(name=name, days=days,
|
|
188
194
|
notification_days=self.DAYS_TO_TRIGGER_RESOURCE_MAIL,
|
|
189
195
|
delete_days=self.DAYS_TO_DELETE_RESOURCE,
|
|
190
|
-
resource_name=resource_name,
|
|
191
|
-
|
|
196
|
+
resource_name=resource_name,
|
|
197
|
+
resource_id=resource_id,
|
|
198
|
+
resource_type=resource_type,
|
|
199
|
+
msgadmins=self.DAYS_TO_NOTIFY_ADMINS,
|
|
200
|
+
extra_purse=kwargs.get('extra_purse'))
|
|
192
201
|
if not kwargs.get('admins'):
|
|
193
|
-
self._mail.send_email_postfix(to=to, content=body, subject=subject, cc=cc, resource_id=resource_id,
|
|
202
|
+
self._mail.send_email_postfix(to=to, content=body, subject=subject, cc=cc, resource_id=resource_id,
|
|
203
|
+
message_type=kwargs.get('message_type'),
|
|
204
|
+
extra_purse=kwargs.get('delta_cost', 0))
|
|
194
205
|
else:
|
|
195
206
|
if self.__manager_email_alert:
|
|
196
207
|
kwargs['admins'].append(f'{ldap_data.get("managerId")}@redhat.com')
|
|
197
|
-
self._mail.send_email_postfix(to=kwargs.get('admins'), content=body, subject=subject, cc=[],
|
|
208
|
+
self._mail.send_email_postfix(to=kwargs.get('admins'), content=body, subject=subject, cc=[],
|
|
209
|
+
resource_id=resource_id, message_type=kwargs.get('message_type'),
|
|
210
|
+
extra_purse=kwargs.get('delta_cost', 0))
|
|
198
211
|
except Exception as err:
|
|
199
212
|
logger.info(err)
|
|
200
213
|
|
|
@@ -251,7 +264,8 @@ class NonClusterZombiePolicy:
|
|
|
251
264
|
except Exception as err:
|
|
252
265
|
logger.info(f'Exception raised: {err}: {resource_id}')
|
|
253
266
|
|
|
254
|
-
def _check_resource_and_delete(self, resource_name: str, resource_id: str, resource_type: str, resource: dict,
|
|
267
|
+
def _check_resource_and_delete(self, resource_name: str, resource_id: str, resource_type: str, resource: dict,
|
|
268
|
+
empty_days: int, days_to_delete_resource: int, tags: list = [], **kwargs):
|
|
255
269
|
"""
|
|
256
270
|
This method check and delete resources
|
|
257
271
|
@param resource_name:
|
|
@@ -268,20 +282,28 @@ class NonClusterZombiePolicy:
|
|
|
268
282
|
tags = resource.get('Tags') if resource.get('Tags') else []
|
|
269
283
|
user = self._get_tag_name_from_tags(tag_name='User', tags=tags)
|
|
270
284
|
if not user:
|
|
271
|
-
user = self._get_resource_username(resource_id=resource_id, resource_type=resource_type,
|
|
285
|
+
user = self._get_resource_username(resource_id=resource_id, resource_type=resource_type,
|
|
286
|
+
event_type='EventName')
|
|
272
287
|
if user:
|
|
273
288
|
tags.append({'Key': 'User', 'Value': user})
|
|
274
289
|
zombie_resource = {}
|
|
275
290
|
if empty_days >= self.DAYS_TO_TRIGGER_RESOURCE_MAIL:
|
|
276
291
|
if empty_days == self.DAYS_TO_TRIGGER_RESOURCE_MAIL:
|
|
277
292
|
kwargs['delta_cost'] = kwargs.get('extra_purse')
|
|
278
|
-
self._trigger_mail(resource_type=resource_name, resource_id=resource_id, tags=tags,
|
|
293
|
+
self._trigger_mail(resource_type=resource_name, resource_id=resource_id, tags=tags,
|
|
294
|
+
days=self.DAYS_TO_TRIGGER_RESOURCE_MAIL, message_type='notification',
|
|
295
|
+
extra_purse=kwargs.get('extra_purse'), delta_cost=kwargs.get('delta_cost', 0))
|
|
279
296
|
elif empty_days == self.DAYS_TO_NOTIFY_ADMINS:
|
|
280
|
-
self._trigger_mail(resource_type=resource_name, resource_id=resource_id, tags=tags, days=empty_days,
|
|
297
|
+
self._trigger_mail(resource_type=resource_name, resource_id=resource_id, tags=tags, days=empty_days,
|
|
298
|
+
admins=self._admins, message_type='notify_admin',
|
|
299
|
+
extra_purse=kwargs.get('extra_purse'), delta_cost=kwargs.get('delta_cost', 0))
|
|
281
300
|
elif empty_days >= days_to_delete_resource:
|
|
282
301
|
if self._dry_run == 'no':
|
|
283
302
|
if self._get_policy_value(tags=tags) not in ('NOTDELETE', 'SKIP'):
|
|
284
|
-
self._trigger_mail(resource_type=resource_name, resource_id=resource_id, tags=tags,
|
|
303
|
+
self._trigger_mail(resource_type=resource_name, resource_id=resource_id, tags=tags,
|
|
304
|
+
days=empty_days, message_type='delete',
|
|
305
|
+
extra_purse=kwargs.get('extra_purse'),
|
|
306
|
+
delta_cost=kwargs.get('delta_cost', 0))
|
|
285
307
|
self.__delete_resource_on_name(resource_id=resource_id)
|
|
286
308
|
zombie_resource = resource
|
|
287
309
|
return zombie_resource
|
|
@@ -291,9 +313,10 @@ class NonClusterZombiePolicy:
|
|
|
291
313
|
This method update the tags in aws
|
|
292
314
|
@return:
|
|
293
315
|
"""
|
|
294
|
-
if left_out_days < self.DAYS_TO_DELETE_RESOURCE or self._dry_run == 'yes' or self._get_policy_value(
|
|
295
|
-
|
|
296
|
-
|
|
316
|
+
if left_out_days < self.DAYS_TO_DELETE_RESOURCE or self._dry_run == 'yes' or self._get_policy_value(
|
|
317
|
+
tags=tags) in ('NOTDELETE', 'SKIP'):
|
|
318
|
+
if self._get_tag_name_from_tags(tags=tags, tag_name='LastUsedDay') \
|
|
319
|
+
or self._get_tag_name_from_tags(tags=tags, tag_name='DryRunNoDays') \
|
|
297
320
|
or resource_left_out:
|
|
298
321
|
if self._dry_run == 'no':
|
|
299
322
|
tags = self._update_tag_value(tags=tags, tag_name='DryRunNoDays', tag_value=str(left_out_days))
|
|
@@ -321,12 +344,15 @@ class NonClusterZombiePolicy:
|
|
|
321
344
|
organize_data = []
|
|
322
345
|
if 'ec2' in self._policy:
|
|
323
346
|
for instance in resources:
|
|
324
|
-
skip_policy = self._ec2_operations.get_tag_value_from_tags(tags=instance.get('Tags', []),
|
|
347
|
+
skip_policy = self._ec2_operations.get_tag_value_from_tags(tags=instance.get('Tags', []),
|
|
348
|
+
tag_name='Policy')
|
|
325
349
|
if not skip_policy:
|
|
326
|
-
skip_policy = self._ec2_operations.get_tag_value_from_tags(tags=instance.get('Tags', []),
|
|
350
|
+
skip_policy = self._ec2_operations.get_tag_value_from_tags(tags=instance.get('Tags', []),
|
|
351
|
+
tag_name='Skip')
|
|
327
352
|
instance_data = {
|
|
328
353
|
'ResourceId': instance.get('InstanceId'), 'InstanceId': instance.get('InstanceId'),
|
|
329
|
-
'User': self._ec2_operations.get_tag_value_from_tags(tags=instance.get('Tags', []),
|
|
354
|
+
'User': self._ec2_operations.get_tag_value_from_tags(tags=instance.get('Tags', []),
|
|
355
|
+
tag_name='User'),
|
|
330
356
|
'Policy': skip_policy,
|
|
331
357
|
'LaunchTime': instance.get('LaunchTime').strftime("%Y-%m-%dT%H:%M:%S+00:00"),
|
|
332
358
|
'InstanceType': instance.get('InstanceType'),
|
|
@@ -334,7 +360,7 @@ class NonClusterZombiePolicy:
|
|
|
334
360
|
'StateTransitionReason': instance.get('StateTransitionReason')
|
|
335
361
|
}
|
|
336
362
|
for index, device_mappings in enumerate(instance['BlockDeviceMappings']):
|
|
337
|
-
instance_data.setdefault('DeviceMappings', [])\
|
|
363
|
+
instance_data.setdefault('DeviceMappings', []) \
|
|
338
364
|
.append(device_mappings['Ebs']['AttachTime'].strftime("%Y-%m-%dT%H:%M:%S+00:00"))
|
|
339
365
|
organize_data.append(instance_data)
|
|
340
366
|
else:
|
|
@@ -343,8 +369,10 @@ class NonClusterZombiePolicy:
|
|
|
343
369
|
'VolumeId': volume.get('VolumeId'),
|
|
344
370
|
'VolumeState': volume.get('State'), 'Iops': volume.get('Iops'),
|
|
345
371
|
'VolumeType': volume.get('VolumeType'),
|
|
346
|
-
'User': self._ec2_operations.get_tag_value_from_tags(tags=volume.get('Tags', []),
|
|
347
|
-
|
|
372
|
+
'User': self._ec2_operations.get_tag_value_from_tags(tags=volume.get('Tags', []),
|
|
373
|
+
tag_name='User'),
|
|
374
|
+
'Policy': self._ec2_operations.get_tag_value_from_tags(tags=volume.get('Tags', []),
|
|
375
|
+
tag_name='Policy')}
|
|
348
376
|
if volume.get('Attachments'):
|
|
349
377
|
for attachment in volume.get('Attachments'):
|
|
350
378
|
volume_data.update({
|
|
@@ -362,8 +390,12 @@ class NonClusterZombiePolicy:
|
|
|
362
390
|
volume_ids.append(block_device.get('Ebs').get('VolumeId'))
|
|
363
391
|
volumes = self._ec2_client.describe_volumes(VolumeIds=volume_ids)['Volumes']
|
|
364
392
|
for volume in volumes:
|
|
365
|
-
ebs_cost += self.resource_pricing.get_ebs_cost(volume_size=volume.get('Size'),
|
|
393
|
+
ebs_cost += self.resource_pricing.get_ebs_cost(volume_size=volume.get('Size'),
|
|
394
|
+
volume_type=volume.get('VolumeType'),
|
|
395
|
+
hours=resource_hours)
|
|
366
396
|
else:
|
|
367
397
|
if resource_type == 'ebs':
|
|
368
|
-
ebs_cost += self.resource_pricing.get_ebs_cost(volume_size=resource.get('Size'),
|
|
398
|
+
ebs_cost += self.resource_pricing.get_ebs_cost(volume_size=resource.get('Size'),
|
|
399
|
+
volume_type=resource.get('VolumeType'),
|
|
400
|
+
hours=resource_hours)
|
|
369
401
|
return round(ebs_cost, 3)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/__init__.py
RENAMED
|
File without changes
|
{cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/aws/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/gcp/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloud_governance-1.1.367 → cloud_governance-1.1.369}/cloud_governance/common/clouds/ibm/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|