Create on boarding docker
[sdc.git] / catalog-fe / src / main / java / org / openecomp / sdc / fe / servlets / FeProxyServlet.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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.openecomp.sdc.fe.servlets;
22
23 import java.util.concurrent.TimeUnit;
24
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27
28 import org.eclipse.jetty.client.api.Response;
29 import org.openecomp.sdc.common.api.Constants;
30 import org.openecomp.sdc.fe.config.Configuration;
31 import org.openecomp.sdc.fe.config.ConfigurationManager;
32 import org.openecomp.sdc.fe.config.FeEcompErrorManager;
33 import org.openecomp.sdc.fe.mdc.MdcData;
34 import org.openecomp.sdc.fe.utils.BeProtocol;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37 import org.slf4j.MDC;
38
39 import com.google.common.cache.Cache;
40 import com.google.common.cache.CacheBuilder;
41
42 public class FeProxyServlet extends SSLProxyServlet {
43         private static final long serialVersionUID = 1L;
44         private static final String URL = "%s://%s%s%s";
45     private static final String ONBOARDING_CONTEXT = "/onboarding-api";
46     private static final String DCAED_CONTEXT = "/dcae-api";
47         private static final Logger log = LoggerFactory.getLogger(FeProxyServlet.class.getName());
48         private static Cache<String, MdcData> mdcDataCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build();
49
50 //      @Override
51 //      public URI rewriteURI(HttpServletRequest request) {
52 //              try {
53 //                      logFeRequest(request);
54 //              } catch (Exception e) {
55 //                      FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Request");
56 //                      log.error("Unexpected FE request logging error :", e);
57 //              }
58 //              String originalUrl = request.getRequestURL().toString();
59 //              String redirectedUrl = getModifiedUrl(request);
60 //
61 //              log.debug("FeProxyServlet Redirecting request from: {} , to: {}", originalUrl, redirectedUrl);
62 //
63 //              return URI.create(redirectedUrl);
64 //      }
65
66         @Override
67         protected String rewriteTarget(HttpServletRequest request) {
68                 try {
69                         logFeRequest(request);
70                 } catch (Exception e) {
71                         FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Request");
72                         log.error("Unexpected FE request logging error :", e);
73                 }
74                 String originalUrl = request.getRequestURL().toString();
75                 String redirectedUrl = getModifiedUrl(request);
76
77                 log.debug("FeProxyServlet Redirecting request from: {} , to: {}", originalUrl, redirectedUrl);
78
79                 return redirectedUrl;
80         }
81
82 //      @Override
83 //      protected void onResponseSuccess(HttpServletRequest request, HttpServletResponse response, Response proxyResponse) {
84 //              try {
85 //                      logFeResponse(request, proxyResponse);
86 //              } catch (Exception e) {
87 //                      FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response");
88 //                      log.error("Unexpected FE response logging error :", e);
89 //              }
90 //              super.onResponseSuccess(request, response, proxyResponse);
91 //      }
92 //protected void onProxyResponseSuccess(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Response serverResponse) {
93         @Override
94         protected void onProxyResponseSuccess(HttpServletRequest request, HttpServletResponse proxyResponse, Response response) {
95                 try {
96                         logFeResponse(request, response);
97                 } catch (Exception e) {
98                         FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response");
99                         log.error("Unexpected FE response logging error :", e);
100                 }
101                 super.onProxyResponseSuccess(request, proxyResponse, response);
102         }
103
104         private void logFeRequest(HttpServletRequest httpRequest) {
105
106                 MDC.clear();
107
108                 Long transactionStartTime = System.currentTimeMillis();
109                 // UUID - In FE, we are supposed to get the below header from UI.
110                 // We do not generate it if it's missing - BE does.
111                 String uuid = httpRequest.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
112                 String serviceInstanceID = httpRequest.getHeader(Constants.X_ECOMP_SERVICE_ID_HEADER);
113
114                 if (uuid != null && uuid.length() > 0) {
115                         // UserId for logging
116                         String userId = httpRequest.getHeader(Constants.USER_ID_HEADER);
117
118                         String remoteAddr = httpRequest.getRemoteAddr();
119                         String localAddr = httpRequest.getLocalAddr();
120
121                         mdcDataCache.put(uuid, new MdcData(serviceInstanceID, userId, remoteAddr, localAddr, transactionStartTime));
122
123                         updateMdc(uuid, serviceInstanceID, userId, remoteAddr, localAddr, null);
124                 }
125                 inHttpRequest(httpRequest);
126         }
127
128         private void logFeResponse(HttpServletRequest request, Response proxyResponse) {
129                 String uuid = request.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
130                 String transactionRoundTime = null;
131
132                 if (uuid != null) {
133                         MdcData mdcData = mdcDataCache.getIfPresent(uuid);
134                         if (mdcData != null) {
135                                 Long transactionStartTime = mdcData.getTransactionStartTime();
136                                 if (transactionStartTime != null) {// should'n ever be null, but
137                                                                                                         // just to be defensive
138                                         transactionRoundTime = Long.toString(System.currentTimeMillis() - transactionStartTime);
139                                 }
140                                 updateMdc(uuid, mdcData.getServiceInstanceID(), mdcData.getUserId(), mdcData.getRemoteAddr(), mdcData.getLocalAddr(), transactionRoundTime);
141                         }
142                 }
143                 outHttpResponse(proxyResponse);
144
145                 MDC.clear();
146         }
147
148         // Extracted for purpose of clear method name, for logback %M parameter
149         private void inHttpRequest(HttpServletRequest httpRequest) {
150                 log.info("{} {} {}", httpRequest.getMethod(), httpRequest.getRequestURI(), httpRequest.getProtocol());
151         }
152
153         // Extracted for purpose of clear method name, for logback %M parameter
154         private void outHttpResponse(Response proxyResponse) {
155                 log.info("SC=\"{}\"", proxyResponse.getStatus());
156         }
157
158         private void updateMdc(String uuid, String serviceInstanceID, String userId, String remoteAddr, String localAddr, String transactionStartTime) {
159                 MDC.put("uuid", uuid);
160                 MDC.put("serviceInstanceID", serviceInstanceID);
161                 MDC.put("userId", userId);
162                 MDC.put("remoteAddr", remoteAddr);
163                 MDC.put("localAddr", localAddr);
164                 MDC.put("timer", transactionStartTime);
165         }
166
167     private String getModifiedUrl(HttpServletRequest request) {
168                 Configuration config = getConfiguration(request);
169                 if (config == null) {
170                         log.error("failed to retrive configuration.");
171                         throw new RuntimeException("failed to read FE configuration");
172                 }
173                 String uri = request.getRequestURI();
174         String protocol;
175         String host;
176         String port;
177                 if (uri.contains(ONBOARDING_CONTEXT)){
178             uri = uri.replace("/sdc1/feProxy"+ONBOARDING_CONTEXT,ONBOARDING_CONTEXT);
179             protocol = config.getOnboarding().getProtocolBe();
180             host = config.getOnboarding().getHostBe();
181             port = config.getOnboarding().getPortBe().toString();
182                 }
183                 else if(uri.contains(DCAED_CONTEXT)){
184             uri = uri.replace("/sdc1/feProxy"+DCAED_CONTEXT,DCAED_CONTEXT);
185             protocol = config.getBeProtocol();
186             host = config.getBeHost();
187             if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
188                 port = config.getBeHttpPort().toString();
189             } else {
190                 port = config.getBeSslPort().toString();
191             }
192                 }
193                 else{
194                     uri = uri.replace("/sdc1/feProxy","/sdc2");
195             protocol = config.getBeProtocol();
196             host = config.getBeHost();
197             if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
198                 port = config.getBeHttpPort().toString();
199             } else {
200                 port = config.getBeSslPort().toString();
201             }
202
203                 }
204
205         String authority = getAuthority(host, port);
206         String queryString = getQueryString(request);
207         return  String.format(URL,protocol,authority,uri,queryString);
208
209
210
211
212 //              String scheme = config.getBeProtocol();
213 //              String uri = request.getRequestURI().toString();
214 //              StringBuilder url = new StringBuilder();
215 //              url.append(scheme).append("://").append(config.getBeHost());
216 //              url.append(":");
217 //              if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
218 //                      url.append(config.getBeHttpPort());
219 //              } else {
220 //                      url.append(config.getBeSslPort());
221 //              }
222 //              url.append(uri);
223 //              String queryString = request.getQueryString(); // d=789
224 //              if (queryString != null) {
225 //                      url.append("?").append(queryString);
226 //              }
227 //
228 //              String redirectedUrl = url.toString();
229 //              String onboardingForwardContext = config.getOnboardingForwardContext();
230 //              if (onboardingForwardContext == null || onboardingForwardContext.isEmpty()) {
231 //                      onboardingForwardContext = "/onboarding-api";
232 //              }
233 //              redirectedUrl = redirectedUrl.replace("/sdc1/feProxy/dcae-api", "/dcae");
234 //              redirectedUrl = redirectedUrl.replace("/sdc1/feProxy/onboarding-api", onboardingForwardContext);
235 //              redirectedUrl = redirectedUrl.replace("/sdc1/feProxy", "/sdc2");
236 //              return redirectedUrl;
237
238         }
239
240
241
242     private Configuration getConfiguration(HttpServletRequest request) {
243                 return ((ConfigurationManager) request.getSession().getServletContext().getAttribute(Constants.CONFIGURATION_MANAGER_ATTR)).getConfiguration();
244         }
245
246     private String getAuthority(String host, String port) {
247         String authority;
248         if (port==null){
249             authority=host;
250         }
251         else{
252             authority=host+":"+port;
253         }
254         return authority;
255     }
256
257     private String getQueryString(HttpServletRequest request) {
258         String queryString = request.getQueryString();
259         if (queryString != null) {
260             queryString="?"+queryString;
261         }
262         else{
263             queryString="";
264         }
265         return queryString;
266     }
267 }