package org.ovirt.engine.core.services; import java.io.IOException; import java.io.PrintWriter; import java.net.HttpURLConnection; import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /*** * This class is a servlet implementation, aimed to report fundemental health of engine. * The servlet URL is: /OvirtEngineWeb/HealthStatus (as defined in web.xml), and these * are the possible HTTP return codes: * - 200: OK * - 500: Unable to connect to DB. * - 404/other: Depending on Tomcat/Jboss state, servlet may be unavailable or connection refused. * If the servlet is unable to contact the backend bean, it'll write an apropriate message to out. * */ public class HealthStatus extends HttpServlet { private static final Logger log = LoggerFactory.getLogger(HealthStatus.class); @Inject private BackendInternal backend; private boolean runQuery(PrintWriter out) { boolean fReturn = false; try { log.debug("Calling CheckDBConnection query"); VdcQueryParametersBase params = new VdcQueryParametersBase(); VdcQueryReturnValue v = backend.runInternalQuery(VdcQueryType.CheckDBConnection, params); if (v != null) { fReturn = v.getSucceeded(); out.print(fReturn ? "DB Up!" : "DB Down!"); } else { log.error("Got NULL from backend.RunQuery!"); } } catch (Throwable t) { String msg = "Unable to contact Database!"; if (backend == null) { msg = "Unable to contact Backend!"; } out.print(msg); log.error(msg, t); fReturn = false; } return fReturn; } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { log.debug("Health Status servlet: entry"); response.setContentType("text/html"); try (PrintWriter out = response.getWriter()) { if (runQuery(out)) { out.print("Welcome to Health Status!"); log.debug("Succeeded to run Health Status."); } else { response.setStatus(HttpURLConnection.HTTP_INTERNAL_ERROR); log.error("Failed to run Health Status."); } } catch (Exception e) { response.setStatus(HttpURLConnection.HTTP_INTERNAL_ERROR); log.error("Error calling runQuery: ", e); } log.debug("Health Status servlet: close"); } }