Commit 3990bdeb authored by Jorge Moratinos's avatar Jorge Moratinos
Browse files

Update on publish upgraded to support send of event...

Update on publish upgraded to support send of event SERVICE_API_AVAILABLE/UNAVAILABLE only on change
parent 865ec9ef
Loading
Loading
Loading
Loading
Loading
+50 −36
Original line number Diff line number Diff line
@@ -254,17 +254,20 @@ class PublishServiceOperations(Resource):
                "Updating service api with id: " + service_api_id)

            my_query = {'apf_id': apf_id, 'api_id': service_api_id}
            serviceapidescription = mycol.find_one(my_query)
            serviceapidescription_old = mycol.find_one(my_query)

            if serviceapidescription is None:
            if serviceapidescription_old is None:
                current_app.logger.error(service_api_not_found_message)
                return not_found_error(detail="Service API not existing", cause="Service API id not found")

            service_api_description = service_api_description.to_dict()
            service_api_description = clean_empty(service_api_description)

            service_api_description_old = ServiceAPIDescription.from_dict(
                json.dumps(serviceapidescription_old, cls=CustomJSONEncoder))

            result = mycol.find_one_and_update(
                serviceapidescription,
                serviceapidescription_old,
                {"$set": service_api_description},
                projection={"_id": 0,
                            "api_name": 1,
@@ -293,39 +296,10 @@ class PublishServiceOperations(Resource):
            if response.status_code == 200:
                RedisEvent("SERVICE_API_UPDATE",
                           service_api_descriptions=[service_api_description_updated]).send_event()
                if service_api_description.api_status is None or len(service_api_description.api_status.aef_ids) > 0:
                    if service_api_description.supported_features is not None:
                        if service_api_description.return_supp_feat_dict(service_api_description.supported_features)["ApiStatusMonitoring"]:
                            current_app.logger.info(f"Service available")
                            RedisEvent("SERVICE_API_AVAILABLE",
                                       service_api_descriptions=[
                                           service_api_description],
                                       api_ids=[str(service_api_id)]
                                       ).send_event()
                        else:
                            current_app.logger.info("Service available")
                            RedisEvent("SERVICE_API_AVAILABLE",
                                       api_ids=[str(service_api_id)]).send_event()
                    else:
                        current_app.logger.info("Service available")
                        RedisEvent("SERVICE_API_AVAILABLE",
                                   api_ids=[str(service_api_id)]).send_event()
                else:
                    if service_api_description.supported_features is not None:
                        if service_api_description.return_supp_feat_dict(service_api_description.supported_features)["ApiStatusMonitoring"]:
                            current_app.logger.info(f"Service unavailable")
                            RedisEvent("SERVICE_API_UNAVAILABLE",
                                       service_api_descriptions=[
                                           service_api_description],
                                       api_ids=[str(service_api_id)]).send_event()
                        else:
                            current_app.logger.info("Service available")
                            RedisEvent("SERVICE_API_UNAVAILABLE",
                                       api_ids=[str(service_api_id)]).send_event()
                    else:
                        current_app.logger.info("Service available")
                        RedisEvent("SERVICE_API_UNAVAILABLE",
                                   api_ids=[str(service_api_id)]).send_event()
                self.send_events_on_update(
                    service_api_id,
                    service_api_description_old,
                    service_api_description_updated)

            return response

@@ -333,3 +307,43 @@ class PublishServiceOperations(Resource):
            exception = "An exception occurred in update service"
            current_app.logger.error(exception + "::" + str(e))
            return internal_server_error(detail=exception, cause=str(e))

    def send_events_on_update(self,
                              service_api_id,
                              service_api_decription_old,
                              service_api_description_new):

        service_api_status_event_old = self.service_api_status_event(
            service_api_decription_old)
        service_api_status_event_new = self.service_api_status_event(
            service_api_decription_old)

        if service_api_status_event_old == service_api_status_event_new:
            current_app.logger.info(
                "service_api_status not changed, it remains " +
                service_api_status_event_new +
                " Then no event will be sent")
        else:
            current_app.logger.info("service_api_status changed, event " +
                                    service_api_status_event_new +
                                    " Event will be sent")
            RedisEvent(service_api_status_event_new,
                       service_api_descriptions=[
                           service_api_description_new],
                       api_ids=[str(service_api_id)]).send_event()

    def service_api_status_event(service_api_description):
        service_api_status = ""
        if ServiceAPIDescription.return_supp_feat_dict(service_api_description.supported_features)["ApiStatusMonitoring"]:
            if service_api_description.api_status is None or len(service_api_description.api_status.aef_ids) > 0:
                current_app.logger.info(
                    "Service available, at least one AEF is available")
                service_api_status = "SERVICE_API_AVAILABLE"
            else:
                current_app.logger.info(
                    "Service unavailable, all AEFs are unavailable")
                service_api_status = "SERVICE_API_UNAVAILABLE"
        else:
            current_app.logger.info("Service available")
            service_api_status = "SERVICE_API_AVAILABLE"
        return service_api_status