Divide the MSB source codes into two repos
[msb/apigateway.git] / apiroute / apiroute-service / src / main / java / org / onap / msb / apiroute / wrapper / InitRouteServiceWrapper.java
1 package org.onap.msb.apiroute.wrapper;
2
3 import io.dropwizard.jetty.HttpConnectorFactory;
4 import io.dropwizard.server.SimpleServerFactory;
5
6 import java.io.BufferedWriter;
7 import java.io.File;
8 import java.io.FileNotFoundException;
9 import java.io.FileOutputStream;
10 import java.io.IOException;
11 import java.io.OutputStreamWriter;
12 import java.net.URL;
13 import java.util.List;
14
15 import org.apache.commons.lang3.StringUtils;
16 import org.onap.msb.apiroute.ApiRouteApp;
17 import org.onap.msb.apiroute.ApiRouteAppConfig;
18 import org.onap.msb.apiroute.SyncDataManager;
19 import org.onap.msb.apiroute.api.ApiRouteInfo;
20 import org.onap.msb.apiroute.api.CustomRouteInfo;
21 import org.onap.msb.apiroute.api.DiscoverInfo;
22 import org.onap.msb.apiroute.api.IuiRouteInfo;
23 import org.onap.msb.apiroute.api.RouteServer;
24 import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
25 import org.onap.msb.apiroute.health.ConsulLinkHealthCheck;
26 import org.onap.msb.apiroute.health.RedisHealthCheck;
27 import org.onap.msb.apiroute.wrapper.serviceListener.MicroServiceChangeListener;
28 import org.onap.msb.apiroute.wrapper.serviceListener.RouteNotify;
29 import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
30 import org.onap.msb.apiroute.wrapper.util.FileUtil;
31 import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
32 import org.onap.msb.apiroute.wrapper.util.JedisUtil;
33 import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
34 import org.onap.msb.apiroute.wrapper.util.RouteUtil;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 import redis.clients.jedis.Jedis;
39
40 import com.fasterxml.jackson.core.type.TypeReference;
41
42 public class InitRouteServiceWrapper {
43
44   private static final Logger LOGGER = LoggerFactory.getLogger(InitRouteServiceWrapper.class);
45
46
47   private static InitRouteServiceWrapper instance = new InitRouteServiceWrapper();
48
49   private InitRouteServiceWrapper() {}
50
51   public static InitRouteServiceWrapper getInstance() {
52     return instance;
53   }
54
55
56   /**
57    * The listener registration service changes
58    */
59   public void registerServiceChangeListener() {
60
61     RouteNotify.getInstance().addServiceChangeListener(new MicroServiceChangeListener());
62
63   }
64   
65   public void initFilterConfig(){
66     //route init
67     ConfigUtil.getInstance().initRouteWay();       
68     ConfigUtil.getInstance().initApiGatewayPort();
69     ConfigUtil.getInstance().initRouteNameSpaceMatches();
70     ConfigUtil.getInstance().initRouteLabelsMatches();
71     ConfigUtil.getInstance().initNodeMetaQueryParam();
72     
73   }
74   
75   public void initDataSynchro(){
76     
77     registerServiceChangeListener();
78
79     boolean ifRedisConnect=startCheckRedisConnect();
80
81     if(ifRedisConnect){
82       initRouteInfoFromJson();      
83       runConsulClientApp();
84     }
85   }
86   
87   public void initHealthCheck()
88   {
89       LOGGER.info("start check consul link thread");
90       Thread tConsul= new Thread(new ConsulLinkHealthCheck(),"_healthcheck_consul_");
91       tConsul.setDaemon(true);
92       tConsul.start();
93       
94       LOGGER.info("start check redis thread");
95       Thread tRedies= new Thread(new RedisHealthCheck(),"_healthcheck_redis_");
96       tRedies.setDaemon(true);
97       tRedies.start();
98   }
99
100
101
102
103   public boolean startCheckRedisConnect() {
104
105         int n = 0;
106         while (true) {
107           if (!checkRedisConnect()) {
108             n++;
109             LOGGER.warn(n + "/10 : Initial Route Configuration——redis connection fail...");
110
111             try {
112               Thread.sleep(10000);
113             } catch (InterruptedException e) {
114               LOGGER.error("Thread.sleep throw except:" + e.getMessage());
115             }
116
117
118             if (n >= 10) {
119               LOGGER.error("Initial Route Configuration——redis connection fail,timeout exit...");
120               return false;
121             }
122           } else {
123             LOGGER.warn(" Initial Route Configuration——redis connection success...");
124            return true;
125           }
126         }
127
128       
129   }
130
131
132   // Open the consul to monitor subscription service
133   public void runConsulClientApp() {
134
135     String consulIP;
136     int consulPort;
137     String consulConfSource="Default";
138
139     
140     DiscoverInfo discoverInfo = ConfigUtil.getInstance().getDiscoverInfo();
141
142     if (discoverInfo.isEnabled()) {
143       LOGGER.warn("starting to initial consul Configuration");
144       String[] routeWay = ConfigUtil.getInstance().getRouteWay();
145       try {
146         String sys_consulIp=ConfigUtil.getInstance().getConsul_ip();
147         if (StringUtils.isNotBlank(sys_consulIp)) {
148           consulIP = sys_consulIp.trim();
149           consulPort = RouteUtil.consulDeafultPort;
150           consulConfSource="env:CONSUL_IP";
151         } else {
152           consulIP = discoverInfo.getIp();
153           consulPort = discoverInfo.getPort();
154           consulConfSource="init discoverInfo";
155         }
156
157         LOGGER.warn("init consul sync Address from [ "+consulConfSource+" ]:"  + consulIP + ":" + consulPort);
158
159         // Registration service discovery routing
160         // api
161         ApiRouteInfo discoverApiService = new ApiRouteInfo();
162         discoverApiService.setServiceName("msdiscover");
163         discoverApiService.setUrl("/api/microservices/v1");
164         discoverApiService.setVersion("v1");
165         discoverApiService.setMetricsUrl("/admin/metrics");
166         discoverApiService.setApiJson("/api/microservices/v1/swagger.json");
167         discoverApiService.setHost("msb");
168
169         RouteServer[] servers = new RouteServer[1];
170         servers[0] = new RouteServer(discoverInfo.getIp(), String.valueOf(discoverInfo.getPort()));
171         discoverApiService.setServers(servers);
172
173
174         for (int i = 0; i < routeWay.length; i++) {
175           ApiRouteServiceWrapper.getInstance().saveApiRouteInstance4Rest(discoverApiService,
176               routeWay[i]);
177         }
178
179
180
181         // iui
182         IuiRouteInfo discoverIUIService = new IuiRouteInfo();
183         discoverIUIService.setServiceName("msdiscover");
184         discoverIUIService.setUrl("/iui/microservices");
185         discoverIUIService.setHost("msb");
186         discoverIUIService.setServers(servers);
187
188         for (int i = 0; i < routeWay.length; i++) {
189           IuiRouteServiceWrapper.getInstance()
190               .saveIuiRouteInstance(discoverIUIService, routeWay[i]);
191         }
192
193
194         /*
195          * ConsulClientApp consulClientApp = new ConsulClientApp(consulIP, consulPort);
196          * consulClientApp.startServiceListen();
197          */
198
199  //       SyncDataManager syncDataManager = new SyncDataManager();
200         // Monitor serviceList change
201         SyncDataManager.initSyncTask(consulIP, consulPort);
202
203
204         LOGGER.warn("start monitor consul service--" + consulIP + ":" + consulPort);
205       } catch (Exception e) {
206         LOGGER.error("start monitor consul service fail:" + e.getMessage());
207       }
208     }
209    
210
211
212   }
213
214
215
216   /**
217    * @Title: initRouteInfoFromJson
218    * @Description: TODO(According to the JSON file configuration initialization route data)
219    * @return: void
220    */
221   public void initRouteInfoFromJson() {
222     LOGGER.info("starting to initial Route Configuration");
223     URL apiDocsPath = InitRouteServiceWrapper.class.getResource("/ext/initServices");
224     if (apiDocsPath != null) {
225       String path = apiDocsPath.getPath();
226
227       LOGGER.info("read JsonFilefolder:" + path);
228
229       try {
230         File[] files = FileUtil.readFileFolder(path);
231         for (int i = 0; i < files.length; i++) {
232           File file = files[i];
233           if (file.isFile() && file.getName().endsWith(".json")) {
234             LOGGER.info("read JsonFile:" + file.getPath());
235             String fileContent = FileUtil.readFile(file.getPath());
236             saveInitService2redis(fileContent);
237           } else {
238             LOGGER.warn(file.getName() + " is not a right file");
239           }
240         }
241
242
243
244       } catch (FileNotFoundException e) {
245         // TODO Auto-generated catch block
246         LOGGER.error("read  initServices Files throw FileNotFoundException", e);
247       } catch (IOException e) {
248         // TODO Auto-generated catch block
249         LOGGER.error("read  initServices Files throw IOexception", e);
250       }
251
252     }
253
254
255
256   }
257
258
259
260   private void saveInitService2redis(String fileContent) {
261
262     String[] routeWay = ConfigUtil.getInstance().getRouteWay();
263     String iuiRootPath = ConfigUtil.getInstance().getIUI_ROOT_PATH();
264
265     try {
266       List<ApiRouteInfo> routeList =
267           JacksonJsonUtil.jsonToListBean(fileContent, new TypeReference<List<ApiRouteInfo>>() {});
268       for (ApiRouteInfo route : routeList) {
269         String url = route.getUrl();
270
271         if (RegExpTestUtil.urlRegExpTest(route.getServiceName())) {
272
273           for (int i = 0; i < routeWay.length; i++) {
274             try {
275
276               CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(
277                   route.getServiceName(), route.getHost(), "", routeWay[i]);
278
279             } catch (ExtendedNotFoundException e) {
280
281               LOGGER.info("initCustomRoute: ServiceName--" + route.getServiceName());
282
283               CustomRouteInfo customRouteInfo = new CustomRouteInfo();
284               customRouteInfo.setControl(route.getControl());
285               customRouteInfo.setServers(route.getServers());
286               customRouteInfo.setServiceName(route.getServiceName());
287               customRouteInfo.setStatus(route.getStatus());
288               customRouteInfo.setUrl(route.getUrl());
289               customRouteInfo.setHost(route.getHost());
290
291
292
293               CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,
294                   routeWay[i]);
295
296             }
297           }
298         } else {
299
300           if (RegExpTestUtil.apiRouteUrlRegExpTest(url) || url.startsWith("/api/microservices/") || url.startsWith("/admin/microservices/")) {
301
302             for (int i = 0; i < routeWay.length; i++) {
303               try {
304
305                 ApiRouteServiceWrapper.getInstance().getApiRouteInstance(route.getServiceName(),
306                     route.getVersion(), route.getHost(), route.getPublish_port(), routeWay[i]);
307
308               } catch (ExtendedNotFoundException e) {
309                 LOGGER.info("initapiRoute: ServiceName--" + route.getServiceName());
310
311                 if (url.startsWith("/api/microservices")) {
312                   if (StringUtils.isNotBlank(System.getenv("dwApp_server_connector_port"))) {
313                     replaceApigatewayPort(route.getServers(),
314                         System.getenv("dwApp_server_connector_port"));
315                   }
316                 }
317                 
318                 if (url.startsWith("/admin/microservices")) {                 
319                     replaceApigatewayPort(route.getServers(),ConfigUtil.getInstance().getServerPort());                  
320                 }
321
322                 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance4Rest(route, routeWay[i]);
323
324               }
325             }
326
327
328           } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url) || url.equals("/iui/microservices")) {
329
330             for (int i = 0; i < routeWay.length; i++) {
331               try {
332
333                 IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(route.getServiceName(),
334                     route.getHost(), "", routeWay[i]);
335
336               } catch (ExtendedNotFoundException e) {
337
338                 LOGGER.info(" initiuiRoute: ServiceName--" + route.getServiceName());
339                 IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
340                 iuiRouteInfo.setControl(route.getControl());
341                 iuiRouteInfo.setServers(route.getServers());
342                 iuiRouteInfo.setServiceName(route.getServiceName());
343                 iuiRouteInfo.setStatus(route.getStatus());
344                 iuiRouteInfo.setHost(route.getHost());
345
346
347                 if (url.equals("/iui/microservices")) {
348                   iuiRouteInfo.setUrl("/" + iuiRootPath + "/microservices");
349                   if (StringUtils.isNotBlank(System.getenv("dwApp_server_connector_port"))) {
350                     replaceApigatewayPort(iuiRouteInfo.getServers(),
351                         System.getenv("dwApp_server_connector_port"));
352                   }
353                 } else {
354                   iuiRouteInfo.setUrl(route.getUrl());
355                 }
356
357                 IuiRouteServiceWrapper.getInstance()
358                     .saveIuiRouteInstance(iuiRouteInfo, routeWay[i]);
359
360
361               }
362             }
363
364           } else {
365             LOGGER.error("init Service throw exception——serviceName: " + route.getServiceName()
366                 + ",url:" + url);
367           }
368         }
369
370
371
372       }
373
374     } catch (Exception e) {
375       // TODO Auto-generated catch block
376       LOGGER.error("read  initServices Files throw exception", e);
377     }
378
379   }
380
381   private void replaceApigatewayPort(RouteServer[] servers, String apigatewayPort) {
382     for (int i = 0; i < servers.length; i++) {
383       servers[i].setPort(apigatewayPort);
384     }
385   }
386
387   public void initMetricsConfig(ApiRouteAppConfig configuration) {
388
389     SimpleServerFactory simpleServerFactory =
390         (SimpleServerFactory) configuration.getServerFactory();
391     HttpConnectorFactory httpConnectorFactory =
392         (HttpConnectorFactory) simpleServerFactory.getConnector();
393     String metricsUrl =
394         "http://127.0.0.1:" + httpConnectorFactory.getPort()
395             + simpleServerFactory.getAdminContextPath() + "/metrics";
396     ConfigUtil.getInstance().setMetricsUrl(metricsUrl);
397   }
398
399
400   private boolean checkRedisConnect() {
401     Jedis jedis = null;
402     try {
403        jedis = JedisUtil.borrowJedisInstance();
404       return true;
405     } catch (Exception e) {
406       LOGGER.error("checkRedisConnect call redis throw exception", e);
407     }finally {
408       JedisUtil.returnJedisInstance(jedis);
409     } 
410
411     return false;
412   }
413
414
415
416 }