【7.1.6】【scanner】更新devops平台汇报资源

pull/25/head
fengshuonan 2022-01-11 17:36:15 +08:00
parent 40d634556b
commit 85d12f7998
6 changed files with 158 additions and 17 deletions

View File

@ -62,4 +62,14 @@ public interface ScannerConstants {
*/
String FIELD_METADATA_CLASS_ALL_PATH = "cn.stylefeng.roses.kernel.scanner.api.pojo.resource.FieldMetadata";
/**
* DevOpstoken
*/
Long DEVOPS_REPORT_TIMEOUT_SECONDS = 5L;
/**
* DevOps
*/
Integer DEVOPS_REPORT_CONNECTION_TIMEOUT_SECONDS = 3;
}

View File

@ -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.
*
* GunsAPACHE 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 {
/**
* DevOpsHttp
*/
HTTP_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + ScannerConstants.RESOURCE_MODULE_NAME + "01", "DevOps汇报资源出错Http调用出错"),
/**
* DevOpsHttp
*/
HTTP_RESPONSE_EMPTY(RuleConstants.BUSINESS_ERROR_TYPE_CODE + ScannerConstants.RESOURCE_MODULE_NAME + "02", "DevOps汇报资源出错Http调用获取返回结果为空"),
/**
* DevOpsHttp
*/
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;
}
}

View File

@ -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 {
/**
* DevOpsIP
* DevOpshttp://127.0.0.1:8087
*/
private String host;
/**
* DevOps
*/
private String port;
private String serverHost;
/**
* DevOpsDevOps
@ -29,6 +25,13 @@ public class DevOpsReportProperties {
/**
* DevOpsjwt
*/
private String projectInteractionKey;
private String projectInteractionSecretKey;
/**
* FieldMetadata
* <p>
* cn.stylefeng.roses
*/
private String fieldMetadataClassPath = ScannerConstants.FIELD_METADATA_CLASS_ALL_PATH;
}

View File

@ -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);
}

View File

@ -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>

View File

@ -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);
}
}
/**