v2.8.0_e初始化

1、测试代码,开源用户尽量不要使用;
2、包含Kafka-HA的相关功能;
3、并非基于2.6.0拉的分支,是基于master分支的 commit-id: 462303fca0 拉的2.8.0_e的分支。出现这个情况的原因是v2.6.0的代码并不是最新的,2.x最新的代码是 462303fca0 这个commit对应的代码;
This commit is contained in:
zengqiao
2023-02-13 16:35:43 +08:00
parent 462303fca0
commit e81c0f3040
178 changed files with 9938 additions and 1674 deletions

View File

@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.util.List;
@@ -13,6 +15,8 @@ import java.util.List;
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description = "Quota工单审批参数")
@NoArgsConstructor
@AllArgsConstructor
public class OrderHandleQuotaDTO {
@ApiModelProperty(value = "分区数, 非必须")
private Integer partitionNum;

View File

@@ -3,24 +3,31 @@ package com.xiaojukeji.kafka.manager.bpm.order.impl;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.xiaojukeji.kafka.manager.account.AccountService;
import com.xiaojukeji.kafka.manager.common.entity.ao.gateway.TopicQuota;
import com.xiaojukeji.kafka.manager.common.entity.ResultStatus;
import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account;
import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.OrderExtensionAuthorityDTO;
import com.xiaojukeji.kafka.manager.bpm.common.entry.detail.AbstractOrderDetailData;
import com.xiaojukeji.kafka.manager.bpm.common.entry.detail.OrderDetailApplyAuthorityDTO;
import com.xiaojukeji.kafka.manager.bpm.common.handle.OrderHandleBaseDTO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AppDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AuthorityDO;
import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils;
import com.xiaojukeji.kafka.manager.bpm.order.AbstractAuthorityOrder;
import com.xiaojukeji.kafka.manager.common.bizenum.ha.HaRelationTypeEnum;
import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.common.entity.ResultStatus;
import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account;
import com.xiaojukeji.kafka.manager.common.entity.ao.gateway.TopicQuota;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.LogicalClusterDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.OrderDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.TopicDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AppDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AuthorityDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ha.HaASRelationDO;
import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils;
import com.xiaojukeji.kafka.manager.service.biz.ha.HaASRelationManager;
import com.xiaojukeji.kafka.manager.service.cache.LogicalClusterMetadataManager;
import com.xiaojukeji.kafka.manager.bpm.order.AbstractAuthorityOrder;
import com.xiaojukeji.kafka.manager.service.cache.PhysicalClusterMetadataManager;
import com.xiaojukeji.kafka.manager.service.service.TopicManagerService;
import com.xiaojukeji.kafka.manager.service.service.gateway.AppService;
import com.xiaojukeji.kafka.manager.service.service.gateway.AuthorityService;
import com.xiaojukeji.kafka.manager.service.service.TopicManagerService;
import com.xiaojukeji.kafka.manager.service.service.ha.HaTopicService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -52,6 +59,12 @@ public class ApplyAuthorityOrder extends AbstractAuthorityOrder {
@Autowired
private TopicManagerService topicManagerService;
@Autowired
private HaTopicService haTopicService;
@Autowired
private HaASRelationManager haASRelationManager;
@Override
public AbstractOrderDetailData getOrderExtensionDetailData(String extensions) {
OrderDetailApplyAuthorityDTO orderDetailDTO = new OrderDetailApplyAuthorityDTO();
@@ -116,21 +129,40 @@ public class ApplyAuthorityOrder extends AbstractAuthorityOrder {
if (ValidateUtils.isNull(physicalClusterId)) {
return ResultStatus.CLUSTER_NOT_EXIST;
}
TopicQuota topicQuotaDO = new TopicQuota();
topicQuotaDO.setAppId(orderExtensionDTO.getAppId());
topicQuotaDO.setTopicName(orderExtensionDTO.getTopicName());
topicQuotaDO.setClusterId(physicalClusterId);
AuthorityDO authorityDO = new AuthorityDO();
authorityDO.setAccess(orderExtensionDTO.getAccess());
authorityDO.setAppId(orderExtensionDTO.getAppId());
authorityDO.setTopicName(orderExtensionDTO.getTopicName());
authorityDO.setClusterId(physicalClusterId);
// authorityDO.setApplicant(orderDO.getApplicant());
HaASRelationDO relation = haASRelationManager.getASRelation(physicalClusterId, orderExtensionDTO.getTopicName());
if (authorityService.addAuthorityAndQuota(authorityDO, topicQuotaDO) < 1) {
return ResultStatus.OPERATION_FAILED;
//是否高可用topic
Integer haRelation = HaRelationTypeEnum.UNKNOWN.getCode();
if (relation != null){
//用户侧不允许操作备topic
if (relation.getStandbyClusterPhyId().equals(orderExtensionDTO.getClusterId())){
return ResultStatus.OPERATION_FORBIDDEN;
}
haRelation = HaRelationTypeEnum.ACTIVE.getCode();
}
ResultStatus resultStatus = applyAuthority(physicalClusterId,
orderExtensionDTO.getTopicName(),
userName,
orderExtensionDTO.getAppId(),
orderExtensionDTO.getAccess(),
haRelation);
if (haRelation.equals(HaRelationTypeEnum.UNKNOWN.getCode())
&& ResultStatus.SUCCESS.getCode() != resultStatus.getCode()){
return resultStatus;
}
//给备topic添加权限
if (relation.getActiveResName().equals(orderExtensionDTO.getTopicName())){
return applyAuthority(relation.getStandbyClusterPhyId(),
relation.getStandbyResName(),
userName,
orderExtensionDTO.getAppId(),
orderExtensionDTO.getAccess(),
HaRelationTypeEnum.STANDBY.getCode());
}
return ResultStatus.SUCCESS;
}
@@ -158,4 +190,39 @@ public class ApplyAuthorityOrder extends AbstractAuthorityOrder {
}
return approverList;
}
private ResultStatus applyAuthority(Long physicalClusterId, String topicName, String userName, String appId, Integer access, Integer haRelation){
ClusterDO clusterDO = PhysicalClusterMetadataManager.getClusterFromCache(physicalClusterId);
if (clusterDO == null){
return ResultStatus.CLUSTER_NOT_EXIST;
}
TopicQuota topicQuotaDO = new TopicQuota();
topicQuotaDO.setAppId(appId);
topicQuotaDO.setTopicName(topicName);
topicQuotaDO.setClusterId(physicalClusterId);
AuthorityDO authorityDO = new AuthorityDO();
authorityDO.setAccess(access);
authorityDO.setAppId(appId);
authorityDO.setTopicName(topicName);
authorityDO.setClusterId(physicalClusterId);
if (authorityService.addAuthorityAndQuota(authorityDO, topicQuotaDO) < 1) {
return ResultStatus.OPERATION_FAILED;
}
Result result = new Result();
HaASRelationDO relation = haASRelationManager.getASRelation(physicalClusterId, topicName);
if (HaRelationTypeEnum.STANDBY.getCode() == haRelation){
result = haTopicService.activeUserHAInKafka(PhysicalClusterMetadataManager.getClusterFromCache(relation.getActiveClusterPhyId()),
PhysicalClusterMetadataManager.getClusterFromCache(relation.getStandbyClusterPhyId()),
appId,
userName);
}
if (result.failed()){
return ResultStatus.ZOOKEEPER_OPERATE_FAILED;
}
return ResultStatus.SUCCESS;
}
}

View File

@@ -3,6 +3,7 @@ package com.xiaojukeji.kafka.manager.bpm.order.impl;
import com.alibaba.fastjson.JSONObject;
import com.xiaojukeji.kafka.manager.account.AccountService;
import com.xiaojukeji.kafka.manager.bpm.common.OrderTypeEnum;
import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.OrderExtensionQuotaDTO;
import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.PartitionOrderExtensionDTO;
import com.xiaojukeji.kafka.manager.bpm.common.entry.detail.AbstractOrderDetailData;
import com.xiaojukeji.kafka.manager.bpm.common.entry.detail.PartitionOrderDetailData;
@@ -12,16 +13,17 @@ import com.xiaojukeji.kafka.manager.bpm.order.AbstractOrder;
import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.common.entity.ResultStatus;
import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account;
import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.OrderExtensionQuotaDTO;
import com.xiaojukeji.kafka.manager.common.entity.metrics.TopicMetrics;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.LogicalClusterDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.OrderDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.RegionDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ha.HaASRelationDO;
import com.xiaojukeji.kafka.manager.common.utils.DateUtils;
import com.xiaojukeji.kafka.manager.common.utils.ListUtils;
import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils;
import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.TopicMetadata;
import com.xiaojukeji.kafka.manager.service.biz.ha.HaASRelationManager;
import com.xiaojukeji.kafka.manager.service.cache.KafkaMetricsCache;
import com.xiaojukeji.kafka.manager.service.cache.LogicalClusterMetadataManager;
import com.xiaojukeji.kafka.manager.service.cache.PhysicalClusterMetadataManager;
@@ -61,6 +63,9 @@ public class ApplyPartitionOrder extends AbstractOrder {
@Autowired
private RegionService regionService;
@Autowired
private HaASRelationManager haASRelationManager;
@Override
public AbstractOrderDetailData getOrderExtensionDetailData(String extensions) {
PartitionOrderDetailData detailData = new PartitionOrderDetailData();
@@ -169,28 +174,30 @@ public class ApplyPartitionOrder extends AbstractOrder {
if (ValidateUtils.isNull(physicalClusterId)) {
return ResultStatus.CLUSTER_NOT_EXIST;
}
if (!PhysicalClusterMetadataManager.isTopicExistStrictly(physicalClusterId, extensionDTO.getTopicName())) {
return ResultStatus.TOPIC_NOT_EXIST;
}
if (handleDTO.isExistNullParam()) {
return ResultStatus.OPERATION_FAILED;
}
ClusterDO clusterDO = clusterService.getById(physicalClusterId);
return adminService.expandPartitions(
clusterDO,
extensionDTO.getTopicName(),
handleDTO.getPartitionNum(),
handleDTO.getRegionId(),
handleDTO.getBrokerIdList(),
userName
);
}
private OrderExtensionQuotaDTO supplyExtension(OrderExtensionQuotaDTO extensionDTO, OrderHandleQuotaDTO handleDTO){
extensionDTO.setPartitionNum(handleDTO.getPartitionNum());
extensionDTO.setRegionId(handleDTO.getRegionId());
extensionDTO.setBrokerIdList(handleDTO.getBrokerIdList());
return extensionDTO;
//备topic扩分区
HaASRelationDO relationDO = haASRelationManager.getASRelation(physicalClusterId, extensionDTO.getTopicName());
if (relationDO != null){
//用户侧不允许操作备topic
if (relationDO.getStandbyClusterPhyId().equals(extensionDTO.getClusterId())){
return ResultStatus.OPERATION_FORBIDDEN;
}
ResultStatus rv = apply(relationDO.getStandbyClusterPhyId(),
relationDO.getStandbyResName(),
userName,
handleDTO.getPartitionNum(),
null,
PhysicalClusterMetadataManager.getBrokerIdList(relationDO.getStandbyClusterPhyId()));
if (ResultStatus.SUCCESS.getCode() != rv.getCode()){
return rv;
}
}
return apply(physicalClusterId, extensionDTO.getTopicName(), userName,
handleDTO.getPartitionNum(), handleDTO.getRegionId(), handleDTO.getBrokerIdList());
}
@Override
@@ -206,4 +213,29 @@ public class ApplyPartitionOrder extends AbstractOrder {
return accountService.getAdminOrderHandlerFromCache();
}
private ResultStatus apply(Long physicalClusterId, String topicName, String userName, int partitionNum, Long regionId, List<Integer> brokerIds){
ClusterDO clusterDO = clusterService.getById(physicalClusterId);
if (clusterDO == null){
return ResultStatus.CLUSTER_NOT_EXIST;
}
if (!PhysicalClusterMetadataManager.isTopicExistStrictly(physicalClusterId, topicName)) {
return ResultStatus.TOPIC_NOT_EXIST;
}
return adminService.expandPartitions(
clusterDO,
topicName,
partitionNum,
regionId,
brokerIds,
userName
);
}
private OrderExtensionQuotaDTO supplyExtension(OrderExtensionQuotaDTO extensionDTO, OrderHandleQuotaDTO handleDTO){
extensionDTO.setPartitionNum(handleDTO.getPartitionNum());
extensionDTO.setRegionId(handleDTO.getRegionId());
extensionDTO.setBrokerIdList(handleDTO.getBrokerIdList());
return extensionDTO;
}
}

View File

@@ -3,39 +3,46 @@ package com.xiaojukeji.kafka.manager.bpm.order.impl;
import com.alibaba.fastjson.JSONObject;
import com.xiaojukeji.kafka.manager.account.AccountService;
import com.xiaojukeji.kafka.manager.bpm.common.OrderTypeEnum;
import com.xiaojukeji.kafka.manager.bpm.order.AbstractOrder;
import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account;
import com.xiaojukeji.kafka.manager.common.entity.ao.gateway.TopicQuota;
import com.xiaojukeji.kafka.manager.common.entity.ResultStatus;
import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.OrderExtensionQuotaDTO;
import com.xiaojukeji.kafka.manager.bpm.common.entry.detail.AbstractOrderDetailData;
import com.xiaojukeji.kafka.manager.bpm.common.entry.detail.QuotaOrderDetailData;
import com.xiaojukeji.kafka.manager.bpm.common.handle.OrderHandleBaseDTO;
import com.xiaojukeji.kafka.manager.bpm.common.handle.OrderHandleQuotaDTO;
import com.xiaojukeji.kafka.manager.bpm.order.AbstractOrder;
import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.common.entity.ResultStatus;
import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account;
import com.xiaojukeji.kafka.manager.common.entity.ao.gateway.TopicQuota;
import com.xiaojukeji.kafka.manager.common.entity.metrics.TopicMetrics;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.LogicalClusterDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.OrderDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.RegionDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AppDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ha.HaASRelationDO;
import com.xiaojukeji.kafka.manager.common.utils.DateUtils;
import com.xiaojukeji.kafka.manager.common.utils.ListUtils;
import com.xiaojukeji.kafka.manager.common.utils.NumberUtils;
import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils;
import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.TopicMetadata;
import com.xiaojukeji.kafka.manager.common.zookeeper.znode.config.TopicQuotaData;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.OrderDO;
import com.xiaojukeji.kafka.manager.service.biz.ha.HaASRelationManager;
import com.xiaojukeji.kafka.manager.service.cache.KafkaMetricsCache;
import com.xiaojukeji.kafka.manager.service.cache.LogicalClusterMetadataManager;
import com.xiaojukeji.kafka.manager.service.cache.PhysicalClusterMetadataManager;
import com.xiaojukeji.kafka.manager.service.service.*;
import com.xiaojukeji.kafka.manager.service.service.AdminService;
import com.xiaojukeji.kafka.manager.service.service.ClusterService;
import com.xiaojukeji.kafka.manager.service.service.RegionService;
import com.xiaojukeji.kafka.manager.service.service.TopicManagerService;
import com.xiaojukeji.kafka.manager.service.service.gateway.AppService;
import com.xiaojukeji.kafka.manager.service.service.gateway.QuotaService;
import com.xiaojukeji.kafka.manager.service.utils.KafkaZookeeperUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
@@ -68,6 +75,9 @@ public class ApplyQuotaOrder extends AbstractOrder {
@Autowired
private RegionService regionService;
@Autowired
private HaASRelationManager haASRelationManager;
@Override
public AbstractOrderDetailData getOrderExtensionDetailData(String extensions) {
QuotaOrderDetailData orderDetailDTO = new QuotaOrderDetailData();
@@ -198,40 +208,40 @@ public class ApplyQuotaOrder extends AbstractOrder {
if (ValidateUtils.isNull(physicalClusterId)) {
return ResultStatus.CLUSTER_NOT_EXIST;
}
if (!PhysicalClusterMetadataManager.isTopicExistStrictly(physicalClusterId, extensionDTO.getTopicName())) {
return ResultStatus.TOPIC_NOT_EXIST;
}
if (!handleDTO.isExistNullParam()) {
ClusterDO clusterDO = clusterService.getById(physicalClusterId);
ResultStatus resultStatus = adminService.expandPartitions(
clusterDO,
extensionDTO.getTopicName(),
handleDTO.getPartitionNum(),
handleDTO.getRegionId(),
handleDTO.getBrokerIdList(),
userName);
if (!ResultStatus.SUCCESS.equals(resultStatus)) {
return resultStatus;
//备topic调整quota
HaASRelationDO relationDO = haASRelationManager.getASRelation(physicalClusterId, extensionDTO.getTopicName());
if (relationDO != null){
if (relationDO.getStandbyClusterPhyId().equals(physicalClusterId)){
return ResultStatus.OPERATION_FORBIDDEN;
}
List<Integer> standbyBrokerIds = PhysicalClusterMetadataManager.getBrokerIdList(relationDO.getStandbyClusterPhyId());
if(standbyBrokerIds == null || standbyBrokerIds.isEmpty()){
return ResultStatus.BROKER_NOT_EXIST;
}
OrderExtensionQuotaDTO standbyDto = new OrderExtensionQuotaDTO();
standbyDto.setClusterId(relationDO.getStandbyClusterPhyId());
standbyDto.setTopicName(relationDO.getStandbyResName());
standbyDto.setConsumeQuota(extensionDTO.getConsumeQuota());
standbyDto.setProduceQuota(extensionDTO.getProduceQuota());
standbyDto.setAppId(extensionDTO.getAppId());
ResultStatus rv = applyQuota(userName,
new OrderHandleQuotaDTO(handleDTO.getPartitionNum(), null, standbyBrokerIds),
standbyDto);
if (ResultStatus.SUCCESS.getCode() != rv.getCode()){
return rv;
}
}
TopicQuota topicQuotaDO = new TopicQuota();
topicQuotaDO.setAppId(extensionDTO.getAppId());
topicQuotaDO.setTopicName(extensionDTO.getTopicName());
topicQuotaDO.setConsumeQuota(extensionDTO.getConsumeQuota());
topicQuotaDO.setProduceQuota(extensionDTO.getProduceQuota());
topicQuotaDO.setClusterId(physicalClusterId);
if (quotaService.addTopicQuota(topicQuotaDO) > 0) {
orderDO.setExtensions(JSONObject.toJSONString(supplyExtension(extensionDTO, handleDTO)));
return ResultStatus.SUCCESS;
}
return ResultStatus.OPERATION_FAILED;
}
private OrderExtensionQuotaDTO supplyExtension(OrderExtensionQuotaDTO extensionDTO, OrderHandleQuotaDTO handleDTO){
extensionDTO.setPartitionNum(handleDTO.getPartitionNum());
extensionDTO.setRegionId(handleDTO.getRegionId());
extensionDTO.setBrokerIdList(handleDTO.getBrokerIdList());
return extensionDTO;
extensionDTO.setClusterId(physicalClusterId);
ResultStatus resultStatus = applyQuota(userName, handleDTO, extensionDTO);
if (ResultStatus.SUCCESS.getCode() != resultStatus.getCode()){
return resultStatus;
}
orderDO.setExtensions(JSONObject.toJSONString(supplyExtension(extensionDTO, handleDTO)));
return ResultStatus.SUCCESS;
}
@Override
@@ -246,4 +256,43 @@ public class ApplyQuotaOrder extends AbstractOrder {
public List<Account> getApproverList(String extensions) {
return accountService.getAdminOrderHandlerFromCache();
}
private ResultStatus applyQuota(
String userName,
OrderHandleQuotaDTO handleDTO,
OrderExtensionQuotaDTO dto){
if (!PhysicalClusterMetadataManager.isTopicExistStrictly(dto.getClusterId(), dto.getTopicName())) {
return ResultStatus.TOPIC_NOT_EXIST;
}
if (!handleDTO.isExistNullParam()) {
ClusterDO clusterDO = clusterService.getById(dto.getClusterId());
ResultStatus resultStatus = adminService.expandPartitions(
clusterDO,
dto.getTopicName(),
handleDTO.getPartitionNum(),
handleDTO.getRegionId(),
handleDTO.getBrokerIdList(),
userName);
if (!ResultStatus.SUCCESS.equals(resultStatus)) {
return resultStatus;
}
}
TopicQuota topicQuotaDO = new TopicQuota();
topicQuotaDO.setAppId(dto.getAppId());
topicQuotaDO.setTopicName(dto.getTopicName());
topicQuotaDO.setConsumeQuota(dto.getConsumeQuota());
topicQuotaDO.setProduceQuota(dto.getProduceQuota());
topicQuotaDO.setClusterId(dto.getClusterId());
if (quotaService.addTopicQuota(topicQuotaDO) > 0) {
return ResultStatus.SUCCESS;
}
return ResultStatus.OPERATION_FAILED;
}
private OrderExtensionQuotaDTO supplyExtension(OrderExtensionQuotaDTO extensionDTO, OrderHandleQuotaDTO handleDTO){
extensionDTO.setPartitionNum(handleDTO.getPartitionNum());
extensionDTO.setRegionId(handleDTO.getRegionId());
extensionDTO.setBrokerIdList(handleDTO.getBrokerIdList());
return extensionDTO;
}
}

View File

@@ -2,27 +2,29 @@ package com.xiaojukeji.kafka.manager.bpm.order.impl;
import com.alibaba.fastjson.JSONObject;
import com.xiaojukeji.kafka.manager.bpm.common.OrderTypeEnum;
import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AppDO;
import com.xiaojukeji.kafka.manager.common.constant.Constant;
import com.xiaojukeji.kafka.manager.common.entity.ResultStatus;
import com.xiaojukeji.kafka.manager.common.entity.ao.topic.TopicConnection;
import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.OrderExtensionDeleteTopicDTO;
import com.xiaojukeji.kafka.manager.bpm.common.entry.detail.AbstractOrderDetailData;
import com.xiaojukeji.kafka.manager.bpm.common.entry.detail.OrderDetailDeleteTopicDTO;
import com.xiaojukeji.kafka.manager.bpm.common.handle.OrderHandleBaseDTO;
import com.xiaojukeji.kafka.manager.common.entity.vo.normal.cluster.ClusterNameDTO;
import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils;
import com.xiaojukeji.kafka.manager.bpm.order.AbstractTopicOrder;
import com.xiaojukeji.kafka.manager.common.constant.Constant;
import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.common.entity.ResultStatus;
import com.xiaojukeji.kafka.manager.common.entity.ao.topic.TopicConnection;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.OrderDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.TopicDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AppDO;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ha.HaASRelationDO;
import com.xiaojukeji.kafka.manager.common.entity.vo.normal.cluster.ClusterNameDTO;
import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils;
import com.xiaojukeji.kafka.manager.service.biz.ha.HaASRelationManager;
import com.xiaojukeji.kafka.manager.service.cache.LogicalClusterMetadataManager;
import com.xiaojukeji.kafka.manager.service.cache.PhysicalClusterMetadataManager;
import com.xiaojukeji.kafka.manager.bpm.order.AbstractTopicOrder;
import com.xiaojukeji.kafka.manager.service.service.AdminService;
import com.xiaojukeji.kafka.manager.service.service.gateway.AppService;
import com.xiaojukeji.kafka.manager.service.service.ClusterService;
import com.xiaojukeji.kafka.manager.service.service.TopicManagerService;
import com.xiaojukeji.kafka.manager.service.service.gateway.AppService;
import com.xiaojukeji.kafka.manager.service.service.gateway.TopicConnectionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -54,6 +56,9 @@ public class DeleteTopicOrder extends AbstractTopicOrder {
@Autowired
private TopicConnectionService connectionService;
@Autowired
private HaASRelationManager haASRelationManager;
@Override
public AbstractOrderDetailData getOrderExtensionDetailData(String extensions) {
OrderDetailDeleteTopicDTO orderDetailDTO = new OrderDetailDeleteTopicDTO();
@@ -128,26 +133,32 @@ public class DeleteTopicOrder extends AbstractTopicOrder {
if (ValidateUtils.isNull(physicalClusterId)) {
return ResultStatus.CLUSTER_NOT_EXIST;
}
HaASRelationDO relationDO = haASRelationManager.getASRelation(physicalClusterId, extensionDTO.getTopicName());
if (relationDO != null) {
//高可用topic需要先解除高可用关系才能删除
return ResultStatus.HA_TOPIC_DELETE_FORBIDDEN;
}
return delTopic(physicalClusterId, extensionDTO.getTopicName(), userName);
}
private ResultStatus delTopic(Long physicalClusterId, String topicName, String userName){
ClusterDO clusterDO = clusterService.getById(physicalClusterId);
if (!PhysicalClusterMetadataManager.isTopicExistStrictly(physicalClusterId, extensionDTO.getTopicName())) {
if (!PhysicalClusterMetadataManager.isTopicExistStrictly(physicalClusterId, topicName)) {
return ResultStatus.TOPIC_NOT_EXIST;
}
// 最近topic是否还有生产或者消费操作
if (connectionService.isExistConnection(
physicalClusterId,
extensionDTO.getTopicName(),
topicName,
new Date(System.currentTimeMillis() - Constant.TOPIC_CONNECTION_LATEST_TIME_MS),
new Date())
) {
) {
return ResultStatus.OPERATION_FORBIDDEN;
}
ResultStatus resultStatus = adminService.deleteTopic(clusterDO, extensionDTO.getTopicName(), userName);
if (!ResultStatus.SUCCESS.equals(resultStatus)) {
return resultStatus;
}
return resultStatus;
return adminService.deleteTopic(clusterDO, topicName, userName);
}
}

View File

@@ -155,6 +155,7 @@ public class ThirdPartDeleteTopicOrder extends AbstractTopicOrder {
return ResultStatus.USER_WITHOUT_AUTHORITY;
}
ResultStatus resultStatus = adminService.deleteTopic(clusterDO, extensionDTO.getTopicName(), userName);
if (!ResultStatus.SUCCESS.equals(resultStatus)) {
return resultStatus;

View File

@@ -1,40 +0,0 @@
package com.xiaojukeji.kafka.manager.kcm.common.bizenum;
/**
* 任务动作
* @author zengqiao
* @date 20/4/26
*/
public enum ClusterTaskActionEnum {
UNKNOWN("unknown"),
START("start"),
PAUSE("pause"),
IGNORE("ignore"),
CANCEL("cancel"),
REDO("redo"),
KILL("kill"),
ROLLBACK("rollback"),
;
private String action;
ClusterTaskActionEnum(String action) {
this.action = action;
}
public String getAction() {
return action;
}
@Override
public String toString() {
return "ClusterTaskActionEnum{" +
"action='" + action + '\'' +
'}';
}
}

View File

@@ -1,7 +1,7 @@
package com.xiaojukeji.kafka.manager.kcm.component.agent;
import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskActionEnum;
import com.xiaojukeji.kafka.manager.common.bizenum.TaskActionEnum;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskStateEnum;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskSubStateEnum;
import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskLog;
@@ -37,7 +37,7 @@ public abstract class AbstractAgent {
* @param actionEnum 执行动作
* @return true:触发成功, false:触发失败
*/
public abstract boolean actionTask(Long taskId, ClusterTaskActionEnum actionEnum);
public abstract boolean actionTask(Long taskId, TaskActionEnum actionEnum);
/**
* 执行任务
@@ -46,7 +46,7 @@ public abstract class AbstractAgent {
* @param hostname 具体主机
* @return true:触发成功, false:触发失败
*/
public abstract boolean actionHostTask(Long taskId, ClusterTaskActionEnum actionEnum, String hostname);
public abstract boolean actionHostTask(Long taskId, TaskActionEnum actionEnum, String hostname);
/**
* 获取任务运行的状态[阻塞, 执行中, 完成等]

View File

@@ -3,7 +3,7 @@ package com.xiaojukeji.kafka.manager.kcm.component.agent.n9e;
import com.xiaojukeji.kafka.manager.common.bizenum.KafkaFileEnum;
import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.kcm.common.Constant;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskActionEnum;
import com.xiaojukeji.kafka.manager.common.bizenum.TaskActionEnum;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskTypeEnum;
import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskLog;
import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.CreationTaskData;
@@ -94,7 +94,7 @@ public class N9e extends AbstractAgent {
}
@Override
public boolean actionTask(Long taskId, ClusterTaskActionEnum actionEnum) {
public boolean actionTask(Long taskId, TaskActionEnum actionEnum) {
Map<String, Object> param = new HashMap<>(1);
param.put("action", actionEnum.getAction());
@@ -115,7 +115,7 @@ public class N9e extends AbstractAgent {
}
@Override
public boolean actionHostTask(Long taskId, ClusterTaskActionEnum actionEnum, String hostname) {
public boolean actionHostTask(Long taskId, TaskActionEnum actionEnum, String hostname) {
Map<String, Object> params = new HashMap<>(2);
params.put("action", actionEnum.getAction());
params.put("hostname", hostname);
@@ -234,7 +234,7 @@ public class N9e extends AbstractAgent {
n9eCreationTask.setScript(this.script);
n9eCreationTask.setArgs(sb.toString());
n9eCreationTask.setAccount(this.account);
n9eCreationTask.setAction(ClusterTaskActionEnum.PAUSE.getAction());
n9eCreationTask.setAction(TaskActionEnum.PAUSE.getAction());
n9eCreationTask.setHosts(creationTaskData.getHostList());
return n9eCreationTask;
}

View File

@@ -4,7 +4,7 @@ import com.xiaojukeji.kafka.manager.common.utils.ListUtils;
import com.xiaojukeji.kafka.manager.common.utils.SpringTool;
import com.xiaojukeji.kafka.manager.kcm.ClusterTaskService;
import com.xiaojukeji.kafka.manager.kcm.common.Converters;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskActionEnum;
import com.xiaojukeji.kafka.manager.common.bizenum.TaskActionEnum;
import com.xiaojukeji.kafka.manager.kcm.common.entry.ClusterTaskConstant;
import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskLog;
import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskSubStatus;
@@ -93,38 +93,38 @@ public class ClusterTaskServiceImpl implements ClusterTaskService {
return ResultStatus.CALL_CLUSTER_TASK_AGENT_FAILED;
}
if (ClusterTaskActionEnum.START.getAction().equals(action) && ClusterTaskStateEnum.BLOCKED.equals(stateEnumResult.getData())) {
if (TaskActionEnum.START.getAction().equals(action) && ClusterTaskStateEnum.BLOCKED.equals(stateEnumResult.getData())) {
// 暂停状态, 可以执行开始
return actionTaskExceptRollbackAction(agentTaskId, ClusterTaskActionEnum.START, "");
return actionTaskExceptRollbackAction(agentTaskId, TaskActionEnum.START, "");
}
if (ClusterTaskActionEnum.PAUSE.getAction().equals(action) && ClusterTaskStateEnum.RUNNING.equals(stateEnumResult.getData())) {
if (TaskActionEnum.PAUSE.getAction().equals(action) && ClusterTaskStateEnum.RUNNING.equals(stateEnumResult.getData())) {
// 运行状态, 可以执行暂停
return actionTaskExceptRollbackAction(agentTaskId, ClusterTaskActionEnum.PAUSE, "");
return actionTaskExceptRollbackAction(agentTaskId, TaskActionEnum.PAUSE, "");
}
if (ClusterTaskActionEnum.IGNORE.getAction().equals(action)) {
if (TaskActionEnum.IGNORE.getAction().equals(action)) {
// 忽略 & 取消随时都可以操作
return actionTaskExceptRollbackAction(agentTaskId, ClusterTaskActionEnum.IGNORE, hostname);
return actionTaskExceptRollbackAction(agentTaskId, TaskActionEnum.IGNORE, hostname);
}
if (ClusterTaskActionEnum.CANCEL.getAction().equals(action)) {
if (TaskActionEnum.CANCEL.getAction().equals(action)) {
// 忽略 & 取消随时都可以操作
return actionTaskExceptRollbackAction(agentTaskId, ClusterTaskActionEnum.CANCEL, hostname);
return actionTaskExceptRollbackAction(agentTaskId, TaskActionEnum.CANCEL, hostname);
}
if ((!ClusterTaskStateEnum.FINISHED.equals(stateEnumResult.getData()) || !rollback)
&& ClusterTaskActionEnum.ROLLBACK.getAction().equals(action)) {
&& TaskActionEnum.ROLLBACK.getAction().equals(action)) {
// 暂未操作完时可以回滚, 回滚所有操作过的机器到上一个版本
return actionTaskRollback(clusterTaskDO);
}
return ResultStatus.OPERATION_FAILED;
}
private ResultStatus actionTaskExceptRollbackAction(Long agentId, ClusterTaskActionEnum actionEnum, String hostname) {
private ResultStatus actionTaskExceptRollbackAction(Long agentId, TaskActionEnum actionEnum, String hostname) {
if (!ValidateUtils.isBlank(hostname)) {
return actionHostTaskExceptRollbackAction(agentId, actionEnum, hostname);
}
return abstractAgent.actionTask(agentId, actionEnum)? ResultStatus.SUCCESS: ResultStatus.OPERATION_FAILED;
}
private ResultStatus actionHostTaskExceptRollbackAction(Long agentId, ClusterTaskActionEnum actionEnum, String hostname) {
private ResultStatus actionHostTaskExceptRollbackAction(Long agentId, TaskActionEnum actionEnum, String hostname) {
return abstractAgent.actionHostTask(agentId, actionEnum, hostname)? ResultStatus.SUCCESS: ResultStatus.OPERATION_FAILED;
}
@@ -176,7 +176,7 @@ public class ClusterTaskServiceImpl implements ClusterTaskService {
if (clusterTaskDao.updateRollback(clusterTaskDO) <= 0) {
return ResultStatus.MYSQL_ERROR;
}
abstractAgent.actionTask(clusterTaskDO.getAgentTaskId(), ClusterTaskActionEnum.CANCEL);
abstractAgent.actionTask(clusterTaskDO.getAgentTaskId(), TaskActionEnum.CANCEL);
return ResultStatus.SUCCESS;
} catch (Exception e) {
LOGGER.error("create cluster task failed, clusterTaskDO:{}.", clusterTaskDO, e);

View File

@@ -4,7 +4,7 @@ import com.xiaojukeji.kafka.manager.common.entity.Result;
import com.xiaojukeji.kafka.manager.common.entity.ResultStatus;
import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterTaskDO;
import com.xiaojukeji.kafka.manager.dao.ClusterTaskDao;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskActionEnum;
import com.xiaojukeji.kafka.manager.common.bizenum.TaskActionEnum;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskStateEnum;
import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskTypeEnum;
import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskLog;
@@ -163,7 +163,7 @@ public class ClusterTaskServiceTest extends BaseTest {
}
private void executeTask2TaskNotExistTest() {
ResultStatus resultStatus = clusterTaskService.executeTask(INVALID_TASK_ID, ClusterTaskActionEnum.START.getAction(), ADMIN);
ResultStatus resultStatus = clusterTaskService.executeTask(INVALID_TASK_ID, TaskActionEnum.START.getAction(), ADMIN);
Assert.assertEquals(resultStatus.getCode(), ResultStatus.RESOURCE_NOT_EXIST.getCode());
}
@@ -172,7 +172,7 @@ public class ClusterTaskServiceTest extends BaseTest {
ClusterTaskDO clusterTaskDO = getClusterTaskDO();
Mockito.when(clusterTaskDao.getById(Mockito.anyLong())).thenReturn(clusterTaskDO);
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.START.getAction(), ADMIN);
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.START.getAction(), ADMIN);
Assert.assertEquals(resultStatus.getCode(), ResultStatus.CALL_CLUSTER_TASK_AGENT_FAILED.getCode());
}
@@ -183,12 +183,12 @@ public class ClusterTaskServiceTest extends BaseTest {
// success
Mockito.when(abstractAgent.actionTask(Mockito.anyLong(), Mockito.any())).thenReturn(true);
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.START.getAction(), ADMIN);
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.START.getAction(), ADMIN);
Assert.assertEquals(resultStatus.getCode(), ResultStatus.SUCCESS.getCode());
// operation failed
Mockito.when(abstractAgent.actionTask(Mockito.anyLong(), Mockito.any())).thenReturn(false);
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.START.getAction(), ADMIN);
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.START.getAction(), ADMIN);
Assert.assertEquals(resultStatus2.getCode(), ResultStatus.OPERATION_FAILED.getCode());
}
@@ -199,12 +199,12 @@ public class ClusterTaskServiceTest extends BaseTest {
// success
Mockito.when(abstractAgent.actionTask(Mockito.anyLong(), Mockito.any())).thenReturn(true);
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.PAUSE.getAction(), ADMIN);
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.PAUSE.getAction(), ADMIN);
Assert.assertEquals(resultStatus.getCode(), ResultStatus.SUCCESS.getCode());
// operation failed
Mockito.when(abstractAgent.actionTask(Mockito.anyLong(), Mockito.any())).thenReturn(false);
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.PAUSE.getAction(), ADMIN);
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.PAUSE.getAction(), ADMIN);
Assert.assertEquals(resultStatus2.getCode(), ResultStatus.OPERATION_FAILED.getCode());
}
@@ -215,12 +215,12 @@ public class ClusterTaskServiceTest extends BaseTest {
// success
Mockito.when(abstractAgent.actionTask(Mockito.anyLong(), Mockito.any())).thenReturn(true);
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.IGNORE.getAction(), "");
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.IGNORE.getAction(), "");
Assert.assertEquals(resultStatus.getCode(), ResultStatus.SUCCESS.getCode());
// operation failed
Mockito.when(abstractAgent.actionTask(Mockito.anyLong(), Mockito.any())).thenReturn(false);
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.IGNORE.getAction(), "");
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.IGNORE.getAction(), "");
Assert.assertEquals(resultStatus2.getCode(), ResultStatus.OPERATION_FAILED.getCode());
}
@@ -231,12 +231,12 @@ public class ClusterTaskServiceTest extends BaseTest {
// success
Mockito.when(abstractAgent.actionTask(Mockito.anyLong(), Mockito.any())).thenReturn(true);
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.CANCEL.getAction(), "");
ResultStatus resultStatus = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.CANCEL.getAction(), "");
Assert.assertEquals(resultStatus.getCode(), ResultStatus.SUCCESS.getCode());
// operation failed
Mockito.when(abstractAgent.actionTask(Mockito.anyLong(), Mockito.any())).thenReturn(false);
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.CANCEL.getAction(), "");
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.CANCEL.getAction(), "");
Assert.assertEquals(resultStatus2.getCode(), ResultStatus.OPERATION_FAILED.getCode());
}
@@ -246,7 +246,7 @@ public class ClusterTaskServiceTest extends BaseTest {
Mockito.when(clusterTaskDao.getById(Mockito.anyLong())).thenReturn(clusterTaskDO);
// operation failed
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.START.getAction(), ADMIN);
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.START.getAction(), ADMIN);
Assert.assertEquals(resultStatus2.getCode(), ResultStatus.OPERATION_FAILED.getCode());
}
@@ -257,7 +257,7 @@ public class ClusterTaskServiceTest extends BaseTest {
Mockito.when(clusterTaskDao.getById(Mockito.anyLong())).thenReturn(clusterTaskDO);
// operation failed
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, ClusterTaskActionEnum.ROLLBACK.getAction(), ADMIN);
ResultStatus resultStatus2 = clusterTaskService.executeTask(REAL_TASK_ID_IN_MYSQL, TaskActionEnum.ROLLBACK.getAction(), ADMIN);
Assert.assertEquals(resultStatus2.getCode(), ResultStatus.OPERATION_FORBIDDEN.getCode());
}