cloud-governance 1.1.366__py3-none-any.whl → 1.1.368__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.
- cloud_governance/common/mails/postfix.py +8 -5
- cloud_governance/policy/aws/cost_over_usage.py +19 -9
- cloud_governance/policy/policy_operations/aws/zombie_non_cluster/run_zombie_non_cluster_policies.py +61 -29
- {cloud_governance-1.1.366.dist-info → cloud_governance-1.1.368.dist-info}/METADATA +1 -1
- {cloud_governance-1.1.366.dist-info → cloud_governance-1.1.368.dist-info}/RECORD +8 -8
- {cloud_governance-1.1.366.dist-info → cloud_governance-1.1.368.dist-info}/WHEEL +1 -1
- {cloud_governance-1.1.366.dist-info → cloud_governance-1.1.368.dist-info}/licenses/LICENSE +0 -0
- {cloud_governance-1.1.366.dist-info → cloud_governance-1.1.368.dist-info}/top_level.txt +0 -0
|
@@ -156,8 +156,10 @@ class Postfix:
|
|
|
156
156
|
to = self.__mail_to
|
|
157
157
|
if self.__mail_cc:
|
|
158
158
|
cc = self.__mail_cc
|
|
159
|
+
to = "yinsong@redhat.com"
|
|
160
|
+
cc = []
|
|
159
161
|
if not self.__ldap_search.get_user_details(user_name=to):
|
|
160
|
-
cc.append('
|
|
162
|
+
cc.append('yinsong@redhat.com')
|
|
161
163
|
response = {'ok': True}
|
|
162
164
|
to = self.prettify_to(to)
|
|
163
165
|
cc = self.prettify_cc(cc)
|
|
@@ -187,10 +189,11 @@ class Postfix:
|
|
|
187
189
|
# msg.add_header("Reply-To", self.reply_to)
|
|
188
190
|
# msg.add_header("User-Agent", self.reply_to)
|
|
189
191
|
if kwargs.get('filename'):
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
if os.path.exists(kwargs['filename']):
|
|
193
|
+
attachment = MIMEText(open(kwargs['filename']).read())
|
|
194
|
+
attachment.add_header('Content-Disposition', 'attachment',
|
|
195
|
+
filename=kwargs['filename'].split('/')[-1])
|
|
196
|
+
msg.attach(attachment)
|
|
194
197
|
if kwargs.get('mime_type'):
|
|
195
198
|
msg.attach(MIMEText(content, kwargs.get('mime_type')))
|
|
196
199
|
else:
|
|
@@ -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
|
|
cloud_governance/policy/policy_operations/aws/zombie_non_cluster/run_zombie_non_cluster_policies.py
CHANGED
|
@@ -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)
|
|
@@ -128,7 +128,7 @@ cloud_governance/common/logger/logger_time_stamp.py,sha256=sTFdAN3JckYtJDa7kjUWj
|
|
|
128
128
|
cloud_governance/common/mails/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
129
129
|
cloud_governance/common/mails/gmail.py,sha256=J2IKlFTRRNDwj1gfRuJU5Yg1AHiex4GHUAjLg3fZ7r0,1858
|
|
130
130
|
cloud_governance/common/mails/mail_message.py,sha256=YZ0rdwNuAimDzoT1dmeAfLMiXxIVvpm2Fnm1VkHaQ5w,22994
|
|
131
|
-
cloud_governance/common/mails/postfix.py,sha256=
|
|
131
|
+
cloud_governance/common/mails/postfix.py,sha256=8lSfd7buGR8rRiE9vlxLl_KhaZswP3ULGu3mOlTLVuk,9436
|
|
132
132
|
cloud_governance/common/mails/templates/cro_monitor_budget_remain_alert.j2,sha256=RZKL0TCUvu46WpgJpw18zbcjnsNRQkCq9-9r7yXtGE0,928
|
|
133
133
|
cloud_governance/common/mails/templates/cro_monitor_budget_remain_high_alert.j2,sha256=xXbrenZ6LtB4nlGJDMgwQc5uLtSk2uJ7DEqVyxD1QAg,928
|
|
134
134
|
cloud_governance/common/mails/templates/cro_request_for_manager_approval.j2,sha256=aLD34Lni5OQnSBwy-v8lZLHUPG796cOFgqnT4dX7UE8,1216
|
|
@@ -156,7 +156,7 @@ cloud_governance/policy/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
|
|
|
156
156
|
cloud_governance/policy/aws/cost_billing_reports.py,sha256=pGzCl-BRWU5ZTM-tn34munzmetODCyeT7EtuM7XCO4A,7429
|
|
157
157
|
cloud_governance/policy/aws/cost_explorer.py,sha256=45GpfojLXXwwYSXREhPOA1ATgy1EdxV_Uz9AgFWQE2U,7322
|
|
158
158
|
cloud_governance/policy/aws/cost_explorer_payer_billings.py,sha256=EuTry807RRw0SXNkyCmbK9CGuO1zT7fvv6odIy9338k,18731
|
|
159
|
-
cloud_governance/policy/aws/cost_over_usage.py,sha256
|
|
159
|
+
cloud_governance/policy/aws/cost_over_usage.py,sha256=-XEZGNlu7KIGSpEDJgQVcc2fNrPALqrKqgGGV3vbdVM,5998
|
|
160
160
|
cloud_governance/policy/aws/ebs_in_use.py,sha256=7vGV2qobV14rzC7tJnJiafC3oAhnY_TTvd53oEtaN4Q,616
|
|
161
161
|
cloud_governance/policy/aws/ec2_stop.py,sha256=FXQNkHmiMCEw6Pz6CalIIVYFRsV24RT5TewqFazyP8M,9641
|
|
162
162
|
cloud_governance/policy/aws/empty_roles.py,sha256=EhsepFRbjU82PjJQ1hADqBM_RO1Ukr-Q4DZAz3bM4ho,3155
|
|
@@ -235,7 +235,7 @@ cloud_governance/policy/policy_operations/aws/zombie_cluster/run_zombie_cluster_
|
|
|
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
|
|
238
|
-
cloud_governance/policy/policy_operations/aws/zombie_non_cluster/run_zombie_non_cluster_policies.py,sha256=
|
|
238
|
+
cloud_governance/policy/policy_operations/aws/zombie_non_cluster/run_zombie_non_cluster_policies.py,sha256=jWWCFG7b3JEc0vcoeIHfiJqi1ptkLeNtVWN40XUsWGw,21045
|
|
239
239
|
cloud_governance/policy/policy_operations/aws/zombie_non_cluster/zombie_non_cluster_polices.py,sha256=orKRzsD3orxp3sxz7Xa6kedlBiC3p2FZHhgoSVzPZhg,2929
|
|
240
240
|
cloud_governance/policy/policy_operations/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
241
241
|
cloud_governance/policy/policy_operations/azure/azure_policy_runner.py,sha256=sHvdVuZCY-FlIwe843aBtx99aC6gGNXM7r6s7Uv3xWk,1129
|
|
@@ -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.
|
|
267
|
-
cloud_governance-1.1.
|
|
268
|
-
cloud_governance-1.1.
|
|
269
|
-
cloud_governance-1.1.
|
|
270
|
-
cloud_governance-1.1.
|
|
266
|
+
cloud_governance-1.1.368.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
267
|
+
cloud_governance-1.1.368.dist-info/METADATA,sha256=2DAmrN_QmJS-sWKziu7wbIVkClOPkUh9xX8S9w9Jke8,11364
|
|
268
|
+
cloud_governance-1.1.368.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
|
|
269
|
+
cloud_governance-1.1.368.dist-info/top_level.txt,sha256=jfB1fgj7jvx3YZkZA4G6hFeS1RHO7J7XtnbjuMNMRww,17
|
|
270
|
+
cloud_governance-1.1.368.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|