1 /*******************************************************************************
2 * Copyright 2016-2017 ZTE, Inc. and others.
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.
15 ******************************************************************************/
16 package org.onap.msb.apiroute.wrapper;
18 import java.util.HashSet;
19 import java.util.List;
21 import java.util.regex.Matcher;
22 import java.util.regex.Pattern;
24 import org.onap.msb.apiroute.api.MicroServiceFullInfo;
25 import org.onap.msb.apiroute.api.Node;
26 import org.onap.msb.apiroute.api.exception.ExtendedInternalServerErrorException;
27 import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
28 import org.onap.msb.apiroute.api.exception.UnprocessableEntityException;
29 import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
30 import org.onap.msb.apiroute.wrapper.service.MicroServiceFullService;
31 import org.onap.msb.apiroute.wrapper.serviceListener.RouteNotify;
32 import org.onap.msb.apiroute.wrapper.util.MicroServiceUtil;
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;
38 public class MicroServiceWrapper {
40 private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceWrapper.class);
42 private static MicroServiceWrapper instance = new MicroServiceWrapper();
45 private MicroServiceWrapper() {}
47 public static MicroServiceWrapper getInstance() {
55 * @Title: getAllMicroServiceInstances
56 * @Description: getAllMicroServiceInstances
61 public List<MicroServiceFullInfo> getAllMicroServiceInstances() {
64 return MicroServiceFullService.getInstance().getAllMicroServiceInstances();
66 } catch (Exception e) {
67 throw new ExtendedInternalServerErrorException(e.getMessage());
72 public Set<String> getAllMicroServiceKey() {
75 int failedTimer = 5 * 1000;
77 Set<String> serviceKeys=null;
82 serviceKeys= MicroServiceFullService.getInstance().getAllMicroServiceKey();
85 } catch (Exception e) {
87 LOGGER.error(failedNum + "/"+retryCount+" : get AllMicroServiceKey fail"+e);
91 Thread.sleep(failedTimer);
92 } catch (InterruptedException ex) {
93 LOGGER.warn("get AllMicroServiceKey Thread.sleep throw except:" + ex.getMessage());
97 }while (failedNum <= retryCount);
108 * @Title: getMicroServiceInstance
109 * @Description: (getMicroServiceInstance)
110 * @param: @param serviceName
111 * @param: @param version
113 * @return: ApiRouteInfo
115 public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version) {
116 if ("null".equals(version)) {
119 serviceName = serviceName.replace("*", "/");
121 RouteUtil.checkServiceNameAndVersion(serviceName, version);
123 MicroServiceFullInfo microServiceInfo;
126 MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
128 } catch (Exception e) {
129 throw new ExtendedInternalServerErrorException(e.getMessage());
132 if (null == microServiceInfo) {
133 String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version;
134 throw new ExtendedNotFoundException(errInfo);
138 return microServiceInfo;
144 * @Title updateMicroServiceStatus
145 * @Description updateMicroServiceStatus
150 * @return RouteResult
153 public synchronized MicroServiceFullInfo updateMicroServiceStatus(String serviceName,
154 String version, String status) {
156 if ("null".equals(version)) {
159 serviceName = serviceName.replace("*", "/");
161 RouteUtil.checkServiceNameAndVersion(serviceName, version);
163 RouteUtil.checkServiceStatus(status);
167 MicroServiceFullService.getInstance().updateMicroServiceStatus(serviceName, version, status);
169 MicroServiceFullInfo newMicroServiceInfo =
170 MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
172 // Notify the listeners
173 RouteNotify.getInstance().noticeUpdateStatusListener(newMicroServiceInfo, status);
176 return newMicroServiceInfo;
177 } catch (NullPointerException e) {
178 throw new ExtendedNotFoundException(e.getMessage());
179 } catch (Exception e) {
180 LOGGER.error("update MicroServiceNode throw exception", e);
181 throw new ExtendedInternalServerErrorException(e.getMessage());
188 public synchronized MicroServiceFullInfo saveMicroServiceInstance(
189 MicroServiceFullInfo microServiceInfo, boolean createOrUpdate, String requestIP,
192 RouteUtil.checkMicroServiceInfoFormat(microServiceInfo, requestIP);
196 if (createOrUpdate == false) {
197 deleteServiceAndnoticeRoute(microServiceInfo);
200 saveServiceAndnoticeRoute(microServiceInfo);
203 MicroServiceFullInfo newMicroServiceInfo =
204 MicroServiceFullService.getInstance().getMicroServiceInstance(
205 microServiceInfo.getServiceName(), microServiceInfo.getVersion());
208 return newMicroServiceInfo;
210 } catch (UnprocessableEntityException e) {
212 } catch (Exception e) {
213 throw new ExtendedInternalServerErrorException("save MicroServiceInfo fail :[serviceName]" + microServiceInfo.getServiceName()
214 + "[version]" + microServiceInfo.getVersion()+ e.getMessage());
220 public synchronized void deleteMicroService4AllVersion(String serviceName) {
223 List<MicroServiceFullInfo> microServiceList4AllVersion =
224 MicroServiceFullService.getInstance().getAllVersionsOfTheService(serviceName);
226 if (microServiceList4AllVersion.size() == 0) {
227 LOGGER.info("delete MicroServiceInfo for All Version Fail:serviceName-" + serviceName
230 for (MicroServiceFullInfo microServiceInfo : microServiceList4AllVersion) {
231 deleteServiceAndnoticeRoute(microServiceInfo);
235 } catch (Exception e) {
236 LOGGER.error("delete MicroServiceInfo for all version :serviceName-" + serviceName +" throw exception", e);
242 public synchronized void deleteMicroService(String serviceName, String version) {
243 if ("null".equals(version)) {
246 serviceName = serviceName.replace("*", "/");
248 RouteUtil.checkServiceNameAndVersion(serviceName, version);
252 MicroServiceFullInfo microServiceInfo =
253 MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
255 if (microServiceInfo == null) {
256 LOGGER.error("delete MicroServiceInfo FAIL:serviceName-" + serviceName + ",version-"+ version + " not fond ");
259 deleteServiceAndnoticeRoute(microServiceInfo);
263 } catch (ExtendedNotFoundException e) {
265 } catch (Exception e) {
267 throw new ExtendedInternalServerErrorException("delete MicroServiceInfo serviceName-" + serviceName + ",version-" + version+e.getMessage());
274 public synchronized void deleteMicroServiceInstance(String serviceName, String version,
275 String ip, String port) {
276 if ("null".equals(version)) {
279 serviceName = serviceName.replace("*", "/");
281 RouteUtil.checkServiceNameAndVersion(serviceName, version);
283 if (!RegExpTestUtil.ipRegExpTest(ip)) {
284 throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:IP(" + ip+ ")is not a valid IP address");
287 if (!RegExpTestUtil.portRegExpTest(port)) {
288 throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:Port(" + port + ")is not a valid Port address");
293 MicroServiceFullInfo microServiceInfo =
294 MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
296 if (microServiceInfo == null) {
297 throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:serviceName-"+ serviceName + ",version-" + version + " not fond ");
300 Set<Node> nodes = microServiceInfo.getNodes();
302 boolean ifFindBNode = false;
304 for (Node node : nodes) {
305 if (node.getIp().equals(ip) && node.getPort().equals(port)) {
309 if (nodes.isEmpty()) {
310 // delete MicroService
311 deleteServiceAndnoticeRoute(microServiceInfo);
314 MicroServiceFullService.getInstance().saveMicroServiceInfo2Redis(microServiceInfo);
315 RouteNotify.getInstance().noticeRouteListener4Update(serviceName, version,
324 throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"+ serviceName + ",version-" + version +",node-" + ip + ":" + port + " not fond ");
328 } catch (ExtendedNotFoundException e) {
330 } catch (Exception e) {
331 throw new ExtendedInternalServerErrorException("delete MicroServiceInfo :serviceName-"+ serviceName + ",version-" + version+",node-" + ip + ":" + port +"throw exception"+e.getMessage());
338 public void deleteServiceAndnoticeRoute(MicroServiceFullInfo service) throws Exception {
341 // Delete the redis record
342 MicroServiceFullService.getInstance().deleteMicroService(service.getServiceName(),
343 service.getVersion());
344 LOGGER.info("delete MicroServiceInfo And notice to Route success:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion());
346 // Notify the listeners
347 RouteNotify.getInstance().noticeRouteListener4Delete(service);
349 } catch (Exception e) {
350 LOGGER.error("delete MicroService And synchro to Route:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion()+" throw exception", e);
355 public void saveServiceAndnoticeRoute(MicroServiceFullInfo service) throws Exception {
358 // save the redis record
359 MicroServiceFullService.getInstance().saveMicroServiceInfo2Redis(service);
361 LOGGER.info("save MicroServiceInfo And notice to Route success:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion());
363 // Notify the listeners
364 RouteNotify.getInstance().noticeRouteListener4Add(service);
367 } catch (Exception e) {
368 LOGGER.error("save MicroServiceInfo And synchro to Route fail :[serviceName]" + service.getServiceName()+ "[version]" + service.getVersion() + " throw exception", e);
373 public Set<String> getAllVersion(String serviceName) {
374 Set<String> serviceVersionSet = new HashSet<String>();
376 String pattern = MicroServiceUtil.getServiceKey(serviceName, "*");
377 Set<String> serviceKeySet = RedisAccessWrapper.filterKeys(pattern);
380 Pattern serviceKeyRegexPattern = MicroServiceUtil.getServiceKeyRegexPattern();
381 for (String serviceKey : serviceKeySet) {
382 Matcher matcher = serviceKeyRegexPattern.matcher(serviceKey);
383 if (matcher.matches()) {
384 serviceVersionSet.add(matcher.group("version"));
387 } catch (Exception e) {
388 LOGGER.error("getAllVersion [serviceName]:" + serviceName + " throw exception", e);
391 return serviceVersionSet;