mirror of https://gitee.com/stylefeng/roses
【7.1.6】【scanner】更新devops平台汇报资源
parent
40d634556b
commit
85d12f7998
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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类的全路径
|
||||
* <p>
|
||||
* 默认是cn.stylefeng.roses开头的
|
||||
*/
|
||||
private String fieldMetadataClassPath = ScannerConstants.FIELD_METADATA_CLASS_ALL_PATH;
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -17,6 +17,13 @@
|
|||
|
||||
<dependencies>
|
||||
|
||||
<!--jwt相关参数-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>jwt-sdk</artifactId>
|
||||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--系统管理api模块-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
|
|
|
@ -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<SysResourceMapper, SysResource> implements SysResourceService, ResourceReportApi, ResourceServiceApi, DevOpsReportApi {
|
||||
|
||||
@Resource
|
||||
|
@ -371,14 +388,47 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
|||
@Override
|
||||
public void reportResources(DevOpsReportProperties devOpsReportProperties, Map<String, Map<String, ResourceDefinition>> 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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue