cloud-governance 1.1.362__py3-none-any.whl → 1.1.364__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,6 +27,7 @@ class EC2Operations:
27
27
  self.ec2_client = get_boto3_client('ec2', region_name=region)
28
28
  self.get_full_list = Utils().get_details_resource_list
29
29
  self.utils = Utils(region=region)
30
+ self.cluster_prefix = self.__environment_variables_dict.get('CLUSTER_PREFIX')
30
31
 
31
32
  @logger_time_stamp
32
33
  @typeguard.typechecked
@@ -292,7 +293,8 @@ class EC2Operations:
292
293
  for item in resource:
293
294
  if item.get('Tags'):
294
295
  for tag in item.get('Tags'):
295
- if 'kubernetes.io/cluster/' in tag.get('Key'):
296
+ ok, _ = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix, tag=tag)
297
+ if ok:
296
298
  found = True
297
299
  break
298
300
  if found:
@@ -315,7 +317,8 @@ class EC2Operations:
315
317
  found = False
316
318
  if resource.get(tags):
317
319
  for tag in resource.get(tags):
318
- if 'kubernetes.io/cluster/' in tag.get('Key'):
320
+ ok, _ = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix, tag=tag)
321
+ if ok:
319
322
  found = True
320
323
  break
321
324
  if found:
@@ -462,20 +465,21 @@ class EC2Operations:
462
465
 
463
466
  def is_cluster_resource(self, resource_id: str):
464
467
  """
465
- This method checks tags have cluster key, if cluster return True else False
468
+ This method checks tags have a cluster key, if cluster return True else False
466
469
  @param resource_id:
467
470
  @return:
468
471
  """
469
472
  resource_tags = self.ec2_client.describe_tags(Filters=[{'Name': 'resource-id', 'Values': [resource_id]}])
470
473
  if resource_tags.get('Tags'):
471
474
  for tag in resource_tags['Tags']:
472
- if 'kubernetes.io/cluster/' in tag.get('Key'):
475
+ ok, _ = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix, tag=tag)
476
+ if ok:
473
477
  return True
474
478
  return False
475
479
 
476
480
  def get_ec2_list(self, instances_list: list):
477
481
  """
478
- This method return all instances in one list by taking instances_list
482
+ This method returns all instances in one list by taking instances_list
479
483
  @param instances_list:
480
484
  @return:
481
485
  """
@@ -487,7 +491,7 @@ class EC2Operations:
487
491
 
488
492
  def get_tag(self, name: str, tags: list):
489
493
  """
490
- This method get tag name fom the tags
494
+ This method get tag name from the tags
491
495
  @param name:
492
496
  @param tags:
493
497
  @return:
@@ -527,7 +531,12 @@ class EC2Operations:
527
531
  def get_tag_value_from_tags(self, tags: list, tag_name: str, cast_type: str = 'str',
528
532
  default_value: any = '') -> any:
529
533
  """
530
- This method return the tag value inputted by tag_name
534
+ This method returns the tag value inputted by tag_name
535
+ :param tags:
536
+ :param tag_name:
537
+ :param cast_type:
538
+ :param default_value:
539
+ :return:
531
540
  """
532
541
  if tags:
533
542
  for tag in tags:
@@ -589,7 +598,7 @@ class EC2Operations:
589
598
 
590
599
  def tag_ec2_resources(self, client_method: Callable, tags: list, resource_ids: list):
591
600
  """
592
- This method tag the ec2 resources with batch wise of 10
601
+ This method tags the ec2 resources with batch wise of 10
593
602
  :param client_method:
594
603
  :param tags:
595
604
  :param resource_ids:
@@ -604,7 +613,7 @@ class EC2Operations:
604
613
 
605
614
  def get_attached_time(self, volume_list: list):
606
615
  """
607
- This method return the root volume attached time
616
+ This method returns the root volume attached time
608
617
  :param volume_list:
609
618
  :return:
610
619
  """
@@ -107,3 +107,25 @@ class Utils:
107
107
  resources = func_name(Marker=resources[iter_tag_name], **kwargs)
108
108
  resource_list.extend(resources[output_tag])
109
109
  return resource_list
110
+
111
+ @staticmethod
112
+ def is_cluster_resource(cluster_prefix: list, tags: list = None, tag: dict = None):
113
+ """
114
+ This method checks if the resource i.e: EC2, IAM is a cluster resource
115
+ Resources have the tags
116
+ :param tag:
117
+ :param cluster_prefix:
118
+ :param tags:
119
+ :return:
120
+ """
121
+ for prefix in cluster_prefix:
122
+ prefix = prefix.strip()
123
+ if tag:
124
+ if tag.get('Key').startswith(prefix):
125
+ return True, tag.get('Key')
126
+ else:
127
+ if tags:
128
+ for tag in tags:
129
+ if tag.get('Key').startswith(prefix):
130
+ return True, tag.get('Key')
131
+ return False, None
@@ -1,4 +1,5 @@
1
1
  import argparse
2
+ import json
2
3
  import os
3
4
 
4
5
  from ast import literal_eval
@@ -126,7 +127,16 @@ class EnvironmentVariables:
126
127
  '{}')
127
128
  self._environment_variables_dict['DAYS_TO_DELETE_RESOURCE'] = int(
128
129
  EnvironmentVariables.get_env('DAYS_TO_DELETE_RESOURCE', '7'))
129
-
130
+ try:
131
+ self._environment_variables_dict['CLUSTER_PREFIX'] = json.loads(EnvironmentVariables.get_env(
132
+ 'CLUSTER_PREFIX',
133
+ '["kubernetes.io/cluster", "sigs.k8s.io/cluster-api-provider-aws/cluster"]'
134
+ ))
135
+ except json.JSONDecodeError as err:
136
+ self._environment_variables_dict['CLUSTER_PREFIX'] = [
137
+ "kubernetes.io/cluster",
138
+ "sigs.k8s.io/cluster-api-provider-aws/cluster"
139
+ ]
130
140
  # AWS Cost Explorer tags
131
141
  self._environment_variables_dict['cost_metric'] = EnvironmentVariables.get_env('cost_metric', 'UnblendedCost')
132
142
  self._environment_variables_dict['start_date'] = EnvironmentVariables.get_env('start_date', '')
@@ -6,12 +6,6 @@ from cloud_governance.common.clouds.aws.ec2.ec2_operations import EC2Operations
6
6
  from cloud_governance.common.logger.init_logger import logger
7
7
  from cloud_governance.common.clouds.aws.utils.utils import Utils
8
8
 
9
- # @todo add next token
10
- # response = client.get_servers()
11
- # results = response["serverList"]
12
- # while "NextToken" in response:
13
- # response = client.get_servers(NextToken=response["NextToken"])
14
- # results.extend(response["serverList"])
15
9
  from cloud_governance.policy.policy_operations.aws.zombie_cluster.delete_ec2_resources import DeleteEC2Resources
16
10
  from cloud_governance.policy.policy_operations.aws.zombie_cluster.delete_iam_resources import DeleteIAMResources
17
11
  from cloud_governance.policy.policy_operations.aws.zombie_cluster.delete_s3_resources import DeleteS3Resources
@@ -23,10 +17,10 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
23
17
  alert user after 4 days of cluster deleted. and delete the resources after 7 days of cluster deleted.
24
18
  """
25
19
 
26
- def __init__(self, cluster_prefix: str = None, delete: bool = False, region: str = 'us-east-2',
20
+ def __init__(self, cluster_prefix: list = None, delete: bool = False, region: str = 'us-east-2',
27
21
  cluster_tag: str = '', resource_name: str = '', force_delete: bool = False):
28
22
  super().__init__(region=region, force_delete=force_delete)
29
- self.cluster_prefix = cluster_prefix
23
+ self.cluster_prefix = cluster_prefix if cluster_prefix is not None else []
30
24
  self.delete = delete
31
25
  self.cluster_tag = cluster_tag
32
26
  self.resource_name = resource_name
@@ -53,13 +47,15 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
53
47
  if items.get('Instances'):
54
48
  instances_list.append(items['Instances'])
55
49
  for instance in instances_list:
50
+
56
51
  for item in instance:
57
- if item.get('InstanceId'):
58
- instance_id = item['InstanceId']
52
+ instance_id = item.get('InstanceId')
59
53
  if item.get('Tags'):
60
- for tag in item['Tags']:
61
- if tag['Key'].startswith(self.cluster_prefix) and tag.get('Value', '').lower() == 'owned':
62
- result_instance[instance_id] = tag['Key']
54
+ ok, cluster_id = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix,
55
+ tags=item.get('Tags', []))
56
+ if ok:
57
+ result_instance[instance_id] = cluster_id
58
+
63
59
  return result_instance
64
60
 
65
61
  def _cluster_instance(self):
@@ -75,12 +71,11 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
75
71
  instances_list.append(items['Instances'])
76
72
  for instance in instances_list:
77
73
  for item in instance:
78
- if item.get('InstanceId'):
79
- instance_id = item['InstanceId']
80
- if item.get('Tags'):
81
- for tag in item['Tags']:
82
- if tag['Key'].startswith(self.cluster_prefix) and tag.get('Value', '').lower() == 'owned':
83
- result_instance[instance_id] = tag['Key']
74
+ instance_id = item['InstanceId']
75
+ ok, cluster_id = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix,
76
+ tags=item.get('Tags', []))
77
+ if ok:
78
+ result_instance[instance_id] = cluster_id
84
79
 
85
80
  return result_instance
86
81
 
@@ -98,20 +93,21 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
98
93
  # skip when input_resource_id no found
99
94
  else:
100
95
  continue
101
- if resource.get(tags):
102
- for tag in resource[tags]:
103
- if tag['Key'].startswith(self.cluster_prefix) and tag.get('Value', '').lower() == 'owned':
104
- # when input a specific cluster, return resource id of the input cluster
105
- for inner_tag in resource[tags]:
106
- if self.cluster_tag:
107
- if self.cluster_tag == inner_tag['Key']:
108
- result_resources_key_id[resource_id] = tag['Key']
109
- elif self.resource_name:
110
- if self.resource_name == inner_tag['Value']:
111
- result_resources_key_id[resource_id] = tag['Key']
112
- else:
96
+ tags_list = resource.get(tags, [])
97
+ if tags:
98
+ ok, cluster_id = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix,
99
+ tags=tags_list)
100
+ if ok:
101
+ result_resources_key_id[resource_id] = cluster_id
102
+ for tag in tags_list:
103
+ if ok:
104
+ if self.cluster_tag and self.cluster_tag == tag['Key']:
105
+ result_resources_key_id[resource_id] = tag['Key']
106
+ break
107
+ else:
108
+ if self.resource_name and self.resource_name == tag['Value']:
113
109
  result_resources_key_id[resource_id] = tag['Key']
114
- break
110
+ break
115
111
  return result_resources_key_id
116
112
 
117
113
  def __extract_vpc_id_from_resource_data(self, zombie_id: str, resource_data: list, input_tag: str,
@@ -136,7 +132,7 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
136
132
 
137
133
  def __get_cluster_resources_by_vpc_id(self, vpc_id: str, resource_data: list, output_tag: str, input_tag: str = ''):
138
134
  """
139
- this method list all the resources by vpc_id
135
+ this method lists all the resources by vpc_id
140
136
  :param vpc_id:
141
137
  :param resource_data:
142
138
  :param output_tag:
@@ -238,7 +234,7 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
238
234
 
239
235
  def zombie_cluster_snapshot(self, vpc_id: str = '', cluster_tag_vpc: str = ''):
240
236
  """
241
- This method returns list of cluster's snapshot according to cluster tag name and cluster name data
237
+ This method returns the list of cluster's snapshot according to cluster tag name and cluster name data
242
238
  """
243
239
  snapshots_data = self.ec2_operations.get_snapshots()
244
240
  exist_snapshot = self.__get_cluster_resources(resources_list=snapshots_data, input_resource_id='SnapshotId')
@@ -463,16 +459,20 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
463
459
  resource_id = resource['LoadBalancerName']
464
460
  tags = self.elb_client.describe_tags(LoadBalancerNames=[resource_id])
465
461
  for item in tags['TagDescriptions']:
466
- if item.get('Tags'):
467
- for tag in item['Tags']:
468
- if tag['Key'].startswith(self.cluster_prefix):
462
+ tags = item.get('Tags')
463
+ if tags:
464
+ ok, cluster_id = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix,
465
+ tags=tags)
466
+ if ok:
467
+ exist_load_balancer[resource_id] = cluster_id
468
+ for tag in tags:
469
+ if ok:
469
470
  # when input a specific cluster, return resource id of the input cluster
470
471
  if self.cluster_tag:
471
472
  if self.cluster_tag == tag['Key']:
472
473
  exist_load_balancer[resource_id] = tag['Key']
473
- else:
474
- exist_load_balancer[resource_id] = tag['Key']
475
- break
474
+ break
475
+
476
476
  zombies = self.__get_zombie_resources(exist_load_balancer)
477
477
  resources = self._get_tags_of_zombie_resources(resources=load_balancers_data,
478
478
  resource_id_name='LoadBalancerName', zombies=zombies,
@@ -502,16 +502,20 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
502
502
  resource_id = resource['LoadBalancerArn']
503
503
  tags = self.elbv2_client.describe_tags(ResourceArns=[resource_id])
504
504
  for item in tags['TagDescriptions']:
505
- if item.get('Tags'):
506
- for tag in item['Tags']:
507
- if tag['Key'].startswith(self.cluster_prefix):
505
+ tags = item.get('Tags', [])
506
+ if tags:
507
+ ok, cluster_id = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix,
508
+ tags=tags)
509
+ if ok:
510
+ exist_load_balancer[resource_id] = cluster_id
511
+ for tag in tags:
512
+ if ok:
508
513
  # when input a specific cluster, return resource id of the input cluster
509
514
  if self.cluster_tag:
510
515
  if self.cluster_tag == tag['Key']:
511
516
  exist_load_balancer[resource_id] = tag['Key']
512
- else:
513
- exist_load_balancer[resource_id] = tag['Key']
514
- break
517
+ break
518
+
515
519
  zombies = self.__get_zombie_resources(exist_load_balancer)
516
520
  resources = self._get_tags_of_zombie_resources(resources=load_balancers_data,
517
521
  resource_id_name='LoadBalancerArn', zombies=zombies,
@@ -858,16 +862,19 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
858
862
  if 'worker-role' in role_name or 'master-role' in role_name:
859
863
  role_data = self.iam_client.get_role(RoleName=role_name)
860
864
  data = role_data['Role']
861
- if data.get('Tags'):
865
+ tags = data.get('Tags', [])
866
+ if tags:
867
+ ok, cluster_id = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix,
868
+ tags=tags)
869
+ if ok:
870
+ exist_role_name_tag[role_name] = cluster_id
862
871
  for tag in data['Tags']:
863
- if tag['Key'].startswith(self.cluster_prefix):
872
+ if ok:
864
873
  # when input a specific cluster, return resource id of the input cluster
865
874
  if self.cluster_tag:
866
875
  if self.cluster_tag == tag['Key']:
867
876
  exist_role_name_tag[role_name] = tag['Key']
868
- else:
869
- exist_role_name_tag[role_name] = tag['Key']
870
- break
877
+ break
871
878
  zombies = []
872
879
  cluster_left_out_days = {}
873
880
  if exist_role_name_tag:
@@ -900,16 +907,19 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
900
907
  user_name = user['UserName']
901
908
  user_data = self.iam_client.get_user(UserName=user_name)
902
909
  data = user_data['User']
903
- if data.get('Tags'):
904
- for tag in data['Tags']:
905
- if tag['Key'].startswith(self.cluster_prefix):
910
+ tags = data.get('Tags', [])
911
+ if tags:
912
+ ok, cluster_id = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix,
913
+ tags=tags)
914
+ if ok:
915
+ exist_user_name_tag[user_name] = cluster_id
916
+ for tag in tags:
917
+ if ok:
906
918
  # when input a specific cluster, return resource id of the input cluster
907
919
  if self.cluster_tag:
908
920
  if self.cluster_tag == tag['Key']:
909
921
  exist_user_name_tag[user_name] = tag['Key']
910
- else:
911
- exist_user_name_tag[user_name] = tag['Key']
912
- break
922
+ break
913
923
  zombies = self.__get_all_zombie_resources(exist_user_name_tag)
914
924
  resources = self._get_tags_of_zombie_resources(resources=users_data, resource_id_name='UserName',
915
925
  zombies=zombies, aws_service='user')
@@ -944,15 +954,18 @@ class ZombieClusterResources(ZombieClusterCommonMethods):
944
954
  tags = self.s3_client.get_bucket_tagging(Bucket=bucket['Name'])
945
955
  except Exception as e: # continue when no bucket tags
946
956
  continue
947
- for tag in tags['TagSet']:
948
- if tag['Key'].startswith(self.cluster_prefix):
957
+ tags = tags.get('TagSet', [])
958
+ ok, cluster_id = Utils.is_cluster_resource(cluster_prefix=self.cluster_prefix,
959
+ tags=tags)
960
+ if ok:
961
+ exist_bucket_name_tag[bucket['Name']] = cluster_id
962
+ for tag in tags:
963
+ if ok:
949
964
  # when input a specific cluster, return resource id of the input cluster
950
965
  if self.cluster_tag:
951
966
  if self.cluster_tag == tag['Key']:
952
967
  exist_bucket_name_tag[bucket['Name']] = tag['Key']
953
- else:
954
- exist_bucket_name_tag[bucket['Name']] = tag['Key']
955
- break
968
+ break
956
969
  zombies = self.__get_all_zombie_resources(exist_bucket_name_tag)
957
970
  resources = self._get_tags_of_zombie_resources(resources=response['Buckets'], resource_id_name='Name',
958
971
  zombies=zombies, aws_service='bucket', aws_tag='TagSet')
@@ -2,7 +2,6 @@ from datetime import datetime
2
2
 
3
3
  import typeguard
4
4
 
5
- from cloud_governance.common.clouds.aws.ec2.ec2_operations import EC2Operations
6
5
  from cloud_governance.common.clouds.aws.utils.common_methods import get_tag_value_from_tags
7
6
  from cloud_governance.common.elasticsearch.elasticsearch_operations import ElasticSearchOperations
8
7
  from cloud_governance.main.environment_variables import environment_variables
@@ -16,7 +15,8 @@ from cloud_governance.policy.aws.zombie_cluster_resource import ZombieClusterRes
16
15
  @typeguard.typechecked
17
16
  def __get_resource_list(region, delete: bool = False, resource: str = '', cluster_tag: str = '',
18
17
  resource_name: str = '', service_type: str = ' '):
19
- zombie_cluster_resources = ZombieClusterResources(cluster_prefix='kubernetes.io/cluster/', delete=delete,
18
+ cluster_prefix = environment_variables.environment_variables_dict.get('CLUSTER_PREFIX')
19
+ zombie_cluster_resources = ZombieClusterResources(cluster_prefix=cluster_prefix, delete=delete,
20
20
  region=region, cluster_tag=cluster_tag,
21
21
  resource_name=resource_name)
22
22
  zombie_cluster_resources_dict = {'zombie_cluster_volume': zombie_cluster_resources.zombie_cluster_volume,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloud-governance
3
- Version: 1.1.362
3
+ Version: 1.1.364
4
4
  Summary: Cloud Governance Tool
5
5
  Home-page: https://github.com/redhat-performance/cloud-governance
6
6
  Author: Red Hat
@@ -49,7 +49,7 @@ cloud_governance/common/clouds/aws/cost_explorer/cost_explorer_operations.py,sha
49
49
  cloud_governance/common/clouds/aws/dynamodb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  cloud_governance/common/clouds/aws/dynamodb/dynamodb_operations.py,sha256=eeV3YgT2bAMwb3UmQjCGdh3ie3-Q8UvKNv4iOypYwNg,4916
51
51
  cloud_governance/common/clouds/aws/ec2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- cloud_governance/common/clouds/aws/ec2/ec2_operations.py,sha256=wt5gLCe5EFtooaukWRS6QBliCy_1_LDurTs5i1IZH4Y,24291
52
+ cloud_governance/common/clouds/aws/ec2/ec2_operations.py,sha256=0ibMvf7nqyK9MCRhxrg11xnOPELqsZIQsZUgd6_neKc,24680
53
53
  cloud_governance/common/clouds/aws/iam/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
54
  cloud_governance/common/clouds/aws/iam/iam_operations.py,sha256=ngVh19oIse1UjzvUkImYzs3xBFt74LhdUGbOhI58ZMA,4843
55
55
  cloud_governance/common/clouds/aws/price/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -71,7 +71,7 @@ cloud_governance/common/clouds/aws/support/__init__.py,sha256=47DEQpj8HBSa-_TImW
71
71
  cloud_governance/common/clouds/aws/support/support_operations.py,sha256=ELXeg8lQ-Jz0jGuGaaT2jMte0lxzIF38VSsYaF95wUk,1364
72
72
  cloud_governance/common/clouds/aws/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
73
  cloud_governance/common/clouds/aws/utils/common_methods.py,sha256=h79by6nD1JnGeCsSP0xLJ86ptbbSLCSRs3JsOE26PEo,1720
74
- cloud_governance/common/clouds/aws/utils/utils.py,sha256=rm6qKo6tFUJepIJ7qeINLR6fdEInYG1eVipkfvDK9Do,4165
74
+ cloud_governance/common/clouds/aws/utils/utils.py,sha256=deKge5ZeijqyXRvUsSnPBwm6a7U9lHI21h9e02rHtYI,4917
75
75
  cloud_governance/common/clouds/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  cloud_governance/common/clouds/azure/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  cloud_governance/common/clouds/azure/common/common_operations.py,sha256=MPSEXkNyvd7SHRuXNmjby8nK2_UZ__zOvo2H_9T9E_M,3138
@@ -143,7 +143,7 @@ cloud_governance/common/utils/configs.py,sha256=8ry4UQT9s_GUivhrCdwS0vOWYN6OJIHD
143
143
  cloud_governance/common/utils/json_datetime_encoder.py,sha256=_-jzRTe0UqAKTn2E9qaU8SYIxHUoRA5ElWuVA0Y54Xw,338
144
144
  cloud_governance/common/utils/utils.py,sha256=ZUsi4ax2XhDIV-EQ5kJt5Ppd72kmm2psqcg1cNDZrvc,4349
145
145
  cloud_governance/main/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
- cloud_governance/main/environment_variables.py,sha256=Hn4rTIF8w4calJZC1Joz9mlsAZ7y9OQsb_30gDsiNd8,28528
146
+ cloud_governance/main/environment_variables.py,sha256=PzRntrFs4gZepEuTCuqCvjF_NSGLN9M6s0z8GcnszYQ,29028
147
147
  cloud_governance/main/environment_variables_exceptions.py,sha256=UR0Ith0P0oshsDZdJRlRq8ZUTt0h8jFvUtrnP4m4AIY,437
148
148
  cloud_governance/main/es_uploader.py,sha256=6Ify5CS2NtUF1xXZ-rMwpYxVzDKfEZhv2vogWFltt98,10656
149
149
  cloud_governance/main/main.py,sha256=4TBiCBO_1z8KpGXb8brPKBmv3jHBl8fl_-Sb80ctYno,18880
@@ -166,7 +166,7 @@ cloud_governance/policy/aws/optimize_resources_report.py,sha256=zG7w8KHF7Z25jxYG
166
166
  cloud_governance/policy/aws/s3_inactive.py,sha256=NXUUGtJhpqohaWYczSebw-q0Q7RKg3XMMj_h7xfGhQ0,2839
167
167
  cloud_governance/policy/aws/skipped_resources.py,sha256=D0kbt9dg6Bkl5PgGaqimWvLct6D-JOnerzJ0FkWzGFc,5679
168
168
  cloud_governance/policy/aws/spot_savings_analysis.py,sha256=lGG5qtz8pr7xjLo5BrtVSHGTz928MLwYPbSCaDfpTes,5513
169
- cloud_governance/policy/aws/zombie_cluster_resource.py,sha256=EVxz76Tx0iLgXuFBZj_AOdkJBAz2m5U8RmSUkWQcmVo,59195
169
+ cloud_governance/policy/aws/zombie_cluster_resource.py,sha256=pwE8MypeqQfSQs--U1hbk5nk1M6x0R_NLs0x-wmOIjI,59626
170
170
  cloud_governance/policy/aws/zombie_snapshots.py,sha256=V48cq4GCG2z-MRwUSE4b5wQcGeI_T1Ah99SiHlTwkvY,3834
171
171
  cloud_governance/policy/aws/cleanup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
172
  cloud_governance/policy/aws/cleanup/database_idle.py,sha256=-kITbr5yB1QAi65D6zRO0kdWH1CFPEyd86nJua-dNKM,3632
@@ -231,7 +231,7 @@ cloud_governance/policy/policy_operations/aws/zombie_cluster/__init__.py,sha256=
231
231
  cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_ec2_resources.py,sha256=LhT91KCA-POvFbPSp7K_LnVJX6SFJPwysWtfW4O1SWg,27146
232
232
  cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_iam_resources.py,sha256=HzHIx_FLRCrlhYi15-Y4vrOmmbBUhm-kAA7FWgRqYN0,3730
233
233
  cloud_governance/policy/policy_operations/aws/zombie_cluster/delete_s3_resources.py,sha256=Y0PaOGUEurgizoXjZb8a5qC2MVObcqGwJ4oYGZ-Oyic,1373
234
- cloud_governance/policy/policy_operations/aws/zombie_cluster/run_zombie_cluster_resources.py,sha256=EOxBf4t4mgrpKPs0CVazqA_wQLSwXav5BWvMpVtEDgE,12313
234
+ cloud_governance/policy/policy_operations/aws/zombie_cluster/run_zombie_cluster_resources.py,sha256=6ZC-KQpRPpRdqY-QuVI5BYoaaxgTv4QLNDUJ8v7oTiU,12315
235
235
  cloud_governance/policy/policy_operations/aws/zombie_cluster/validate_zombies.py,sha256=lOCmOTfrF6M1QZl6to7Y1A13Cvf-taNxBOvvhFswOTo,1164
236
236
  cloud_governance/policy/policy_operations/aws/zombie_cluster/zombie_cluster_common_methods.py,sha256=VqXk8A0OLZOxBm422kb-n5zfM8DY4FYdkwZO91xwRxQ,14791
237
237
  cloud_governance/policy/policy_operations/aws/zombie_non_cluster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -263,8 +263,8 @@ cloud_governance/policy/policy_runners/elasticsearch/__init__.py,sha256=47DEQpj8
263
263
  cloud_governance/policy/policy_runners/elasticsearch/upload_elastic_search.py,sha256=pOwUJWXjJbyTy8iv3Ap8xJGnqQe-5lZgoR8-vGfAVos,1881
264
264
  cloud_governance/policy/policy_runners/ibm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
265
265
  cloud_governance/policy/policy_runners/ibm/policy_runner.py,sha256=V0E_f7F3hXit0aSq4BlfX1Jd4vjR2NEvOWsJ5upvZ4o,1302
266
- cloud_governance-1.1.362.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
267
- cloud_governance-1.1.362.dist-info/METADATA,sha256=CGX1-fNDewqVwZqGQl85u8m15hojXa6MZ5MXM9HtMhs,11364
268
- cloud_governance-1.1.362.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
269
- cloud_governance-1.1.362.dist-info/top_level.txt,sha256=jfB1fgj7jvx3YZkZA4G6hFeS1RHO7J7XtnbjuMNMRww,17
270
- cloud_governance-1.1.362.dist-info/RECORD,,
266
+ cloud_governance-1.1.364.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
267
+ cloud_governance-1.1.364.dist-info/METADATA,sha256=VXfrBwJvenIoddZji5UmX8g1qtD7NSEGVqY6jx-KQEw,11364
268
+ cloud_governance-1.1.364.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
269
+ cloud_governance-1.1.364.dist-info/top_level.txt,sha256=jfB1fgj7jvx3YZkZA4G6hFeS1RHO7J7XtnbjuMNMRww,17
270
+ cloud_governance-1.1.364.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5