cloud-governance 1.1.352__py3-none-any.whl → 1.1.353__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 +99 -62
- {cloud_governance-1.1.352.dist-info → cloud_governance-1.1.353.dist-info}/METADATA +1 -1
- {cloud_governance-1.1.352.dist-info → cloud_governance-1.1.353.dist-info}/RECORD +6 -6
- {cloud_governance-1.1.352.dist-info → cloud_governance-1.1.353.dist-info}/WHEEL +1 -1
- {cloud_governance-1.1.352.dist-info → cloud_governance-1.1.353.dist-info}/LICENSE +0 -0
- {cloud_governance-1.1.352.dist-info → cloud_governance-1.1.353.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import datetime
|
|
2
|
+
import os
|
|
2
3
|
import smtplib
|
|
3
4
|
from email.message import EmailMessage
|
|
4
5
|
from email.mime.multipart import MIMEMultipart
|
|
@@ -12,6 +13,7 @@ from cloud_governance.common.logger.init_logger import logger
|
|
|
12
13
|
|
|
13
14
|
# https://github.com/redhat-performance/quads/blob/master/quads/tools/postman.py
|
|
14
15
|
from cloud_governance.common.logger.logger_time_stamp import logger_time_stamp
|
|
16
|
+
from cloud_governance.common.utils.api_requests import APIRequests
|
|
15
17
|
from cloud_governance.main.environment_variables import environment_variables
|
|
16
18
|
|
|
17
19
|
|
|
@@ -45,7 +47,9 @@ class Postfix:
|
|
|
45
47
|
self.__POSTFIX_HOST = environment_variables.POSTFIX_HOST
|
|
46
48
|
self.__POSTFIX_PORT = environment_variables.POSTFIX_PORT
|
|
47
49
|
self.bucket_name, self.key = self.get_bucket_name()
|
|
50
|
+
self.__perf_services_url = os.environ.get('PERF_SERVICES_URL')
|
|
48
51
|
self.__es_index = 'cloud-governance-mail-messages'
|
|
52
|
+
self.__api_request = APIRequests()
|
|
49
53
|
if self.__es_host:
|
|
50
54
|
self.__es_operations = ElasticSearchOperations(es_host=self.__es_host, es_port=self.__es_port)
|
|
51
55
|
if self.__policy_output:
|
|
@@ -74,7 +78,7 @@ class Postfix:
|
|
|
74
78
|
|
|
75
79
|
def prettify_to(self, to: Union[str, list]):
|
|
76
80
|
"""
|
|
77
|
-
This method
|
|
81
|
+
This method prettifies to
|
|
78
82
|
:param to:
|
|
79
83
|
:type to:
|
|
80
84
|
:return:
|
|
@@ -89,7 +93,7 @@ class Postfix:
|
|
|
89
93
|
|
|
90
94
|
def prettify_cc(self, cc: Union[str, list], to: str = ''):
|
|
91
95
|
"""
|
|
92
|
-
This method
|
|
96
|
+
This method prettifies cc
|
|
93
97
|
:param to:
|
|
94
98
|
:type to:
|
|
95
99
|
:param cc:
|
|
@@ -103,6 +107,48 @@ class Postfix:
|
|
|
103
107
|
to = self.prettify_to(to=to).split(',')
|
|
104
108
|
return ','.join(list(set(cc_unique_values) - set(to)))
|
|
105
109
|
|
|
110
|
+
def __save_to_elastic(self, **kwargs):
|
|
111
|
+
"""
|
|
112
|
+
This method uploads data to elasticsearch
|
|
113
|
+
:param kwargs:
|
|
114
|
+
:return:
|
|
115
|
+
"""
|
|
116
|
+
es_data = kwargs.get('es_data')
|
|
117
|
+
data = {'Policy': self.__policy,
|
|
118
|
+
'Account': self.__account.upper(),
|
|
119
|
+
'MessageType': kwargs.get('message_type', 'alert')}
|
|
120
|
+
if es_data:
|
|
121
|
+
data.update(es_data)
|
|
122
|
+
if kwargs.get('resource_id'):
|
|
123
|
+
data['resource_id'] = kwargs['resource_id']
|
|
124
|
+
if kwargs.get('extra_purse'):
|
|
125
|
+
data['extra_purse'] = round(kwargs['extra_purse'], 3)
|
|
126
|
+
if kwargs.get('remaining_budget'):
|
|
127
|
+
data['remaining_budget'] = kwargs['remaining_budget']
|
|
128
|
+
if self.__es_host:
|
|
129
|
+
self.__es_operations.upload_to_elasticsearch(data=data, index=self.__es_index)
|
|
130
|
+
logger.info(f'Uploaded to es index: {self.__es_index}')
|
|
131
|
+
else:
|
|
132
|
+
logger.info('Error missing the es_host')
|
|
133
|
+
|
|
134
|
+
def __save_to_s3(self, content: str, **kwargs):
|
|
135
|
+
"""
|
|
136
|
+
This method save mail message to s3 bucket
|
|
137
|
+
:return:
|
|
138
|
+
"""
|
|
139
|
+
if kwargs.get('filename'):
|
|
140
|
+
file_name = kwargs['filename'].split('/')[-1]
|
|
141
|
+
date_key = datetime.datetime.now().strftime("%Y%m%d%H")
|
|
142
|
+
if self.__policy_output:
|
|
143
|
+
self.__s3_operations.upload_file(file_name_path=kwargs['filename'],
|
|
144
|
+
bucket=self.bucket_name,
|
|
145
|
+
key=f'{self.key}/{self.__policy}/{date_key}',
|
|
146
|
+
upload_file=file_name)
|
|
147
|
+
s3_path = f'{self.__policy_output}/logs/{self.__policy}/{date_key}/{file_name}'
|
|
148
|
+
content += f'\n\nresource_file_path: s3://{s3_path}\n\n'
|
|
149
|
+
logger.info("File Saved to S3")
|
|
150
|
+
self.__save_to_elastic(**kwargs)
|
|
151
|
+
|
|
106
152
|
@logger_time_stamp
|
|
107
153
|
def send_email_postfix(self, subject: str, to: any, cc: list, content: str, **kwargs):
|
|
108
154
|
if self.__email_alert:
|
|
@@ -112,65 +158,56 @@ class Postfix:
|
|
|
112
158
|
cc = self.__mail_cc
|
|
113
159
|
if not self.__ldap_search.get_user_details(user_name=to):
|
|
114
160
|
cc.append('athiruma@redhat.com')
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
161
|
+
response = {'ok': True}
|
|
162
|
+
to = self.prettify_to(to)
|
|
163
|
+
cc = self.prettify_cc(cc)
|
|
164
|
+
kwargs.setdefault('es_data', {}).update({'To': to, 'Cc': cc, 'Message': content})
|
|
165
|
+
if self.__perf_services_url:
|
|
166
|
+
body = {
|
|
167
|
+
"cc": cc,
|
|
168
|
+
"to": to,
|
|
169
|
+
"subject": subject,
|
|
170
|
+
"mail_body": content,
|
|
171
|
+
}
|
|
172
|
+
if kwargs.get('filename'):
|
|
173
|
+
body['file_content'] = open(kwargs['filename']).read()
|
|
174
|
+
body['filename'] = kwargs['filename'].split('/')[-1]
|
|
175
|
+
api_url = self.__perf_services_url + f"/postfix/send_mail"
|
|
176
|
+
response = self.__api_request.post(api_url, json=body)
|
|
177
|
+
response = response.json()
|
|
132
178
|
else:
|
|
133
|
-
msg
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
self.__es_operations.upload_to_elasticsearch(data=data, index=self.__es_index)
|
|
167
|
-
logger.warn(f'Uploaded to es index: {self.__es_index}')
|
|
168
|
-
else:
|
|
169
|
-
logger.warn('Error missing the es_host')
|
|
170
|
-
except smtplib.SMTPException as ex:
|
|
171
|
-
logger.error(f'Error while sending mail, {ex}')
|
|
172
|
-
return False
|
|
179
|
+
msg = MIMEMultipart('alternative')
|
|
180
|
+
msg["Subject"] = subject
|
|
181
|
+
msg["From"] = "%s <%s>" % (
|
|
182
|
+
'cloud-governance',
|
|
183
|
+
"@".join(["noreply-cloud-governance", 'redhat.com']),
|
|
184
|
+
)
|
|
185
|
+
msg["To"] = to
|
|
186
|
+
msg["Cc"] = cc
|
|
187
|
+
# msg.add_header("Reply-To", self.reply_to)
|
|
188
|
+
# msg.add_header("User-Agent", self.reply_to)
|
|
189
|
+
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)
|
|
194
|
+
if kwargs.get('mime_type'):
|
|
195
|
+
msg.attach(MIMEText(content, kwargs.get('mime_type')))
|
|
196
|
+
else:
|
|
197
|
+
msg.attach(MIMEText(content))
|
|
198
|
+
try:
|
|
199
|
+
with smtplib.SMTP(self.__POSTFIX_HOST, self.__POSTFIX_PORT) as s:
|
|
200
|
+
try:
|
|
201
|
+
s.send_message(msg)
|
|
202
|
+
except smtplib.SMTPException as ex:
|
|
203
|
+
logger.error(f'Error while sending mail, {ex}')
|
|
204
|
+
response = {
|
|
205
|
+
'ok': True
|
|
206
|
+
}
|
|
207
|
+
except Exception as err:
|
|
208
|
+
logger.error(f'Some error occurred, {err}')
|
|
209
|
+
if isinstance(response, dict) and response.get('ok'):
|
|
210
|
+
logger.info(f'Mail sent successfully to {to}')
|
|
211
|
+
self.__save_to_s3(content, **kwargs)
|
|
173
212
|
return True
|
|
174
|
-
|
|
175
|
-
logger.error(f'Some error occurred, {err}')
|
|
176
|
-
return False
|
|
213
|
+
return False
|
|
@@ -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=SYrXQnDGqY9JffLW8jh2UiGTul9Cc56ZJ0DYzEFuW-k,9304
|
|
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
|
|
@@ -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.353.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
267
|
+
cloud_governance-1.1.353.dist-info/METADATA,sha256=m67JWKZBvw6oGdd5E3f4Ya3txAvEXnYNATZVy1xVS2w,11342
|
|
268
|
+
cloud_governance-1.1.353.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
|
|
269
|
+
cloud_governance-1.1.353.dist-info/top_level.txt,sha256=jfB1fgj7jvx3YZkZA4G6hFeS1RHO7J7XtnbjuMNMRww,17
|
|
270
|
+
cloud_governance-1.1.353.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|