--- /dev/null
+/**\r
+* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
+*\r
+* Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*/\r
+\r
+package org.openo.msb.wrapper.serviceListener;\r
+\r
+import java.util.Set;\r
+\r
+import org.apache.commons.lang3.StringUtils;\r
+import org.openo.msb.api.ApiRouteInfo;\r
+import org.openo.msb.api.CustomRouteInfo;\r
+import org.openo.msb.api.IuiRouteInfo;\r
+import org.openo.msb.api.Node;\r
+import org.openo.msb.api.RouteServer;\r
+import org.openo.msb.api.Service;\r
+import org.openo.msb.wrapper.ApiRouteServiceWrapper;\r
+import org.openo.msb.wrapper.CustomRouteServiceWrapper;\r
+import org.openo.msb.wrapper.IuiRouteServiceWrapper;\r
+import org.openo.msb.wrapper.util.RegExpTestUtil;\r
+import org.openo.msb.wrapper.util.RouteUtil;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+\r
+public class MicroServiceChangeListener implements IMicroServiceChangeListener {\r
+ \r
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);\r
+ \r
+ @Override\r
+ public void onSave(Service microServiceInfo,String serverPort) {\r
+ \r
+ if("UI".equals(microServiceInfo.getProtocol())){\r
+ IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);\r
+ if(null != iuiRouteInfo){\r
+ IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);\r
+ }\r
+ }\r
+ else{ \r
+ \r
+ if(ifApiRouteUrl(microServiceInfo.getUrl())){\r
+ ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);\r
+ if(null != apiRouteInfo){\r
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo,serverPort);\r
+ }\r
+ }\r
+ else{\r
+ CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);\r
+ if(null != customRouteInfo){\r
+ CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,serverPort);\r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void onChange(String serviceName, String version, Service microServiceInfo,String serverPort) {\r
+ \r
+ if("UI".equals(microServiceInfo.getProtocol())){\r
+ if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
+ serviceName=serviceName.substring(4);\r
+ }\r
+ IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);\r
+ if(null != iuiRouteInfo){\r
+ IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName, iuiRouteInfo);\r
+ }\r
+ }\r
+ else{\r
+ \r
+ if(ifApiRouteUrl(microServiceInfo.getUrl())){\r
+ ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);\r
+ if(null != apiRouteInfo){\r
+ ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName, version, apiRouteInfo,serverPort);\r
+ }\r
+ }\r
+ else{\r
+ if(!serviceName.startsWith("/")){\r
+ serviceName="/"+serviceName;\r
+ }\r
+ CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);\r
+ if(null != customRouteInfo){\r
+ CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,customRouteInfo,serverPort);\r
+ }\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void onStatusChange(String serviceName,String url,String version,String protocol,String status) {\r
+ if("UI".equals(protocol)){\r
+\r
+ if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
+ serviceName=serviceName.substring(4);\r
+ } \r
+ IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, status);\r
+ \r
+ }\r
+ else{\r
+ if(ifApiRouteUrl(url)){\r
+ ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, status);\r
+ }\r
+ else{\r
+ if(!serviceName.startsWith("/")){\r
+ serviceName="/"+serviceName;\r
+ }\r
+ CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, status); \r
+ }\r
+ }\r
+ \r
+ \r
+\r
+ }\r
+\r
+ @Override\r
+ public void onDelete(String serviceName,String url, String version,String protocol,String serverPort) {\r
+ \r
+ if("UI".equals(protocol)){\r
+ if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
+ serviceName=serviceName.substring(4);\r
+ } \r
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName, "*");\r
+ \r
+ }\r
+ else{\r
+ if(ifApiRouteUrl(url)){\r
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version, "*",serverPort);\r
+ }\r
+ else{\r
+\r
+ \r
+ if(!serviceName.startsWith("/")){\r
+ serviceName="/"+serviceName;\r
+ }\r
+ \r
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName, "*",serverPort); \r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ /** \r
+ * @Title ifApiRouteUrl \r
+ * @Description TODO(According to judge whether the API registration URL format) \r
+ * @param url\r
+ * @return \r
+ * @return boolean \r
+ */\r
+ private boolean ifApiRouteUrl(String url){\r
+ return RegExpTestUtil.apiRouteUrlRegExpTest(url);\r
+ }\r
+ \r
+ \r
+ /**\r
+ * From MicroServiceInfo to ApiRouteInfo\r
+ * @param microServiceInfo\r
+ * @return\r
+ */\r
+ private ApiRouteInfo buildApiRouteInfo(Service microServiceInfo){\r
+ \r
+ ApiRouteInfo apiRouteInfo = new ApiRouteInfo();\r
+ apiRouteInfo.setUrl(microServiceInfo.getUrl());\r
+ \r
+ Set<Node> nodes=microServiceInfo.getNodes();\r
+ RouteServer[] routeServers=new RouteServer[nodes.size()];\r
+ \r
+ \r
+ int i=0;\r
+ for(Node node:nodes){\r
+ RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
+ routeServers[i]=routeServer;\r
+ i++;\r
+ } \r
+ \r
+ \r
+ apiRouteInfo.setServers(routeServers);\r
+ String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
+ if(RouteUtil.contain(rangs, "0")){\r
+ apiRouteInfo.setVisualRange("0");\r
+ }\r
+ else{\r
+ apiRouteInfo.setVisualRange("1");\r
+ }\r
+ \r
+ \r
+ if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
+ apiRouteInfo.setUseOwnUpstream("1");\r
+ }\r
+ \r
+ \r
+ \r
+ apiRouteInfo.setServiceName(microServiceInfo.getServiceName());\r
+ apiRouteInfo.setVersion(microServiceInfo.getVersion());\r
+ //TODO:set json and metrics defaultValue\r
+ String version="".equals(microServiceInfo.getVersion())?"":"/"+microServiceInfo.getVersion();\r
+ apiRouteInfo.setApiJson(microServiceInfo.getUrl()+"/swagger.json");\r
+ apiRouteInfo.setMetricsUrl("/admin/metrics");\r
+ return apiRouteInfo;\r
+ }\r
+ \r
+ \r
+ /**\r
+ * From MicroServiceInfo to CustomRouteInfo\r
+ * @param microServiceInfo\r
+ * @return\r
+ */\r
+ private CustomRouteInfo buildCustomRouteInfo(Service microServiceInfo){\r
+ \r
+ CustomRouteInfo customRouteInfo = new CustomRouteInfo();\r
+ customRouteInfo.setUrl(microServiceInfo.getUrl());\r
+ \r
+ Set<Node> nodes=microServiceInfo.getNodes();\r
+ RouteServer[] routeServers=new RouteServer[nodes.size()];\r
+ \r
+ \r
+ int i=0;\r
+ for(Node node:nodes){\r
+ RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
+ routeServers[i]=routeServer;\r
+ i++;\r
+ } \r
+ \r
+ customRouteInfo.setServers(routeServers);\r
+ String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
+ if(RouteUtil.contain(rangs, "0")){\r
+ customRouteInfo.setVisualRange("0");\r
+ }\r
+ else{\r
+ customRouteInfo.setVisualRange("1");\r
+ }\r
+ \r
+ if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
+ customRouteInfo.setUseOwnUpstream("1");\r
+ }\r
+ \r
+ String serviceName;\r
+ if(!microServiceInfo.getServiceName().startsWith("/")){\r
+ serviceName="/"+microServiceInfo.getServiceName();\r
+ }\r
+ else{\r
+ serviceName=microServiceInfo.getServiceName();\r
+ }\r
+ customRouteInfo.setServiceName(serviceName);\r
+ \r
+ return customRouteInfo;\r
+ }\r
+ \r
+ \r
+ /**\r
+ * From MicroServiceInfo to IuiRouteInfo\r
+ * @param microServiceInfo\r
+ * @return\r
+ */\r
+ private IuiRouteInfo buildIuiRouteInfo(Service microServiceInfo){\r
+ \r
+ IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();\r
+ iuiRouteInfo.setUrl(microServiceInfo.getUrl());\r
+ \r
+ Set<Node> nodes=microServiceInfo.getNodes();\r
+ RouteServer[] routeServers=new RouteServer[nodes.size()];\r
+ \r
+ \r
+ int i=0;\r
+ for(Node node:nodes){\r
+ RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
+ routeServers[i]=routeServer;\r
+ i++;\r
+ } \r
+ \r
+ iuiRouteInfo.setServers(routeServers);\r
+ String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
+ if(RouteUtil.contain(rangs, "0")){\r
+ iuiRouteInfo.setVisualRange("0");\r
+ }\r
+ else{\r
+ iuiRouteInfo.setVisualRange("1");\r
+ }\r
+ \r
+ if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
+ iuiRouteInfo.setUseOwnUpstream("1");\r
+ }\r
+\r
+ String serviceName=microServiceInfo.getServiceName();\r
+ if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
+ serviceName=serviceName.substring(4);\r
+ }\r
+ \r
+ \r
+ iuiRouteInfo.setServiceName(serviceName);\r
+ \r
+ return iuiRouteInfo;\r
+ }\r
+}\r