From f2c4190a5c366185d8c663bbc7efe4a18847a929 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Tue, 19 Sep 2023 19:31:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E7=AD=96=E7=95=A5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/enums/BooleanBit.java | 4 +- .../ops/framework/common/utils/Valid.java | 11 ++ .../config/OrionMybatisAutoConfiguration.java | 14 +++ .../request/host/HostConfigUpdateRequest.java | 8 +- .../host/HostConfigUpdateStatusRequest.java | 12 +- .../module/asset/entity/vo/HostConfigVO.java | 3 + .../asset/enums/HostConfigTypeEnum.java | 9 +- .../host/config/model/HostSshConfigModel.java | 12 +- .../config/strategy/HostConfigStrategy.java | 7 -- .../strategy/HostSshConfigStrategy.java | 10 +- .../asset/service/HostConfigService.java | 7 ++ .../service/impl/HostConfigServiceImpl.java | 111 +++++++++--------- .../asset/service/impl/HostServiceImpl.java | 6 + 13 files changed, 125 insertions(+), 89 deletions(-) diff --git a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/enums/BooleanBit.java b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/enums/BooleanBit.java index 375fbacb..f4f452c9 100644 --- a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/enums/BooleanBit.java +++ b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/enums/BooleanBit.java @@ -26,14 +26,14 @@ public enum BooleanBit { ; - private final Integer v; + private final Integer value; public static BooleanBit of(Integer value) { if (value == null) { return null; } for (BooleanBit e : values()) { - if (e.v.equals(value)) { + if (e.value.equals(value)) { return e; } } diff --git a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/utils/Valid.java b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/utils/Valid.java index 4de0623e..eed186b6 100644 --- a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/utils/Valid.java +++ b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/utils/Valid.java @@ -105,4 +105,15 @@ public class Valid extends com.orion.lang.utils.Valid { return obj; } + /** + * 检查是否更新成功 + * + * @param effect effect + * @return effect + */ + public static int version(int effect) { + isTrue(effect > 0, ErrorMessage.DATA_MODIFIED); + return effect; + } + } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/config/OrionMybatisAutoConfiguration.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/config/OrionMybatisAutoConfiguration.java index 5a939b32..1808e849 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/config/OrionMybatisAutoConfiguration.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/config/OrionMybatisAutoConfiguration.java @@ -1,6 +1,8 @@ package com.orion.ops.framework.mybatis.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.orion.ops.framework.common.constant.AutoConfigureOrderConst; import com.orion.ops.framework.common.constant.FilterOrderConst; import com.orion.ops.framework.common.filter.FilterCreator; @@ -37,6 +39,18 @@ public class OrionMybatisAutoConfiguration { return new FieldFillHandler(); } + /** + * 注册 乐观锁插件 + * + * @return 拦截器 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + return interceptor; + } + /** * @return mybatis 缓存清理过滤器 */ diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateRequest.java index 740d796f..7964376d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateRequest.java @@ -25,12 +25,8 @@ import java.io.Serializable; public class HostConfigUpdateRequest implements Serializable { @NotNull - @Schema(description = "hostId") - private Long hostId; - - @NotNull - @Schema(description = "配置类型") - private String type; + @Schema(description = "id") + private Long id; @NotBlank @Schema(description = "配置详情") diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateStatusRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateStatusRequest.java index 6509bbc2..b7b2aec9 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateStatusRequest.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateStatusRequest.java @@ -24,15 +24,15 @@ import java.io.Serializable; public class HostConfigUpdateStatusRequest implements Serializable { @NotNull - @Schema(description = "hostId") - private Long hostId; - - @NotNull - @Schema(description = "配置类型") - private String type; + @Schema(description = "id") + private Long id; @NotNull @Schema(description = "状态 0停用 1启用") private Integer status; + @NotNull + @Schema(description = "配置版本号") + private Integer version; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConfigVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConfigVO.java index b76ed722..e63110f1 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConfigVO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/HostConfigVO.java @@ -28,6 +28,9 @@ public class HostConfigVO { @Schema(description = "version") private Integer version; + @Schema(description = "配置类型") + private String type; + @Schema(description = "状态 0停用 1启用") private Integer status; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostConfigTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostConfigTypeEnum.java index e099b0f3..c6ac5944 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostConfigTypeEnum.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostConfigTypeEnum.java @@ -1,5 +1,6 @@ package com.orion.ops.module.asset.enums; +import com.orion.ops.framework.common.enums.BooleanBit; import com.orion.ops.module.asset.handler.host.config.model.HostConfigModel; import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel; import com.orion.ops.module.asset.handler.host.config.strategy.HostConfigStrategy; @@ -19,7 +20,7 @@ public enum HostConfigTypeEnum { /** * SSH 配置 */ - SSH(HostSshConfigModel.class, new HostSshConfigStrategy()), + SSH(HostSshConfigModel.class, new HostSshConfigStrategy(), BooleanBit.TRUE.getValue()), ; @@ -27,6 +28,8 @@ public enum HostConfigTypeEnum { private final HostConfigStrategy strategy; + private final Integer defaultStatus; + public static HostConfigTypeEnum of(String type) { if (type == null) { return null; @@ -48,4 +51,8 @@ public enum HostConfigTypeEnum { return (T) strategy; } + public Integer getDefaultStatus() { + return defaultStatus; + } + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java index 8cdb99e1..669ef483 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java @@ -37,12 +37,20 @@ public class HostSshConfigModel implements HostConfigModel { @Schema(description = "身份id") private Long identityId; + @NotNull + @Schema(description = "连接超时时间") + private Integer connectTimeout; + @NotBlank - @Schema(description = "编码") + @Schema(description = "SSH输出编码") private String charset; @NotBlank @Schema(description = "文件名称编码") - private String filenameCharset; + private String fileNameCharset; + + @NotBlank + @Schema(description = "文件内容编码") + private String fileContentCharset; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java index 4eef3a87..ca370f0d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java @@ -20,13 +20,6 @@ public interface HostConfigStrategy { */ Config getDefault(); - /** - * 插入填充 - * - * @param config config - */ - void insertFill(Config config); - /** * 更新填充 * diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java index 342f189b..c1f5386f 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java @@ -24,16 +24,12 @@ public class HostSshConfigStrategy implements HostConfigStrategy getHostConfig(Long hostId) { List configs = hostConfigDAO.getHostConfigByHostId(hostId); + if (configs.isEmpty()) { + // 初始化 兜底 + this.initHostConfig(hostId); + configs = hostConfigDAO.getHostConfigByHostId(hostId); + } + // 返回 return configs.stream().map(s -> { HostConfigVO vo = HostConfigConvert.MAPPER.to(s); // 获取配置 @@ -77,71 +83,60 @@ public class HostConfigServiceImpl implements HostConfigService { @Override public Integer updateHostConfig(HostConfigUpdateRequest request) { - String typeValue = request.getType(); - HostConfigTypeEnum type = Valid.valid(HostConfigTypeEnum::of, typeValue); - HostConfigModel requestConfig = JSON.parseObject(request.getConfig(), type.getType()); + Long id = request.getId(); // 查询原配置 - HostConfigDO record = hostConfigDAO.getHostConfigByHostId(request.getHostId(), typeValue); - HostConfigStrategy strategy = type.getStrategy(); - if (record == null) { - // 填充 - strategy.insertFill(requestConfig); - // 检查参数 - Valid.valid(requestConfig); - // 新增配置 - HostConfigDO insert = HostConfigConvert.MAPPER.to(request); - insert.setVersion(Const.DEFAULT_VERSION); - insert.setConfig(requestConfig.serial()); - hostConfigDAO.insert(insert); - return Const.DEFAULT_VERSION; - } else { - // 检查版本 - Valid.eq(record.getVersion(), request.getVersion(), ErrorMessage.DATA_MODIFIED); - // 填充 - HostConfigModel beforeConfig = JSON.parseObject(record.getConfig(), type.getType()); - strategy.updateFill(beforeConfig, requestConfig); - // 检查参数 - Valid.valid(requestConfig); - // 修改配置 - // TODO 检查version是否改变 - HostConfigDO update = new HostConfigDO(); - update.setId(record.getId()); - update.setVersion(request.getVersion()); - update.setConfig(requestConfig.serial()); - hostConfigDAO.updateById(update); - return update.getVersion(); - } + HostConfigDO record = hostConfigDAO.selectById(id); + Valid.notNull(record, ErrorMessage.CONFIG_ABSENT); + HostConfigTypeEnum type = Valid.valid(HostConfigTypeEnum::of, record.getType()); + HostConfigModel config = JSON.parseObject(request.getConfig(), type.getType()); + // 检查版本 + Valid.eq(record.getVersion(), request.getVersion(), ErrorMessage.DATA_MODIFIED); + // 填充 + HostConfigModel beforeConfig = JSON.parseObject(record.getConfig(), type.getType()); + type.getStrategy().updateFill(beforeConfig, config); + // 检查参数 + Valid.valid(config); + // 修改配置 + HostConfigDO update = new HostConfigDO(); + update.setId(id); + update.setVersion(request.getVersion()); + update.setConfig(config.serial()); + int effect = hostConfigDAO.updateById(update); + Valid.version(effect); + return update.getVersion(); } @Override public Integer updateHostConfigStatus(HostConfigUpdateStatusRequest request) { - Long hostId = request.getHostId(); - String typeValue = request.getType(); + Long id = request.getId(); Integer status = request.getStatus(); Valid.valid(BooleanBit::of, status); - HostConfigTypeEnum type = Valid.valid(HostConfigTypeEnum::of, typeValue); // 查询配置 - HostConfigDO record = hostConfigDAO.getHostConfigByHostId(hostId, typeValue); - HostConfigStrategy strategy = type.getStrategy(); - if (record == null) { - // 插入默认值 - HostConfigDO insert = new HostConfigDO(); - insert.setHostId(hostId); - insert.setType(typeValue); - insert.setStatus(status); - insert.setVersion(Const.DEFAULT_VERSION); - insert.setConfig(strategy.getDefault().serial()); - hostConfigDAO.insert(insert); - return Const.DEFAULT_VERSION; - } else { - // TODO 检查version是否改变 - // 修改状态 - HostConfigDO update = new HostConfigDO(); - update.setId(record.getId()); - update.setStatus(status); - hostConfigDAO.updateById(update); - return update.getVersion(); - } + HostConfigDO record = hostConfigDAO.selectById(id); + Valid.notNull(record, ErrorMessage.CONFIG_ABSENT); + // 修改状态 + HostConfigDO update = new HostConfigDO(); + update.setId(id); + update.setStatus(status); + update.setVersion(request.getVersion()); + int effect = hostConfigDAO.updateById(update); + Valid.version(effect); + return update.getVersion(); + } + + @Override + public void initHostConfig(Long hostId) { + List configs = Arrays.stream(HostConfigTypeEnum.values()) + .map(s -> { + HostConfigDO insert = new HostConfigDO(); + insert.setHostId(hostId); + insert.setType(s.name()); + insert.setStatus(s.getDefaultStatus()); + insert.setConfig(s.getStrategy().getDefault().serial()); + insert.setVersion(Const.DEFAULT_VERSION); + return insert; + }).collect(Collectors.toList()); + hostConfigDAO.insertBatch(configs); } } 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 701cad3f..94f0fb07 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 @@ -19,6 +19,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.HostConfigVO; import com.orion.ops.module.asset.entity.vo.HostVO; +import com.orion.ops.module.asset.service.HostConfigService; import com.orion.ops.module.asset.service.HostService; import com.orion.ops.module.infra.api.FavoriteApi; import com.orion.ops.module.infra.api.TagRelApi; @@ -56,6 +57,9 @@ public class HostServiceImpl implements HostService { @Resource private HostConfigDAO hostConfigDAO; + @Resource + private HostConfigService hostConfigService; + @Resource private TagRelApi tagRelApi; @@ -79,6 +83,8 @@ public class HostServiceImpl implements HostService { if (!Lists.isEmpty(tags)) { tagRelApi.addTagRel(TagTypeEnum.HOST, id, tags); } + // 创建配置 + hostConfigService.initHostConfig(id); return id; }