From e057ab858f3bf292865bf3112d4d0fa1073a9b24 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Mon, 22 Apr 2024 13:59:55 +0800 Subject: [PATCH] =?UTF-8?q?:hammer:=20=E6=A8=A1=E6=9D=BF=E4=B8=BB=E6=9C=BA?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E6=9C=8D=E5=8A=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 3 +- .../module/asset/dao/ExecTemplateHostDAO.java | 17 +++ .../entity/domain/ExecTemplateHostDO.java | 41 +++++++ .../exec/ExecTemplateCreateRequest.java | 4 + .../exec/ExecTemplateQueryRequest.java | 3 + .../exec/ExecTemplateUpdateRequest.java | 4 + .../asset/entity/vo/ExecTemplateVO.java | 4 + .../service/ExecTemplateHostService.java | 56 +++++++++ .../impl/ExecTemplateHostServiceImpl.java | 116 ++++++++++++++++++ .../service/impl/ExecTemplateServiceImpl.java | 47 +++++-- .../asset/service/impl/HostServiceImpl.java | 6 + .../mapper/ExecTemplateHostMapper.xml | 22 ++++ 12 files changed, 315 insertions(+), 8 deletions(-) create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecTemplateHostDAO.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecTemplateHostDO.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecTemplateHostService.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecTemplateHostServiceImpl.java create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/ExecTemplateHostMapper.xml diff --git a/docker-compose.yml b/docker-compose.yml index b1e24de2..d868e726 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,11 +35,12 @@ services: - /data/orion-ops-pro-space/docker-volumes/mysql/etc-mysql:/etc/mysql orion-ops-pro-redis: image: redis:6.0.16-alpine - command: redis-server --requirepass Data@123456 + command: redis-server --appendonly yes --requirepass Data@123456 ports: - 6380:6379 volumes: - /data/orion-ops-pro-space/docker-volumes/redis/data:/data + - /data/orion-ops-pro-space/docker-volumes/redis/redis.conf:/usr/local/etc/redis/redis.conf orion-ops-pro-adminer: image: adminer ports: diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecTemplateHostDAO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecTemplateHostDAO.java new file mode 100644 index 00000000..97338fb9 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecTemplateHostDAO.java @@ -0,0 +1,17 @@ +package com.orion.ops.module.asset.dao; + +import com.orion.ops.framework.mybatis.core.mapper.IMapper; +import com.orion.ops.module.asset.entity.domain.ExecTemplateHostDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 执行模板主机 Mapper 接口 + * + * @author Jiahang Li + * @version 1.0.6 + * @since 2024-4-22 12:13 + */ +@Mapper +public interface ExecTemplateHostDAO extends IMapper { + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecTemplateHostDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecTemplateHostDO.java new file mode 100644 index 00000000..3bba238c --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecTemplateHostDO.java @@ -0,0 +1,41 @@ +package com.orion.ops.module.asset.entity.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.orion.ops.framework.mybatis.core.domain.BaseDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +/** + * 执行模板主机 实体对象 + * + * @author Jiahang Li + * @version 1.0.6 + * @since 2024-4-22 12:13 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "exec_template_host", autoResultMap = true) +@Schema(name = "ExecTemplateHostDO", description = "执行模板主机 实体对象") +public class ExecTemplateHostDO extends BaseDO { + + private static final long serialVersionUID = 1L; + + @Schema(description = "id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @Schema(description = "模板id") + @TableField("template_id") + private Long templateId; + + @Schema(description = "主机id") + @TableField("host_id") + private Long hostId; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateCreateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateCreateRequest.java index d46b2768..818a9b9f 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateCreateRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateCreateRequest.java @@ -12,6 +12,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.io.Serializable; +import java.util.List; /** * 执行模板 创建请求对象 @@ -51,4 +52,7 @@ public class ExecTemplateCreateRequest implements Serializable { @Schema(description = "参数定义") private String parameterSchema; + @Schema(description = "模板主机") + private List hostIdList; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateQueryRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateQueryRequest.java index 02947382..65918ec4 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateQueryRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateQueryRequest.java @@ -31,4 +31,7 @@ public class ExecTemplateQueryRequest extends PageRequest { @Schema(description = "命令") private String command; + @Schema(description = "是否查询模板主机") + private Boolean queryHost; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateUpdateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateUpdateRequest.java index 8d4e78af..7a9de41b 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateUpdateRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecTemplateUpdateRequest.java @@ -12,6 +12,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.io.Serializable; +import java.util.List; /** * 执行模板 更新请求对象 @@ -55,4 +56,7 @@ public class ExecTemplateUpdateRequest implements Serializable { @Schema(description = "参数定义") private String parameterSchema; + @Schema(description = "模板主机") + private List hostIdList; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecTemplateVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecTemplateVO.java index a5d0ed0d..dab3ac2b 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecTemplateVO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecTemplateVO.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.Date; +import java.util.Set; /** * 执行模板 视图响应对象 @@ -55,4 +56,7 @@ public class ExecTemplateVO implements Serializable { @Schema(description = "修改人") private String updater; + @Schema(description = "模板主机") + private Set hostIdList; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecTemplateHostService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecTemplateHostService.java new file mode 100644 index 00000000..a554ba8f --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecTemplateHostService.java @@ -0,0 +1,56 @@ +package com.orion.ops.module.asset.service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 执行模板主机 服务类 + * + * @author Jiahang Li + * @version 1.0.6 + * @since 2024-4-22 12:13 + */ +public interface ExecTemplateHostService { + + /** + * 查询模板主机 + * + * @param templateId templateId + * @return hostId + */ + Set getHostByTemplateId(Long templateId); + + /** + * 查询模板主机 + * + * @param templateIdList templateIdList + * @return hostIdMap + */ + Map> getHostByTemplateIdList(List templateIdList); + + /** + * 设置模板主机 + * + * @param templateId templateId + * @param hostList hostList + */ + void setTemplateHost(Long templateId, List hostList); + + /** + * 通过 templateId 删除 + * + * @param templateId templateId + * @return effect + */ + Integer deleteByTemplateId(Long templateId); + + /** + * 通过 hostId 删除 + * + * @param hostId hostId + * @return effect + */ + Integer deleteByHostId(Long hostId); + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecTemplateHostServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecTemplateHostServiceImpl.java new file mode 100644 index 00000000..0ecbe9ef --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecTemplateHostServiceImpl.java @@ -0,0 +1,116 @@ +package com.orion.ops.module.asset.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.orion.lang.function.Functions; +import com.orion.lang.utils.collect.Lists; +import com.orion.ops.module.asset.dao.ExecTemplateHostDAO; +import com.orion.ops.module.asset.entity.domain.ExecTemplateHostDO; +import com.orion.ops.module.asset.service.ExecTemplateHostService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 执行模板主机 服务实现类 + * + * @author Jiahang Li + * @version 1.0.6 + * @since 2024-4-22 12:13 + */ +@Slf4j +@Service +public class ExecTemplateHostServiceImpl implements ExecTemplateHostService { + + @Resource + private ExecTemplateHostDAO execTemplateHostDAO; + + @Override + public Set getHostByTemplateId(Long templateId) { + return execTemplateHostDAO.of() + .createWrapper() + .select(ExecTemplateHostDO::getHostId) + .eq(ExecTemplateHostDO::getTemplateId, templateId) + .then() + .stream() + .map(ExecTemplateHostDO::getHostId) + .collect(Collectors.toSet()); + } + + @Override + public Map> getHostByTemplateIdList(List templateIdList) { + return execTemplateHostDAO.of() + .createWrapper() + .select(ExecTemplateHostDO::getTemplateId, ExecTemplateHostDO::getHostId) + .in(ExecTemplateHostDO::getTemplateId, templateIdList) + .then() + .stream() + .collect(Collectors.groupingBy( + ExecTemplateHostDO::getTemplateId, + Collectors.mapping(ExecTemplateHostDO::getHostId, Collectors.toSet()) + )); + } + + @Override + public void setTemplateHost(Long templateId, List hostList) { + LambdaQueryWrapper wrapper = execTemplateHostDAO.wrapper() + .eq(ExecTemplateHostDO::getTemplateId, templateId); + if (Lists.isEmpty(hostList)) { + // 为空移除 + execTemplateHostDAO.delete(wrapper); + } else { + // 查询主机 + wrapper.select(ExecTemplateHostDO::getId, ExecTemplateHostDO::getHostId); + Map hostMap = execTemplateHostDAO.of(wrapper) + .stream() + .collect(Collectors.toMap(ExecTemplateHostDO::getHostId, + ExecTemplateHostDO::getId, + Functions.right())); + // 插入主机 + List insertRecords = hostList.stream() + .filter(s -> !hostMap.containsKey(s)) + .map(s -> ExecTemplateHostDO.builder() + .templateId(templateId) + .hostId(s) + .build()) + .collect(Collectors.toList()); + if (!insertRecords.isEmpty()) { + execTemplateHostDAO.insertBatch(insertRecords); + } + // 删除主机 + List deleteIdList = hostMap.keySet() + .stream() + .filter(s -> !hostList.contains(s)) + .map(hostMap::get) + .collect(Collectors.toList()); + if (!deleteIdList.isEmpty()) { + execTemplateHostDAO.deleteBatchIds(deleteIdList); + } + } + } + + @Override + public Integer deleteByTemplateId(Long templateId) { + LambdaQueryWrapper wrapper = execTemplateHostDAO.lambda() + .eq(ExecTemplateHostDO::getTemplateId, templateId); + log.info("ExecTemplateHostService-deleteByTemplateId idList: {}", templateId); + int effect = execTemplateHostDAO.delete(wrapper); + log.info("ExecTemplateHostService-deleteByTemplateId effect: {}", effect); + return effect; + } + + @Override + public Integer deleteByHostId(Long hostId) { + LambdaQueryWrapper wrapper = execTemplateHostDAO.lambda() + .eq(ExecTemplateHostDO::getHostId, hostId); + log.info("ExecTemplateHostService-deleteByHostId idList: {}", hostId); + int effect = execTemplateHostDAO.delete(wrapper); + log.info("ExecTemplateHostService-deleteByHostId effect: {}", effect); + return effect; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecTemplateServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecTemplateServiceImpl.java index e502dc2b..6c442876 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecTemplateServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecTemplateServiceImpl.java @@ -3,6 +3,7 @@ package com.orion.ops.module.asset.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.orion.lang.define.wrapper.DataGrid; +import com.orion.lang.utils.Booleans; import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.module.asset.convert.ExecTemplateConvert; @@ -13,11 +14,16 @@ import com.orion.ops.module.asset.entity.request.exec.ExecTemplateQueryRequest; import com.orion.ops.module.asset.entity.request.exec.ExecTemplateUpdateRequest; import com.orion.ops.module.asset.entity.vo.ExecTemplateVO; import com.orion.ops.module.asset.enums.ScriptExecEnum; +import com.orion.ops.module.asset.service.ExecTemplateHostService; import com.orion.ops.module.asset.service.ExecTemplateService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** * 执行模板 服务实现类 @@ -33,6 +39,9 @@ public class ExecTemplateServiceImpl implements ExecTemplateService { @Resource private ExecTemplateDAO execTemplateDAO; + @Resource + private ExecTemplateHostService execTemplateHostService; + @Override public Long createExecTemplate(ExecTemplateCreateRequest request) { log.info("ExecTemplateService-createExecTemplate request: {}", JSON.toJSONString(request)); @@ -41,9 +50,11 @@ public class ExecTemplateServiceImpl implements ExecTemplateService { ExecTemplateDO record = ExecTemplateConvert.MAPPER.to(request); // 查询数据是否冲突 this.checkExecTemplatePresent(record); - // 插入 + // 插入模板 int effect = execTemplateDAO.insert(record); Long id = record.getId(); + // 修改模板主机 + execTemplateHostService.setTemplateHost(id, request.getHostIdList()); log.info("ExecTemplateService-createExecTemplate id: {}, effect: {}", id, effect); return id; } @@ -60,29 +71,49 @@ public class ExecTemplateServiceImpl implements ExecTemplateService { ExecTemplateDO updateRecord = ExecTemplateConvert.MAPPER.to(request); // 查询数据是否冲突 this.checkExecTemplatePresent(updateRecord); - // 更新 + // 更新模板 int effect = execTemplateDAO.updateById(updateRecord); + // 修改模板主机 + execTemplateHostService.setTemplateHost(id, request.getHostIdList()); log.info("ExecTemplateService-updateExecTemplateById effect: {}", effect); return effect; } @Override public ExecTemplateVO getExecTemplateById(Long id) { - // 查询 + // 查询模板 ExecTemplateDO record = execTemplateDAO.selectById(id); Valid.notNull(record, ErrorMessage.DATA_ABSENT); // 转换 - return ExecTemplateConvert.MAPPER.to(record); + ExecTemplateVO template = ExecTemplateConvert.MAPPER.to(record); + // 查询模板主机 + Set hosts = execTemplateHostService.getHostByTemplateId(id); + template.setHostIdList(hosts); + return template; } @Override public DataGrid getExecTemplatePage(ExecTemplateQueryRequest request) { // 条件 LambdaQueryWrapper wrapper = this.buildQueryWrapper(request); - // 查询 - return execTemplateDAO.of(wrapper) + // 查询模板 + DataGrid templates = execTemplateDAO.of(wrapper) .page(request) .dataGrid(ExecTemplateConvert.MAPPER::to); + if (templates.isEmpty()) { + return templates; + } + // 查询模板主机 + if (Booleans.isTrue(request.getQueryHost())) { + List idList = templates.stream() + .map(ExecTemplateVO::getId) + .collect(Collectors.toList()); + Map> templateHosts = execTemplateHostService.getHostByTemplateIdList(idList); + for (ExecTemplateVO template : templates) { + template.setHostIdList(templateHosts.get(template.getId())); + } + } + return templates; } @Override @@ -91,9 +122,11 @@ public class ExecTemplateServiceImpl implements ExecTemplateService { // 检查数据是否存在 ExecTemplateDO record = execTemplateDAO.selectById(id); Valid.notNull(record, ErrorMessage.DATA_ABSENT); - // 删除 + // 删除模板 int effect = execTemplateDAO.deleteById(id); log.info("ExecTemplateService-deleteExecTemplateById id: {}, effect: {}", id, effect); + // 删除模板主机 + effect += execTemplateHostService.deleteByTemplateId(id); return effect; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostServiceImpl.java index aa5a20ff..dfb72791 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostServiceImpl.java @@ -22,6 +22,7 @@ import com.orion.ops.module.asset.entity.request.host.HostQueryRequest; import com.orion.ops.module.asset.entity.request.host.HostUpdateRequest; import com.orion.ops.module.asset.entity.vo.HostVO; import com.orion.ops.module.asset.service.ExecJobHostService; +import com.orion.ops.module.asset.service.ExecTemplateHostService; import com.orion.ops.module.asset.service.HostConfigService; import com.orion.ops.module.asset.service.HostService; import com.orion.ops.module.infra.api.DataExtraApi; @@ -70,6 +71,9 @@ public class HostServiceImpl implements HostService { @Resource private ExecJobHostService execJobHostService; + @Resource + private ExecTemplateHostService execTemplateHostService; + @Resource private TagRelApi tagRelApi; @@ -219,6 +223,8 @@ public class HostServiceImpl implements HostService { hostConfigDAO.deleteByHostId(id); // 删除计划任务主机 execJobHostService.deleteByHostId(id); + // 删除执行模板主机 + execTemplateHostService.deleteByHostId(id); // 删除分组 dataGroupRelApi.deleteByRelId(DataGroupTypeEnum.HOST, id); // 删除 tag 引用 diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/ExecTemplateHostMapper.xml b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/ExecTemplateHostMapper.xml new file mode 100644 index 00000000..e7af6380 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/ExecTemplateHostMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + id, template_id, host_id, create_time, update_time, creator, updater, deleted + + +