diff --git a/README.md b/README.md index aba8cb5c95..a259003ffe 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,6 @@ Redis 也可能会挂,Redis 本身提供哨兵 (Sentinel) 机制保证集群 - 【有任何疑问,请阅读】[XPipe Wiki](https://github.com/ctripcorp/x-pipe/wiki) - 【目前用户的问题整理】[XPipe Q&A](https://github.com/ctripcorp/x-pipe/wiki/XPipe-Q&A) - 【文章】[携程Redis多数据中心解决方案-XPipe](https://mp.weixin.qq.com/s/Q3bt0-5nv8uNMdHuls-Exw?) -- 【文章】[携程Redis海外机房数据同步实践](https://mp.weixin.qq.com/s/LeSSdT6bOEFzZyN26PRVzg) - 【PPT】[携程内XPipe使用介绍](https://docs.c-ctrip.com/files/6/portal/0AS2w12000947w1mw6A59.pptx) diff --git a/redis/redis-checker/src/main/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HealthStatus.java b/redis/redis-checker/src/main/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HealthStatus.java index c79ddac951..5a365b85b6 100644 --- a/redis/redis-checker/src/main/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HealthStatus.java +++ b/redis/redis-checker/src/main/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HealthStatus.java @@ -62,15 +62,15 @@ public HealthStatus(RedisHealthCheckInstance instance, ScheduledExecutorService this.instanceLongDelayMilli = ()->instance.getHealthCheckConfig().instanceLongDelayMilli(); this.delayDownAfterMilli = () -> { DelayConfig delayConfig = instance.getHealthCheckConfig().getDelayConfig(instance.getCheckInfo().getClusterId(), currentDcId, instance.getCheckInfo().getDcId()); - return delayConfig.getClusterLevelDelayDownAfterMilli() > 0 ? delayConfig.getClusterLevelDelayDownAfterMilli() : delayConfig.getDcLevelDelayDownAfterMilli();}; + return delayConfig.getClusterLevelDelayDownAfterMilli();}; this.healthyDelayMilli = () -> { DelayConfig delayConfig = instance.getHealthCheckConfig().getDelayConfig(instance.getCheckInfo().getClusterId(), currentDcId, instance.getCheckInfo().getDcId()); - return delayConfig.getClusterLevelHealthyDelayMilli() > 0 ? delayConfig.getClusterLevelHealthyDelayMilli() : delayConfig.getDcLevelHealthyDelayMilli();}; + return delayConfig.getClusterLevelHealthyDelayMilli();}; checkParam(); } private void checkParam() { - if(this.delayDownAfterMilli.getAsInt() < this.pingDownAfterMilli.getAsInt()) { + if(this.delayDownAfterMilli.getAsInt() > 0 && this.delayDownAfterMilli.getAsInt() < this.pingDownAfterMilli.getAsInt()) { logger.error("Ping-Down-After-Milli must smaller than Delay-Down-After-Milli"); } } @@ -151,7 +151,7 @@ void delay(long delayMilli, long...srcShardDbId){ lastHealthDelayTime.compareAndSet(UNSET_TIME, System.currentTimeMillis()); delayLogger.debug("{}, {}", instance.getCheckInfo().getHostPort(), delayMilli); - if(delayMilli >= 0 && delayMilli <= healthyDelayMilli.getAsInt()){ + if (delayMilli >= 0 && (delayMilli <= healthyDelayMilli.getAsInt() || healthyDelayMilli.getAsInt() < 0)) { lastHealthDelayTime.set(System.currentTimeMillis()); setDelayUp(); } @@ -181,7 +181,9 @@ protected void healthStatusUpdate() { final int delayDownAfter = delayDownAfterMilli.getAsInt(); final int instanceLongDelay = instanceLongDelayMilli.getAsInt(); - if ( delayDownTime > delayDownAfter) { + if (delayDownAfter < 0) { + // skip for negative distance + } else if ( delayDownTime > delayDownAfter) { setDelayDown(); }else if(delayDownTime >= instanceLongDelay){ setDelayHalfDown(); diff --git a/redis/redis-checker/src/main/java/com/ctrip/xpipe/redis/checker/model/KeeperContainerUsedInfoModel.java b/redis/redis-checker/src/main/java/com/ctrip/xpipe/redis/checker/model/KeeperContainerUsedInfoModel.java index 76f3b6b438..50617f2916 100644 --- a/redis/redis-checker/src/main/java/com/ctrip/xpipe/redis/checker/model/KeeperContainerUsedInfoModel.java +++ b/redis/redis-checker/src/main/java/com/ctrip/xpipe/redis/checker/model/KeeperContainerUsedInfoModel.java @@ -12,6 +12,8 @@ public class KeeperContainerUsedInfoModel { private String org; + private String tag; + private String az; private String updateTime; @@ -62,6 +64,7 @@ public KeeperContainerUsedInfoModel(KeeperContainerUsedInfoModel model, Map.Entr this.keeperIp = model.getKeeperIp(); this.dcName = model.getDcName(); this.org = model.getOrg(); + this.tag = model.getTag(); this.az = model.getAz(); this.activeInputFlow = model.getActiveInputFlow() + dcClusterShard.getValue().getInputFlow(); this.totalInputFlow = model.getTotalInputFlow() + dcClusterShard.getValue().getInputFlow(); @@ -80,19 +83,6 @@ public KeeperContainerUsedInfoModel(KeeperContainerUsedInfoModel model, Map.Entr this.diskType = model.getDiskType(); } - public void addModel(KeeperContainerUsedInfoModel model) { - if (!Objects.equals(model.keeperIp, keeperIp) || !Objects.equals(model.dcName, dcName) || !Objects.equals(model.org, org) || !Objects.equals(model.az, az)) { - return; - } - activeInputFlow += model.activeInputFlow; - totalInputFlow += model.totalInputFlow; - activeRedisUsedMemory += model.activeRedisUsedMemory; - totalRedisUsedMemory += model.totalRedisUsedMemory; - activeKeeperCount += model.activeKeeperCount; - totalKeeperCount += model.totalKeeperCount; - detailInfo.putAll(model.detailInfo); - } - public static KeeperContainerUsedInfoModel cloneKeeperContainerUsedInfoModel(KeeperContainerUsedInfoModel model) { KeeperContainerUsedInfoModel newModel = new KeeperContainerUsedInfoModel(); newModel.setKeeperIp(model.getKeeperIp()); @@ -157,6 +147,15 @@ public KeeperContainerUsedInfoModel setOrg(String org) { return this; } + public String getTag() { + return tag; + } + + public KeeperContainerUsedInfoModel setTag(String tag) { + this.tag = tag; + return this; + } + public String getAz() { return az; } @@ -323,8 +322,9 @@ public String toString() { "keeperIp='" + keeperIp + '\'' + ", dcName='" + dcName + '\'' + ", org='" + org + '\'' + + ", tag='" + tag + '\'' + ", az='" + az + '\'' + - ", updateTime=" + updateTime + + ", updateTime='" + updateTime + '\'' + ", activeInputFlow=" + activeInputFlow + ", totalInputFlow=" + totalInputFlow + ", inputFlowStandard=" + inputFlowStandard + diff --git a/redis/redis-checker/src/test/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HealthStatusTest.java b/redis/redis-checker/src/test/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HealthStatusTest.java index c74ab8d335..316f5d976d 100644 --- a/redis/redis-checker/src/test/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HealthStatusTest.java +++ b/redis/redis-checker/src/test/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HealthStatusTest.java @@ -524,6 +524,47 @@ public void testDelayOkAndInstanceUpAfterLoading() { assertEquals(HEALTHY, healthStatus.getState()); } + @Test + public void testPingDownWithNegativeDistance() { + when(config.pingDownAfterMilli()).thenReturn(40); + when(config.getDelayConfig(any(),any(),any())).thenReturn( + new DelayConfig("test","test","test") + .setClusterLevelHealthyDelayMilli(-20).setClusterLevelDelayDownAfterMilli(-40)); + + healthStatus.pongInit(); + sleep(40 * 2 + 5); + healthStatus.healthStatusUpdate(); + Assert.assertSame(healthStatus.getState(), HEALTH_STATE.DOWN); + } + + @Test + public void testDelayDown() { + when(config.pingDownAfterMilli()).thenReturn(1000); + when(config.getDelayConfig(any(),any(),any())).thenReturn( + new DelayConfig("test","test","test") + .setClusterLevelHealthyDelayMilli(20).setClusterLevelDelayDownAfterMilli(40)); + + healthStatus.pong(); + healthStatus.delay(1); + sleep(40 * 2 + 5); + healthStatus.healthStatusUpdate(); + Assert.assertSame(HEALTH_STATE.SICK, healthStatus.getState()); + } + + @Test + public void testDelayDownWithNegativeDistance() { + when(config.pingDownAfterMilli()).thenReturn(1000); + when(config.getDelayConfig(any(),any(),any())).thenReturn( + new DelayConfig("test","test","test") + .setClusterLevelHealthyDelayMilli(-20).setClusterLevelDelayDownAfterMilli(-40)); + + healthStatus.pong(); + healthStatus.delay(1); + sleep(40 * 2 + 5); + healthStatus.healthStatusUpdate(); + Assert.assertSame(HEALTHY, healthStatus.getState()); + } + private void markup() { healthStatus.pong(); healthStatus.delay(config.getDelayConfig("test","test","test").getClusterLevelHealthyDelayMilli()/2); diff --git a/redis/redis-checker/src/test/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HeteroHealthStatusTest.java b/redis/redis-checker/src/test/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HeteroHealthStatusTest.java index 18e7a38e9a..73e1646aef 100644 --- a/redis/redis-checker/src/test/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HeteroHealthStatusTest.java +++ b/redis/redis-checker/src/test/java/com/ctrip/xpipe/redis/checker/healthcheck/actions/interaction/HeteroHealthStatusTest.java @@ -41,8 +41,8 @@ public void beforeHealthStatusTest() { config = mock(HealthCheckConfig.class); when(config.getDelayConfig(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn( new DelayConfig("test", "test", "test"). - setDcLevelHealthyDelayMilli(2000).setClusterLevelHealthyDelayMilli(-2000). - setDcLevelDelayDownAfterMilli(2000 * 8).setClusterLevelDelayDownAfterMilli(-2000 * 8)); + setDcLevelHealthyDelayMilli(2000).setClusterLevelHealthyDelayMilli(2000). + setDcLevelDelayDownAfterMilli(2000 * 8).setClusterLevelDelayDownAfterMilli(2000 * 8)); when(instance.getHealthCheckConfig()).thenReturn(config); healthStatus = new HeteroHealthStatus(instance, scheduled); @@ -65,7 +65,8 @@ public void testStateSwitchFromUnknowToUp() { @Test public void testInstanceLongDelay() throws InterruptedException, TimeoutException { when(config.getDelayConfig(Mockito.any(),Mockito.any(),Mockito.any())).thenReturn( - new DelayConfig("test","test","test").setDcLevelHealthyDelayMilli(200)); + new DelayConfig("test","test","test") + .setDcLevelHealthyDelayMilli(200).setClusterLevelHealthyDelayMilli(200)); when(config.instanceLongDelayMilli()).thenReturn(300); when(config.checkIntervalMilli()).thenReturn(100); diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/controller/api/data/meta/KeeperContainerCreateInfo.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/controller/api/data/meta/KeeperContainerCreateInfo.java index 28da1d4d8b..180892bc42 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/controller/api/data/meta/KeeperContainerCreateInfo.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/controller/api/data/meta/KeeperContainerCreateInfo.java @@ -22,6 +22,8 @@ public class KeeperContainerCreateInfo extends AbstractCreateInfo { @Nullable private String orgName; + private String tag; + private boolean active; private String azName; @@ -101,6 +103,7 @@ public String toString() { ", keepercontainerPort=" + keepercontainerPort + ", keepercontainerOrgId=" + keepercontainerOrgId + ", orgName='" + orgName + '\'' + + ", tag='" + tag + '\'' + ", active=" + active + ", azName='" + azName + '\'' + ", diskType='" + diskType + '\'' + @@ -116,6 +119,15 @@ public KeeperContainerCreateInfo setOrgName(String orgName) { return this; } + public String getTag() { + return tag; + } + + public KeeperContainerCreateInfo setTag(String tag) { + this.tag = tag; + return this; + } + public String getDiskType() { return diskType; } diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/controller/consoleportal/KeeperContainerInfoController.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/controller/consoleportal/KeeperContainerInfoController.java index 47c1528f4a..c6deb7f8a6 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/controller/consoleportal/KeeperContainerInfoController.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/controller/consoleportal/KeeperContainerInfoController.java @@ -74,14 +74,13 @@ public RetMessage updateKeeperContainer(@RequestBody KeeperContainerInfoModel ke } } - @RequestMapping(value = {"/keepercontainers/dc/{dcName}/az/{azName}/org/{orgName}", - "/keepercontainers/dc/{dcName}/az/{azName}/org", - "/keepercontainers/dc/{dcName}/az/org/{orgName}", - "/keepercontainers/dc/{dcName}/az/org"}, - method = RequestMethod.GET) - public List getAvailableKeeperContainersByDcAzAndOrg(@PathVariable String dcName, - @PathVariable(required = false) String azName, @PathVariable(required = false) String orgName) { - return keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzAndOrg(dcName, azName, orgName); + @RequestMapping(value = "/keepercontainers/dc/az/org/tag", method = RequestMethod.GET) + public List getAvailableKeeperContainersByDcAzAndOrg( + @RequestParam String dcName, + @RequestParam(required = false) String azName, + @RequestParam(required = false) String orgName, + @RequestParam(required = false) String tag) { + return keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzOrgAndTag(dcName, azName, orgName, tag); } @RequestMapping(value = "/keepercontainers/overload/all", method = RequestMethod.GET) diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/keeper/impl/KeeperContainerUsedInfoMsgCollector.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/keeper/impl/KeeperContainerUsedInfoMsgCollector.java index a05ab3c42f..f0ca755df2 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/keeper/impl/KeeperContainerUsedInfoMsgCollector.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/keeper/impl/KeeperContainerUsedInfoMsgCollector.java @@ -246,6 +246,7 @@ private KeeperContainerUsedInfoModel getKeeperBasicModel(String ip, String dcNam if (organizationTbl != null) { model.setOrg(organizationTbl.getOrgName()); } + model.setTag(keepercontainerTbl.getTag()); try { KeeperDiskInfo keeperDiskInfo = keeperContainerDiskInfoCollector.getKeeperDiskInfo(ip); if (keeperDiskInfo == null) { diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/keeper/util/DefaultKeeperContainerUsedInfoAnalyzerContext.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/keeper/util/DefaultKeeperContainerUsedInfoAnalyzerContext.java index bd570794eb..ff097a8a38 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/keeper/util/DefaultKeeperContainerUsedInfoAnalyzerContext.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/keeper/util/DefaultKeeperContainerUsedInfoAnalyzerContext.java @@ -131,6 +131,7 @@ public KeeperContainerUsedInfoModel getBestKeeperContainer(KeeperContainerUsedIn KeeperContainerUsedInfoModel target = queue.poll(); if ((Objects.equals(srcKeeper.getOrg(), target.getOrg())) && (Objects.equals(srcKeeper.getAz(), target.getAz())) + && (Objects.equals(srcKeeper.getTag(), target.getTag())) && !Objects.equals(target.getKeeperIp(), srcKeeperPair.getKeeperIp()) && ((!isMigrateShardBackUp && filterChain.canMigrate(dcClusterShard, srcKeeperPair, target, this)) || (isMigrateShardBackUp && !filterChain.isMigrateKeeperPairOverload(dcClusterShard, srcKeeperPair, target, this)))) { diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/model/KeeperContainerInfoModel.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/model/KeeperContainerInfoModel.java index 454320f672..c44eaa034e 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/model/KeeperContainerInfoModel.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/model/KeeperContainerInfoModel.java @@ -13,6 +13,7 @@ public class KeeperContainerInfoModel implements Serializable { private HostPort addr; private String dcName; private String orgName; + private String tag; private String azName; private long keeperCount; private long shardCount; @@ -79,6 +80,14 @@ public void setOrgName(String orgName) { this.orgName = orgName; } + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + public String getAzName() { return azName; } diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/KeeperContainerService.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/KeeperContainerService.java index 33ec1e79e0..db46295a70 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/KeeperContainerService.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/KeeperContainerService.java @@ -26,7 +26,7 @@ public interface KeeperContainerService { List findAllInfos(); KeeperContainerInfoModel findKeeperContainerInfoModelById(long id); - List findAvailableKeeperContainerInfoModelsByDcAzAndOrg(String dcName, String azName, String orgName); + List findAvailableKeeperContainerInfoModelsByDcAzOrgAndTag(String dcName, String azName, String orgName, String tag); void addKeeperContainer(KeeperContainerCreateInfo createInfo); diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/ClusterServiceImpl.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/ClusterServiceImpl.java index e899e05f60..0583fd9303 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/ClusterServiceImpl.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/ClusterServiceImpl.java @@ -777,6 +777,7 @@ public void updateCluster(String clusterName, ClusterModel cluster) { // organization info should not be updated by cluster, // it's automatically updated by scheduled task proto.setOrganizationInfo(null); + proto.setTag(cluster.getClusterTbl().getTag() == null ? "" : cluster.getClusterTbl().getTag()); clusterDao.updateCluster(proto); } diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerServiceImpl.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerServiceImpl.java index 92515ace87..229b5a10f0 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerServiceImpl.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerServiceImpl.java @@ -147,41 +147,44 @@ public List findBestKeeperContainersByDcCluster(String dcNam * 3. BU don't have its own kc, find in the normal kc pool(org id is 0L) */ long clusterOrgId; + String clusterTag; if (clusterName != null) { ClusterTbl clusterTbl = clusterService.find(clusterName); clusterOrgId = clusterTbl == null ? XPipeConsoleConstant.DEFAULT_ORG_ID : clusterTbl.getClusterOrgId(); + clusterTag = clusterTbl == null ? "" : clusterTbl.getTag(); } else { clusterOrgId = XPipeConsoleConstant.DEFAULT_ORG_ID; + clusterTag = ""; } - logger.info("cluster org id: {}", clusterOrgId); + logger.info("cluster org id: {}, tag: {}", clusterOrgId, clusterTag); return queryHandler.handleQuery(new DalQuery>() { @Override public List doQuery() throws DalException { // find all keepers, both in used and unused List allDcKeeperContainers = dao.findActiveByDcName(dcName, KeepercontainerTblEntity.READSET_FULL); - List allDcOrgKeeperContainers = allDcKeeperContainers.stream().filter(keepercontainer -> keepercontainer.getKeepercontainerOrgId() == clusterOrgId).collect(Collectors.toList()); + List allDcOrgTagKeeperContainers = allDcKeeperContainers.stream().filter(keepercontainer -> keepercontainer.getKeepercontainerOrgId() == clusterOrgId && Objects.equals(keepercontainer.getTag(), clusterTag)).collect(Collectors.toList()); - List dcOrgKeeperContainersInUsed; - if (allDcOrgKeeperContainers.isEmpty() && clusterOrgId != XPipeConsoleConstant.DEFAULT_ORG_ID) { + List dcOrgTagKeeperContainersInUsed; + if (allDcOrgTagKeeperContainers.isEmpty() && clusterOrgId != XPipeConsoleConstant.DEFAULT_ORG_ID) { logger.info("cluster {} with org id {} is going to find keepercontainers in normal pool", clusterName, clusterOrgId); - allDcOrgKeeperContainers = allDcKeeperContainers.stream().filter(keepercontainer -> keepercontainer.getKeepercontainerOrgId() == XPipeConsoleConstant.DEFAULT_ORG_ID).collect(Collectors.toList()); + allDcOrgTagKeeperContainers = allDcKeeperContainers.stream().filter(keepercontainer -> keepercontainer.getKeepercontainerOrgId() == XPipeConsoleConstant.DEFAULT_ORG_ID && Objects.equals(keepercontainer.getTag(), clusterTag)).collect(Collectors.toList()); // find keepers in used in normal org - dcOrgKeeperContainersInUsed = dao.findKeeperContainerByCluster(dcName, XPipeConsoleConstant.DEFAULT_ORG_ID, + dcOrgTagKeeperContainersInUsed = dao.findKeeperContainerByCluster(dcName, XPipeConsoleConstant.DEFAULT_ORG_ID, clusterTag, KeepercontainerTblEntity.READSET_KEEPER_COUNT_BY_CLUSTER); } else { // find keepers in used in cluster org - dcOrgKeeperContainersInUsed = dao.findKeeperContainerByCluster(dcName, clusterOrgId, + dcOrgTagKeeperContainersInUsed = dao.findKeeperContainerByCluster(dcName, clusterOrgId, clusterTag, KeepercontainerTblEntity.READSET_KEEPER_COUNT_BY_CLUSTER); } - setCountAndSortForAllKeeperContainers(allDcOrgKeeperContainers, dcOrgKeeperContainersInUsed); + setCountAndSortForAllKeeperContainers(allDcOrgTagKeeperContainers, dcOrgTagKeeperContainersInUsed); if (!skipAzFilter) { - allDcOrgKeeperContainers = filterKeeperFromSameAvailableZone(allDcOrgKeeperContainers, dcName); + allDcOrgTagKeeperContainers = filterKeeperFromSameAvailableZone(allDcOrgTagKeeperContainers, dcName); } - logger.info("find keeper containers: {}", allDcOrgKeeperContainers); - return allDcOrgKeeperContainers; + logger.info("find keeper containers: {}", allDcOrgTagKeeperContainers); + return allDcOrgTagKeeperContainers; } }); } @@ -288,6 +291,7 @@ public void addKeeperContainer(final KeeperContainerCreateInfo createInfo) { .setKeepercontainerIp(createInfo.getKeepercontainerIp()) .setKeepercontainerPort(createInfo.getKeepercontainerPort()) .setKeepercontainerOrgId(org.getId()) + .setTag(createInfo.getTag() == null ? "" : createInfo.getTag()) .setKeepercontainerActive(createInfo.isActive()) .setKeepercontainerDiskType(createInfo.getDiskType() == null ? KeeperContainerDiskType.DEFAULT.getDesc() : createInfo.getDiskType().toUpperCase()); @@ -314,6 +318,7 @@ public KeeperContainerCreateInfo apply(KeepercontainerTbl input) { .setDcName(dc).setActive(input.isKeepercontainerActive()) .setKeepercontainerIp(input.getKeepercontainerIp()) .setKeepercontainerPort(input.getKeepercontainerPort()) + .setTag(input.getTag()) .setDiskType(input.getKeepercontainerDiskType()); if (org != null) { info.setKeepercontainerOrgId(org.getOrgId()).setOrgName(org.getOrgName()); @@ -357,7 +362,7 @@ public KeeperContainerCreateInfo apply(KeepercontainerTbl input) { } keepercontainerTbl.setKeepercontainerActive(createInfo.isActive()); - + keepercontainerTbl.setTag(createInfo.getTag() == null ? "" : createInfo.getTag()); keepercontainerTbl.setKeepercontainerDiskType(createInfo.getDiskType()); queryHandler.handleUpdate(new DalQuery() { @Override @@ -425,7 +430,8 @@ public void addKeeperContainerByInfoModel(KeeperContainerInfoModel keeperContain proto.setKeepercontainerDc(dcTbl.getId()) .setKeepercontainerIp(keeperContainerInfoModel.getAddr().getHost()) .setKeepercontainerPort(keeperContainerInfoModel.getAddr().getPort()) - .setKeepercontainerActive(keeperContainerInfoModel.isActive()); + .setKeepercontainerActive(keeperContainerInfoModel.isActive()) + .setTag(keeperContainerInfoModel.getTag() == null ? "" : keeperContainerInfoModel.getTag()); queryHandler.handleInsert(new DalQuery() { @Override @@ -464,7 +470,7 @@ public void updateKeeperContainerByInfoModel(KeeperContainerInfoModel keeperCont } proto.setKeepercontainerActive(keeperContainerInfoModel.isActive()); - + proto.setTag(keeperContainerInfoModel.getTag() == null ? "" : keeperContainerInfoModel.getTag()); proto.setKeepercontainerDiskType(keeperContainerInfoModel.getDiskType()); queryHandler.handleQuery(new DalQuery() { @@ -561,6 +567,7 @@ public List findAllInfos() { model.setAddr(new HostPort(baseInfo.getKeepercontainerIp(), baseInfo.getKeepercontainerPort())); model.setDcName(baseInfo.getDcInfo().getDcName()); model.setOrgName(baseInfo.getOrgInfo().getOrgName()); + model.setTag(baseInfo.getTag()); model.setDiskType(baseInfo.getKeepercontainerDiskType()); if (baseInfo.getAzId() != 0) { @@ -599,6 +606,7 @@ public KeeperContainerInfoModel findKeeperContainerInfoModelById(long id) { keeperContainerInfoModel.setAzName(azNameMap.get(keepercontainerTbl.getAzId())); keeperContainerInfoModel.setAddr(new HostPort(keepercontainerTbl.getKeepercontainerIp(), keepercontainerTbl.getKeepercontainerPort())); keeperContainerInfoModel.setDiskType(keepercontainerTbl.getKeepercontainerDiskType()); + keeperContainerInfoModel.setTag(keepercontainerTbl.getTag()); OrganizationTbl organizationTbl = organizationService.getOrganization(keepercontainerTbl.getKeepercontainerOrgId()); if (organizationTbl != null) { @@ -609,9 +617,10 @@ public KeeperContainerInfoModel findKeeperContainerInfoModelById(long id) { } @Override - public List findAvailableKeeperContainerInfoModelsByDcAzAndOrg(String dcName, String azName, String orgName) { + public List findAvailableKeeperContainerInfoModelsByDcAzOrgAndTag(String dcName, String azName, String orgName, String tag) { long azId = 0; long orgId = 0; + String keeperTag = tag == null ? "" : tag; if (!StringUtil.isEmpty(azName)) { AzTbl azTbl = azService.getAvailableZoneTblByAzName(azName); @@ -632,6 +641,9 @@ public List findAvailableKeeperContainerInfoModelsByDc if (orgId != keepercontainer.getKeepercontainerOrgId()) { continue; } + if (!keeperTag.equalsIgnoreCase(keepercontainer.getTag())) { + continue; + } KeeperContainerInfoModel keeperContainerInfoModel = new KeeperContainerInfoModel(); keeperContainerInfoModel.setId(keepercontainer.getKeepercontainerId()); diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerServiceWithoutDB.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerServiceWithoutDB.java index 8780cd8852..b38f8f03e6 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerServiceWithoutDB.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerServiceWithoutDB.java @@ -148,7 +148,7 @@ public KeeperContainerInfoModel findKeeperContainerInfoModelById(long id) { } @Override - public List findAvailableKeeperContainerInfoModelsByDcAzAndOrg(String dcName, String azName, String orgName) { + public List findAvailableKeeperContainerInfoModelsByDcAzOrgAndTag(String dcName, String azName, String orgName, String tag) { throw new UnsupportedOperationException(); } diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/meta/impl/KeepercontainerMetaServiceImpl.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/meta/impl/KeepercontainerMetaServiceImpl.java index 94dfd25e12..4c12ad54f2 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/meta/impl/KeepercontainerMetaServiceImpl.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/service/meta/impl/KeepercontainerMetaServiceImpl.java @@ -24,6 +24,7 @@ public KeeperContainerMeta encodeKeepercontainerMeta(KeepercontainerTbl keeperco keeperContainerMeta.setIp(keepercontainer.getKeepercontainerIp()); keeperContainerMeta.setPort(keepercontainer.getKeepercontainerPort()); keeperContainerMeta.setDiskType(keepercontainer.getKeepercontainerDiskType()); + keeperContainerMeta.setTag(keepercontainer.getTag()); keeperContainerMeta.setParent(dcMeta); if(keepercontainer.getAzId() != 0) keeperContainerMeta.setAzId(keepercontainer.getAzId()); diff --git a/redis/redis-console/src/main/resources/META-INF/dal/jdbc/meta-codegen.xml b/redis/redis-console/src/main/resources/META-INF/dal/jdbc/meta-codegen.xml index 1bf2e97b22..91e39f9740 100644 --- a/redis/redis-console/src/main/resources/META-INF/dal/jdbc/meta-codegen.xml +++ b/redis/redis-console/src/main/resources/META-INF/dal/jdbc/meta-codegen.xml @@ -204,6 +204,7 @@ + diff --git a/redis/redis-console/src/main/resources/META-INF/dal/jdbc/meta-dal.xml b/redis/redis-console/src/main/resources/META-INF/dal/jdbc/meta-dal.xml index 7718bcab73..d4dbe19fb2 100644 --- a/redis/redis-console/src/main/resources/META-INF/dal/jdbc/meta-dal.xml +++ b/redis/redis-console/src/main/resources/META-INF/dal/jdbc/meta-dal.xml @@ -1703,12 +1703,16 @@ + + + + @@ -1780,6 +1784,7 @@ + @@ -1789,6 +1794,7 @@ AND = 1 AND = 0 AND = ${org-id} + AND = ${tag} AND kit.redis_role = 'keeper' GROUP BY order by count diff --git a/redis/redis-console/src/main/resources/sql/h2/xpipedemodbinitdata.sql b/redis/redis-console/src/main/resources/sql/h2/xpipedemodbinitdata.sql index a5bfa9415c..f480cff656 100644 --- a/redis/redis-console/src/main/resources/sql/h2/xpipedemodbinitdata.sql +++ b/redis/redis-console/src/main/resources/sql/h2/xpipedemodbinitdata.sql @@ -20,7 +20,7 @@ insert into SETINEL_TBL (setinel_id,dc_id,setinel_address,setinel_description) v insert into SETINEL_TBL (setinel_id,dc_id,setinel_address,setinel_description) values(2,2,'127.0.0.1:17170,127.0.0.1:17171,127.0.0.1:17172','setinel no.2'); insert into SETINEL_TBL (setinel_id,dc_id,setinel_address,setinel_description) values(3,3,'127.0.0.1:32222,127.0.0.1:32223','setinel no.3'); -insert into KEEPERCONTAINER_TBL(keepercontainer_id,keepercontainer_dc,keepercontainer_ip,keepercontainer_port,keepercontainer_active) values (1,1,'127.0.0.1',7080,1); +insert into KEEPERCONTAINER_TBL(keepercontainer_id,keepercontainer_dc,keepercontainer_ip,keepercontainer_port,keepercontainer_active, tag) values (1,1,'127.0.0.1',7080,1, 'tag-1'); insert into KEEPERCONTAINER_TBL(keepercontainer_id,keepercontainer_dc,keepercontainer_ip,keepercontainer_port,keepercontainer_active) values (2,1,'127.0.0.1',7081,1); insert into KEEPERCONTAINER_TBL(keepercontainer_id,keepercontainer_dc,keepercontainer_ip,keepercontainer_port,keepercontainer_active) values (3,1,'127.0.0.1',7082,1); insert into KEEPERCONTAINER_TBL(keepercontainer_id,keepercontainer_dc,keepercontainer_ip,keepercontainer_port,keepercontainer_active) values (4,2,'127.0.0.1',7180,1); diff --git a/redis/redis-console/src/main/resources/sql/h2/xpipedemodbtables.sql b/redis/redis-console/src/main/resources/sql/h2/xpipedemodbtables.sql index b87b0af371..16a2eb4d04 100644 --- a/redis/redis-console/src/main/resources/sql/h2/xpipedemodbtables.sql +++ b/redis/redis-console/src/main/resources/sql/h2/xpipedemodbtables.sql @@ -197,7 +197,8 @@ create table KEEPERCONTAINER_TBL DataChange_LastTime timestamp default CURRENT_TIMESTAMP, deleted tinyint(1) not null default 0, keepercontainer_org_id bigint(20) unsigned NOT NULL DEFAULT 0, - keepercontainer_disk_type varchar(64) not null default 'default' + keepercontainer_disk_type varchar(64) not null default 'default', + tag varchar(32) not null default '', ); -- Migration Event Table diff --git a/redis/redis-console/src/main/resources/sql/mysql/xpipedemodbtables.sql b/redis/redis-console/src/main/resources/sql/mysql/xpipedemodbtables.sql index bfe49430ad..135fa03bf1 100644 --- a/redis/redis-console/src/main/resources/sql/mysql/xpipedemodbtables.sql +++ b/redis/redis-console/src/main/resources/sql/mysql/xpipedemodbtables.sql @@ -233,6 +233,7 @@ CREATE TABLE `KEEPERCONTAINER_TBL` ( `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'deleted or not', `keepercontainer_org_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'organization id of keeper container', `keepercontainer_disk_type` varchar(64) not null default 'default', + `tag` varchar(32) not null default '', PRIMARY KEY (`keepercontainer_id`), KEY `DataChange_LastTime` (`DataChange_LastTime`), KEY `keepercontainer_dc` (`keepercontainer_dc`) diff --git a/redis/redis-console/src/main/resources/static/dist/bundle.js b/redis/redis-console/src/main/resources/static/dist/bundle.js index 1560f5348d..4e61b70753 100644 --- a/redis/redis-console/src/main/resources/static/dist/bundle.js +++ b/redis/redis-console/src/main/resources/static/dist/bundle.js @@ -9163,7 +9163,7 @@ eval("angular\n .module('index')\n .controller('FullLinkHealthCheckCtl', F \*****************************************/ /***/ (() => { -eval("angular\n .module('index')\n .controller('IndexCtl', IndexCtl);\nIndexCtl.$inject = ['$rootScope', '$scope', '$window', 'UserService', 'ConfigService', 'AppUtil'];\nfunction IndexCtl($rootScope, $scope, $window, UserService, ConfigService, AppUtil) {\n $rootScope.currentNav = '1-2';\n $rootScope.switchNav = switchNav;\n $rootScope.historyPage = 1;\n $rootScope.preChangeConfig = preChangeConfig;\n $rootScope.changeConfig = changeConfig;\n $rootScope.updateConfig = updateConfig;\n function switchNav(nav) {\n $rootScope.currentNav = nav;\n }\n UserService.getCurrentUser()\n .then(function (result) {\n $rootScope.currentUser = result;\n });\n ConfigService.isAlertSystemOn()\n .then(function (result) {\n $rootScope.isAlertSystemOn = (result.state === 0);\n });\n ConfigService.isSentinelAutoProcessOn()\n .then(function (result) {\n $rootScope.isSentinelAutoProcOn = (result.state === 0);\n });\n ConfigService.isKeeperBalanceInfoCollectOn()\n .then(function (result) {\n $rootScope.isKeeperBalanceInfoCollectOn = (result.state === 0);\n });\n function preChangeConfig(key, value) {\n $rootScope.configChangeKey = key;\n $rootScope.configChangeValue = value;\n $('#changeConfigConfirm').modal('show');\n }\n function changeConfig() {\n ConfigService.changeConfig($rootScope.configChangeKey, $rootScope.configChangeValue)\n .then(function (result) {\n $window.location.reload();\n $('#changeConfigConfirm').modal('hide');\n toastr.success('设置更改成功');\n }, function (result) {\n toastr.error(AppUtil.errorMsg(result), '设置更改失败');\n $window.location.reload();\n });\n }\n function updateConfig() {\n ConfigService.isAlertSystemOn()\n .then(function (result) {\n $rootScope.isAlertSystemOn = (result.state === 0);\n });\n ConfigService.isSentinelAutoProcessOn()\n .then(function (result) {\n $rootScope.isSentinelAutoProcOn = (result.state === 0);\n });\n ConfigService.isKeeperBalanceInfoCollectOn()\n .then(function (result) {\n $rootScope.isKeeperBalanceInfoCollectOn = (result.state === 0);\n });\n $window.location.reload();\n }\n}\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/controllers/IndexCtl.ts?"); +eval("angular\n .module('index')\n .controller('IndexCtl', IndexCtl);\nIndexCtl.$inject = ['$rootScope', '$scope', '$window', 'UserService', 'ConfigService', 'AppUtil'];\nfunction IndexCtl($rootScope, $scope, $window, UserService, ConfigService, AppUtil) {\n $rootScope.currentNav = '1-2';\n $rootScope.switchNav = switchNav;\n $rootScope.historyPage = 1;\n $rootScope.preChangeConfig = preChangeConfig;\n $rootScope.changeConfig = changeConfig;\n $rootScope.updateConfig = updateConfig;\n function switchNav(nav) {\n $rootScope.currentNav = nav;\n }\n UserService.getCurrentUser()\n .then(function (result) {\n $rootScope.currentUser = result;\n });\n ConfigService.isAlertSystemOn()\n .then(function (result) {\n $rootScope.isAlertSystemOn = (result.state === 0);\n });\n ConfigService.isSentinelAutoProcessOn()\n .then(function (result) {\n $rootScope.isSentinelAutoProcOn = (result.state === 0);\n });\n function preChangeConfig(key, value) {\n $rootScope.configChangeKey = key;\n $rootScope.configChangeValue = value;\n $('#changeConfigConfirm').modal('show');\n }\n function changeConfig() {\n ConfigService.changeConfig($rootScope.configChangeKey, $rootScope.configChangeValue)\n .then(function (result) {\n $window.location.reload();\n $('#changeConfigConfirm').modal('hide');\n toastr.success('设置更改成功');\n }, function (result) {\n toastr.error(AppUtil.errorMsg(result), '设置更改失败');\n $window.location.reload();\n });\n }\n function updateConfig() {\n ConfigService.isAlertSystemOn()\n .then(function (result) {\n $rootScope.isAlertSystemOn = (result.state === 0);\n });\n ConfigService.isSentinelAutoProcessOn()\n .then(function (result) {\n $rootScope.isSentinelAutoProcOn = (result.state === 0);\n });\n $window.location.reload();\n }\n}\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/controllers/IndexCtl.ts?"); /***/ }), @@ -9193,7 +9193,7 @@ eval("angular\n .module('index')\n .controller('KeeperContainerListCtl', K \***************************************************/ /***/ (() => { -eval("angular\n .module('index')\n .controller('KeeperMigrationCtl', KeeperMigrationCtl);\nKeeperMigrationCtl.$inject = ['$rootScope', '$scope', '$window', '$stateParams', 'KeeperContainerService',\n 'toastr', 'NgTableParams', 'ClusterService', 'RedisService', 'ClusterType'];\nfunction KeeperMigrationCtl($rootScope, $scope, $window, $stateParams, KeeperContainerService, toastr, NgTableParams, ClusterService, RedisService, ClusterType) {\n $scope.keepercontainerId = $stateParams.keepercontainer;\n $scope.srcKeepercontainer = [];\n $scope.allClustersWithSrcKeeperContainer = [];\n $scope.availableKeeperContainers = [];\n $scope.availableMigrationKeeperNums = [];\n $scope.maxMigrationKeeperNum = 0;\n $scope.targetKeeperContainer = {};\n $scope.toggle = toggle;\n $scope.toggleAll = toggleAll;\n $scope.isIndeterminate = isIndeterminate;\n $scope.isChecked = isChecked;\n $scope.preMigrateKeepers = preMigrateKeepers;\n $scope.doMigrateKeepers = doMigrateKeepers;\n $scope.gotoClusterHickwall = gotoClusterHickwall;\n init();\n function init() {\n for (var i = 0; i < 50; i++) {\n $scope.availableMigrationKeeperNums.push(i + 1);\n }\n KeeperContainerService.findKeepercontainerById($scope.keepercontainerId)\n .then(function (result) {\n $scope.srcKeepercontainer = result;\n KeeperContainerService.findAvailableKeepersByDcAzAndOrg($scope.srcKeepercontainer.dcName, $scope.srcKeepercontainer.azName, $scope.srcKeepercontainer.orgName)\n .then(function (result) {\n $scope.availableKeeperContainers = result.filter(function (keepercontainer) { return keepercontainer.id != $scope.srcKeepercontainer.id; });\n });\n });\n ClusterService.findAllByKeeperContainer($scope.keepercontainerId)\n .then(function (result) {\n $scope.allClustersWithSrcKeeperContainer = result;\n $scope.tableParams = new NgTableParams({\n page: 1,\n count: 10,\n }, {\n filterDelay: 100,\n counts: [10, 25, 50],\n dataset: $scope.allClustersWithSrcKeeperContainer,\n });\n });\n }\n function preMigrateKeepers() {\n $('#migrateKeepersConfirm').modal('show');\n }\n function doMigrateKeepers() {\n var selectedClusters = $scope.allClustersWithSrcKeeperContainer.filter(function (cluster) {\n return cluster.selected && (cluster.targetDc !== \"-\");\n });\n $scope.availableKeeperContainers.forEach(function (keeperContainer) {\n var keeperHost = keeperContainer.addr.host + \":\" + keeperContainer.addr.port;\n if (keeperHost == $scope.targetKeeperContainer) {\n $scope.targetKeeperContainer = keeperContainer;\n }\n });\n RedisService.migrateKeepers($scope.maxMigrationKeeperNum, $scope.targetKeeperContainer, $scope.srcKeepercontainer, selectedClusters)\n .then(function (result) {\n $('#migrateKeepersConfirm').modal('hide');\n toastr.success(\"迁移成功\");\n $window.location.href = \"/#/keepercontainers\";\n $window.location.reload();\n });\n }\n function toggle(cluster) {\n cluster.selected = !cluster.selected;\n }\n ;\n function isIndeterminate() {\n var selectedClusters = $scope.allClustersWithSrcKeeperContainer.filter(function (cluster) {\n return cluster.selected;\n });\n return (selectedClusters.length !== $scope.allClustersWithSrcKeeperContainer.length) &&\n (selectedClusters.length > 0);\n }\n ;\n function isChecked() {\n var selectedClusters = $scope.allClustersWithSrcKeeperContainer.filter(function (cluster) {\n return cluster.selected;\n });\n return (selectedClusters.length === $scope.allClustersWithSrcKeeperContainer.length) &&\n (selectedClusters.length !== 0);\n }\n ;\n function toggleAll() {\n if ($scope.isIndeterminate()) {\n $scope.allClustersWithSrcKeeperContainer.forEach(function (cluster) {\n cluster.selected = true;\n });\n }\n else {\n $scope.allClustersWithSrcKeeperContainer.forEach(function (cluster) {\n cluster.selected = !cluster.selected;\n });\n }\n }\n ;\n function gotoClusterHickwall(clusterName) {\n ClusterService.getClusterHickwallAddr(clusterName, ClusterType.lookup('one_way').value).then(function (result) {\n if (result != null && result.state === 0) {\n $window.open(result.message, '_blank');\n }\n });\n }\n}\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/controllers/KeeperMigrationCtl.ts?"); +eval("angular\n .module('index')\n .controller('KeeperMigrationCtl', KeeperMigrationCtl);\nKeeperMigrationCtl.$inject = ['$rootScope', '$scope', '$window', '$stateParams', 'KeeperContainerService',\n 'toastr', 'NgTableParams', 'ClusterService', 'RedisService', 'ClusterType'];\nfunction KeeperMigrationCtl($rootScope, $scope, $window, $stateParams, KeeperContainerService, toastr, NgTableParams, ClusterService, RedisService, ClusterType) {\n $scope.keepercontainerId = $stateParams.keepercontainer;\n $scope.srcKeepercontainer = [];\n $scope.allClustersWithSrcKeeperContainer = [];\n $scope.availableKeeperContainers = [];\n $scope.availableMigrationKeeperNums = [];\n $scope.maxMigrationKeeperNum = 0;\n $scope.targetKeeperContainer = {};\n $scope.toggle = toggle;\n $scope.toggleAll = toggleAll;\n $scope.isIndeterminate = isIndeterminate;\n $scope.isChecked = isChecked;\n $scope.preMigrateKeepers = preMigrateKeepers;\n $scope.doMigrateKeepers = doMigrateKeepers;\n $scope.gotoClusterHickwall = gotoClusterHickwall;\n init();\n function init() {\n for (var i = 0; i < 50; i++) {\n $scope.availableMigrationKeeperNums.push(i + 1);\n }\n KeeperContainerService.findKeepercontainerById($scope.keepercontainerId)\n .then(function (result) {\n $scope.srcKeepercontainer = result;\n KeeperContainerService.findAvailableKeepersByDcAzOrgAndTag($scope.srcKeepercontainer.dcName, $scope.srcKeepercontainer.azName, $scope.srcKeepercontainer.orgName, $scope.srcKeepercontainer.tag)\n .then(function (result) {\n $scope.availableKeeperContainers = result.filter(function (keepercontainer) { return keepercontainer.id != $scope.srcKeepercontainer.id; });\n });\n });\n ClusterService.findAllByKeeperContainer($scope.keepercontainerId)\n .then(function (result) {\n $scope.allClustersWithSrcKeeperContainer = result;\n $scope.tableParams = new NgTableParams({\n page: 1,\n count: 10,\n }, {\n filterDelay: 100,\n counts: [10, 25, 50],\n dataset: $scope.allClustersWithSrcKeeperContainer,\n });\n });\n }\n function preMigrateKeepers() {\n $('#migrateKeepersConfirm').modal('show');\n }\n function doMigrateKeepers() {\n var selectedClusters = $scope.allClustersWithSrcKeeperContainer.filter(function (cluster) {\n return cluster.selected && (cluster.targetDc !== \"-\");\n });\n $scope.availableKeeperContainers.forEach(function (keeperContainer) {\n var keeperHost = keeperContainer.addr.host + \":\" + keeperContainer.addr.port;\n if (keeperHost == $scope.targetKeeperContainer) {\n $scope.targetKeeperContainer = keeperContainer;\n }\n });\n RedisService.migrateKeepers($scope.maxMigrationKeeperNum, $scope.targetKeeperContainer, $scope.srcKeepercontainer, selectedClusters)\n .then(function (result) {\n $('#migrateKeepersConfirm').modal('hide');\n toastr.success(\"迁移成功\");\n $window.location.href = \"/#/keepercontainers\";\n $window.location.reload();\n });\n }\n function toggle(cluster) {\n cluster.selected = !cluster.selected;\n }\n ;\n function isIndeterminate() {\n var selectedClusters = $scope.allClustersWithSrcKeeperContainer.filter(function (cluster) {\n return cluster.selected;\n });\n return (selectedClusters.length !== $scope.allClustersWithSrcKeeperContainer.length) &&\n (selectedClusters.length > 0);\n }\n ;\n function isChecked() {\n var selectedClusters = $scope.allClustersWithSrcKeeperContainer.filter(function (cluster) {\n return cluster.selected;\n });\n return (selectedClusters.length === $scope.allClustersWithSrcKeeperContainer.length) &&\n (selectedClusters.length !== 0);\n }\n ;\n function toggleAll() {\n if ($scope.isIndeterminate()) {\n $scope.allClustersWithSrcKeeperContainer.forEach(function (cluster) {\n cluster.selected = true;\n });\n }\n else {\n $scope.allClustersWithSrcKeeperContainer.forEach(function (cluster) {\n cluster.selected = !cluster.selected;\n });\n }\n }\n ;\n function gotoClusterHickwall(clusterName) {\n ClusterService.getClusterHickwallAddr(clusterName, ClusterType.lookup('one_way').value).then(function (result) {\n if (result != null && result.state === 0) {\n $window.open(result.message, '_blank');\n }\n });\n }\n}\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/controllers/KeeperMigrationCtl.ts?"); /***/ }), @@ -9203,7 +9203,7 @@ eval("angular\n .module('index')\n .controller('KeeperMigrationCtl', Keepe \*******************************************************/ /***/ (() => { -eval("angular\n .module('index')\n .controller('KeepercontainerFormCtl', KeepercontainerFormCtl);\nKeepercontainerFormCtl.$inject = ['$scope', '$stateParams', '$window', 'toastr', 'AppUtil', 'KeeperContainerService', 'DcService', 'AzService', 'NgTableParams'];\nfunction KeepercontainerFormCtl($scope, $stateParams, $window, toastr, AppUtil, KeeperContainerService, DcService, AzService, NgTableParams) {\n $scope.routes = {};\n $scope.tableParams = new NgTableParams({}, {});\n var OPERATE_TYPE = {\n CREATE: 'create',\n UPDATE: 'update',\n };\n $scope.bools = [true, false];\n $scope.operateType = $stateParams.type;\n $scope.keepercontainerId = $stateParams.id;\n $scope.allDcs = [];\n $scope.dcNames = [];\n $scope.organizations = [];\n $scope.dcAzs = [];\n $scope.keepercontainer = [];\n $scope.doAddKeepercontainer = doAddKeepercontainer;\n init();\n function init() {\n DcService.loadAllDcs()\n .then(function (result) {\n $scope.allDcs = result;\n $scope.allDcs.forEach(function (dc) {\n AzService.getAllActiveAvailableZoneInfosByDc(dc.id)\n .then(function (result) {\n $scope.dcAzs[dc.dcName] = result.map(function (az) {\n return az.azName;\n });\n ;\n });\n });\n $scope.dcNames = result.map(function (dc) {\n return dc.dcName;\n });\n });\n KeeperContainerService.getAllOrganizations()\n .then(function (result) {\n $scope.organizations = result;\n $scope.organizationNames = result.map(function (org) {\n return org.orgName;\n });\n });\n KeeperContainerService.getAllDiskTypes()\n .then(function (result) {\n $scope.diskTypes = result;\n });\n if ($scope.operateType != OPERATE_TYPE.CREATE) {\n KeeperContainerService.findKeepercontainerById($scope.keepercontainerId)\n .then(function (result) {\n $scope.keepercontainer = result;\n }, function (result) {\n toastr.error(AppUtil.errorMsg(result));\n });\n }\n else {\n $scope.keepercontainer = {};\n }\n }\n function doAddKeepercontainer() {\n if ($scope.operateType == OPERATE_TYPE.CREATE) {\n KeeperContainerService.addKeepercontainer($scope.keepercontainer.addr, $scope.keepercontainer.dcName, $scope.keepercontainer.orgName, $scope.keepercontainer.azName, $scope.keepercontainer.active, $scope.keepercontainer.diskType)\n .then(function (result) {\n if (result.message == 'success') {\n toastr.success(\"添加成功\");\n $window.location.href = \"/#/keepercontainers\";\n }\n else {\n toastr.error(result.message, \"添加失败\");\n }\n }, function (result) {\n toastr.error(AppUtil.errorMsg(result), \"添加失败\");\n });\n }\n else {\n KeeperContainerService.updateKeepercontainer($scope.keepercontainer.addr, $scope.keepercontainer.dcName, $scope.keepercontainer.orgName, $scope.keepercontainer.azName, $scope.keepercontainer.active, $scope.keepercontainer.diskType)\n .then(function (result) {\n if (result.message == 'success') {\n toastr.success(\"修改成功\");\n $window.location.href = \"/#/keepercontainers\";\n }\n else {\n toastr.error(result.message, \"修改失败\");\n }\n }, function (result) {\n toastr.error(AppUtil.errorMsg(result), \"修改失败\");\n });\n }\n }\n}\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/controllers/KeepercontainerFormCtl.ts?"); +eval("angular\n .module('index')\n .controller('KeepercontainerFormCtl', KeepercontainerFormCtl);\nKeepercontainerFormCtl.$inject = ['$scope', '$stateParams', '$window', 'toastr', 'AppUtil', 'KeeperContainerService', 'DcService', 'AzService', 'NgTableParams'];\nfunction KeepercontainerFormCtl($scope, $stateParams, $window, toastr, AppUtil, KeeperContainerService, DcService, AzService, NgTableParams) {\n $scope.routes = {};\n $scope.tableParams = new NgTableParams({}, {});\n var OPERATE_TYPE = {\n CREATE: 'create',\n UPDATE: 'update',\n };\n $scope.bools = [true, false];\n $scope.operateType = $stateParams.type;\n $scope.keepercontainerId = $stateParams.id;\n $scope.allDcs = [];\n $scope.dcNames = [];\n $scope.organizations = [];\n $scope.dcAzs = [];\n $scope.keepercontainer = [];\n $scope.doAddKeepercontainer = doAddKeepercontainer;\n init();\n function init() {\n DcService.loadAllDcs()\n .then(function (result) {\n $scope.allDcs = result;\n $scope.allDcs.forEach(function (dc) {\n AzService.getAllActiveAvailableZoneInfosByDc(dc.id)\n .then(function (result) {\n $scope.dcAzs[dc.dcName] = result.map(function (az) {\n return az.azName;\n });\n ;\n });\n });\n $scope.dcNames = result.map(function (dc) {\n return dc.dcName;\n });\n });\n KeeperContainerService.getAllOrganizations()\n .then(function (result) {\n $scope.organizations = result;\n $scope.organizationNames = result.map(function (org) {\n return org.orgName;\n });\n });\n KeeperContainerService.getAllDiskTypes()\n .then(function (result) {\n $scope.diskTypes = result;\n });\n if ($scope.operateType != OPERATE_TYPE.CREATE) {\n KeeperContainerService.findKeepercontainerById($scope.keepercontainerId)\n .then(function (result) {\n $scope.keepercontainer = result;\n }, function (result) {\n toastr.error(AppUtil.errorMsg(result));\n });\n }\n else {\n $scope.keepercontainer = {};\n }\n }\n function doAddKeepercontainer() {\n if ($scope.operateType == OPERATE_TYPE.CREATE) {\n KeeperContainerService.addKeepercontainer($scope.keepercontainer.addr, $scope.keepercontainer.dcName, $scope.keepercontainer.orgName, $scope.keepercontainer.azName, $scope.keepercontainer.active, $scope.keepercontainer.diskType, $scope.keepercontainer.tag)\n .then(function (result) {\n if (result.message == 'success') {\n toastr.success(\"添加成功\");\n $window.location.href = \"/#/keepercontainers\";\n }\n else {\n toastr.error(result.message, \"添加失败\");\n }\n }, function (result) {\n toastr.error(AppUtil.errorMsg(result), \"添加失败\");\n });\n }\n else {\n KeeperContainerService.updateKeepercontainer($scope.keepercontainer.addr, $scope.keepercontainer.dcName, $scope.keepercontainer.orgName, $scope.keepercontainer.azName, $scope.keepercontainer.active, $scope.keepercontainer.diskType, $scope.keepercontainer.tag)\n .then(function (result) {\n if (result.message == 'success') {\n toastr.success(\"修改成功\");\n $window.location.href = \"/#/keepercontainers\";\n }\n else {\n toastr.error(result.message, \"修改失败\");\n }\n }, function (result) {\n toastr.error(AppUtil.errorMsg(result), \"修改失败\");\n });\n }\n }\n}\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/controllers/KeepercontainerFormCtl.ts?"); /***/ }), @@ -9443,7 +9443,7 @@ eval("angular\n .module('services')\n .service('ClusterService', ClusterSe \*******************************************/ /***/ (() => { -eval("angular\n .module('services')\n .service('ConfigService', ConfigService);\nConfigService.$inject = ['$resource', '$q'];\nfunction ConfigService($resource, $q) {\n var resource = $resource('', {}, {\n is_alert_system_on: {\n method: 'GET',\n url: '/console/config/alert_system'\n },\n is_sentinel_auto_process_on: {\n method: 'GET',\n url: '/console/config/sentinel_auto_process'\n },\n is_keeper_balance_info_collect_on: {\n method: 'GET',\n url: '/console/config/keeper_balance_info_collect'\n },\n change_config: {\n method: 'POST',\n url: '/console/config/change_config'\n }\n });\n function isAlertSystemOn() {\n var d = $q.defer();\n resource.is_alert_system_on({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function isSentinelAutoProcessOn() {\n var d = $q.defer();\n resource.is_sentinel_auto_process_on({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function isKeeperBalanceInfoCollectOn() {\n var d = $q.defer();\n resource.is_keeper_balance_info_collect_on({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function changeConfig(key, value) {\n var d = $q.defer();\n resource.change_config({}, {\n key: key,\n val: value\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n return {\n isAlertSystemOn: isAlertSystemOn,\n isSentinelAutoProcessOn: isSentinelAutoProcessOn,\n isKeeperBalanceInfoCollectOn: isKeeperBalanceInfoCollectOn,\n changeConfig: changeConfig\n };\n}\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/services/ConfigService.ts?"); +eval("angular\n .module('services')\n .service('ConfigService', ConfigService);\nConfigService.$inject = ['$resource', '$q'];\nfunction ConfigService($resource, $q) {\n var resource = $resource('', {}, {\n is_alert_system_on: {\n method: 'GET',\n url: '/console/config/alert_system'\n },\n is_sentinel_auto_process_on: {\n method: 'GET',\n url: '/console/config/sentinel_auto_process'\n },\n change_config: {\n method: 'POST',\n url: '/console/config/change_config'\n }\n });\n function isAlertSystemOn() {\n var d = $q.defer();\n resource.is_alert_system_on({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function isSentinelAutoProcessOn() {\n var d = $q.defer();\n resource.is_sentinel_auto_process_on({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function changeConfig(key, value) {\n var d = $q.defer();\n resource.change_config({}, {\n key: key,\n val: value\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n return {\n isAlertSystemOn: isAlertSystemOn,\n isSentinelAutoProcessOn: isSentinelAutoProcessOn,\n changeConfig: changeConfig\n };\n}\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/services/ConfigService.ts?"); /***/ }), @@ -9483,7 +9483,7 @@ eval("angular\n .module('services')\n .service('HealthCheckService', Healt \****************************************************/ /***/ (() => { -eval("angular\n .module('services')\n .service('KeeperContainerService', ['$resource', '$q', function ($resource, $q) {\n var resource = $resource('', {}, {\n find_availablekeepers_by_dc: {\n method: 'POST',\n url: '/console/dcs/:dcName/availablekeepers',\n isArray: true\n },\n find_active_kcs_by_dc_and_cluster: {\n method: 'GET',\n url: '/console/dcs/:dcName/cluster/:clusterName/activekeepercontainers',\n isArray: true\n },\n find_keepercontainer_by_id: {\n method: 'GET',\n url: '/console/keepercontainer/:id',\n },\n find_available_keepers_by_dc_az_and_org: {\n method: 'GET',\n url: '/console/keepercontainers/dc/:dcName/az/:azName/org/:orgName',\n isArray: true\n },\n get_all_infos: {\n method: 'GET',\n url: '/console/keepercontainer/infos/all',\n isArray: true\n },\n get_all_diskTypes: {\n method: 'GET',\n url: '/console/keepercontainer/diskType',\n isArray: true\n },\n get_all_organizations: {\n method: 'GET',\n url: '/console/organizations',\n isArray: true\n },\n add_keepercontainer: {\n method: 'POST',\n url: '/console/keepercontainer'\n },\n update_keepercontainer: {\n method: 'PUT',\n url: '/console/keepercontainer'\n },\n get_all_overload_keepercontainer: {\n method: 'GET',\n url: '/console/keepercontainers/overload/all',\n isArray: true\n },\n get_all_overload_lasted_used_info: {\n method: 'GET',\n url: '/console/keepercontainer/overload/info/lasted',\n isArray: true\n },\n get_all_keepers: {\n method: 'GET',\n url: '/console/keepercontainer/keepers/:ip',\n isArray: true\n },\n get_overload_keepercontainer_migration_process: {\n method: 'GET',\n url: '/console/keepercontainer/overload/migration/process',\n isArray: true\n },\n get_all_available_zone_info_models_by_dc: {\n method: 'GET',\n url: '/console/az/dcs/tbl/:dcId',\n isArray: true\n },\n begin_to_migrate_overload_keepercontainer: {\n method: 'POST',\n url: '/console/keepercontainer/overload/migration/begin'\n },\n migrate_keeper_task_terminate: {\n method: 'POST',\n url: '/console/keepercontainer/overload/migration/terminate'\n },\n stop_to_migrate_overload_keepercontainer: {\n method: 'POST',\n url: '/console/keepercontainer/overload/migration/stop'\n },\n reset_election: {\n method: 'POST',\n url: '/api/keepers/election/reset/:ip/:port/:shardId'\n },\n release_rdb: {\n method: 'POST',\n url: '/api/keepers/release/rdb/:ip/:port/:shardId'\n }\n });\n function findActiveKeeperContainersByDc(dcName) {\n var d = $q.defer();\n resource.find_activekeepercontainers_by_dc({\n dcName: dcName\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function findAvailableKeepersByDc(dcName, shard) {\n var d = $q.defer();\n resource.find_availablekeepers_by_dc({\n dcName: dcName\n }, shard, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function findKeepercontainerById(id) {\n var d = $q.defer();\n resource.find_keepercontainer_by_id({\n id: id\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function findAvailableKeepersByDcAzAndOrg(dcName, azName, orgName) {\n var d = $q.defer();\n resource.find_available_keepers_by_dc_az_and_org({\n dcName: dcName,\n azName: azName,\n orgName: orgName\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllAvailableZoneInfoModelsByDc(dcId) {\n var d = $q.defer();\n resource.get_all_available_zone_info_models_by_dc({\n dcId: dcId\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function findAvailableKeepersByDcAndCluster(dcName, clusterName) {\n var d = $q.defer();\n resource.find_active_kcs_by_dc_and_cluster({\n dcName: dcName,\n clusterName: clusterName\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllInfos() {\n var d = $q.defer();\n resource.get_all_infos({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllOrganizations() {\n var d = $q.defer();\n resource.get_all_organizations({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllDiskTypes() {\n var d = $q.defer();\n resource.get_all_diskTypes({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function addKeepercontainer(addr, dcName, orgName, azName, active, diskType) {\n var d = $q.defer();\n resource.add_keepercontainer({}, {\n addr: addr,\n dcName: dcName,\n orgName: orgName,\n azName: azName,\n active: active,\n diskType: diskType\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function updateKeepercontainer(addr, dcName, orgName, azName, active, diskType) {\n var d = $q.defer();\n resource.update_keepercontainer({}, {\n addr: addr,\n dcName: dcName,\n orgName: orgName,\n azName: azName,\n active: active,\n diskType: diskType\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllOverloadKeepercontainer() {\n var d = $q.defer();\n resource.get_all_overload_keepercontainer({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllKeepercontainerUsedInfo() {\n var d = $q.defer();\n resource.get_all_overload_lasted_used_info({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllKeepers(ip) {\n var d = $q.defer();\n resource.get_all_keepers({\n ip: ip\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getOverloadKeeperContainerMigrationProcess() {\n var d = $q.defer();\n resource.get_overload_keepercontainer_migration_process({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function beginToMigrateOverloadKeeperContainers() {\n var d = $q.defer();\n resource.begin_to_migrate_overload_keepercontainer(Array.from(arguments), function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function migrateKeeperTaskTerminate() {\n var d = $q.defer();\n resource.migrate_keeper_task_terminate({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function resetElection(ip, port, shardId) {\n var d = $q.defer();\n resource.reset_election({\n ip: ip,\n port: port,\n shardId: shardId\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function releaseRdb(ip, port, shardId) {\n var d = $q.defer();\n resource.release_rdb({\n ip: ip,\n port: port,\n shardId: shardId\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n return {\n findAvailableKeepersByDc: findAvailableKeepersByDc,\n findAvailableKeepersByDcAndCluster: findAvailableKeepersByDcAndCluster,\n findKeepercontainerById: findKeepercontainerById,\n getAllAvailableZoneInfoModelsByDc: getAllAvailableZoneInfoModelsByDc,\n findAvailableKeepersByDcAzAndOrg: findAvailableKeepersByDcAzAndOrg,\n getAllInfos: getAllInfos,\n getAllOrganizations: getAllOrganizations,\n getAllDiskTypes: getAllDiskTypes,\n addKeepercontainer: addKeepercontainer,\n updateKeepercontainer: updateKeepercontainer,\n getAllOverloadKeepercontainer: getAllOverloadKeepercontainer,\n getAllKeepercontainerUsedInfo: getAllKeepercontainerUsedInfo,\n getAllKeepers: getAllKeepers,\n getOverloadKeeperContainerMigrationProcess: getOverloadKeeperContainerMigrationProcess,\n beginToMigrateOverloadKeeperContainers: beginToMigrateOverloadKeeperContainers,\n migrateKeeperTaskTerminate: migrateKeeperTaskTerminate,\n resetElection: resetElection,\n releaseRdb: releaseRdb\n };\n }]);\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/services/KeeperContainerService.ts?"); +eval("angular\n .module('services')\n .service('KeeperContainerService', ['$resource', '$q', function ($resource, $q) {\n var resource = $resource('', {}, {\n find_availablekeepers_by_dc: {\n method: 'POST',\n url: '/console/dcs/:dcName/availablekeepers',\n isArray: true\n },\n find_active_kcs_by_dc_and_cluster: {\n method: 'GET',\n url: '/console/dcs/:dcName/cluster/:clusterName/activekeepercontainers',\n isArray: true\n },\n find_keepercontainer_by_id: {\n method: 'GET',\n url: '/console/keepercontainer/:id',\n },\n find_available_keepers_by_dc_az_and_org: {\n method: 'GET',\n url: '/console/keepercontainers/dc/az/org/tag',\n params: {\n dcName: '@dcName',\n azName: '@azName',\n orgName: '@orgName',\n tag: '@tag'\n },\n isArray: true\n },\n get_all_infos: {\n method: 'GET',\n url: '/console/keepercontainer/infos/all',\n isArray: true\n },\n get_all_diskTypes: {\n method: 'GET',\n url: '/console/keepercontainer/diskType',\n isArray: true\n },\n get_all_organizations: {\n method: 'GET',\n url: '/console/organizations',\n isArray: true\n },\n add_keepercontainer: {\n method: 'POST',\n url: '/console/keepercontainer'\n },\n update_keepercontainer: {\n method: 'PUT',\n url: '/console/keepercontainer'\n },\n get_all_overload_keepercontainer: {\n method: 'GET',\n url: '/console/keepercontainers/overload/all',\n isArray: true\n },\n get_all_overload_lasted_used_info: {\n method: 'GET',\n url: '/console/keepercontainer/overload/info/lasted',\n isArray: true\n },\n get_all_keepers: {\n method: 'GET',\n url: '/console/keepercontainer/keepers/:ip',\n isArray: true\n },\n get_overload_keepercontainer_migration_process: {\n method: 'GET',\n url: '/console/keepercontainer/overload/migration/process',\n isArray: true\n },\n get_all_available_zone_info_models_by_dc: {\n method: 'GET',\n url: '/console/az/dcs/tbl/:dcId',\n isArray: true\n },\n begin_to_migrate_overload_keepercontainer: {\n method: 'POST',\n url: '/console/keepercontainer/overload/migration/begin'\n },\n migrate_keeper_task_terminate: {\n method: 'POST',\n url: '/console/keepercontainer/overload/migration/terminate'\n },\n stop_to_migrate_overload_keepercontainer: {\n method: 'POST',\n url: '/console/keepercontainer/overload/migration/stop'\n },\n reset_election: {\n method: 'POST',\n url: '/api/keepers/election/reset/:ip/:port/:shardId'\n },\n release_rdb: {\n method: 'POST',\n url: '/api/keepers/release/rdb/:ip/:port/:shardId'\n }\n });\n function findActiveKeeperContainersByDc(dcName) {\n var d = $q.defer();\n resource.find_activekeepercontainers_by_dc({\n dcName: dcName\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function findAvailableKeepersByDc(dcName, shard) {\n var d = $q.defer();\n resource.find_availablekeepers_by_dc({\n dcName: dcName\n }, shard, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function findKeepercontainerById(id) {\n var d = $q.defer();\n resource.find_keepercontainer_by_id({\n id: id\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function findAvailableKeepersByDcAzOrgAndTag(dcName, azName, orgName, tag) {\n var d = $q.defer();\n resource.find_available_keepers_by_dc_az_and_org({\n dcName: dcName,\n azName: azName,\n orgName: orgName,\n tag: tag\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllAvailableZoneInfoModelsByDc(dcId) {\n var d = $q.defer();\n resource.get_all_available_zone_info_models_by_dc({\n dcId: dcId\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function findAvailableKeepersByDcAndCluster(dcName, clusterName) {\n var d = $q.defer();\n resource.find_active_kcs_by_dc_and_cluster({\n dcName: dcName,\n clusterName: clusterName\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllInfos() {\n var d = $q.defer();\n resource.get_all_infos({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllOrganizations() {\n var d = $q.defer();\n resource.get_all_organizations({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllDiskTypes() {\n var d = $q.defer();\n resource.get_all_diskTypes({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function addKeepercontainer(addr, dcName, orgName, azName, active, diskType, tag) {\n var d = $q.defer();\n resource.add_keepercontainer({}, {\n addr: addr,\n dcName: dcName,\n orgName: orgName,\n azName: azName,\n active: active,\n diskType: diskType,\n tag: tag,\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function updateKeepercontainer(addr, dcName, orgName, azName, active, diskType, tag) {\n var d = $q.defer();\n resource.update_keepercontainer({}, {\n addr: addr,\n dcName: dcName,\n orgName: orgName,\n azName: azName,\n active: active,\n diskType: diskType,\n tag: tag\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllOverloadKeepercontainer() {\n var d = $q.defer();\n resource.get_all_overload_keepercontainer({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllKeepercontainerUsedInfo() {\n var d = $q.defer();\n resource.get_all_overload_lasted_used_info({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getAllKeepers(ip) {\n var d = $q.defer();\n resource.get_all_keepers({\n ip: ip\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function getOverloadKeeperContainerMigrationProcess() {\n var d = $q.defer();\n resource.get_overload_keepercontainer_migration_process({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function beginToMigrateOverloadKeeperContainers() {\n var d = $q.defer();\n resource.begin_to_migrate_overload_keepercontainer(Array.from(arguments), function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function migrateKeeperTaskTerminate() {\n var d = $q.defer();\n resource.migrate_keeper_task_terminate({}, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function resetElection(ip, port, shardId) {\n var d = $q.defer();\n resource.reset_election({\n ip: ip,\n port: port,\n shardId: shardId\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n function releaseRdb(ip, port, shardId) {\n var d = $q.defer();\n resource.release_rdb({\n ip: ip,\n port: port,\n shardId: shardId\n }, function (result) {\n d.resolve(result);\n }, function (result) {\n d.reject(result);\n });\n return d.promise;\n }\n return {\n findAvailableKeepersByDc: findAvailableKeepersByDc,\n findAvailableKeepersByDcAndCluster: findAvailableKeepersByDcAndCluster,\n findKeepercontainerById: findKeepercontainerById,\n getAllAvailableZoneInfoModelsByDc: getAllAvailableZoneInfoModelsByDc,\n findAvailableKeepersByDcAzOrgAndTag: findAvailableKeepersByDcAzOrgAndTag,\n getAllInfos: getAllInfos,\n getAllOrganizations: getAllOrganizations,\n getAllDiskTypes: getAllDiskTypes,\n addKeepercontainer: addKeepercontainer,\n updateKeepercontainer: updateKeepercontainer,\n getAllOverloadKeepercontainer: getAllOverloadKeepercontainer,\n getAllKeepercontainerUsedInfo: getAllKeepercontainerUsedInfo,\n getAllKeepers: getAllKeepers,\n getOverloadKeeperContainerMigrationProcess: getOverloadKeeperContainerMigrationProcess,\n beginToMigrateOverloadKeeperContainers: beginToMigrateOverloadKeeperContainers,\n migrateKeeperTaskTerminate: migrateKeeperTaskTerminate,\n resetElection: resetElection,\n releaseRdb: releaseRdb\n };\n }]);\n\n\n//# sourceURL=webpack://XPipe-Console/./scripts/services/KeeperContainerService.ts?"); /***/ }), diff --git a/redis/redis-console/src/main/resources/static/scripts/controllers/KeeperMigrationCtl.ts b/redis/redis-console/src/main/resources/static/scripts/controllers/KeeperMigrationCtl.ts index 3605dbccd9..9a1aaf8bc4 100644 --- a/redis/redis-console/src/main/resources/static/scripts/controllers/KeeperMigrationCtl.ts +++ b/redis/redis-console/src/main/resources/static/scripts/controllers/KeeperMigrationCtl.ts @@ -34,8 +34,8 @@ function KeeperMigrationCtl($rootScope, $scope, $window, $stateParams, KeeperCon KeeperContainerService.findKeepercontainerById($scope.keepercontainerId) .then(function (result) { $scope.srcKeepercontainer = result; - KeeperContainerService.findAvailableKeepersByDcAzAndOrg($scope.srcKeepercontainer.dcName, - $scope.srcKeepercontainer.azName, $scope.srcKeepercontainer.orgName) + KeeperContainerService.findAvailableKeepersByDcAzOrgAndTag($scope.srcKeepercontainer.dcName, + $scope.srcKeepercontainer.azName, $scope.srcKeepercontainer.orgName, $scope.srcKeepercontainer.tag) .then(function (result) { $scope.availableKeeperContainers = result.filter(keepercontainer => keepercontainer.id != $scope.srcKeepercontainer.id); }); diff --git a/redis/redis-console/src/main/resources/static/scripts/controllers/KeepercontainerFormCtl.ts b/redis/redis-console/src/main/resources/static/scripts/controllers/KeepercontainerFormCtl.ts index dbb7421499..87e39a61b7 100644 --- a/redis/redis-console/src/main/resources/static/scripts/controllers/KeepercontainerFormCtl.ts +++ b/redis/redis-console/src/main/resources/static/scripts/controllers/KeepercontainerFormCtl.ts @@ -76,7 +76,7 @@ function KeepercontainerFormCtl($scope, $stateParams, $window, toastr, AppUtil, function doAddKeepercontainer() { if($scope.operateType == OPERATE_TYPE.CREATE) { KeeperContainerService.addKeepercontainer($scope.keepercontainer.addr, $scope.keepercontainer.dcName, - $scope.keepercontainer.orgName, $scope.keepercontainer.azName, $scope.keepercontainer.active, $scope.keepercontainer.diskType) + $scope.keepercontainer.orgName, $scope.keepercontainer.azName, $scope.keepercontainer.active, $scope.keepercontainer.diskType, $scope.keepercontainer.tag) .then(function(result) { if(result.message == 'success' ) { toastr.success("添加成功"); @@ -89,7 +89,7 @@ function KeepercontainerFormCtl($scope, $stateParams, $window, toastr, AppUtil, }); } else { KeeperContainerService.updateKeepercontainer($scope.keepercontainer.addr, $scope.keepercontainer.dcName, - $scope.keepercontainer.orgName, $scope.keepercontainer.azName, $scope.keepercontainer.active, $scope.keepercontainer.diskType) + $scope.keepercontainer.orgName, $scope.keepercontainer.azName, $scope.keepercontainer.active, $scope.keepercontainer.diskType, $scope.keepercontainer.tag) .then(function(result) { if(result.message == 'success' ) { toastr.success("修改成功"); diff --git a/redis/redis-console/src/main/resources/static/scripts/services/KeeperContainerService.ts b/redis/redis-console/src/main/resources/static/scripts/services/KeeperContainerService.ts index 406e85c304..7c812deca1 100644 --- a/redis/redis-console/src/main/resources/static/scripts/services/KeeperContainerService.ts +++ b/redis/redis-console/src/main/resources/static/scripts/services/KeeperContainerService.ts @@ -19,7 +19,13 @@ angular }, find_available_keepers_by_dc_az_and_org: { method: 'GET', - url: '/console/keepercontainers/dc/:dcName/az/:azName/org/:orgName', + url: '/console/keepercontainers/dc/az/org/tag', + params: { + dcName: '@dcName', + azName: '@azName', + orgName: '@orgName', + tag: '@tag' + }, isArray : true }, get_all_infos: { @@ -131,12 +137,13 @@ angular return d.promise; } - function findAvailableKeepersByDcAzAndOrg(dcName, azName, orgName) { + function findAvailableKeepersByDcAzOrgAndTag(dcName, azName, orgName, tag) { var d = $q.defer(); resource.find_available_keepers_by_dc_az_and_org({ dcName: dcName, azName: azName, - orgName: orgName + orgName: orgName, + tag: tag }, function (result) { d.resolve(result); @@ -206,7 +213,7 @@ angular return d.promise; } - function addKeepercontainer(addr, dcName, orgName, azName, active, diskType) { + function addKeepercontainer(addr, dcName, orgName, azName, active, diskType, tag) { var d = $q.defer(); resource.add_keepercontainer({}, { addr : addr, @@ -214,7 +221,8 @@ angular orgName : orgName, azName : azName, active :active, - diskType : diskType + diskType : diskType, + tag : tag, }, function(result) { d.resolve(result); @@ -224,7 +232,7 @@ angular return d.promise; } - function updateKeepercontainer(addr, dcName, orgName, azName, active, diskType) { + function updateKeepercontainer(addr, dcName, orgName, azName, active, diskType, tag) { var d = $q.defer(); resource.update_keepercontainer({}, { addr : addr, @@ -232,7 +240,8 @@ angular orgName : orgName, azName : azName, active :active, - diskType : diskType + diskType : diskType, + tag : tag }, function(result) { d.resolve(result); @@ -346,7 +355,7 @@ angular findAvailableKeepersByDcAndCluster : findAvailableKeepersByDcAndCluster, findKeepercontainerById : findKeepercontainerById, getAllAvailableZoneInfoModelsByDc : getAllAvailableZoneInfoModelsByDc, - findAvailableKeepersByDcAzAndOrg : findAvailableKeepersByDcAzAndOrg, + findAvailableKeepersByDcAzOrgAndTag : findAvailableKeepersByDcAzOrgAndTag, getAllInfos: getAllInfos, getAllOrganizations: getAllOrganizations, getAllDiskTypes: getAllDiskTypes, diff --git a/redis/redis-console/src/main/resources/static/views/index/cluster_form.html b/redis/redis-console/src/main/resources/static/views/index/cluster_form.html index a8dd3d5788..40b5b8734e 100644 --- a/redis/redis-console/src/main/resources/static/views/index/cluster_form.html +++ b/redis/redis-console/src/main/resources/static/views/index/cluster_form.html @@ -111,6 +111,16 @@

Cluster信息

+
+ +
+ +
+
+ @@ -184,6 +194,14 @@

Cluster信息

+
+ + +
+ +
+
+
diff --git a/redis/redis-console/src/main/resources/static/views/index/cluster_list.html b/redis/redis-console/src/main/resources/static/views/index/cluster_list.html index e246b5053e..1af84c9797 100644 --- a/redis/redis-console/src/main/resources/static/views/index/cluster_list.html +++ b/redis/redis-console/src/main/resources/static/views/index/cluster_list.html @@ -61,6 +61,7 @@ + 数据中心  Cluster  diff --git a/redis/redis-console/src/main/resources/static/views/index/keepercontainer_form.html b/redis/redis-console/src/main/resources/static/views/index/keepercontainer_form.html index 582b22d847..3d00cb204d 100644 --- a/redis/redis-console/src/main/resources/static/views/index/keepercontainer_form.html +++ b/redis/redis-console/src/main/resources/static/views/index/keepercontainer_form.html @@ -105,6 +105,16 @@

修改KeeperContainer

+
+ +
+ +
+
+
diff --git a/redis/redis-console/src/main/resources/static/views/index/keepercontainer_list.html b/redis/redis-console/src/main/resources/static/views/index/keepercontainer_list.html index cb1f572f79..84bde377db 100644 --- a/redis/redis-console/src/main/resources/static/views/index/keepercontainer_list.html +++ b/redis/redis-console/src/main/resources/static/views/index/keepercontainer_list.html @@ -23,6 +23,7 @@ {{info.active}} {{info.diskType}} {{info.azName}} + {{info.tag}} {{info.keeperCount}} {{info.clusterCount}} diff --git a/redis/redis-console/src/test/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerCheckerServiceImplTest.java b/redis/redis-console/src/test/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerCheckerServiceImplTest.java index ae14772d88..9090f7829a 100644 --- a/redis/redis-console/src/test/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerCheckerServiceImplTest.java +++ b/redis/redis-console/src/test/java/com/ctrip/xpipe/redis/console/service/impl/KeeperContainerCheckerServiceImplTest.java @@ -8,27 +8,18 @@ import com.ctrip.xpipe.redis.console.model.ClusterTbl; import com.ctrip.xpipe.redis.console.model.KeeperContainerInfoModel; import com.ctrip.xpipe.redis.console.model.KeepercontainerTbl; -import com.ctrip.xpipe.redis.core.entity.KeeperInstanceMeta; -import com.ctrip.xpipe.redis.core.entity.KeeperMeta; -import com.ctrip.xpipe.redis.core.entity.KeeperTransMeta; import com.ctrip.xpipe.spring.RestTemplateFactory; import com.ctrip.xpipe.utils.StringUtil; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; -import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.*; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.web.client.RestTemplate; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -283,6 +274,7 @@ public void testUpdateKeeperContainerByInfoModel() { keeper.setAzName(null); keeper.setOrgName("org-1"); + keeper.setTag("tag-1"); keeper.setActive(false); keeper.setDcName("jq"); keeper.setDiskType("AWS_1T"); @@ -295,6 +287,7 @@ public void testUpdateKeeperContainerByInfoModel() { Assert.assertEquals(7033, keeper1.getAddr().getPort()); Assert.assertEquals(false, keeper1.isActive()); Assert.assertEquals("org-1", keeper1.getOrgName()); + Assert.assertEquals("tag-1", keeper1.getTag()); Assert.assertEquals(null, keeper1.getAzName()); Assert.assertEquals("AWS_1T", keeper1.getDiskType()); @@ -371,16 +364,16 @@ public void testFindKeeperContainerById() { @Test public void testFindKeeperContainerByDcAzAndOrg() { - List keeperContainers = keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzAndOrg("fra", "A", "org-1"); + List keeperContainers = keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzOrgAndTag("fra", "A", "org-1", ""); Assert.assertEquals(0, keeperContainers.size()); - keeperContainers = keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzAndOrg("fra", "A", ""); + keeperContainers = keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzOrgAndTag("fra", "A", "", ""); Assert.assertEquals(2, keeperContainers.size()); - keeperContainers = keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzAndOrg("jq", "", "org-1"); + keeperContainers = keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzOrgAndTag("jq", "", "org-1", ""); Assert.assertEquals(2, keeperContainers.size()); - keeperContainers = keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzAndOrg("jq", "", ""); + keeperContainers = keeperContainerService.findAvailableKeeperContainerInfoModelsByDcAzOrgAndTag("jq", "", "", ""); Assert.assertEquals(3, keeperContainers.size()); } diff --git a/redis/redis-core/src/main/resources/META-INF/dal/model/keeper-codegen.xml b/redis/redis-core/src/main/resources/META-INF/dal/model/keeper-codegen.xml index 108cdc8641..2fbc8d197c 100644 --- a/redis/redis-core/src/main/resources/META-INF/dal/model/keeper-codegen.xml +++ b/redis/redis-core/src/main/resources/META-INF/dal/model/keeper-codegen.xml @@ -39,6 +39,7 @@ +