2  * Copyright 2016 ZTE Corporation.
 
   4  * Licensed under the Apache License, Version 2.0 (the "License");
 
   5  * you may not use this file except in compliance with the License.
 
   6  * You may obtain a copy of the License at
 
   8  *     http://www.apache.org/licenses/LICENSE-2.0
 
  10  * Unless required by applicable law or agreed to in writing, software
 
  11  * distributed under the License is distributed on an "AS IS" BASIS,
 
  12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  13  * See the License for the specific language governing permissions and
 
  14  * limitations under the License.
 
  16 package org.openo.msb.wrapper.serviceListener;
 
  20 import org.apache.commons.lang3.StringUtils;
 
  21 import org.openo.msb.api.ApiRouteInfo;
 
  22 import org.openo.msb.api.CustomRouteInfo;
 
  23 import org.openo.msb.api.IuiRouteInfo;
 
  24 import org.openo.msb.api.Node;
 
  25 import org.openo.msb.api.RouteServer;
 
  26 import org.openo.msb.api.Service;
 
  27 import org.openo.msb.wrapper.ApiRouteServiceWrapper;
 
  28 import org.openo.msb.wrapper.CustomRouteServiceWrapper;
 
  29 import org.openo.msb.wrapper.IuiRouteServiceWrapper;
 
  30 import org.openo.msb.wrapper.util.RegExpTestUtil;
 
  31 import org.openo.msb.wrapper.util.RouteUtil;
 
  32 import org.slf4j.Logger;
 
  33 import org.slf4j.LoggerFactory;
 
  36 public class MicroServiceChangeListener implements IMicroServiceChangeListener {
 
  38     private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);
 
  41     public void onSave(Service microServiceInfo,String serverPort) {
 
  43         if("UI".equals(microServiceInfo.getProtocol())){
 
  44             IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);
 
  45             if(null != iuiRouteInfo){
 
  46                 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);
 
  51             if(ifApiRouteUrl(microServiceInfo.getUrl())){
 
  52                 ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);
 
  53                 if(null != apiRouteInfo){
 
  54                     ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo,serverPort);
 
  58                 CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);
 
  59                 if(null != customRouteInfo){
 
  60                     CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,serverPort);
 
  69     public void onChange(String serviceName, String version, Service microServiceInfo,String serverPort) {
 
  71         if("UI".equals(microServiceInfo.getProtocol())){
 
  72             if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){
 
  73                 serviceName=serviceName.substring(4);
 
  75             IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);
 
  76             if(null != iuiRouteInfo){
 
  77                 IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName, iuiRouteInfo);
 
  82             if(ifApiRouteUrl(microServiceInfo.getUrl())){
 
  83                 ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);
 
  84                 if(null != apiRouteInfo){
 
  85                     ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName, version, apiRouteInfo,serverPort);
 
  89                 if(!serviceName.startsWith("/")){
 
  90                     serviceName="/"+serviceName;
 
  92                 CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);
 
  93                 if(null != customRouteInfo){
 
  94                     CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,customRouteInfo,serverPort);
 
 102     public void onStatusChange(String serviceName,String url,String version,String protocol,String status) {
 
 103         if("UI".equals(protocol)){
 
 105             if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){
 
 106                 serviceName=serviceName.substring(4);
 
 108            IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, status);
 
 112             if(ifApiRouteUrl(url)){
 
 113                 ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, status);
 
 116                 if(!serviceName.startsWith("/")){
 
 117                     serviceName="/"+serviceName;
 
 119                 CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, status); 
 
 128     public void onDelete(String serviceName,String url, String version,String protocol,String serverPort) {
 
 130         if("UI".equals(protocol)){
 
 131             if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){
 
 132                 serviceName=serviceName.substring(4);
 
 134            IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName, "*");
 
 138             if(ifApiRouteUrl(url)){
 
 139                 ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version, "*",serverPort);
 
 144                 if(!serviceName.startsWith("/")){
 
 145                     serviceName="/"+serviceName;
 
 148                 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName, "*",serverPort); 
 
 155     * @Title ifApiRouteUrl 
 
 156     * @Description TODO(According to judge whether the API registration URL format) 
 
 161     private boolean ifApiRouteUrl(String url){
 
 162         return RegExpTestUtil.apiRouteUrlRegExpTest(url);
 
 167      * From MicroServiceInfo to ApiRouteInfo
 
 168      * @param microServiceInfo
 
 171     private ApiRouteInfo buildApiRouteInfo(Service microServiceInfo){
 
 173         ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
 
 174         apiRouteInfo.setUrl(microServiceInfo.getUrl());
 
 176         Set<Node> nodes=microServiceInfo.getNodes();
 
 177         RouteServer[] routeServers=new RouteServer[nodes.size()];
 
 181         for(Node node:nodes){
 
 182             RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); 
 
 183             routeServers[i]=routeServer;
 
 188         apiRouteInfo.setServers(routeServers);
 
 189         String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");
 
 190         if(RouteUtil.contain(rangs, "0")){
 
 191             apiRouteInfo.setVisualRange("0");
 
 194             apiRouteInfo.setVisualRange("1");
 
 198       if("ip_hash".equals(microServiceInfo.getLb_policy())){
 
 199           apiRouteInfo.setUseOwnUpstream("1");
 
 204         apiRouteInfo.setServiceName(microServiceInfo.getServiceName());
 
 205         apiRouteInfo.setVersion(microServiceInfo.getVersion());
 
 206         //TODO:set json and metrics defaultValue
 
 207         String version="".equals(microServiceInfo.getVersion())?"":"/"+microServiceInfo.getVersion();
 
 208         apiRouteInfo.setApiJson(microServiceInfo.getUrl()+"/swagger.json");
 
 209         apiRouteInfo.setMetricsUrl("/admin/metrics");
 
 215      * From MicroServiceInfo to CustomRouteInfo
 
 216      * @param microServiceInfo
 
 219     private CustomRouteInfo buildCustomRouteInfo(Service microServiceInfo){
 
 221         CustomRouteInfo customRouteInfo = new CustomRouteInfo();
 
 222         customRouteInfo.setUrl(microServiceInfo.getUrl());
 
 224         Set<Node> nodes=microServiceInfo.getNodes();
 
 225         RouteServer[] routeServers=new RouteServer[nodes.size()];
 
 229         for(Node node:nodes){
 
 230             RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); 
 
 231             routeServers[i]=routeServer;
 
 235         customRouteInfo.setServers(routeServers);
 
 236         String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");
 
 237         if(RouteUtil.contain(rangs, "0")){
 
 238             customRouteInfo.setVisualRange("0");
 
 241             customRouteInfo.setVisualRange("1");
 
 244         if("ip_hash".equals(microServiceInfo.getLb_policy())){
 
 245             customRouteInfo.setUseOwnUpstream("1");
 
 249         if(!microServiceInfo.getServiceName().startsWith("/")){
 
 250             serviceName="/"+microServiceInfo.getServiceName();
 
 253             serviceName=microServiceInfo.getServiceName();
 
 255         customRouteInfo.setServiceName(serviceName);
 
 257         return customRouteInfo;
 
 262      * From MicroServiceInfo to IuiRouteInfo
 
 263      * @param microServiceInfo
 
 266     private IuiRouteInfo buildIuiRouteInfo(Service microServiceInfo){
 
 268         IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
 
 269         iuiRouteInfo.setUrl(microServiceInfo.getUrl());
 
 271         Set<Node> nodes=microServiceInfo.getNodes();
 
 272         RouteServer[] routeServers=new RouteServer[nodes.size()];
 
 276         for(Node node:nodes){
 
 277             RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); 
 
 278             routeServers[i]=routeServer;
 
 282         iuiRouteInfo.setServers(routeServers);
 
 283         String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");
 
 284         if(RouteUtil.contain(rangs, "0")){
 
 285             iuiRouteInfo.setVisualRange("0");
 
 288             iuiRouteInfo.setVisualRange("1");
 
 291         if("ip_hash".equals(microServiceInfo.getLb_policy())){
 
 292             iuiRouteInfo.setUseOwnUpstream("1");
 
 295         String serviceName=microServiceInfo.getServiceName();
 
 296         if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){
 
 297             serviceName=serviceName.substring(4);
 
 301         iuiRouteInfo.setServiceName(serviceName);