diff --git a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/constants/ScannerConstants.java b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/constants/ScannerConstants.java index 44552d11a..59ff15072 100644 --- a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/constants/ScannerConstants.java +++ b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/constants/ScannerConstants.java @@ -62,4 +62,14 @@ public interface ScannerConstants { */ String FIELD_METADATA_CLASS_ALL_PATH = "cn.stylefeng.roses.kernel.scanner.api.pojo.resource.FieldMetadata"; + /** + * DevOps平台资源汇报接口token超时时间 + */ + Long DEVOPS_REPORT_TIMEOUT_SECONDS = 5L; + + /** + * DevOps平台资源汇报接口连接超时时间 + */ + Integer DEVOPS_REPORT_CONNECTION_TIMEOUT_SECONDS = 3; + } diff --git a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/exception/enums/DevOpsExceptionEnum.java b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/exception/enums/DevOpsExceptionEnum.java new file mode 100644 index 000000000..75a1642ac --- /dev/null +++ b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/exception/enums/DevOpsExceptionEnum.java @@ -0,0 +1,71 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.scanner.api.exception.enums; + +import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; +import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum; +import cn.stylefeng.roses.kernel.scanner.api.constants.ScannerConstants; +import lombok.Getter; + +/** + * DevOps一体化平台异常枚举 + * + * @author fengshuonan + * @date 2022/1/11 17:31 + */ +@Getter +public enum DevOpsExceptionEnum implements AbstractExceptionEnum { + + /** + * DevOps汇报资源出错,Http调用出错! + */ + HTTP_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + ScannerConstants.RESOURCE_MODULE_NAME + "01", "DevOps汇报资源出错,Http调用出错!"), + + /** + * DevOps汇报资源出错,Http调用获取返回结果出错! + */ + HTTP_RESPONSE_EMPTY(RuleConstants.BUSINESS_ERROR_TYPE_CODE + ScannerConstants.RESOURCE_MODULE_NAME + "02", "DevOps汇报资源出错,Http调用获取返回结果为空!"), + + /** + * DevOps汇报资源出错,Http调用获取返回结果出错! + */ + HTTP_RESPONSE_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + ScannerConstants.RESOURCE_MODULE_NAME + "02", "DevOps汇报资源出错,Http调用获取返回结果错误!具体原因为:{}"); + + /** + * 错误编码 + */ + private final String errorCode; + + /** + * 提示用户信息 + */ + private final String userTip; + + DevOpsExceptionEnum(String errorCode, String userTip) { + this.errorCode = errorCode; + this.userTip = userTip; + } + +} diff --git a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/pojo/devops/DevOpsReportProperties.java b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/pojo/devops/DevOpsReportProperties.java index ada74b66c..5d4d8b2f9 100644 --- a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/pojo/devops/DevOpsReportProperties.java +++ b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/pojo/devops/DevOpsReportProperties.java @@ -1,5 +1,6 @@ package cn.stylefeng.roses.kernel.scanner.api.pojo.devops; +import cn.stylefeng.roses.kernel.scanner.api.constants.ScannerConstants; import lombok.Data; /** @@ -12,14 +13,9 @@ import lombok.Data; public class DevOpsReportProperties { /** - * DevOps平台的IP + * DevOps平台的服务端地址,例如:http://127.0.0.1:8087 */ - private String host; - - /** - * DevOps平台的端口 - */ - private String port; + private String serverHost; /** * 当前项目在DevOps平台的唯一标识,由DevOps平台颁发 @@ -29,6 +25,13 @@ public class DevOpsReportProperties { /** * 当前项目和DevOps平台的交互秘钥(jwt秘钥) */ - private String projectInteractionKey; + private String projectInteractionSecretKey; + + /** + * FieldMetadata类的全路径 + *

+ * 默认是cn.stylefeng.roses开头的 + */ + private String fieldMetadataClassPath = ScannerConstants.FIELD_METADATA_CLASS_ALL_PATH; } diff --git a/kernel-d-scanner/scanner-sdk-scanner/src/main/java/cn/stylefeng/roses/kernel/scanner/ResourceReportListener.java b/kernel-d-scanner/scanner-sdk-scanner/src/main/java/cn/stylefeng/roses/kernel/scanner/ResourceReportListener.java index 35fb45551..aea51f249 100644 --- a/kernel-d-scanner/scanner-sdk-scanner/src/main/java/cn/stylefeng/roses/kernel/scanner/ResourceReportListener.java +++ b/kernel-d-scanner/scanner-sdk-scanner/src/main/java/cn/stylefeng/roses/kernel/scanner/ResourceReportListener.java @@ -77,10 +77,10 @@ public class ResourceReportListener extends ApplicationReadyListener implements DevOpsReportProperties devOpsReportProperties = applicationContext.getBean(DevOpsReportProperties.class); // 如果配置了相关属性则进行DevOps资源汇报 if (ObjectUtil.isAllNotEmpty(devOpsReportProperties, - devOpsReportProperties.getHost(), - devOpsReportProperties.getPort(), - devOpsReportProperties.getProjectInteractionKey(), - devOpsReportProperties.getProjectUniqueCode())) { + devOpsReportProperties.getServerHost(), + devOpsReportProperties.getProjectInteractionSecretKey(), + devOpsReportProperties.getProjectUniqueCode(), + devOpsReportProperties.getServerHost())) { DevOpsReportApi devOpsReportApi = applicationContext.getBean(DevOpsReportApi.class); devOpsReportApi.reportResources(devOpsReportProperties, modularResources); } diff --git a/kernel-s-system/system-business-resource/pom.xml b/kernel-s-system/system-business-resource/pom.xml index d8422bb0b..35569b7a6 100644 --- a/kernel-s-system/system-business-resource/pom.xml +++ b/kernel-s-system/system-business-resource/pom.xml @@ -17,6 +17,13 @@ + + + cn.stylefeng.roses + jwt-sdk + ${roses.version} + + cn.stylefeng.roses diff --git a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/service/impl/SysResourceServiceImpl.java b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/service/impl/SysResourceServiceImpl.java index 3f20ac647..a32fc5528 100644 --- a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/service/impl/SysResourceServiceImpl.java +++ b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/service/impl/SysResourceServiceImpl.java @@ -24,7 +24,12 @@ */ package cn.stylefeng.roses.kernel.system.modular.resource.service.impl; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; import cn.stylefeng.roses.kernel.auth.api.LoginUserApi; import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo; @@ -32,13 +37,19 @@ import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; +import cn.stylefeng.roses.kernel.jwt.JwtTokenOperator; +import cn.stylefeng.roses.kernel.jwt.api.pojo.config.JwtConfig; import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; import cn.stylefeng.roses.kernel.rule.constants.TreeConstants; import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; +import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData; import cn.stylefeng.roses.kernel.rule.tree.factory.DefaultTreeBuildFactory; import cn.stylefeng.roses.kernel.scanner.api.DevOpsReportApi; import cn.stylefeng.roses.kernel.scanner.api.ResourceReportApi; +import cn.stylefeng.roses.kernel.scanner.api.exception.ScannerException; +import cn.stylefeng.roses.kernel.scanner.api.exception.enums.DevOpsExceptionEnum; import cn.stylefeng.roses.kernel.scanner.api.pojo.devops.DevOpsReportProperties; +import cn.stylefeng.roses.kernel.scanner.api.pojo.devops.DevOpsReportResourceParam; import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ReportResourceParam; import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceDefinition; import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceUrlParam; @@ -52,11 +63,13 @@ import cn.stylefeng.roses.kernel.system.modular.resource.factory.ResourceFactory import cn.stylefeng.roses.kernel.system.modular.resource.mapper.SysResourceMapper; import cn.stylefeng.roses.kernel.system.modular.resource.pojo.ResourceTreeNode; import cn.stylefeng.roses.kernel.system.modular.resource.service.SysResourceService; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -66,6 +79,9 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; +import static cn.stylefeng.roses.kernel.scanner.api.constants.ScannerConstants.DEVOPS_REPORT_CONNECTION_TIMEOUT_SECONDS; +import static cn.stylefeng.roses.kernel.scanner.api.constants.ScannerConstants.DEVOPS_REPORT_TIMEOUT_SECONDS; + /** * 资源表 服务实现类 * @@ -73,6 +89,7 @@ import java.util.stream.Collectors; * @date 2020/11/23 22:45 */ @Service +@Slf4j public class SysResourceServiceImpl extends ServiceImpl implements SysResourceService, ResourceReportApi, ResourceServiceApi, DevOpsReportApi { @Resource @@ -371,14 +388,47 @@ public class SysResourceServiceImpl extends ServiceImpl> resourceDefinitions) { - // 获取运维平台相关配置 - + // 去掉请求地址结尾的左斜杠 + String serverHost = devOpsReportProperties.getServerHost(); + if (StrUtil.endWith(serverHost, "/")) { + serverHost = StrUtil.removeSuffix(serverHost, "/"); + } - // jwt秘钥生成 + // 组装请求DevOps平台的地址 todo + String devopsReportUrl = serverHost + "/todo url"; + + // jwt token生成 + String projectInteractionSecretKey = devOpsReportProperties.getProjectInteractionSecretKey(); + JwtConfig jwtConfig = new JwtConfig(); + jwtConfig.setJwtSecret(projectInteractionSecretKey); + jwtConfig.setExpiredSeconds(DEVOPS_REPORT_TIMEOUT_SECONDS); + JwtTokenOperator jwtTokenOperator = new JwtTokenOperator(jwtConfig); + String jwtToken = jwtTokenOperator.generateToken(new HashMap<>()); + + // 组装请求参数 + DevOpsReportResourceParam devOpsReportResourceParam = new DevOpsReportResourceParam( + devOpsReportProperties.getProjectUniqueCode(), jwtToken, resourceDefinitions, devOpsReportProperties.getFieldMetadataClassPath()); // 进行post请求,汇报资源 - - + HttpRequest httpRequest = HttpUtil.createPost(devopsReportUrl); + httpRequest.body(JSON.toJSONString(devOpsReportResourceParam)); + httpRequest.setConnectionTimeout(Convert.toInt(DEVOPS_REPORT_CONNECTION_TIMEOUT_SECONDS * 1000)); + try { + HttpResponse execute = httpRequest.execute(); + String body = execute.body(); + ResponseData responseData = JSON.parseObject(body, ResponseData.class); + // 返回结果为空 + if (responseData == null) { + throw new ScannerException(DevOpsExceptionEnum.HTTP_RESPONSE_EMPTY); + } + // 返回失败 + if (!responseData.getSuccess()) { + throw new ScannerException(DevOpsExceptionEnum.HTTP_RESPONSE_ERROR, responseData.getMessage()); + } + } catch (Exception e) { + log.error("向devops平台汇报资源异常,可以将devops相关配置删除", e); + throw new ScannerException(DevOpsExceptionEnum.HTTP_RESPONSE_EMPTY); + } } /**