2 * Copyright 2016 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.
17 package org.onap.msb.apiroute.wrapper;
19 import java.util.HashSet;
20 import java.util.List;
22 import java.util.regex.Matcher;
23 import java.util.regex.Pattern;
25 import org.onap.msb.apiroute.api.MicroServiceFullInfo;
26 import org.onap.msb.apiroute.api.Node;
27 import org.onap.msb.apiroute.api.exception.ExtendedInternalServerErrorException;
28 import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
29 import org.onap.msb.apiroute.api.exception.UnprocessableEntityException;
30 import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
31 import org.onap.msb.apiroute.wrapper.service.MicroServiceFullService;
32 import org.onap.msb.apiroute.wrapper.serviceListener.RouteNotify;
33 import org.onap.msb.apiroute.wrapper.util.MicroServiceUtil;
34 import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
35 import org.onap.msb.apiroute.wrapper.util.RouteUtil;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
39 public class MicroServiceWrapper {
41 private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceWrapper.class);
43 private static MicroServiceWrapper instance = new MicroServiceWrapper();
46 private MicroServiceWrapper() {}
48 public static MicroServiceWrapper getInstance() {
56 * @Title: getAllMicroServiceInstances
57 * @Description: getAllMicroServiceInstances
62 public List<MicroServiceFullInfo> getAllMicroServiceInstances() {
65 return MicroServiceFullService.getInstance().getAllMicroServiceInstances();
67 } catch (Exception e) {
68 throw new ExtendedInternalServerErrorException(e.getMessage());
73 public Set<String> getAllMicroServiceKey() {
76 int failedTimer = 5 * 1000;
78 Set<String> serviceKeys=null;
83 serviceKeys= MicroServiceFullService.getInstance().getAllMicroServiceKey();
86 } catch (Exception e) {
88 LOGGER.error(failedNum + "/"+retryCount+" : get AllMicroServiceKey fail"+e);
92 Thread.sleep(failedTimer);
93 } catch (InterruptedException ex) {
94 LOGGER.warn("get AllMicroServiceKey Thread.sleep throw except:" + ex.getMessage());
98 }while (failedNum <= retryCount);
109 * @Title: getMicroServiceInstance
110 * @Description: (getMicroServiceInstance)
111 * @param: @param serviceName
112 * @param: @param version
114 * @return: ApiRouteInfo
116 public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version) {
117 if ("null".equals(version)) {
120 serviceName = serviceName.replace("*", "/");
122 RouteUtil.checkServiceNameAndVersion(serviceName, version);
124 MicroServiceFullInfo microServiceInfo;
127 MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
129 } catch (Exception e) {
130 throw new ExtendedInternalServerErrorException(e.getMessage());
133 if (null == microServiceInfo) {
134 String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version;
135 throw new ExtendedNotFoundException(errInfo);
139 return microServiceInfo;
145 * @Title updateMicroServiceStatus
146 * @Description updateMicroServiceStatus
151 * @return RouteResult
154 public synchronized MicroServiceFullInfo updateMicroServiceStatus(String serviceName,
155 String version, String status) {
157 if ("null".equals(version)) {
160 serviceName = serviceName.replace("*", "/");
162 RouteUtil.checkServiceNameAndVersion(serviceName, version);
164 RouteUtil.checkServiceStatus(status);
168 MicroServiceFullService.getInstance().updateMicroServiceStatus(serviceName, version, status);
170 MicroServiceFullInfo newMicroServiceInfo =
171 MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
173 // Notify the listeners
174 RouteNotify.getInstance().noticeUpdateStatusListener(newMicroServiceInfo, status);
177 return newMicroServiceInfo;
178 } catch (NullPointerException e) {
179 throw new ExtendedNotFoundException(e.getMessage());
180 } catch (Exception e) {
181 LOGGER.error("update MicroServiceNode throw exception", e);
182 throw new ExtendedInternalServerErrorException(e.getMessage());
189 public synchronized MicroServiceFullInfo saveMicroServiceInstance(
190 MicroServiceFullInfo microServiceInfo, boolean createOrUpdate, String requestIP,
193 RouteUtil.checkMicroServiceInfoFormat(microServiceInfo, requestIP);
197 if (createOrUpdate == false) {
198 deleteServiceAndnoticeRoute(microServiceInfo);
201 saveServiceAndnoticeRoute(microServiceInfo);
204 MicroServiceFullInfo newMicroServiceInfo =
205 MicroServiceFullService.getInstance().getMicroServiceInstance(
206 microServiceInfo.getServiceName(), microServiceInfo.getVersion());
209 return newMicroServiceInfo;
211 } catch (UnprocessableEntityException e) {
213 } catch (Exception e) {
214 throw new ExtendedInternalServerErrorException("save MicroServiceInfo fail :[serviceName]" + microServiceInfo.getServiceName()
215 + "[version]" + microServiceInfo.getVersion()+ e.getMessage());
221 public synchronized void deleteMicroService4AllVersion(String serviceName) {
224 List<MicroServiceFullInfo> microServiceList4AllVersion =
225 MicroServiceFullService.getInstance().getAllVersionsOfTheService(serviceName);
227 if (microServiceList4AllVersion.size() == 0) {
228 LOGGER.info("delete MicroServiceInfo for All Version Fail:serviceName-" + serviceName
231 for (MicroServiceFullInfo microServiceInfo : microServiceList4AllVersion) {
232 deleteServiceAndnoticeRoute(microServiceInfo);
236 } catch (Exception e) {
237 LOGGER.error("delete MicroServiceInfo for all version :serviceName-" + serviceName +" throw exception", e);
243 public synchronized void deleteMicroService(String serviceName, String version) {
244 if ("null".equals(version)) {
247 serviceName = serviceName.replace("*", "/");
249 RouteUtil.checkServiceNameAndVersion(serviceName, version);
253 MicroServiceFullInfo microServiceInfo =
254 MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
256 if (microServiceInfo == null) {
257 LOGGER.error("delete MicroServiceInfo FAIL:serviceName-" + serviceName + ",version-"+ version + " not fond ");
260 deleteServiceAndnoticeRoute(microServiceInfo);
264 } catch (ExtendedNotFoundException e) {
266 } catch (Exception e) {
268 throw new ExtendedInternalServerErrorException("delete MicroServiceInfo serviceName-" + serviceName + ",version-" + version+e.getMessage());
275 public synchronized void deleteMicroServiceInstance(String serviceName, String version,
276 String ip, String port) {
277 if ("null".equals(version)) {
280 serviceName = serviceName.replace("*", "/");
282 RouteUtil.checkServiceNameAndVersion(serviceName, version);
284 if (!RegExpTestUtil.ipRegExpTest(ip)) {
285 throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:IP(" + ip+ ")is not a valid IP address");
288 if (!RegExpTestUtil.portRegExpTest(port)) {
289 throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:Port(" + port + ")is not a valid Port address");
294 MicroServiceFullInfo microServiceInfo =
295 MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
297 if (microServiceInfo == null) {
298 throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:serviceName-"+ serviceName + ",version-" + version + " not fond ");
301 Set<Node> nodes = microServiceInfo.getNodes();
303 boolean ifFindBNode = false;
305 for (Node node : nodes) {
306 if (node.getIp().equals(ip) && node.getPort().equals(port)) {
310 if (nodes.isEmpty()) {
311 // delete MicroService
312 deleteServiceAndnoticeRoute(microServiceInfo);
315 MicroServiceFullService.getInstance().saveMicroServiceInfo2Redis(microServiceInfo);
316 RouteNotify.getInstance().noticeRouteListener4Update(serviceName, version,
325 throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"+ serviceName + ",version-" + version +",node-" + ip + ":" + port + " not fond ");
329 } catch (ExtendedNotFoundException e) {
331 } catch (Exception e) {
332 throw new ExtendedInternalServerErrorException("delete MicroServiceInfo :serviceName-"+ serviceName + ",version-" + version+",node-" + ip + ":" + port +"throw exception"+e.getMessage());
339 public void deleteServiceAndnoticeRoute(MicroServiceFullInfo service) throws Exception {
342 // Delete the redis record
343 MicroServiceFullService.getInstance().deleteMicroService(service.getServiceName(),
344 service.getVersion());
345 LOGGER.info("delete MicroServiceInfo And notice to Route success:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion());
347 // Notify the listeners
348 RouteNotify.getInstance().noticeRouteListener4Delete(service);
350 } catch (Exception e) {
351 LOGGER.error("delete MicroService And synchro to Route:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion()+" throw exception", e);
356 public void saveServiceAndnoticeRoute(MicroServiceFullInfo service) throws Exception {
359 // save the redis record
360 MicroServiceFullService.getInstance().saveMicroServiceInfo2Redis(service);
362 LOGGER.info("save MicroServiceInfo And notice to Route success:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion());
364 // Notify the listeners
365 RouteNotify.getInstance().noticeRouteListener4Add(service);
368 } catch (Exception e) {
369 LOGGER.error("save MicroServiceInfo And synchro to Route fail :[serviceName]" + service.getServiceName()+ "[version]" + service.getVersion() + " throw exception", e);
374 public Set<String> getAllVersion(String serviceName) {
375 Set<String> serviceVersionSet = new HashSet<String>();
377 String pattern = MicroServiceUtil.getServiceKey(serviceName, "*");
378 Set<String> serviceKeySet = RedisAccessWrapper.filterKeys(pattern);
381 Pattern serviceKeyRegexPattern = MicroServiceUtil.getServiceKeyRegexPattern();
382 for (String serviceKey : serviceKeySet) {
383 Matcher matcher = serviceKeyRegexPattern.matcher(serviceKey);
384 if (matcher.matches()) {
385 serviceVersionSet.add(matcher.group("version"));
388 } catch (Exception e) {
389 LOGGER.error("getAllVersion [serviceName]:" + serviceName + " throw exception", e);
392 return serviceVersionSet;