Initial code import
[msb/apigateway.git] / apiroute / apiroute-service / src / main / java / org / openo / msb / wrapper / serviceListener / MicroServiceChangeListener.java
1 /**\r
2 * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
3 *\r
4 * Licensed under the Apache License, Version 2.0 (the "License");\r
5 * you may not use this file except in compliance with the License.\r
6 * You may obtain a copy of the License at\r
7 *\r
8 * http://www.apache.org/licenses/LICENSE-2.0\r
9 *\r
10 * Unless required by applicable law or agreed to in writing, software\r
11 * distributed under the License is distributed on an "AS IS" BASIS,\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13 * See the License for the specific language governing permissions and\r
14 * limitations under the License.\r
15 */\r
16 \r
17 package org.openo.msb.wrapper.serviceListener;\r
18 \r
19 import java.util.Set;\r
20 \r
21 import org.apache.commons.lang3.StringUtils;\r
22 import org.openo.msb.api.ApiRouteInfo;\r
23 import org.openo.msb.api.CustomRouteInfo;\r
24 import org.openo.msb.api.IuiRouteInfo;\r
25 import org.openo.msb.api.Node;\r
26 import org.openo.msb.api.RouteServer;\r
27 import org.openo.msb.api.Service;\r
28 import org.openo.msb.wrapper.ApiRouteServiceWrapper;\r
29 import org.openo.msb.wrapper.CustomRouteServiceWrapper;\r
30 import org.openo.msb.wrapper.IuiRouteServiceWrapper;\r
31 import org.openo.msb.wrapper.util.RegExpTestUtil;\r
32 import org.openo.msb.wrapper.util.RouteUtil;\r
33 import org.slf4j.Logger;\r
34 import org.slf4j.LoggerFactory;\r
35 \r
36 \r
37 public class MicroServiceChangeListener implements IMicroServiceChangeListener {\r
38     \r
39     private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);\r
40     \r
41     @Override\r
42     public void onSave(Service microServiceInfo,String serverPort) {\r
43         \r
44         if("UI".equals(microServiceInfo.getProtocol())){\r
45             IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);\r
46             if(null != iuiRouteInfo){\r
47                 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);\r
48             }\r
49         }\r
50         else{        \r
51         \r
52             if(ifApiRouteUrl(microServiceInfo.getUrl())){\r
53                 ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);\r
54                 if(null != apiRouteInfo){\r
55                     ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo,serverPort);\r
56                 }\r
57             }\r
58             else{\r
59                 CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);\r
60                 if(null != customRouteInfo){\r
61                     CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,serverPort);\r
62                 }\r
63             }\r
64         }\r
65         \r
66         \r
67     }\r
68     \r
69     @Override\r
70     public void onChange(String serviceName, String version, Service microServiceInfo,String serverPort) {\r
71         \r
72         if("UI".equals(microServiceInfo.getProtocol())){\r
73             if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
74                 serviceName=serviceName.substring(4);\r
75             }\r
76             IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);\r
77             if(null != iuiRouteInfo){\r
78                 IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName, iuiRouteInfo);\r
79             }\r
80         }\r
81         else{\r
82         \r
83             if(ifApiRouteUrl(microServiceInfo.getUrl())){\r
84                 ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);\r
85                 if(null != apiRouteInfo){\r
86                     ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName, version, apiRouteInfo,serverPort);\r
87                 }\r
88             }\r
89             else{\r
90                 if(!serviceName.startsWith("/")){\r
91                     serviceName="/"+serviceName;\r
92                 }\r
93                 CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);\r
94                 if(null != customRouteInfo){\r
95                     CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,customRouteInfo,serverPort);\r
96                 }\r
97             }\r
98         }\r
99         \r
100     }\r
101     \r
102     @Override\r
103     public void onStatusChange(String serviceName,String url,String version,String protocol,String status) {\r
104         if("UI".equals(protocol)){\r
105 \r
106             if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
107                 serviceName=serviceName.substring(4);\r
108             } \r
109            IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, status);\r
110             \r
111         }\r
112         else{\r
113             if(ifApiRouteUrl(url)){\r
114                 ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, status);\r
115             }\r
116             else{\r
117                 if(!serviceName.startsWith("/")){\r
118                     serviceName="/"+serviceName;\r
119                 }\r
120                 CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, status); \r
121             }\r
122         }\r
123         \r
124       \r
125 \r
126     }\r
127 \r
128     @Override\r
129     public void onDelete(String serviceName,String url, String version,String protocol,String serverPort) {\r
130         \r
131         if("UI".equals(protocol)){\r
132             if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
133                 serviceName=serviceName.substring(4);\r
134             } \r
135            IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName, "*");\r
136             \r
137         }\r
138         else{\r
139             if(ifApiRouteUrl(url)){\r
140                 ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version, "*",serverPort);\r
141             }\r
142             else{\r
143 \r
144               \r
145                 if(!serviceName.startsWith("/")){\r
146                     serviceName="/"+serviceName;\r
147                 }\r
148                 \r
149                 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName, "*",serverPort); \r
150             }\r
151         }\r
152     }\r
153     \r
154     \r
155     /** \r
156     * @Title ifApiRouteUrl \r
157     * @Description TODO(According to judge whether the API registration URL format) \r
158     * @param url\r
159     * @return      \r
160     * @return boolean    \r
161     */\r
162     private boolean ifApiRouteUrl(String url){\r
163         return RegExpTestUtil.apiRouteUrlRegExpTest(url);\r
164     }\r
165     \r
166    \r
167     /**\r
168      * From MicroServiceInfo to ApiRouteInfo\r
169      * @param microServiceInfo\r
170      * @return\r
171      */\r
172     private ApiRouteInfo buildApiRouteInfo(Service microServiceInfo){\r
173  \r
174         ApiRouteInfo apiRouteInfo = new ApiRouteInfo();\r
175         apiRouteInfo.setUrl(microServiceInfo.getUrl());\r
176         \r
177         Set<Node> nodes=microServiceInfo.getNodes();\r
178         RouteServer[] routeServers=new RouteServer[nodes.size()];\r
179          \r
180         \r
181         int i=0;\r
182         for(Node node:nodes){\r
183             RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
184             routeServers[i]=routeServer;\r
185             i++;\r
186         }      \r
187         \r
188                \r
189         apiRouteInfo.setServers(routeServers);\r
190         String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
191         if(RouteUtil.contain(rangs, "0")){\r
192             apiRouteInfo.setVisualRange("0");\r
193         }\r
194         else{\r
195             apiRouteInfo.setVisualRange("1");\r
196         }\r
197        \r
198         \r
199       if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
200           apiRouteInfo.setUseOwnUpstream("1");\r
201     }\r
202        \r
203         \r
204         \r
205         apiRouteInfo.setServiceName(microServiceInfo.getServiceName());\r
206         apiRouteInfo.setVersion(microServiceInfo.getVersion());\r
207         //TODO:set json and metrics defaultValue\r
208         String version="".equals(microServiceInfo.getVersion())?"":"/"+microServiceInfo.getVersion();\r
209         apiRouteInfo.setApiJson(microServiceInfo.getUrl()+"/swagger.json");\r
210         apiRouteInfo.setMetricsUrl("/admin/metrics");\r
211         return apiRouteInfo;\r
212     }\r
213     \r
214     \r
215     /**\r
216      * From MicroServiceInfo to CustomRouteInfo\r
217      * @param microServiceInfo\r
218      * @return\r
219      */\r
220     private CustomRouteInfo buildCustomRouteInfo(Service microServiceInfo){\r
221       \r
222         CustomRouteInfo customRouteInfo = new CustomRouteInfo();\r
223         customRouteInfo.setUrl(microServiceInfo.getUrl());\r
224         \r
225         Set<Node> nodes=microServiceInfo.getNodes();\r
226         RouteServer[] routeServers=new RouteServer[nodes.size()];\r
227          \r
228         \r
229         int i=0;\r
230         for(Node node:nodes){\r
231             RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
232             routeServers[i]=routeServer;\r
233             i++;\r
234         }      \r
235                \r
236         customRouteInfo.setServers(routeServers);\r
237         String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
238         if(RouteUtil.contain(rangs, "0")){\r
239             customRouteInfo.setVisualRange("0");\r
240         }\r
241         else{\r
242             customRouteInfo.setVisualRange("1");\r
243         }\r
244         \r
245         if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
246             customRouteInfo.setUseOwnUpstream("1");\r
247         }\r
248         \r
249         String serviceName;\r
250         if(!microServiceInfo.getServiceName().startsWith("/")){\r
251             serviceName="/"+microServiceInfo.getServiceName();\r
252         }\r
253         else{\r
254             serviceName=microServiceInfo.getServiceName();\r
255         }\r
256         customRouteInfo.setServiceName(serviceName);\r
257        \r
258         return customRouteInfo;\r
259     }\r
260     \r
261     \r
262     /**\r
263      * From MicroServiceInfo to IuiRouteInfo\r
264      * @param microServiceInfo\r
265      * @return\r
266      */\r
267     private IuiRouteInfo buildIuiRouteInfo(Service microServiceInfo){\r
268       \r
269         IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();\r
270         iuiRouteInfo.setUrl(microServiceInfo.getUrl());\r
271                \r
272         Set<Node> nodes=microServiceInfo.getNodes();\r
273         RouteServer[] routeServers=new RouteServer[nodes.size()];\r
274          \r
275         \r
276         int i=0;\r
277         for(Node node:nodes){\r
278             RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
279             routeServers[i]=routeServer;\r
280             i++;\r
281         }      \r
282                \r
283         iuiRouteInfo.setServers(routeServers);\r
284         String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
285         if(RouteUtil.contain(rangs, "0")){\r
286             iuiRouteInfo.setVisualRange("0");\r
287         }\r
288         else{\r
289             iuiRouteInfo.setVisualRange("1");\r
290         }\r
291         \r
292         if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
293             iuiRouteInfo.setUseOwnUpstream("1");\r
294         }\r
295 \r
296         String serviceName=microServiceInfo.getServiceName();\r
297         if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
298             serviceName=serviceName.substring(4);\r
299         }\r
300         \r
301         \r
302         iuiRouteInfo.setServiceName(serviceName);\r
303        \r
304         return iuiRouteInfo;\r
305     }\r
306 }\r