diff --git a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/constant/Const.java b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/constant/Const.java index 48484401..f6b6450f 100644 --- a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/constant/Const.java +++ b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/constant/Const.java @@ -30,4 +30,6 @@ public class Const implements com.orion.lang.constant.Const { public static final Long NONE_ID = -1L; + public static final Integer DEFAULT_VERSION = 1; + } 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 new file mode 100644 index 00000000..375fbacb --- /dev/null +++ b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/enums/BooleanBit.java @@ -0,0 +1,43 @@ +package com.orion.ops.framework.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * boolean 枚举 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/9/19 10:32 + */ +@Getter +@AllArgsConstructor +public enum BooleanBit { + + /** + * 假 + */ + FALSE(0), + + /** + * 真 + */ + TRUE(1), + + ; + + private final Integer v; + + public static BooleanBit of(Integer value) { + if (value == null) { + return null; + } + for (BooleanBit e : values()) { + if (e.v.equals(value)) { + return e; + } + } + return null; + } + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IJoinMapper.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IJoinMapper.java index 27fe7d0c..43ab4a20 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IJoinMapper.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IJoinMapper.java @@ -1,6 +1,8 @@ package com.orion.ops.framework.mybatis.core.mapper; import com.github.yulichang.base.MPJBaseMapper; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; /** * 通用 join mapper @@ -10,4 +12,14 @@ import com.github.yulichang.base.MPJBaseMapper; * @since 2023/9/18 11:51 */ public interface IJoinMapper extends IMapper, MPJBaseMapper { + + /** + * 获取 MPJLambdaWrapper 对象 + * + * @return 获取 wrapper + */ + default MPJLambdaWrapper join() { + return JoinWrappers.lambda(); + } + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostController.java index 0b09d6ac..cf29577d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostController.java @@ -5,10 +5,7 @@ import com.orion.ops.framework.common.annotation.IgnoreLog; import com.orion.ops.framework.common.annotation.RestWrapper; import com.orion.ops.framework.common.constant.IgnoreLogMode; import com.orion.ops.framework.common.valid.group.Page; -import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateRequest; -import com.orion.ops.module.asset.entity.request.host.HostCreateRequest; -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.request.host.*; 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; @@ -124,9 +121,15 @@ public class HostController { @PutMapping("/update-config") @Operation(summary = "更新主机配置") @PreAuthorize("@ss.hasPermission('asset:host:update-config')") - public boolean updateHostConfig(@Validated @RequestBody HostConfigUpdateRequest request) { - hostConfigService.updateHostConfig(request); - return true; + public Integer updateHostConfig(@Validated @RequestBody HostConfigUpdateRequest request) { + return hostConfigService.updateHostConfig(request); + } + + @PutMapping("/update-config-status") + @Operation(summary = "更新主机配置状态") + @PreAuthorize("@ss.hasPermission('asset:host:update-config')") + public Integer updateHostConfigStatus(@Validated @RequestBody HostConfigUpdateStatusRequest request) { + return hostConfigService.updateHostConfigStatus(request); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/HostConfigDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/HostConfigDO.java index 409a4286..1258fc7a 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/HostConfigDO.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/HostConfigDO.java @@ -35,6 +35,10 @@ public class HostConfigDO extends BaseDO { @TableField("type") private String type; + @Schema(description = "状态 0停用 1启用") + @TableField("status") + private Integer status; + @Schema(description = "配置详情") @TableField("config") private String config; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostConfigContent.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostConfigContent.java deleted file mode 100644 index a284fed0..00000000 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostConfigContent.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.orion.ops.module.asset.entity.dto.host; - -/** - * 主机配置父类 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/9/13 14:47 - */ -public interface HostConfigContent { - - -} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSftpConfig.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSftpConfig.java deleted file mode 100644 index 5cc62e3c..00000000 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSftpConfig.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.orion.ops.module.asset.entity.dto.host; - -/** - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/9/13 16:26 - */ -public class HostSftpConfig implements HostConfigContent { -} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSshConnectConfig.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSshConnectConfig.java deleted file mode 100644 index 9fdc699e..00000000 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSshConnectConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.orion.ops.module.asset.entity.dto.host; - -import lombok.Data; - -/** - * ssh 连接配置 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/9/13 16:18 - */ -@Data -public class HostSshConnectConfig implements HostConfigContent { - - // proxy port username password authType keyId - -} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSshEnvConfig.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSshEnvConfig.java deleted file mode 100644 index 73b1db14..00000000 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/dto/host/HostSshEnvConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.orion.ops.module.asset.entity.dto.host; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.HashMap; - -/** - * ssh 环境变量配置 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/9/13 16:18 - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class HostSshEnvConfig extends HashMap implements HostConfigContent { - -} 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 new file mode 100644 index 00000000..6509bbc2 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/host/HostConfigUpdateStatusRequest.java @@ -0,0 +1,38 @@ +package com.orion.ops.module.asset.entity.request.host; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 主机配置 更新请求对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-13 14:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "HostConfigUpdateRequest", description = "主机配置 更新请求对象") +public class HostConfigUpdateStatusRequest implements Serializable { + + @NotNull + @Schema(description = "hostId") + private Long hostId; + + @NotNull + @Schema(description = "配置类型") + private String type; + + @NotNull + @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/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 a725be22..b76ed722 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 = "状态 0停用 1启用") + private Integer status; + @Schema(description = "config") private Map config; 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 71964f90..e099b0f3 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,11 +1,10 @@ package com.orion.ops.module.asset.enums; -import com.orion.ops.module.asset.entity.dto.host.HostConfigContent; -import com.orion.ops.module.asset.entity.dto.host.HostSftpConfig; -import com.orion.ops.module.asset.entity.dto.host.HostSshConnectConfig; -import com.orion.ops.module.asset.entity.dto.host.HostSshEnvConfig; +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; +import com.orion.ops.module.asset.handler.host.config.strategy.HostSshConfigStrategy; import lombok.AllArgsConstructor; -import lombok.Getter; /** * 主机配置类型枚举 @@ -14,39 +13,19 @@ import lombok.Getter; * @version 1.0.0 * @since 2023/9/11 14:37 */ -@Getter @AllArgsConstructor public enum HostConfigTypeEnum { /** - * SSH 连接配置 + * SSH 配置 */ - SSH_CONNECT(HostSshConnectConfig.class) { - }, - - /** - * SSH 环境变量 - */ - SSH_ENV(HostSshEnvConfig.class), - - /** - * sftp 配置 - */ - SFTP(HostSftpConfig.class), - - /** - * rdp 配置 - */ - RDP(null), - - /** - * 普通配置 - */ - CONFIG(null), + SSH(HostSshConfigModel.class, new HostSshConfigStrategy()), ; - private final Class type; + private final Class type; + + private final HostConfigStrategy strategy; public static HostConfigTypeEnum of(String type) { if (type == null) { @@ -60,21 +39,13 @@ public enum HostConfigTypeEnum { return null; } - /** - * 插入填充 - * - * @param o o - */ - public void insertFill(T o) { + public Class getType() { + return type; } - /** - * 更新填充 - * - * @param before before - * @param after after - */ - public void updateFill(T before, T after) { + @SuppressWarnings("unchecked") + public > T getStrategy() { + return (T) strategy; } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostConfigModel.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostConfigModel.java new file mode 100644 index 00000000..bbfb1ed1 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostConfigModel.java @@ -0,0 +1,23 @@ +package com.orion.ops.module.asset.handler.host.config.model; + +import com.alibaba.fastjson.JSON; + +/** + * 主机配置父类 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/9/13 14:47 + */ +public interface HostConfigModel { + + /** + * 序列化 + * + * @return json + */ + default String serial() { + return JSON.toJSONString(this); + } + +} 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 new file mode 100644 index 00000000..8cdb99e1 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java @@ -0,0 +1,48 @@ +package com.orion.ops.module.asset.handler.host.config.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 主机 SSH 配置 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/9/13 16:18 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "HostSftpConfig", description = "主机 SSH 配置") +public class HostSshConfigModel implements HostConfigModel { + + @NotNull + @Schema(description = "ssh 端口") + private Integer port; + + @NotNull + @Schema(description = "用户名") + private String username; + + @Schema(description = "密码") + private String password; + + @Schema(description = "身份id") + private Long identityId; + + @NotBlank + @Schema(description = "编码") + private String charset; + + @NotBlank + @Schema(description = "文件名称编码") + private String filenameCharset; + +} 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 new file mode 100644 index 00000000..4eef3a87 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java @@ -0,0 +1,46 @@ +package com.orion.ops.module.asset.handler.host.config.strategy; + +import com.orion.ops.module.asset.handler.host.config.model.HostConfigModel; + +import java.util.Map; + +/** + * 主机配置策略 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/9/19 14:27 + */ +public interface HostConfigStrategy { + + /** + * 获取默认值 + * + * @return 默认值 + */ + Config getDefault(); + + /** + * 插入填充 + * + * @param config config + */ + void insertFill(Config config); + + /** + * 更新填充 + * + * @param before 修改前配置 + * @param after 修改后配置 + */ + void updateFill(Config before, Config after); + + /** + * 转为视图配置 + * + * @param config config + * @return 视图配置 + */ + Map toView(String 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 new file mode 100644 index 00000000..342f189b --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java @@ -0,0 +1,62 @@ +package com.orion.ops.module.asset.handler.host.config.strategy; + +import com.alibaba.fastjson.JSON; +import com.orion.lang.utils.Strings; +import com.orion.ops.framework.common.constant.Const; +import com.orion.ops.framework.common.utils.CryptoUtils; +import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel; + +import java.util.Map; + +/** + * 主机 SSH 配置策略 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/9/19 14:26 + */ +public class HostSshConfigStrategy implements HostConfigStrategy { + + private static final int SSH_PORT = 22; + + @Override + public HostSshConfigModel getDefault() { + return HostSshConfigModel.builder() + .port(SSH_PORT) + .charset(Const.UTF_8) + .filenameCharset(Const.UTF_8) + .build(); + } + + @Override + public void insertFill(HostSshConfigModel config) { + // 加密密码 + this.checkEncryptPassword(config); + } + + @Override + public void updateFill(HostSshConfigModel before, HostSshConfigModel after) { + // 加密密码 + this.checkEncryptPassword(after); + } + + @Override + public Map toView(String config) { + if (config == null) { + return null; + } + HostSshConfigModel model = JSON.parseObject(config, HostSshConfigModel.class); + model.setPassword(null); + return JSON.parseObject(JSON.toJSONString(model)); + } + + private void checkEncryptPassword(HostSshConfigModel config) { + String password = config.getPassword(); + if (Strings.isBlank(password)) { + return; + } + // 加密密码 + config.setPassword(CryptoUtils.encryptAsString(password)); + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConfigService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConfigService.java index 1f9ae497..55643892 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConfigService.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/HostConfigService.java @@ -1,9 +1,10 @@ package com.orion.ops.module.asset.service; -import com.orion.ops.module.asset.entity.dto.host.HostConfigContent; import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateRequest; +import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateStatusRequest; import com.orion.ops.module.asset.entity.vo.HostConfigVO; import com.orion.ops.module.asset.enums.HostConfigTypeEnum; +import com.orion.ops.module.asset.handler.host.config.model.HostConfigModel; import java.util.List; @@ -32,7 +33,7 @@ public interface HostConfigService { * @param type type * @return 配置 */ - T getHostConfig(Long hostId, HostConfigTypeEnum type); + T getHostConfig(Long hostId, HostConfigTypeEnum type); /** * 获取配置 @@ -46,7 +47,16 @@ public interface HostConfigService { * 更新配置 * * @param request request + * @return version */ - void updateHostConfig(HostConfigUpdateRequest request); + Integer updateHostConfig(HostConfigUpdateRequest request); + + /** + * 更新配置状态 + * + * @param request request + * @return version + */ + Integer updateHostConfigStatus(HostConfigUpdateStatusRequest request); } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConfigServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConfigServiceImpl.java index ede8b3df..5b15d93e 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConfigServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/HostConfigServiceImpl.java @@ -1,22 +1,26 @@ package com.orion.ops.module.asset.service.impl; import com.alibaba.fastjson.JSON; +import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.constant.ErrorMessage; +import com.orion.ops.framework.common.enums.BooleanBit; import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.module.asset.convert.HostConfigConvert; import com.orion.ops.module.asset.dao.HostConfigDAO; import com.orion.ops.module.asset.entity.domain.HostConfigDO; -import com.orion.ops.module.asset.entity.dto.host.HostConfigContent; import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateRequest; +import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateStatusRequest; import com.orion.ops.module.asset.entity.vo.HostConfigVO; import com.orion.ops.module.asset.enums.HostConfigTypeEnum; +import com.orion.ops.module.asset.handler.host.config.model.HostConfigModel; +import com.orion.ops.module.asset.handler.host.config.strategy.HostConfigStrategy; import com.orion.ops.module.asset.service.HostConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.lang.reflect.Type; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -35,64 +39,108 @@ public class HostConfigServiceImpl implements HostConfigService { @Override public HostConfigVO getHostConfig(Long hostId, String type) { - Valid.valid(HostConfigTypeEnum::of, type); + HostConfigTypeEnum configType = Valid.valid(HostConfigTypeEnum::of, type); // 查询配置 HostConfigDO config = hostConfigDAO.getHostConfigByHostId(hostId, type); Valid.notNull(config, ErrorMessage.CONFIG_ABSENT); // 转换 HostConfigVO vo = HostConfigConvert.MAPPER.to(config); - vo.setConfig(JSON.parseObject(config.getConfig())); + // 获取配置 + Map configMap = configType.getStrategy().toView(config.getConfig()); + vo.setConfig(configMap); return vo; } @Override - public T getHostConfig(Long hostId, HostConfigTypeEnum type) { + public T getHostConfig(Long hostId, HostConfigTypeEnum type) { // 查询配置 HostConfigDO config = hostConfigDAO.getHostConfigByHostId(hostId, type.name()); - Valid.notNull(config, ErrorMessage.CONFIG_ABSENT); - return JSON.parseObject(config.getConfig(), (Type) type.getType()); + if (config == null) { + return null; + } + return (T) JSON.parseObject(config.getConfig(), type.getType()); } @Override public List getHostConfig(Long hostId) { List configs = hostConfigDAO.getHostConfigByHostId(hostId); - return configs.stream().map(config -> { - HostConfigVO vo = HostConfigConvert.MAPPER.to(config); - vo.setConfig(JSON.parseObject(config.getConfig())); + return configs.stream().map(s -> { + HostConfigVO vo = HostConfigConvert.MAPPER.to(s); + // 获取配置 + Map config = HostConfigTypeEnum.of(s.getType()) + .getStrategy() + .toView(s.getConfig()); + vo.setConfig(config); return vo; }).collect(Collectors.toList()); } @Override - public void updateHostConfig(HostConfigUpdateRequest request) { + public Integer updateHostConfig(HostConfigUpdateRequest request) { String typeValue = request.getType(); HostConfigTypeEnum type = Valid.valid(HostConfigTypeEnum::of, typeValue); - HostConfigContent requestConfig = JSON.parseObject(request.getConfig(), type.getType()); + HostConfigModel requestConfig = JSON.parseObject(request.getConfig(), type.getType()); // 查询原配置 HostConfigDO record = hostConfigDAO.getHostConfigByHostId(request.getHostId(), typeValue); + HostConfigStrategy strategy = type.getStrategy(); if (record == null) { // 填充 - type.insertFill(requestConfig); + strategy.insertFill(requestConfig); // 检查参数 Valid.valid(requestConfig); // 新增配置 HostConfigDO insert = HostConfigConvert.MAPPER.to(request); - insert.setConfig(JSON.toJSONString(requestConfig)); + 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); // 填充 - HostConfigContent beforeConfig = JSON.parseObject(record.getConfig(), type.getType()); - type.updateFill(beforeConfig, requestConfig); + 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(JSON.toJSONString(requestConfig)); + update.setConfig(requestConfig.serial()); hostConfigDAO.updateById(update); + return update.getVersion(); + } + } + + @Override + public Integer updateHostConfigStatus(HostConfigUpdateStatusRequest request) { + Long hostId = request.getHostId(); + String typeValue = request.getType(); + 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(); } } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/HostConfigMapper.xml b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/HostConfigMapper.xml index 6d4fe0d8..e3ac4c70 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/HostConfigMapper.xml +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/HostConfigMapper.xml @@ -12,13 +12,14 @@ + - id, host_id, type, config, version, create_time, update_time, creator, updater, deleted + id, host_id, type, status, config, version, create_time, update_time, creator, updater, deleted