in src/handlers/high_level_reports_handler.py [0:0]
def post_c_level(self, event: CLevelGetReportModel):
models = []
rabbitmq = self._rmq.get_customer_rabbitmq(event.customer_id)
if not rabbitmq:
raise self._rmq.no_rabbitmq_response().exc()
builder = MaestroModelBuilder(receivers=tuple(event.receivers))
for typ in event.new_types:
rep = self._rms.get_latest_for_customer(event.customer_id, typ)
if not rep:
_LOG.warning(f'Cannot find {typ} for {event.customer_id}')
continue
self._rms.fetch_data_from_s3(rep)
previous = self._rms.get_latest_for_customer(
customer=event.customer_id,
type_=typ,
till=utc_datetime() + relativedelta(months=-1),
)
if not previous:
_LOG.info(
'Previous clevel report not found, diffs will be empty'
)
previous_data = {}
else:
self._rms.fetch_data_from_s3(previous)
previous_data = previous.data.as_dict()
current_data = rep.data.as_dict()
for cl, data in current_data.items():
add_diff(
data,
previous_data.get(cl, {}),
exclude=('total_scanned_tenants',),
)
base = builder.build_base(rep)
base['data'] = current_data
models.append(
self._rmq.build_m3_json_model(
notification_type=SRE_REPORTS_TYPE_TO_M3_MAPPING[typ],
data=base,
)
)
if not models:
raise (
ResponseFactory(HTTPStatus.NOT_FOUND)
.message(
'No collected reports found to send. Update metrics first'
)
.exc()
)
code = self._rmq.send_to_m3(
rabbitmq=rabbitmq, command=RabbitCommand.SEND_MAIL, models=models
)
if code != 200:
raise (
ResponseFactory(HTTPStatus.SERVICE_UNAVAILABLE)
.message('Could not send message to RabbitMQ')
.exc()
)
return build_response(
code=HTTPStatus.ACCEPTED, content='Successfully sent'
)