From 1af04408663d765fed7ec7f3c276dac33ad1d0cb Mon Sep 17 00:00:00 2001 From: Yiming Liu Date: Fri, 25 Mar 2016 14:58:28 +0800 Subject: [PATCH] Integrate service discovery in portal --- .../apollo/portal/entity/AppConfigVO.java | 2 +- .../com/ctrip/apollo/portal/enums/Env.java | 33 --- .../apollo/portal/service/ConfigService.java | 276 +++++++++++++++++- .../apollo/portal/service/ServiceLocator.java | 54 ++++ .../service/impl/ConfigServiceImpl.java | 270 ----------------- .../portal/service/ConfigServiceTest.java | 136 ++++----- pom.xml | 2 +- 7 files changed, 393 insertions(+), 380 deletions(-) delete mode 100644 apollo-portal/src/main/java/com/ctrip/apollo/portal/enums/Env.java create mode 100644 apollo-portal/src/main/java/com/ctrip/apollo/portal/service/ServiceLocator.java delete mode 100644 apollo-portal/src/main/java/com/ctrip/apollo/portal/service/impl/ConfigServiceImpl.java diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/entity/AppConfigVO.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/entity/AppConfigVO.java index 1da475b3a..132f8b39c 100644 --- a/apollo-portal/src/main/java/com/ctrip/apollo/portal/entity/AppConfigVO.java +++ b/apollo-portal/src/main/java/com/ctrip/apollo/portal/entity/AppConfigVO.java @@ -1,8 +1,8 @@ package com.ctrip.apollo.portal.entity; +import com.ctrip.apollo.Apollo.Env; import com.ctrip.apollo.core.dto.ConfigItemDTO; -import com.ctrip.apollo.portal.enums.Env; import java.util.LinkedList; import java.util.List; diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/enums/Env.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/enums/Env.java deleted file mode 100644 index 7d61f41a4..000000000 --- a/apollo-portal/src/main/java/com/ctrip/apollo/portal/enums/Env.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ctrip.apollo.portal.enums; - -public enum Env { - - DEV("dev"), FWS("fws"), FAT("fat"), UAT("uat"), LPT("lpt"), PROD("prod"), TOOLS("tools"), UN_KNOW( - ""); - - private String value; - - Env(String value) { - this.value = value; - } - - public static Env valueFrom(String env) { - if (env == null || "".equals(env)) { - return UN_KNOW; - } else if ("dev".equals(env)) { - return DEV; - } else if ("fws".equals(env)) { - return FWS; - } else if ("fat".equals(env)) { - return FAT; - } else if ("uat".equals(env)) { - return UAT; - } else if ("prod".equals(env)) { - return PROD; - } else if ("tools".equals(env)) { - return TOOLS; - } else { - return UN_KNOW; - } - } -} diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/ConfigService.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/ConfigService.java index 6e926f53b..8ab60207d 100644 --- a/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/ConfigService.java +++ b/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/ConfigService.java @@ -1,20 +1,278 @@ package com.ctrip.apollo.portal.service; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.ctrip.apollo.Apollo.Env; +import com.ctrip.apollo.core.Constants; +import com.ctrip.apollo.core.dto.ClusterDTO; +import com.ctrip.apollo.core.dto.ConfigItemDTO; +import com.ctrip.apollo.core.dto.ReleaseSnapshotDTO; +import com.ctrip.apollo.core.dto.VersionDTO; +import com.ctrip.apollo.core.serivce.ApolloService; +import com.ctrip.apollo.portal.RestUtils; +import com.ctrip.apollo.portal.constants.PortalConstants; import com.ctrip.apollo.portal.entity.AppConfigVO; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Maps; -public interface ConfigService { +@Service +public class ConfigService { - /** - * load config info by appId and versionId - */ - AppConfigVO loadReleaseConfig(long appId, long versionId); + @Autowired + private ServiceLocator serviceLocator; + + private ObjectMapper objectMapper = new ObjectMapper(); + + public String getAdminServiceUrl() { + List services = serviceLocator.getAdminServices(Env.DEV); + if (services.size() == 0) { + throw new RuntimeException("No available admin service"); + } + return services.get(0).getHomepageUrl(); + } + + public AppConfigVO loadReleaseConfig(long appId, long versionId) { + + if (appId <= 0 || versionId <= 0) { + return null; + } + + long releaseId = getReleaseIdFromVersionId(versionId); + + String serviceHost = getAdminServiceUrl(); + ReleaseSnapshotDTO[] releaseSnapShots = RestUtils + .exchangeInGET(serviceHost + "/configs/release/" + releaseId, ReleaseSnapshotDTO[].class); + if (releaseSnapShots == null || releaseSnapShots.length == 0) { + return null; + } + + AppConfigVO appConfigVO = AppConfigVO.newInstance(appId, versionId); + + for (ReleaseSnapshotDTO snapShot : releaseSnapShots) { + // default cluster + if (Constants.DEFAULT_CLUSTER_NAME.equals(snapShot.getClusterName())) { + + collectDefaultClusterConfigs(appId, snapShot, appConfigVO); + + } else {// cluster special configs + collectSpecialClusterConfigs(appId, snapShot, appConfigVO); + } + } + return appConfigVO; + } + + private long getReleaseIdFromVersionId(long versionId) { + String serviceHost = getAdminServiceUrl(); + VersionDTO version = + RestUtils.exchangeInGET(serviceHost + "/version/" + versionId, VersionDTO.class); + if (version == null) { + return -1; + } + return version.getReleaseId(); + } + + private void collectDefaultClusterConfigs(long appId, ReleaseSnapshotDTO snapShot, + AppConfigVO appConfigVO) { + + Map> groupedConfigs = groupConfigsByApp(snapShot.getConfigurations()); + + List overrideAppConfigs = appConfigVO.getOverrideAppConfigs(); + + for (Map.Entry> entry : groupedConfigs.entrySet()) { + long configAppId = entry.getKey(); + List kvs = entry.getValue(); + + if (configAppId == appId) { + appConfigVO.setDefaultClusterConfigs(kvs); + } else { + + AppConfigVO.OverrideAppConfig overrideAppConfig = new AppConfigVO.OverrideAppConfig(); + overrideAppConfig.setAppId(configAppId); + overrideAppConfig.setConfigs(kvs); + overrideAppConfigs.add(overrideAppConfig); + } + } + + } /** - * - * @param appId - * @return + * appId -> List */ - AppConfigVO loadLatestConfig(long appId); + private Map> groupConfigsByApp(String configJson) { + if (configJson == null || "".equals(configJson)) { + return Maps.newHashMap(); + } + + Map> appIdMapKVs = new HashMap<>(); + + String key; + Object value; + Map kvMaps = null; + try { + kvMaps = objectMapper.readValue(configJson, Map.class); + } catch (IOException e) { + // todo log + } + for (Map.Entry entry : kvMaps.entrySet()) { + key = entry.getKey(); + value = entry.getValue(); + + Long appId = getAppIdFromKey(key); + List kvs = appIdMapKVs.get(appId); + if (kvs == null) { + kvs = new LinkedList<>(); + appIdMapKVs.put(appId, kvs); + } + kvs.add(new ConfigItemDTO(key, value.toString())); + } + + return appIdMapKVs; + + } + + private Long getAppIdFromKey(String key) { + return Long.valueOf(key.substring(0, key.indexOf("."))); + } + + private void collectSpecialClusterConfigs(long appId, ReleaseSnapshotDTO snapShot, + AppConfigVO appConfigVO) { + List overrideClusterConfigs = + appConfigVO.getOverrideClusterConfigs(); + AppConfigVO.OverrideClusterConfig overrideClusterConfig = + new AppConfigVO.OverrideClusterConfig(); + overrideClusterConfig.setClusterName(snapShot.getClusterName()); + // todo step1: cluster special config can't override other app config + overrideClusterConfig.setConfigs(groupConfigsByApp(snapShot.getConfigurations()).get(appId)); + overrideClusterConfigs.add(overrideClusterConfig); + } + + public AppConfigVO loadLatestConfig(long appId) { + if (appId <= 0) { + return null; + } + + String serviceHost = getAdminServiceUrl(); + ClusterDTO[] clusters = + RestUtils.exchangeInGET(serviceHost + "/cluster/app/" + appId, ClusterDTO[].class); + if (clusters == null || clusters.length == 0) { + return null; + } + + StringBuilder sb = new StringBuilder(); + for (ClusterDTO cluster : clusters) { + sb.append(cluster.getId()).append(","); + } + + ConfigItemDTO[] configItems = RestUtils.exchangeInGET( + serviceHost + "/configs/latest?clusterIds=" + sb.substring(0, sb.length() - 1), + ConfigItemDTO[].class); + + return buildAPPConfigVO(appId, Arrays.asList(configItems)); + } + + private AppConfigVO buildAPPConfigVO(long appId, List configItems) { + if (configItems == null || configItems.size() == 0) { + return null; + } + + Map> groupedClusterConfigs = groupConfigByCluster(configItems); + + AppConfigVO appConfigVO = AppConfigVO.newInstance(appId, PortalConstants.LASTEST_VERSION_ID); + + groupConfigByAppAndEnrichDTO(groupedClusterConfigs, appConfigVO); + + return appConfigVO; + + } + + private Map> groupConfigByCluster(List configItems) { + Map> groupedClusterConfigs = new HashMap<>(); + + String clusterName; + for (ConfigItemDTO configItem : configItems) { + clusterName = configItem.getClusterName(); + List clusterConfigs = groupedClusterConfigs.get(clusterName); + if (clusterConfigs == null) { + clusterConfigs = new LinkedList<>(); + groupedClusterConfigs.put(clusterName, clusterConfigs); + } + clusterConfigs.add(configItem); + } + return groupedClusterConfigs; + } + + private void groupConfigByAppAndEnrichDTO(Map> groupedClusterConfigs, + AppConfigVO appConfigVO) { + long appId = appConfigVO.getAppId(); + + List defaultClusterConfigs = appConfigVO.getDefaultClusterConfigs(); + + List overrideAppConfigs = appConfigVO.getOverrideAppConfigs(); + + List overrideClusterConfigs = + appConfigVO.getOverrideClusterConfigs(); + + String clusterName; + List clusterConfigs; + for (Map.Entry> entry : groupedClusterConfigs.entrySet()) { + clusterName = entry.getKey(); + clusterConfigs = entry.getValue(); + + if (Constants.DEFAULT_CLUSTER_NAME.equals(clusterName)) { + // default cluster configs + collectDefaultClusterConfigs(appId, clusterConfigs, defaultClusterConfigs, + overrideAppConfigs); + } else { + // override cluster configs + collectSpecialClusterConfigs(clusterName, clusterConfigs, overrideClusterConfigs); + } + } + } + + private void collectDefaultClusterConfigs(long appId, List clusterConfigs, + List defaultClusterConfigs, + List overrideAppConfigs) { + + Map appIdMapOverrideAppConfig = null; + + for (ConfigItemDTO config : clusterConfigs) { + long targetAppId = config.getAppId(); + if (appId == targetAppId) {// app self's configs + defaultClusterConfigs.add(config); + } else {// override other app configs + if (appIdMapOverrideAppConfig == null) { + appIdMapOverrideAppConfig = new HashMap<>(); + } + + AppConfigVO.OverrideAppConfig overrideAppConfig = + appIdMapOverrideAppConfig.get(targetAppId); + + if (overrideAppConfig == null) { + overrideAppConfig = new AppConfigVO.OverrideAppConfig(); + appIdMapOverrideAppConfig.put(targetAppId, overrideAppConfig); + overrideAppConfigs.add(overrideAppConfig); + } + overrideAppConfig.setAppId(targetAppId); + overrideAppConfig.addConfig(config); + } + } + } + private void collectSpecialClusterConfigs(String clusterName, List clusterConfigs, + List overrideClusterConfigs) { + AppConfigVO.OverrideClusterConfig overrideClusterConfig = + new AppConfigVO.OverrideClusterConfig(); + overrideClusterConfig.setClusterName(clusterName); + overrideClusterConfig.setConfigs(clusterConfigs); + overrideClusterConfigs.add(overrideClusterConfig); + } } diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/ServiceLocator.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/ServiceLocator.java new file mode 100644 index 000000000..4c565b187 --- /dev/null +++ b/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/ServiceLocator.java @@ -0,0 +1,54 @@ +package com.ctrip.apollo.portal.service; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.ctrip.apollo.Apollo.Env; +import com.ctrip.apollo.core.MetaDomainConsts; +import com.ctrip.apollo.core.serivce.ApolloService; + +/** + * + * @author liuym + * + */ +@Service +public class ServiceLocator { + + private static final Logger logger = LoggerFactory.getLogger(ServiceLocator.class); + + private RestTemplate restTemplate = new RestTemplate(); + + private List serviceCaches = new ArrayList<>(); + + public List getAdminServices(Env env) { + return getServices(env, "admin"); + } + + public List getConfigServices(Env env) { + return getServices(env, "config"); + } + + private List getServices(Env env, String serviceUrl) { + String domainName = MetaDomainConsts.getDomain(env); + String url = domainName + "/services/" + serviceUrl; + try { + ApolloService[] services = restTemplate.getForObject(new URI(url), ApolloService[].class); + if (services != null && services.length > 0) { + serviceCaches.clear(); + for (ApolloService service : services) { + serviceCaches.add(service); + } + } + } catch (Exception ex) { + logger.warn(ex.getMessage()); + } + return serviceCaches; + } +} diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/impl/ConfigServiceImpl.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/impl/ConfigServiceImpl.java deleted file mode 100644 index 4f9cd8f0f..000000000 --- a/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/impl/ConfigServiceImpl.java +++ /dev/null @@ -1,270 +0,0 @@ -package com.ctrip.apollo.portal.service.impl; - -import com.google.common.collect.Maps; - -import com.ctrip.apollo.core.Constants; -import com.ctrip.apollo.core.dto.ClusterDTO; -import com.ctrip.apollo.core.dto.ConfigItemDTO; -import com.ctrip.apollo.core.dto.ReleaseSnapshotDTO; -import com.ctrip.apollo.core.dto.VersionDTO; -import com.ctrip.apollo.portal.RestUtils; -import com.ctrip.apollo.portal.constants.PortalConstants; -import com.ctrip.apollo.portal.entity.AppConfigVO; -import com.ctrip.apollo.portal.service.ConfigService; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -@Service -public class ConfigServiceImpl implements ConfigService { - public static final String ADMIN_SERVICE_HOST = "http://localhost:8090"; - private ObjectMapper objectMapper = new ObjectMapper(); - - @Override - public AppConfigVO loadReleaseConfig(long appId, long versionId) { - - if (appId <= 0 || versionId <= 0) { - return null; - } - - long releaseId = getReleaseIdFromVersionId(versionId); - - ReleaseSnapshotDTO[] releaseSnapShots = RestUtils.exchangeInGET( - ADMIN_SERVICE_HOST + "/configs/release/" + releaseId, ReleaseSnapshotDTO[].class); - if (releaseSnapShots == null || releaseSnapShots.length == 0) { - return null; - } - - AppConfigVO appConfigVO = AppConfigVO.newInstance(appId, versionId); - - for (ReleaseSnapshotDTO snapShot : releaseSnapShots) { - //default cluster - if (Constants.DEFAULT_CLUSTER_NAME.equals(snapShot.getClusterName())) { - - collectDefaultClusterConfigs(appId, snapShot, appConfigVO); - - } else {//cluster special configs - collectSpecialClusterConfigs(appId, snapShot, appConfigVO); - } - } - return appConfigVO; - } - - private long getReleaseIdFromVersionId(long versionId) { - VersionDTO version = - RestUtils.exchangeInGET(ADMIN_SERVICE_HOST + "/version/" + versionId, VersionDTO.class); - if (version == null) { - return -1; - } - return version.getReleaseId(); - } - - private void collectDefaultClusterConfigs(long appId, ReleaseSnapshotDTO snapShot, - AppConfigVO appConfigVO) { - - Map> groupedConfigs = - groupConfigsByApp(snapShot.getConfigurations()); - - List overrideAppConfigs = - appConfigVO.getOverrideAppConfigs(); - - for (Map.Entry> entry : groupedConfigs.entrySet()) { - long configAppId = entry.getKey(); - List kvs = entry.getValue(); - - if (configAppId == appId) { - appConfigVO.setDefaultClusterConfigs(kvs); - } else { - - AppConfigVO.OverrideAppConfig overrideAppConfig = - new AppConfigVO.OverrideAppConfig(); - overrideAppConfig.setAppId(configAppId); - overrideAppConfig.setConfigs(kvs); - overrideAppConfigs.add(overrideAppConfig); - } - } - - } - - /** - * appId -> List - */ - private Map> groupConfigsByApp(String configJson) { - if (configJson == null || "".equals(configJson)) { - return Maps.newHashMap(); - } - - Map> appIdMapKVs = new HashMap<>(); - - String key; - Object value; - Map kvMaps = null; - try { - kvMaps = objectMapper.readValue(configJson, Map.class); - } catch (IOException e) { - //todo log - } - for (Map.Entry entry : kvMaps.entrySet()) { - key = entry.getKey(); - value = entry.getValue(); - - Long appId = getAppIdFromKey(key); - List kvs = appIdMapKVs.get(appId); - if (kvs == null) { - kvs = new LinkedList<>(); - appIdMapKVs.put(appId, kvs); - } - kvs.add(new ConfigItemDTO(key, value.toString())); - } - - return appIdMapKVs; - - } - - private Long getAppIdFromKey(String key) { - return Long.valueOf(key.substring(0, key.indexOf("."))); - } - - private void collectSpecialClusterConfigs(long appId, ReleaseSnapshotDTO snapShot, - AppConfigVO appConfigVO) { - List overrideClusterConfigs = - appConfigVO.getOverrideClusterConfigs(); - AppConfigVO.OverrideClusterConfig overrideClusterConfig = - new AppConfigVO.OverrideClusterConfig(); - overrideClusterConfig.setClusterName(snapShot.getClusterName()); - //todo step1: cluster special config can't override other app config - overrideClusterConfig.setConfigs(groupConfigsByApp(snapShot.getConfigurations()).get(appId)); - overrideClusterConfigs.add(overrideClusterConfig); - } - - @Override - public AppConfigVO loadLatestConfig(long appId) { - if (appId <= 0) { - return null; - } - - ClusterDTO[] clusters = RestUtils.exchangeInGET( - ADMIN_SERVICE_HOST + "/cluster/app/" + appId, ClusterDTO[].class); - if (clusters == null || clusters.length == 0) { - return null; - } - - StringBuilder sb = new StringBuilder(); - for (ClusterDTO cluster : clusters) { - sb.append(cluster.getId()).append(","); - } - - ConfigItemDTO[] configItems = RestUtils.exchangeInGET( - ADMIN_SERVICE_HOST + "/configs/latest?clusterIds=" + sb.substring(0, - sb.length() - 1), ConfigItemDTO[].class); - - return buildAPPConfigVO(appId, Arrays.asList(configItems)); - } - - private AppConfigVO buildAPPConfigVO(long appId, List configItems) { - if (configItems == null || configItems.size() == 0) { - return null; - } - - Map> groupedClusterConfigs = groupConfigByCluster(configItems); - - AppConfigVO appConfigVO = - AppConfigVO.newInstance(appId, PortalConstants.LASTEST_VERSION_ID); - - groupConfigByAppAndEnrichDTO(groupedClusterConfigs, appConfigVO); - - return appConfigVO; - - } - - private Map> groupConfigByCluster(List configItems) { - Map> groupedClusterConfigs = new HashMap<>(); - - String clusterName; - for (ConfigItemDTO configItem : configItems) { - clusterName = configItem.getClusterName(); - List clusterConfigs = groupedClusterConfigs.get(clusterName); - if (clusterConfigs == null) { - clusterConfigs = new LinkedList<>(); - groupedClusterConfigs.put(clusterName, clusterConfigs); - } - clusterConfigs.add(configItem); - } - return groupedClusterConfigs; - } - - private void groupConfigByAppAndEnrichDTO(Map> groupedClusterConfigs, - AppConfigVO appConfigVO) { - long appId = appConfigVO.getAppId(); - - List defaultClusterConfigs = appConfigVO.getDefaultClusterConfigs(); - - List overrideAppConfigs = - appConfigVO.getOverrideAppConfigs(); - - List overrideClusterConfigs = - appConfigVO.getOverrideClusterConfigs(); - - String clusterName; - List clusterConfigs; - for (Map.Entry> entry : groupedClusterConfigs.entrySet()) { - clusterName = entry.getKey(); - clusterConfigs = entry.getValue(); - - if (Constants.DEFAULT_CLUSTER_NAME.equals(clusterName)) { - //default cluster configs - collectDefaultClusterConfigs(appId, clusterConfigs, defaultClusterConfigs, - overrideAppConfigs); - } else { - //override cluster configs - collectSpecialClusterConfigs(clusterName, clusterConfigs, overrideClusterConfigs); - } - } - } - - private void collectDefaultClusterConfigs(long appId, List clusterConfigs, - List defaultClusterConfigs, - List overrideAppConfigs) { - - Map appIdMapOverrideAppConfig = null; - - for (ConfigItemDTO config : clusterConfigs) { - long targetAppId = config.getAppId(); - if (appId == targetAppId) {//app self's configs - defaultClusterConfigs.add(config); - } else {//override other app configs - if (appIdMapOverrideAppConfig == null) { - appIdMapOverrideAppConfig = new HashMap<>(); - } - - AppConfigVO.OverrideAppConfig overrideAppConfig = - appIdMapOverrideAppConfig.get(targetAppId); - - if (overrideAppConfig == null) { - overrideAppConfig = new AppConfigVO.OverrideAppConfig(); - appIdMapOverrideAppConfig.put(targetAppId, overrideAppConfig); - overrideAppConfigs.add(overrideAppConfig); - } - - overrideAppConfig.setAppId(targetAppId); - overrideAppConfig.addConfig(config); - } - } - } - - private void collectSpecialClusterConfigs(String clusterName, List clusterConfigs, - List overrideClusterConfigs) { - AppConfigVO.OverrideClusterConfig overrideClusterConfig = - new AppConfigVO.OverrideClusterConfig(); - overrideClusterConfig.setClusterName(clusterName); - overrideClusterConfig.setConfigs(clusterConfigs); - overrideClusterConfigs.add(overrideClusterConfig); - } -} diff --git a/apollo-portal/src/test/java/com/ctrip/apollo/portal/service/ConfigServiceTest.java b/apollo-portal/src/test/java/com/ctrip/apollo/portal/service/ConfigServiceTest.java index ff4f78085..f20c4fec4 100644 --- a/apollo-portal/src/test/java/com/ctrip/apollo/portal/service/ConfigServiceTest.java +++ b/apollo-portal/src/test/java/com/ctrip/apollo/portal/service/ConfigServiceTest.java @@ -1,19 +1,22 @@ package com.ctrip.apollo.portal.service; -import com.ctrip.apollo.core.dto.ClusterDTO; -import com.ctrip.apollo.core.dto.ConfigItemDTO; -import com.ctrip.apollo.core.dto.ReleaseSnapshotDTO; -import com.ctrip.apollo.core.dto.VersionDTO; -import com.ctrip.apollo.portal.RestUtils; -import com.ctrip.apollo.portal.constants.PortalConstants; -import com.ctrip.apollo.portal.entity.AppConfigVO; -import com.ctrip.apollo.portal.service.impl.ConfigServiceImpl; +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; @@ -21,10 +24,15 @@ import org.springframework.http.ResponseEntity; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestTemplate; -import static org.junit.Assert.assertEquals; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.when; +import com.ctrip.apollo.Apollo.Env; +import com.ctrip.apollo.core.dto.ClusterDTO; +import com.ctrip.apollo.core.dto.ConfigItemDTO; +import com.ctrip.apollo.core.dto.ReleaseSnapshotDTO; +import com.ctrip.apollo.core.dto.VersionDTO; +import com.ctrip.apollo.core.serivce.ApolloService; +import com.ctrip.apollo.portal.RestUtils; +import com.ctrip.apollo.portal.constants.PortalConstants; +import com.ctrip.apollo.portal.entity.AppConfigVO; @RunWith(MockitoJUnitRunner.class) public class ConfigServiceTest { @@ -40,12 +48,20 @@ public class ConfigServiceTest { @Mock private ResponseEntity configItemResponse; - private ConfigServiceImpl configService; + @InjectMocks + private ConfigService configService; + + @Spy + private ServiceLocator serviceLocator; @Before public void setUp() { ReflectionTestUtils.setField(RestUtils.class, "restTemplate", restTemplate); - configService = new ConfigServiceImpl(); + ApolloService defaultAdminService = new ApolloService(); + defaultAdminService.setHomepageUrl("http://localhost:8090"); + List services = new ArrayList<>(); + services.add(defaultAdminService); + Mockito.doReturn(services).when(serviceLocator).getAdminServices(Env.DEV); } @Test @@ -57,11 +73,11 @@ public class ConfigServiceTest { VersionDTO someVersion = assembleVersion(appId, "1.0", releaseId); ReleaseSnapshotDTO[] someReleaseSnapShots = assembleReleaseSnapShots(); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/configs/release/" - + releaseId, ReleaseSnapshotDTO[].class, someReleaseSnapShots, releaseSnapShotResponse); + restInvoke(configService.getAdminServiceUrl() + "/configs/release/" + releaseId, + ReleaseSnapshotDTO[].class, someReleaseSnapShots, releaseSnapShotResponse); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/version/" - + versionId, VersionDTO.class, someVersion, versionResponse); + restInvoke(configService.getAdminServiceUrl() + "/version/" + versionId, VersionDTO.class, + someVersion, versionResponse); AppConfigVO appConfigVO = configService.loadReleaseConfig(appId, versionId); @@ -80,15 +96,14 @@ public class ConfigServiceTest { VersionDTO someVersion = assembleVersion(appId, "1.0", releaseId); ReleaseSnapshotDTO[] releaseSnapShots = new ReleaseSnapshotDTO[1]; - releaseSnapShots[0] = - assembleReleaseSnapShot(11111, "default-cluster-name", - "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\"}"); + releaseSnapShots[0] = assembleReleaseSnapShot(11111, "default-cluster-name", + "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\"}"); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/configs/release/" - + releaseId, ReleaseSnapshotDTO[].class, releaseSnapShots, releaseSnapShotResponse); + restInvoke(configService.getAdminServiceUrl() + "/configs/release/" + releaseId, + ReleaseSnapshotDTO[].class, releaseSnapShots, releaseSnapShotResponse); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/version/" - + versionId, VersionDTO.class, someVersion, versionResponse); + restInvoke(configService.getAdminServiceUrl() + "/version/" + versionId, VersionDTO.class, + someVersion, versionResponse); AppConfigVO appConfigVO = configService.loadReleaseConfig(appId, versionId); @@ -106,15 +121,14 @@ public class ConfigServiceTest { long releaseId = 11111; VersionDTO someVersion = assembleVersion(appId, "1.0", releaseId); ReleaseSnapshotDTO[] releaseSnapShots = new ReleaseSnapshotDTO[1]; - releaseSnapShots[0] = - assembleReleaseSnapShot(11111, "default-cluster-name", - "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\", \"5555.bar\":\"demo2\", \"22.bar\":\"demo2\"}"); + releaseSnapShots[0] = assembleReleaseSnapShot(11111, "default-cluster-name", + "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\", \"5555.bar\":\"demo2\", \"22.bar\":\"demo2\"}"); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/configs/release/" - + releaseId, ReleaseSnapshotDTO[].class, releaseSnapShots, releaseSnapShotResponse); + restInvoke(configService.getAdminServiceUrl() + "/configs/release/" + releaseId, + ReleaseSnapshotDTO[].class, releaseSnapShots, releaseSnapShotResponse); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/version/" - + versionId, VersionDTO.class, someVersion, versionResponse); + restInvoke(configService.getAdminServiceUrl() + "/version/" + versionId, VersionDTO.class, + someVersion, versionResponse); AppConfigVO appConfigVO = configService.loadReleaseConfig(appId, versionId); @@ -132,18 +146,16 @@ public class ConfigServiceTest { long releaseId = 11111; VersionDTO someVersion = assembleVersion(appId, "1.0", releaseId); ReleaseSnapshotDTO[] releaseSnapShots = new ReleaseSnapshotDTO[2]; - releaseSnapShots[0] = - assembleReleaseSnapShot(11111, "default-cluster-name", - "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\"}"); - releaseSnapShots[1] = - assembleReleaseSnapShot(11112, "cluster1", - "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\"}"); + releaseSnapShots[0] = assembleReleaseSnapShot(11111, "default-cluster-name", + "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\"}"); + releaseSnapShots[1] = assembleReleaseSnapShot(11112, "cluster1", + "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\"}"); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/configs/release/" - + releaseId, ReleaseSnapshotDTO[].class, releaseSnapShots, releaseSnapShotResponse); + restInvoke(configService.getAdminServiceUrl() + "/configs/release/" + releaseId, + ReleaseSnapshotDTO[].class, releaseSnapShots, releaseSnapShotResponse); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/version/" - + versionId, VersionDTO.class, someVersion, versionResponse); + restInvoke(configService.getAdminServiceUrl() + "/version/" + versionId, VersionDTO.class, + someVersion, versionResponse); AppConfigVO appConfigVO = configService.loadReleaseConfig(appId, versionId); @@ -160,12 +172,11 @@ public class ConfigServiceTest { ClusterDTO[] someClusters = assembleClusters(); ConfigItemDTO[] someConfigItem = assembleConfigItems(); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST + "/cluster/app/" - + appId, ClusterDTO[].class, someClusters, clusterResponse); + restInvoke(configService.getAdminServiceUrl() + "/cluster/app/" + appId, ClusterDTO[].class, + someClusters, clusterResponse); - restInvoke(ConfigServiceImpl.ADMIN_SERVICE_HOST - + "/configs/latest?clusterIds=100,101", ConfigItemDTO[].class, someConfigItem, - configItemResponse); + restInvoke(configService.getAdminServiceUrl() + "/configs/latest?clusterIds=100,101", + ConfigItemDTO[].class, someConfigItem, configItemResponse); AppConfigVO appConfigVO = configService.loadLatestConfig(appId); @@ -177,10 +188,10 @@ public class ConfigServiceTest { } private void restInvoke(String url, Class responseType, T result, - ResponseEntity someResponse) { + ResponseEntity someResponse) { when( restTemplate.exchange(eq(url), eq(HttpMethod.GET), any(HttpEntity.class), eq(responseType))) - .thenReturn(someResponse); + .thenReturn(someResponse); when(someResponse.getStatusCode()).thenReturn(HttpStatus.OK); when(someResponse.getBody()).thenReturn(result); } @@ -195,18 +206,15 @@ public class ConfigServiceTest { private ReleaseSnapshotDTO[] assembleReleaseSnapShots() { ReleaseSnapshotDTO[] releaseSnapShots = new ReleaseSnapshotDTO[3]; - releaseSnapShots[0] = - assembleReleaseSnapShot(11111, "default-cluster-name", - "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\",\"3333.foo\":\"1008\",\"4444.bar\":\"99901\"}"); - releaseSnapShots[1] = - assembleReleaseSnapShot(11111, "cluster1", "{\"6666.foo\":\"demo1\"}"); - releaseSnapShots[2] = - assembleReleaseSnapShot(11111, "cluster2", "{\"6666.bar\":\"bar2222\"}"); + releaseSnapShots[0] = assembleReleaseSnapShot(11111, "default-cluster-name", + "{\"6666.foo\":\"demo1\", \"6666.bar\":\"demo2\",\"3333.foo\":\"1008\",\"4444.bar\":\"99901\"}"); + releaseSnapShots[1] = assembleReleaseSnapShot(11111, "cluster1", "{\"6666.foo\":\"demo1\"}"); + releaseSnapShots[2] = assembleReleaseSnapShot(11111, "cluster2", "{\"6666.bar\":\"bar2222\"}"); return releaseSnapShots; } private ReleaseSnapshotDTO assembleReleaseSnapShot(long releaseId, String clusterName, - String configurations) { + String configurations) { ReleaseSnapshotDTO releaseSnapShot = new ReleaseSnapshotDTO(); releaseSnapShot.setReleaseId(releaseId); releaseSnapShot.setClusterName(clusterName); @@ -231,20 +239,16 @@ public class ConfigServiceTest { private ConfigItemDTO[] assembleConfigItems() { ConfigItemDTO[] configItems = new ConfigItemDTO[5]; - configItems[0] = - assembleConfigItem(100, "default-cluster-name", 6666, "6666.k1", "6666.v1"); - configItems[1] = - assembleConfigItem(100, "default-cluster-name", 6666, "6666.k2", "6666.v2"); - configItems[2] = - assembleConfigItem(100, "default-cluster-name", 6666, "6666.k3", "6666.v3"); - configItems[3] = - assembleConfigItem(100, "default-cluster-name", 5555, "5555.k1", "5555.v1"); + configItems[0] = assembleConfigItem(100, "default-cluster-name", 6666, "6666.k1", "6666.v1"); + configItems[1] = assembleConfigItem(100, "default-cluster-name", 6666, "6666.k2", "6666.v2"); + configItems[2] = assembleConfigItem(100, "default-cluster-name", 6666, "6666.k3", "6666.v3"); + configItems[3] = assembleConfigItem(100, "default-cluster-name", 5555, "5555.k1", "5555.v1"); configItems[4] = assembleConfigItem(101, "cluster1", 6666, "6666.k1", "6666.v1"); return configItems; } private ConfigItemDTO assembleConfigItem(long clusterId, String clusterName, int appId, - String key, String value) { + String key, String value) { ConfigItemDTO configItem = new ConfigItemDTO(); configItem.setClusterName(clusterName); configItem.setClusterId(clusterId); diff --git a/pom.xml b/pom.xml index f78ef5ebc..b6f77e1b7 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,7 @@ org.apache.maven.plugins maven-war-plugin - 2.3 + 2.6 false -- GitLab