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.
@@ -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('athiruma@redhat.com')
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
- attachment = MIMEText(open(kwargs['filename']).read())
191
- attachment.add_header('Content-Disposition', 'attachment',
192
- filename=kwargs['filename'].split('/')[-1])
193
- msg.attach(attachment)
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'), reverse=True)
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 resource_sort_list]:
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 send mail when cost_usage is greater than given cost usage in last specified days
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, index=self._elastic_upload.es_index)
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
- used_instances = self.get_user_used_instances(user_used_list=user_usage['Instances'])
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
- with open(file_name, 'w') as file:
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, user_usage=user_usage['Cost'], name=name, usage_cost=self.COST_USAGE_DOLLAR)
108
- self._elastic_upload.postfix_mail.send_email_postfix(subject=subject, content=body, to=to, cc=cc, filename=file_name)
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('EMAIL_ALERT') if self.__environment_variables_dict.get('EMAIL_ALERT') else False
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 = ['athiruma@redhat.com', 'ebattat@redhat.com']
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 = '', event_type: str = ''):
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, resource_id=resource_id,
151
- resource_type=resource_type, event_type=event_type)
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, resource_id=resource_id,
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, tag_name='User'), self._get_tag_name_from_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, f'{ldap_data.get("managerId")}@redhat.com'] if self.__manager_email_alert else []
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, resource_id=resource_id,
191
- resource_type=resource_type, msgadmins=self.DAYS_TO_NOTIFY_ADMINS, extra_purse=kwargs.get('extra_purse'))
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, message_type=kwargs.get('message_type'), extra_purse=kwargs.get('delta_cost', 0))
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=[], resource_id=resource_id, message_type=kwargs.get('message_type'), extra_purse=kwargs.get('delta_cost', 0))
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, empty_days: int, days_to_delete_resource: int, tags: list = [], **kwargs):
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, event_type='EventName')
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, days=self.DAYS_TO_TRIGGER_RESOURCE_MAIL, message_type='notification', extra_purse=kwargs.get('extra_purse'), delta_cost=kwargs.get('delta_cost', 0))
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, admins=self._admins, message_type='notify_admin', extra_purse=kwargs.get('extra_purse'), delta_cost=kwargs.get('delta_cost', 0))
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, days=empty_days, message_type='delete', extra_purse=kwargs.get('extra_purse'), delta_cost=kwargs.get('delta_cost', 0))
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(tags=tags) in ('NOTDELETE', 'SKIP'):
295
- if self._get_tag_name_from_tags(tags=tags, tag_name='LastUsedDay')\
296
- or self._get_tag_name_from_tags(tags=tags, tag_name='DryRunNoDays')\
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', []), tag_name='Policy')
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', []), tag_name='Skip')
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', []), tag_name='User'),
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', []), tag_name='User'),
347
- 'Policy': self._ec2_operations.get_tag_value_from_tags(tags=volume.get('Tags', []), tag_name='Policy')}
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'), volume_type=volume.get('VolumeType'), hours=resource_hours)
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'), volume_type=resource.get('VolumeType'), hours=resource_hours)
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloud-governance
3
- Version: 1.1.366
3
+ Version: 1.1.368
4
4
  Summary: Cloud Governance Tool
5
5
  Home-page: https://github.com/redhat-performance/cloud-governance
6
6
  Author: Red Hat
@@ -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=SYrXQnDGqY9JffLW8jh2UiGTul9Cc56ZJ0DYzEFuW-k,9304
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=Jhv9VNpgIK1cEGJS6CFitkxwM3o8AUf98N1sRTUL09w,5351
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=IT3AHBCyjKX76XvA1AlCcjX2_4AWln3HFZ37YoOh6ww,19259
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.366.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
267
- cloud_governance-1.1.366.dist-info/METADATA,sha256=9egwQCgQd112lSM8AT7sI7RzclgWyyUOstYihu4YsvI,11364
268
- cloud_governance-1.1.366.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
269
- cloud_governance-1.1.366.dist-info/top_level.txt,sha256=jfB1fgj7jvx3YZkZA4G6hFeS1RHO7J7XtnbjuMNMRww,17
270
- cloud_governance-1.1.366.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5