Springboot 2.0 upgrade
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / GlobalHealthcheckHandler.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.apihandlerinfra;
22
23
24 import java.net.URI;
25 import java.util.Collections;
26 import org.springframework.http.MediaType;
27 import org.springframework.http.ResponseEntity;
28
29 import javax.annotation.PostConstruct;
30 import javax.transaction.Transactional;
31 import javax.ws.rs.DefaultValue;
32 import javax.ws.rs.GET;
33 import javax.ws.rs.Path;
34 import javax.ws.rs.Produces;
35 import javax.ws.rs.QueryParam;
36 import javax.ws.rs.container.ContainerRequestContext;
37 import javax.ws.rs.core.Context;
38 import javax.ws.rs.core.Response;
39 import javax.ws.rs.core.UriBuilder;
40
41 import java.util.UUID;
42 import org.apache.http.HttpStatus;
43 import org.onap.so.logger.MessageEnum;
44 import org.onap.so.logger.MsoLogger;
45 import org.springframework.beans.factory.annotation.Autowired;
46 import org.springframework.beans.factory.annotation.Qualifier;
47 import org.springframework.beans.factory.annotation.Value;
48 import org.springframework.core.env.Environment;
49 import org.springframework.http.HttpEntity;
50 import org.springframework.http.HttpHeaders;
51 import org.springframework.stereotype.Component;
52 import org.springframework.web.client.RestTemplate;
53 import org.springframework.http.HttpMethod;
54 import io.swagger.annotations.Api;
55 import io.swagger.annotations.ApiOperation;
56
57
58 @Component
59 @Path("/globalhealthcheck")
60 @Api(value="/globalhealthcheck",description="APIH Infra Global Health Check")
61 public class GlobalHealthcheckHandler {
62     private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH, GlobalHealthcheckHandler.class);
63     private static final String CONTEXTPATH_PROPERTY = "management.context-path";    
64     private static final String PROPERTY_DOMAIN  = "mso.health.endpoints";    
65     private static final String CATALOGDB_PROPERTY = PROPERTY_DOMAIN+".catalogdb";
66         private static final String REQUESTDB_PROPERTY = PROPERTY_DOMAIN+".requestdb";
67         private static final String SDNC_PROPERTY = PROPERTY_DOMAIN+".sdnc";
68         private static final String OPENSTACK_PROPERTY = PROPERTY_DOMAIN+".openstack";
69         private static final String BPMN_PROPERTY = PROPERTY_DOMAIN+".bpmn";
70         private static final String ASDC_PROPERTY = PROPERTY_DOMAIN+".asdc";
71         private static final String REQUESTDBATTSVC_PROPERTY = PROPERTY_DOMAIN+".requestdbattsvc";
72         private static final String DEFAULT_PROPERTY_VALUE = "";
73         
74     // e.g. /manage
75     private String actuatorContextPath;
76         private String endpointCatalogdb;
77         private String endpointRequestdb;
78         private String endpointSdnc;
79         private String endpointOpenstack;
80         private String endpointBpmn;
81         private String endpointAsdc;
82         private String endpointRequestdbAttsvc;
83         
84         @Autowired
85         private Environment env;
86
87         @Autowired
88         private RestTemplate restTemplate;
89         private final String health = "/health";
90
91         
92         @PostConstruct
93         protected void init() {
94                 actuatorContextPath  = env.getProperty(CONTEXTPATH_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);
95                 endpointCatalogdb  = env.getProperty(CATALOGDB_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);
96                 endpointRequestdb  = env.getProperty(REQUESTDB_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);
97                 endpointSdnc  = env.getProperty(SDNC_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);           
98                 endpointOpenstack  = env.getProperty(OPENSTACK_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);         
99                 endpointBpmn  = env.getProperty(BPMN_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);           
100                 endpointAsdc  = env.getProperty(ASDC_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);           
101                 endpointRequestdbAttsvc  = env.getProperty(REQUESTDBATTSVC_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);             
102         }
103         
104     @GET
105     @Produces("application/json")
106         @ApiOperation(value="Performing global health check",response=Response.class)
107     @Transactional
108     public Response globalHealthcheck (@DefaultValue("true") @QueryParam("enableBpmn") boolean enableBpmn, 
109                                                                         @Context ContainerRequestContext requestContext) {
110         Response HEALTH_CHECK_RESPONSE = null;
111         // Build internal response object
112         HealthcheckResponse rsp = new HealthcheckResponse();
113         
114         try{
115             long startTime = System.currentTimeMillis ();
116             MsoLogger.setServiceName ("GlobalHealthcheck");
117             // Generated RequestId
118             String requestId = requestContext.getProperty("requestId").toString();
119             MsoLogger.setLogContext(requestId, null);
120             msoLogger.info(MessageEnum.APIH_GENERATED_REQUEST_ID, requestId, "", "");
121             
122             // set APIH status, this is the main entry point
123             rsp.setApih(HealthcheckStatus.UP.toString());
124             // set BPMN
125             rsp.setBpmn(querySubsystemHealth(MsoSubsystems.BPMN));
126             // set SDNCAdapter
127             rsp.setSdncAdapter(querySubsystemHealth(MsoSubsystems.SDNC));        
128             // set ASDCController
129             rsp.setAsdcController(querySubsystemHealth(MsoSubsystems.ASDC));        
130             // set CatalogDbAdapter
131             rsp.setCatalogdbAdapter(querySubsystemHealth(MsoSubsystems.CATALOGDB));    
132             // set RequestDbAdapter
133             rsp.setRequestdbAdapter(querySubsystemHealth(MsoSubsystems.REQUESTDB));        
134             // set OpenStackAdapter
135             rsp.setOpenstackAdapter(querySubsystemHealth(MsoSubsystems.OPENSTACK));        
136             // set RequestDbAdapterAttSvc
137             rsp.setRequestdbAdapterAttsvc(querySubsystemHealth(MsoSubsystems.REQUESTDBATT));
138             // set Message
139             rsp.setMessage(String.format("HttpStatus: %s", HttpStatus.SC_OK));
140             msoLogger.info(rsp.toString(), "", "");
141
142             HEALTH_CHECK_RESPONSE = Response.status (HttpStatus.SC_OK)
143                     .entity (rsp)
144                     .build ();
145             
146         }catch (Exception ex){
147                 msoLogger.error(ex);
148                 rsp.setMessage(ex.getMessage());
149             HEALTH_CHECK_RESPONSE = Response.status (HttpStatus.SC_INTERNAL_SERVER_ERROR)
150                     .entity (rsp)
151                     .build ();
152         }
153         
154         return HEALTH_CHECK_RESPONSE;
155     }
156     
157     protected HttpEntity<String> buildHttpEntityForRequest(){
158         HttpHeaders headers = new HttpHeaders();
159         headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); 
160         headers.set("Content-Type", "application/json");
161         HttpEntity<String> entity = new HttpEntity<>("parameters", headers);       
162         return entity;
163     }
164     
165     protected String querySubsystemHealth(MsoSubsystems subsystem){
166         try{
167             // get port number for the subsystem
168                 String ept = getEndpointUrlForSubsystemEnum(subsystem);
169                 
170                 // build final endpoint url
171                         UriBuilder builder = UriBuilder.fromPath(ept).path(actuatorContextPath).path(health);
172                         URI uri = builder.build();
173                 msoLogger.info("Calculated URL: "+uri.toString(), "", "");              
174             
175             ResponseEntity<SubsystemHealthcheckResponse> result = 
176                         restTemplate.exchange(uri, HttpMethod.GET, buildHttpEntityForRequest(), SubsystemHealthcheckResponse.class);
177             
178                 return processResponseFromSubsystem(result,subsystem);
179                 
180         }catch(Exception ex){
181                 msoLogger.error(ex.getMessage());
182                 return HealthcheckStatus.DOWN.toString();
183         }
184     }
185         protected String processResponseFromSubsystem(ResponseEntity<SubsystemHealthcheckResponse> result, MsoSubsystems subsystem){
186         if(result == null || result.getStatusCodeValue() != HttpStatus.SC_OK){
187                 msoLogger.error(String.format("Globalhealthcheck: checking subsystem: %s failed ! result object is: %s", 
188                                 subsystem,
189                                 result == null? "NULL": result));
190                 return HealthcheckStatus.DOWN.toString();
191         }
192         
193         SubsystemHealthcheckResponse body = result.getBody();
194
195                 String status = body.getStatus();
196                 if("UP".equalsIgnoreCase(status)){
197                         return HealthcheckStatus.UP.toString();
198                 }else{
199                         msoLogger.error(subsystem + ", query health endpoint did not return UP status!");
200                         return HealthcheckStatus.DOWN.toString();
201                 }
202         }
203     
204     
205     protected String getEndpointUrlForSubsystemEnum(MsoSubsystems subsystem){
206         switch (subsystem){
207         case SDNC:
208                 return this.endpointSdnc;
209         case ASDC:
210                 return this.endpointAsdc;
211         case BPMN:
212                 return this.endpointBpmn;
213         case CATALOGDB:
214                 return this.endpointCatalogdb;
215         case OPENSTACK:
216                 return this.endpointOpenstack;
217         case REQUESTDB:
218                 return this.endpointRequestdb;
219         case REQUESTDBATT:
220                 return this.endpointRequestdbAttsvc;
221         default:
222                 return "";
223         }       
224     }
225 }