summaryrefslogtreecommitdiffstats
path: root/src/main/org/onap/ecomp/main/consul/ConsulService.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/org/onap/ecomp/main/consul/ConsulService.java')
-rw-r--r--src/main/org/onap/ecomp/main/consul/ConsulService.java465
1 files changed, 465 insertions, 0 deletions
diff --git a/src/main/org/onap/ecomp/main/consul/ConsulService.java b/src/main/org/onap/ecomp/main/consul/ConsulService.java
new file mode 100644
index 0000000..6954670
--- /dev/null
+++ b/src/main/org/onap/ecomp/main/consul/ConsulService.java
@@ -0,0 +1,465 @@
+/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ecomp.main.consul;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.onap.ecomp.main.APIHConfig;
+import org.onap.ecomp.persistence.APIHDBSource;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+
+@Path("/healthservices")
+public class ConsulService {
+
+ final static EELFLogger logger = EELFManager.getInstance().getLogger(ConsulService.class);
+
+ ConsulHelp consulHelp;
+
+ String errorLine = "Bad Request";
+
+ public ConsulService() {
+ consulHelp = new ConsulHelp();
+
+ }
+
+ /**
+ * Return the help for all the available API
+ *
+ * @param id
+ * @param authString
+ * @param userid
+ * @return JSONObject
+ */
+ @GET
+ @Path("/help")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getHelp(@QueryParam("id") String id,@HeaderParam("authorization") String authString,@HeaderParam("userid") String userid) {
+
+
+ logger.info("Received get help API Request");
+ String result = consulHelp.getHelp();
+ logger.info("Handled get help API Request");
+ return Response.status(200).entity(result)
+ .build();
+ }
+
+
+ @GET
+ @Path("/services/{service_name}")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getServiceHealth(@Context HttpServletRequest request,@HeaderParam("authorization") String authString,@HeaderParam("userid") String userid,@PathParam("service_name") String service_name) {
+
+ String url = "";
+ logger.info("Health request for service with service name = "
+ + service_name);
+
+ // validate the user and the application for GET request
+ if (!APIHConfig.getInstance().validateUser(authString, userid, "GET")) {
+ return Response.status(401).entity("Unauthorized").build();
+ }
+
+ url = "/health/checks/" + service_name;
+ if (request.getQueryString() != null)
+ url = "/health/checks/" + service_name + "?"
+ + request.getQueryString();
+
+ JSONObject result = ConsulClient.getInstance().doGET(url);
+ logger.info("Handled Health service name API Request");
+ return handleResponse(result);
+
+ }
+
+ @GET
+ @Path("/nodes/{node_name}")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getNodeHealth(@Context HttpServletRequest request,@HeaderParam("authorization") String authString,@HeaderParam("userid") String userid,@PathParam("node_name") String node_name) {
+
+ String url = "";
+ logger.info("Health request for node with node name = " + node_name);
+
+ // validate the user and the application for GET request
+ if (!APIHConfig.getInstance().validateUser(authString, userid, "GET")) {
+ return Response.status(401).entity("Unauthorized").build();
+ }
+
+ url = "/health/node/" + node_name;
+ if (request.getQueryString() != null)
+ url = "/health/node/" + node_name + "?" + request.getQueryString();
+
+ JSONObject result = ConsulClient.getInstance().doGET(url);
+ logger.info("Handled Health node name API Request");
+ return handleResponse(result);
+
+ }
+
+ @GET
+ @Path("/nodes")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getNodes(@HeaderParam("authorization") String authString,@HeaderParam("userid") String userid,@Context HttpServletRequest request) {
+
+ String url = "";
+ logger.info("Health request for all the nodes");
+ // validate the user and the application for GET request
+
+ if (!APIHConfig.getInstance().validateUser(authString, userid, "GET")) {
+ return Response.status(401).entity("Unauthorized").build();
+ }
+
+ url = "/catalog/nodes";
+ if (request.getQueryString() != null)
+ url = "/catalog/nodes?" + request.getQueryString();
+
+ JSONObject result = ConsulClient.getInstance().doGET(url);
+ logger.info("Handled Health for all node API Request");
+ return handleResponse(result);
+
+ }
+
+ @GET
+ @Path("/services")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getServices(@HeaderParam("authorization") String authString,@HeaderParam("userid") String userid,@Context HttpServletRequest request) {
+
+ String url = "";
+ logger.info("Health request for all the services");
+ // validate the user and the application for GET request
+
+ if (!APIHConfig.getInstance().validateUser(authString, userid, "GET")) {
+ return Response.status(401).entity("Unauthorized").build();
+ }
+
+ url = "/catalog/services";
+ if (request.getQueryString() != null)
+ url = "/catalog/services?" + request.getQueryString();
+
+ JSONObject result = ConsulClient.getInstance().doGET(url);
+ logger.info("Handled Health for all services API Request");
+ return handleResponse(result);
+
+ }
+
+ @GET
+ @Path("/datacenters")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getDatacenters(@HeaderParam("authorization") String authString,@HeaderParam("userid") String userid) {
+
+ String url = "";
+ logger.info("Health request for datacenters");
+ // validate the user and the application for GET request
+
+ if (!APIHConfig.getInstance().validateUser(authString, userid, "GET")) {
+ return Response.status(401).entity("Unauthorized").build();
+ }
+
+ url = "/catalog/datacenters";
+
+ JSONObject result = ConsulClient.getInstance().doGET(url);
+ logger.info("Handled Health for datacenters API Request");
+ return handleResponse(result);
+
+ }
+
+ @GET
+ @Path("/svchist/{id}")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getHistoricalData(@PathParam("id") String id,@Context HttpServletRequest request,@HeaderParam("authorization") String authString,@HeaderParam("userid") String userid) {
+
+ if(!APIHConfig.getInstance().validateUser(authString,userid,"PUT")){
+ return Response.status(401).entity("Unauthorized").build();
+ }
+
+ String utc_startDate = "";
+ String utc_endDate = "";
+ JSONArray resultArray = new JSONArray();
+ logger.info("Historical data request received for id " + id);
+
+ if (request.getQueryString() == null)
+ return Response.status(400).entity("start date and end date is mandatory").build();
+
+ String[] dates = request.getQueryString().split("&");
+ String start_date = "";
+ String end_date = "";
+ if(dates[0].split("=").length ==2 && dates[0].split("=")[0].equals("start") && !dates[0].split("=")[1].isEmpty()){
+ start_date = dates[0].split("=")[1];
+ if (dates[1].split("=").length ==2 && dates[1].split("=")[0].equals("end") && !dates[1].split("=")[1].isEmpty())
+ end_date = dates[1].split("=")[1];
+ else
+ return Response.status(400).entity("start or end tag/value not found").build();
+ }
+ else
+ return Response.status(400).entity("start or end tag/value not found").build();
+
+ try {
+
+ logger.info("Health Request received for start date :" + start_date + " and end date as : " + end_date);
+
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
+ Calendar s = javax.xml.bind.DatatypeConverter.parseDateTime(start_date);
+ Calendar e = javax.xml.bind.DatatypeConverter.parseDateTime(end_date);
+ Date sDate = s.getTime();
+ Date eDate = e.getTime();
+
+
+ formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ utc_startDate = formatter.format(sDate);
+ utc_endDate = formatter.format(eDate);
+ logger.info("Fetching the health date for start date :" + utc_startDate + " and end date as : " + utc_endDate);
+ Connection conn = APIHDBSource.getInstance().getConnection();
+ Statement cs = conn.createStatement();
+ /**
+ String sql = "select date,status,output from healthcheck where id='"
+ + id
+ + "' and date between '"
+ + utc_startDate
+ + "' and '"
+ + utc_endDate + "'";
+ */
+ String sql = "select date,status,output from healthcheck h, service s where s.id = h.id "
+ + " and s.name ='"
+ + id
+ + "' and date between '"
+ + utc_startDate
+ + "' and '"
+ + utc_endDate + "'";
+ logger.info("Sending query : " + sql);
+ ResultSet rs = cs.executeQuery(sql);
+ if (!rs.isBeforeFirst()) {
+ return Response
+ .status(200)
+ //.entity("No health Data found for the selected dates or service")
+ .entity(resultArray.toString())
+ .build();
+ } else {
+ while (rs.next()) {
+ JSONObject tmp = new JSONObject();
+ String returnDate = rs.getString(1).substring(0,19)+ "+0000";
+ // System.out.println("DB return " + returnDate);
+ formatter.setTimeZone(TimeZone.getTimeZone(s.getTimeZone().getID()));
+ Date ret = formatter.parse(returnDate);
+ //System.out.println("After parsing " + ret);
+ //System.out.println("After formatting " + formatter.format(ret));
+
+ tmp.put("Date", formatter.format(ret));
+ tmp.put("Status", rs.getString(2));
+ tmp.put("Output", rs.getString(3));
+ resultArray.put(tmp);
+ }
+ logger.info("Handled historical health date request sucessfully with total records: " + resultArray.length());
+ return Response.status(200).entity(resultArray.toString())
+ .build();
+ }
+ } catch (ParseException e) {
+ e.printStackTrace();
+ return Response.status(400)
+ .entity("start_date or end_date is not parsable. Please check documentation for correct format")
+ .build();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return Response.status(500)
+ .entity("Error fetching the health historical data")
+ .build();
+ }
+ }
+
+ @POST
+ @Path("/register")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response registerService(InputStream inputStream, @HeaderParam("authorization") String authString,@HeaderParam("userid") String userid) {
+
+ logger.info("Register request for a service");
+
+ JSONArray services = new JSONArray();
+ JSONObject outputJson = new JSONObject();
+
+ //validate the user and the application for POST request
+
+ if(!APIHConfig.getInstance().validateUser(authString,userid,"PUT")){
+ return Response.status(401).entity("Unauthorized").build();
+ }
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ StringBuilder check = new StringBuilder();
+ String inputLine;
+ try {
+ while ((inputLine = reader.readLine()) != null)
+ check.append(inputLine);
+
+ JSONObject incoming = new JSONObject(check.toString());
+ services = incoming.optJSONArray("services");
+ if(services == null)
+ return Response.status(400).entity("services[] tag is mandatory").build();
+
+ int service_length = services.length();
+ if(service_length == 1){
+ outputJson = createServiceObject(services.getJSONObject(0));
+ }
+ else if(service_length > 1){
+ for(int i = 0; i< service_length; i++){
+ outputJson = createServiceObject(services.getJSONObject(i));
+ }
+ }
+ else{
+ return Response.status(400).entity("no service is defined inside the services tag").build();
+ }
+
+ logger.info("Handled service register Request");
+ return handleResponse(outputJson);
+
+ } catch (Exception e) {
+ logger.error("some exception" + e.getMessage());
+ return Response.status(400).entity("Error parsing the incoming DATA").build();
+ }
+
+
+
+ }
+
+
+ private JSONObject createServiceObject(JSONObject serviceObject) throws JSONException {
+
+ String url = "/agent/service/register";
+ JSONObject checkObject = new JSONObject();
+ JSONArray checks = new JSONArray();
+ JSONArray tags = new JSONArray();
+ JSONObject outputJson = new JSONObject();
+
+ checks = serviceObject.optJSONArray("checks");
+ tags = serviceObject.optJSONArray("tags");
+ String service_name = serviceObject.optString("name","");
+ String service_port = serviceObject.optString("port","");
+ String service_address = serviceObject.optString("address","");
+
+ if(checks == null || service_port.isEmpty() || service_address.isEmpty() || service_name.isEmpty())
+ return new JSONObject("{\"responseCode\":\"400\",\"responseMsg\":\"Required fields : [checks[], port, address, name]\"}");
+
+ outputJson.put("Name",service_name);
+ outputJson.put("ID",service_name);
+ outputJson.put("Port",Integer.parseInt(service_port));
+ outputJson.put("Address",service_address);
+ outputJson.put("Tags", tags);
+
+ if(checks.length() == 1){
+ if(checks.getJSONObject(0).optString("endpoint", "").isEmpty() || checks.getJSONObject(0).optString("interval", "").isEmpty())
+ return new JSONObject("{\"responseCode\":\"400\",\"responseMsg\":\"Required fields : [endpoint, interval] in checks\"}");
+
+ checkObject.put("HTTP", checks.getJSONObject(0).optString("endpoint", ""));
+ checkObject.put("Interval", checks.getJSONObject(0).optString("interval", ""));
+ if(!checks.getJSONObject(0).optString("description", "").isEmpty())
+ checkObject.put("Notes", checks.getJSONObject(0).optString("description", ""));
+ checkObject.put("ServiceID", service_name);
+
+ outputJson.put("Check", checkObject);
+ }
+ else{
+ JSONArray checks_new = new JSONArray();
+ for (int i = 0; i < checks.length(); i++) {
+ JSONObject o = checks.getJSONObject(i);
+ checkObject = new JSONObject();
+ if(o.optString("endpoint", "").isEmpty() || o.optString("interval", "").isEmpty())
+ return new JSONObject("{\"responseCode\":\"400\",\"responseMsg\":\"Required fields : [endpoint, interval] in checks\"}");
+
+ checkObject.put("HTTP", o.optString("endpoint", ""));
+ checkObject.put("Interval", o.optString("interval", ""));
+ if(!o.optString("description", "").isEmpty())
+ checkObject.put("Notes", o.optString("description", ""));
+ checkObject.put("ServiceID", service_name);
+ checks_new.put(checkObject);
+ }
+ outputJson.put("Checks", checks_new);
+ }
+
+ JSONObject result = ConsulClient.getInstance().doPUT(url, outputJson);
+ return result;
+
+ }
+
+ /**
+ * De register the service from consul
+ * @param inputStream
+ * @param authString
+ * @param userid
+ * @return
+ */
+ @POST
+ @Path("/deregister/{serviceID}")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response deregisterService(@PathParam("serviceID") String serviceId,
+ @HeaderParam("authorization") String authString,
+ @HeaderParam("userid") String userid) {
+
+ String url = "";
+ logger.info("Deregister request for a service");
+ // validate the user and the application for POST request
+
+ if (!APIHConfig.getInstance().validateUser(authString, userid, "POST")) {
+ return Response.status(401).entity("Unauthorized").build();
+ }
+
+ url = "/agent/service/deregister/" + serviceId;
+ JSONObject result = ConsulClient.getInstance().doPUT(url, null);
+ logger.info("Handled service de register Request");
+ return handleResponse(result);
+
+ }
+
+ private Response handleResponse(JSONObject result) {
+
+ if(result == null){
+ return Response.status(500).entity("Internal Server Error – We had a problem with our server. Try again later.").build();
+ }
+ int responseCode = result.optInt("responseCode");
+ String responseMsg = result.optString("responseMsg", "");
+ if(responseCode >= 300)
+ {
+ logger.info("Response code is: " + responseCode + " and Error msg is :" + responseMsg);
+ }
+ return Response.status(responseCode).entity(responseMsg).build();
+ }
+}