1*5e44e3d8SAppaRao Puli #pragma once 2*5e44e3d8SAppaRao Puli 3*5e44e3d8SAppaRao Puli #include <app.hpp> 4*5e44e3d8SAppaRao Puli #include <event_service_manager.hpp> 5*5e44e3d8SAppaRao Puli 6*5e44e3d8SAppaRao Puli namespace redfish 7*5e44e3d8SAppaRao Puli { 8*5e44e3d8SAppaRao Puli 9*5e44e3d8SAppaRao Puli inline void createSubscription(crow::sse_socket::Connection& conn) 10*5e44e3d8SAppaRao Puli { 11*5e44e3d8SAppaRao Puli EventServiceManager& manager = 12*5e44e3d8SAppaRao Puli EventServiceManager::getInstance(&conn.getIoContext()); 13*5e44e3d8SAppaRao Puli if ((manager.getNumberOfSubscriptions() >= maxNoOfSubscriptions) || 14*5e44e3d8SAppaRao Puli manager.getNumberOfSSESubscriptions() >= maxNoOfSSESubscriptions) 15*5e44e3d8SAppaRao Puli { 16*5e44e3d8SAppaRao Puli BMCWEB_LOG_WARNING << "Max SSE subscriptions reached"; 17*5e44e3d8SAppaRao Puli conn.close("Max SSE subscriptions reached"); 18*5e44e3d8SAppaRao Puli return; 19*5e44e3d8SAppaRao Puli } 20*5e44e3d8SAppaRao Puli std::shared_ptr<redfish::Subscription> subValue = 21*5e44e3d8SAppaRao Puli std::make_shared<redfish::Subscription>(conn); 22*5e44e3d8SAppaRao Puli 23*5e44e3d8SAppaRao Puli // GET on this URI means, Its SSE subscriptionType. 24*5e44e3d8SAppaRao Puli subValue->subscriptionType = redfish::subscriptionTypeSSE; 25*5e44e3d8SAppaRao Puli 26*5e44e3d8SAppaRao Puli subValue->protocol = "Redfish"; 27*5e44e3d8SAppaRao Puli subValue->retryPolicy = "TerminateAfterRetries"; 28*5e44e3d8SAppaRao Puli subValue->eventFormatType = "Event"; 29*5e44e3d8SAppaRao Puli 30*5e44e3d8SAppaRao Puli std::string id = manager.addSubscription(subValue, false); 31*5e44e3d8SAppaRao Puli if (id.empty()) 32*5e44e3d8SAppaRao Puli { 33*5e44e3d8SAppaRao Puli conn.close("Internal Error"); 34*5e44e3d8SAppaRao Puli } 35*5e44e3d8SAppaRao Puli } 36*5e44e3d8SAppaRao Puli 37*5e44e3d8SAppaRao Puli inline void deleteSubscription(crow::sse_socket::Connection& conn) 38*5e44e3d8SAppaRao Puli { 39*5e44e3d8SAppaRao Puli redfish::EventServiceManager::getInstance(&conn.getIoContext()) 40*5e44e3d8SAppaRao Puli .deleteSseSubscription(conn); 41*5e44e3d8SAppaRao Puli } 42*5e44e3d8SAppaRao Puli 43*5e44e3d8SAppaRao Puli inline void requestRoutesEventServiceSse(App& app) 44*5e44e3d8SAppaRao Puli { 45*5e44e3d8SAppaRao Puli // Note, this endpoint is given the same privilege level as creating a 46*5e44e3d8SAppaRao Puli // subscription, because functionally, that's the operation being done 47*5e44e3d8SAppaRao Puli BMCWEB_ROUTE(app, "/redfish/v1/EventService/SSE") 48*5e44e3d8SAppaRao Puli .privileges(redfish::privileges::postEventDestinationCollection) 49*5e44e3d8SAppaRao Puli .serverSentEvent() 50*5e44e3d8SAppaRao Puli .onopen(createSubscription) 51*5e44e3d8SAppaRao Puli .onclose(deleteSubscription); 52*5e44e3d8SAppaRao Puli } 53*5e44e3d8SAppaRao Puli } // namespace redfish 54