Commit a9f61204 authored by 黄智's avatar 黄智

Merge remote-tracking branch 'origin/dev' into dev

parents 619689fa 7f25cae8
......@@ -7,6 +7,7 @@ type AlertClass struct {
ClassName string `json:"class_name" xorm:"'class_name'"` // 分类名称
ParentId int `json:"parent_id" xorm:"'parent_id'"` // 父级id
SortOrder int `json:"sort_order" xorm:"'sort_order'"` // 排序
SourceFrom int `json:"source_from" xorm:"source_from"` // 数据来源 1:默认 2:自定义
CreatedBy string `json:"created_by" xorm:"'created_by'"` // 创建人
CreatedAt jsontime.Time `json:"created_at" xorm:"'created_at'"` // 创建时间
UpdatedBy string `json:"updated_by" xorm:"'updated_by'"` // 更新人
......
package entity
import "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/jsontime"
// AlertRules 预警规则配置
type AlertRules struct {
Id string `json:"id" xorm:"'id' pk"` // 主键id
MetricName string `json:"metric_name" xorm:"'metric_name'"` // 预警规则名称(指标名称)
DetectionType int `json:"detection_type" xorm:"'detection_type'"` // 检测类型 1:静态阈值 2:自定义
ClassId int `json:"class_id" xorm:"'class_id'"` // 预警对象id(级联:预警分类/预警对象)
MetricConfigId string `json:"metric_config_id" xorm:"'metric_config_id'"` // 预警指标id
AlertRange string `json:"alert_range" xorm:"'alert_range'"` // 预警范围 字典值
AlertCondition string `json:"alert_condition" xorm:"'alert_condition'"` // 预警规则 字典值
Duration int `json:"duration" xorm:"'duration'"` // 持续时间
DurationUnit string `json:"duration_unit" xorm:"'duration_unit'"` // 持续时间单位 s m h
CheckPeriod int `json:"check_period" xorm:"'check_period'"` // 检查周期 单位:分钟
NotifyMethod string `json:"notify_method" xorm:"'notify_method'"` // 预警通知方式 all dingtalk sms
NotifyPushCount int `json:"notify_push_count" xorm:"'notify_push_count'"` // 消息推送次数
NotifyPushFrequency int `json:"notify_push_frequency" xorm:"'notify_push_frequency'"` // 消息推送频率 分钟
IsEnabled int `json:"is_enabled" xorm:"'is_enabled'"` // 是否开启 0:关闭 1:启动
CreatedBy string `json:"created_by" xorm:"'created_by'"` // 创建人
CreatedAt jsontime.Time `json:"created_at" xorm:"'created_at'"` // 创建时间
UpdatedBy string `json:"updated_by" xorm:"'updated_by'"` // 更新人
UpdatedAt jsontime.Time `json:"updated_at" xorm:"'updated_at'"` // 更新时间
}
func (m *AlertRules) TableName() string {
return "alert_rules"
}
type RulesAlertRange struct {
Name string `json:"name" form:"name" binding:"required"`
Value string `json:"value" form:"value" binding:"required"`
Compare string `json:"compare" form:"compare" binding:"required"`
}
type AlertCondition struct {
ThresholdsMax int `json:"thresholds_max" form:"thresholds_max" binding:"required"`
ThresholdsMin int `json:"thresholds_min" form:"thresholds_min" binding:"required"`
RiskLevel int `json:"risk_level" form:"risk_level" binding:"required"`
}
......@@ -13,6 +13,7 @@ type MetricConfig struct {
CheckPeriod int `json:"check_period" xorm:"'check_period'"` // 检查周期 单位:分钟
IsEnabled int `json:"is_enabled" xorm:"'is_enabled'"` // 是否开启 0:关闭 1:启动
AlertRuleType string `json:"alert_rule_type" xorm:"'alert_rule_type'"` // 预警规则类型 关联字典表
SourceFrom int `json:"source_from" xorm:"source_from"` // 数据来源 1:默认 2:自定义
CreatedBy string `json:"created_by" xorm:"'created_by'"` // 创建人
CreatedAt jsontime.Time `json:"created_at" xorm:"'created_at'"` // 创建时间
UpdatedBy string `json:"updated_by" xorm:"'updated_by'"` // 更新人
......
package entity
import "time"
type WorkOrder struct {
Id int `json:"id" xorm:"pk autoincr" ` // id
OrderName string `json:"order_name" xorm:"order_name"` // 工单名称
OrderLevel int `json:"order_level" xorm:"order_level"` // 工单等级(1紧急任务 2重要任务 3一般任务)
OrderDesc string `json:"order_desc" xorm:"order_desc"` // 工单描述
OrderCnt int `json:"order_cnt" xorm:"order_cnt"` // 实例工单数
PushObj string `json:"push_obj" xorm:"push_obj"` // 推送对象
TimingType int `json:"timing_type" xorm:"timing_type"` // 定时类型(1手动下发 2按周 3自定义时间)
TimingRule string `json:"timing_rule" xorm:"timing_rule"` // 定时规则
TimingState int `json:"timing_state" xorm:"timing_state"` // 定时状态(0禁用 1启用)
CreateUser string `json:"create_user" xorm:"create_user" ` // 创建人
CreateTime time.Time `json:"create_time" xorm:"create_time" ` // 创建时间
UpdateUser string `json:"update_user" xorm:"update_user"` // 修改人
UpdateTime time.Time `json:"update_time" xorm:"update_time" ` // 修改时间
}
......@@ -4,6 +4,7 @@ type AddAlertClass struct {
ClassName string `json:"class_name" form:"class_name" binding:"required"`
ParentId int `json:"parent_id" form:"parent_id" binding:"omitempty,oneof=0 1"`
SortOrder int `json:"sort_order" form:"sort_order"`
SourceFrom int `json:"source_from" form:"source_from" binding:"omitempty,oneof=1 2"` // 数据来源 1:默认 2:自定义
}
type UpdateAlertClass struct {
......
package request
import "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity"
type AddAlertRules struct {
MetricName string `json:"metric_name" form:"metric_name" binding:"required"` // 预警规则名称(指标名称)
DetectionType int `json:"detection_type" form:"detection_type" binding:"oneof=1 2"` // 检测类型 1:静态阈值 2:自定义
ClassId int `json:"class_id" form:"class_id" binding:"required_if=DetectionType 1"` // 预警对象id(级联:预警分类/预警对象)
ClassParentName string `json:"class_parent_name" form:"class_parent_name" binding:"required_if=DetectionType 2"` // 预警分类名称
ClassName string `json:"class_name" form:"class_name" binding:"required_if=DetectionType 2"` // 预警对象名称
MetricConfigName string `json:"metric_config_name" form:"metric_config_name" binding:"required_if=DetectionType 2"` // 预警指标名称(映射entity.MetricConfig.MetricName)
Expr string `json:"expr" form:"expr" binding:"required_if=DetectionType 2"` // 指标表达式(PromQL语句)
AlertCondition []entity.AlertCondition `json:"alert_condition" form:"alert_condition" binding:"required"` // 预警规则 字典值
AlertRuleType string `json:"alert_rule_type" form:"alert_rule_type" binding:"required_if=DetectionType 2"` // 预警规则类型 关联字典表
AlertRange []entity.RulesAlertRange `json:"alert_range" form:"alert_range" binding:"required,dive"` // 预警范围 字典值
Duration int `json:"duration" form:"duration" binding:"gte=0"` // 持续时间
DurationUnit string `json:"duration_unit" form:"duration_unit" binding:"oneof=s m h"` // 持续时间单位 s m h
CheckPeriod int `json:"check_period" form:"check_period" binding:"oneof=1 3 5 10 20 30"` // 检查周期 单位:分钟
NotifyMethod string `json:"notify_method" form:"notify_method" binding:"oneof=all dingtalk sms"` // 预警通知方式 all dingtalk sms
NotifyPushCount int `json:"notify_push_count" form:"notify_push_count" binding:"gte=1"` // 消息推送次数
NotifyPushFrequency int `json:"notify_push_frequency" form:"notify_push_frequency" binding:"gte=1"` // 消息推送频率 分钟
IsEnabled int `json:"is_enabled" form:"is_enabled" binding:"omitempty,oneof=0 1 2"` // 是否开启 1:是 2:否
}
type UpdateAlertRules struct {
Id string `json:"id" binding:"required"`
MetricName string `json:"metric_name" form:"metric_name" binding:"required"` // 预警规则名称(指标名称)
DetectionType int `json:"detection_type" form:"detection_type" binding:"oneof=1 2"` // 检测类型 1:静态阈值 2:自定义
ClassId int `json:"class_id" form:"class_id" binding:"required"` // 预警对象id(级联:预警分类/预警对象)
ClassParentName string `json:"class_parent_name" form:"class_parent_name" binding:"required_if=DetectionType 2"` // 预警分类名称
ClassName string `json:"class_name" form:"class_name" binding:"required_if=DetectionType 2"` // 预警对象名称
MetricConfigName string `json:"metric_config_name" form:"metric_config_name" binding:"required_if=DetectionType 2"` // 预警指标名称(detection_type=2时有值)
Expr string `json:"expr" form:"expr" binding:"required_if=DetectionType 2"` // 指标表达式(PromQL语句)
AlertCondition string `json:"alert_condition" form:"alert_condition" binding:"required"` // 预警规则 字典值
AlertRuleType string `json:"alert_rule_type" form:"alert_rule_type" binding:"required_if=DetectionType 2"` // 预警规则类型 关联字典表
AlertRange string `json:"alert_range" form:"alert_range"` // 预警范围 字典值
Duration int `json:"duration" form:"duration" binding:"gte=0"` // 持续时间
DurationUnit string `json:"duration_unit" form:"duration_unit" binding:"oneof=s m h"` // 持续时间单位 s m h
CheckPeriod int `json:"check_period" form:"check_period" binding:"gte=0"` // 检查周期 单位:分钟
NotifyMethod string `json:"notify_method" form:"notify_method" binding:"oneof=all dingtalk sms"` // 预警通知方式 all dingtalk sms
NotifyPushCount int `json:"notify_push_count" form:"notify_push_count" binding:"gte=1"` // 消息推送次数
NotifyPushFrequency int `json:"notify_push_frequency" form:"notify_push_frequency" binding:"gte=1"` // 消息推送频率 分钟
IsEnabled int `json:"is_enabled" form:"is_enabled" binding:"omitempty,oneof=0 1 2"` // 是否开启 1:是 2:否
}
type DeleteAlertRules struct {
Id string `json:"id" form:"id"`
Ids []string `json:"ids" form:"ids" binding:"required_without=Id"`
}
type DetailAlertRules struct {
Id string `json:"id" form:"id" binding:"required"`
}
type ListAlertRules struct {
Id string `json:"id" form:"id"`
MetricName string `json:"metric_name" form:"metric_name"` // 预警规则名称(指标名称)
DetectionType int `json:"detection_type" form:"detection_type"` // 检测类型 1:静态阈值 2:自定义
ClassId int `json:"class_id" form:"class_id"` // 预警对象id(级联:预警分类/预警对象)
ClassParentName string `json:"class_parent_name" form:"class_parent_name"` // 预警分类名称
ClassName string `json:"class_name" form:"class_name"` // 预警对象名称
MetricConfigName string `json:"metric_config_name" form:"metric_config_name"` // 预警指标名称(detection_type=2时有值)
Expr string `json:"expr" form:"expr"` // 指标表达式(PromQL语句)
AlertCondition string `json:"alert_condition" form:"alert_condition"` // 预警规则 字典值
AlertRuleType string `json:"alert_rule_type" form:"alert_rule_type"` // 预警规则类型 关联字典表
AlertRange string `json:"alert_range" form:"alert_range"` // 预警范围 字典值
Duration int `json:"duration" form:"duration"` // 持续时间
DurationUnit string `json:"duration_unit" form:"duration_unit"` // 持续时间单位 s m h
CheckPeriod int `json:"check_period" form:"check_period"` // 检查周期 单位:分钟
NotifyMethod string `json:"notify_method" form:"notify_method"` // 预警通知方式 all dingtalk sms
NotifyPushCount int `json:"notify_push_count" form:"notify_push_count"` // 消息推送次数
NotifyPushFrequency int `json:"notify_push_frequency" form:"notify_push_frequency"` // 消息推送频率 分钟
IsEnabled int `json:"is_enabled" form:"is_enabled"` // 是否开启 1:是 2:否
Pagination
}
package request
type DocLibGetReq struct {
FileName string `uri:"file_name" binding:"required"` //文档名称
Ext string `uri:"ext" binding:"required"` //后缀格式
Opt string `uri:"opt" binding:"required,oneof=preview download"` //操作
}
......@@ -10,8 +10,9 @@ type AddMetricConfig struct {
Duration int `json:"duration" form:"duration"` // 持续时间
DurationUnit string `json:"duration_unit" form:"duration_unit" binding:"required,oneof=s m h"` // 持续时间单位 s m h
CheckPeriod int `json:"check_period" form:"check_period" binding:"oneof=1 3 5 10 20 30"` // 检查周期 单位:分钟
IsEnabled int `json:"is_enabled" form:"is_enabled" binding:"oneof=0 1 2"` // 是否开启 1:启动 2:停用
IsEnabled int `json:"is_enabled" form:"is_enabled" binding:"omitempty,oneof=0 1 2"` // 是否开启 1:是 2:否
AlertRuleType string `json:"alert_rule_type" form:"alert_rule_type" binding:"required"` // 预警规则类型 关联字典表
SourceFrom int `json:"source_from" form:"source_from" binding:"omitempty,oneof=1 2"` // 数据来源 1:默认 2:自定义
}
type UpdateMetricConfig struct {
......@@ -23,8 +24,9 @@ type UpdateMetricConfig struct {
Duration int `json:"duration" form:"duration"` // 持续时间
DurationUnit string `json:"duration_unit" form:"duration_unit" binding:"omitempty,oneof=s m h"` // 持续时间单位 s m h
CheckPeriod int `json:"check_period" form:"check_period" binding:"omitempty,oneof=1 3 5 10 20 30"` // 检查周期 单位:分钟
IsEnabled int `json:"is_enabled" form:"is_enabled" binding:"omitempty,oneof=0 1 2"` // 是否开启 1:启动 2:停用
IsEnabled int `json:"is_enabled" form:"is_enabled" binding:"omitempty,oneof=0 1 2"` // 是否开启 1:是 2:否
AlertRuleType string `json:"alert_rule_type" form:"alert_rule_type"` // 预警规则类型 关联字典表
SourceFrom int `json:"source_from" form:"source_from" binding:"omitempty,oneof=1 2"` // 数据来源 1:默认 2:自定义
}
type DeleteMetricConfig struct {
......
package request
type TaskHistoryReq struct {
Search string `json:"search" form:"search"` // 关键词
Pagination
}
type TaskInfoListReq struct {
TaskId int `json:"task_id" form:"task_id" binding:"required"` // 主键ID
Search string `json:"search" form:"search"` // 关键词
Pagination
}
package response
import "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity"
type AlertRulesItem struct {
entity.AlertRules `xorm:"extends"`
}
type AlertRulesList struct {
TotalCount int64 `json:"total_count"`
List []AlertRulesItem `json:"list"`
}
......@@ -26,13 +26,14 @@ type HostManage struct {
}
type HostList struct {
Id int `json:"id"` // id
//Id int `json:"id"` // id
Ip string `json:"ip"` // ip
Port string `json:"port"` // 端口
VoucherType int `json:"voucher_type"` // 凭证类型(0密码验证 密钥验证)
UserName string `json:"user_name"` // 用户名
Password string `json:"password"` // 密码
HostFileUrl string `json:"-"` // 主机文件url
Cnt int `json:"cnt""` //主机ip数量
}
type TaskList struct {
......
......@@ -7,7 +7,7 @@ type MetricConfigItem struct {
AlertRange []entity.AlertRange `json:"alert_range" xorm:"alert_range"`
}
type UnitsList struct {
type MetricConfigList struct {
TotalCount int64 `json:"total_count"`
List []MetricConfigItem `json:"list"`
}
......@@ -13,6 +13,7 @@ type TaskManageListRes struct {
type TaskManageRes struct {
Id int `json:"id"` // id
HostGroupId int `json:"host_group_id"` // 主机分组id
TaskName string `json:"task_name"` // 任务名称
TaskDesc string `json:"task_desc"` // 任务描述
YamlDesc string `json:"yaml_desc"` // yaml文件
......
......@@ -30,7 +30,7 @@ type Config struct {
MinioAccessKey string
MinioSecretKey string
MinioBucket string
TempDirPrefix string
//TempDirPrefix string
PrometheusHost string
}
......
......@@ -3,6 +3,7 @@ package controller
import (
"github.com/gin-gonic/gin"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/router/middleware/header"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/service"
......@@ -17,7 +18,12 @@ func AddAlertClass(c *gin.Context) {
}
svc := service.AlertClassSvc{User: header.GetUser(c)}
err := svc.Add(req)
db, err := client.GetDbClient()
if err != nil {
SendJsonResponse(c, resp.DbConnectError.WithError(err), nil)
return
}
_, err = svc.Add(db.NewSession(), req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
......@@ -33,7 +39,12 @@ func UpdateAlertClass(c *gin.Context) {
}
svc := service.AlertClassSvc{User: header.GetUser(c)}
err := svc.Update(req)
db, err := client.GetDbClient()
if err != nil {
SendJsonResponse(c, resp.DbConnectError.WithError(err), nil)
return
}
err = svc.Update(db.NewSession(), req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
......
package controller
import (
"github.com/gin-gonic/gin"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/router/middleware/header"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/service"
)
// AddAlertRules 新增任务
func AddAlertRules(c *gin.Context) {
var req request.AddAlertRules
if err := c.ShouldBind(&req); err != nil {
SendJsonResponse(c, resp.InvalidParam.TranslateError(err), nil)
return
}
svc := service.AlertRulesSvc{User: header.GetUser(c)}
err := svc.Add(req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
}
SendJsonResponse(c, resp.OK, nil)
}
func UpdateAlertRules(c *gin.Context) {
var req request.UpdateAlertRules
if err := c.ShouldBind(&req); err != nil {
SendJsonResponse(c, resp.InvalidParam.TranslateError(err), nil)
return
}
svc := service.AlertRulesSvc{User: header.GetUser(c)}
err := svc.Update(req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
}
SendJsonResponse(c, resp.OK, nil)
}
func DeleteAlertRules(c *gin.Context) {
var req request.DeleteAlertRules
if err := c.ShouldBind(&req); err != nil {
SendJsonResponse(c, resp.InvalidParam.TranslateError(err), nil)
return
}
var ids []string
switch len(req.Ids) {
case 0:
ids = append(ids, req.Id)
default:
ids = req.Ids
}
svc := service.AlertRulesSvc{User: header.GetUser(c)}
err := svc.Delete(ids)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
}
SendJsonResponse(c, resp.OK, nil)
}
func DetailAlertRules(c *gin.Context) {
var req request.DetailAlertRules
if err := c.ShouldBind(&req); err != nil {
SendJsonResponse(c, resp.InvalidParam.TranslateError(err), nil)
return
}
svc := service.AlertRulesSvc{User: header.GetUser(c)}
data, err := svc.GetDataById(req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
}
SendJsonResponse(c, resp.OK, data)
}
func ListAlertRules(c *gin.Context) {
var req request.ListAlertRules
if err := c.ShouldBind(&req); err != nil {
SendJsonResponse(c, resp.InvalidParam.TranslateError(err), nil)
return
}
svc := service.AlertRulesSvc{User: header.GetUser(c)}
data, err := svc.List(req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
}
SendJsonResponse(c, resp.OK, data)
}
......@@ -2,8 +2,12 @@ package controller
import (
"github.com/gin-gonic/gin"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/service"
"net/http"
"net/http/httputil"
"net/url"
)
func AddFile(c *gin.Context) {
......@@ -16,3 +20,32 @@ func AddFile(c *gin.Context) {
}
SendJsonResponse(c, resp.OK, doc)
}
func DownloadFile(c *gin.Context) {
var req request.DocLibGetReq
if err := c.ShouldBindUri(&req); err != nil {
SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
return
}
docLibSvc := service.DocLibSvc{}
docUrl, err := docLibSvc.DownloadFile(c, req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
}
switch req.Opt {
case "download":
//c.Redirect(http.StatusMovedPermanently, docUrl.String())
docUrlParse, _ := url.Parse(docUrl.String())
proxy := httputil.ReverseProxy{
Director: func(req *http.Request) {
req.Header = c.Request.Header
req.Host = docUrlParse.Host
req.URL = docUrlParse
},
}
proxy.ServeHTTP(c.Writer, c.Request)
case "preview":
c.Redirect(http.StatusMovedPermanently, docUrl.String())
}
}
......@@ -7,7 +7,6 @@ import (
json "github.com/json-iterator/go"
"github.com/spf13/cast"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/service"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/util"
......@@ -74,14 +73,14 @@ func GetMinioFiles(fileName string) (hostManageList []request.HostManageList, er
//读取工作簿
rows := xlsxData.GetRows("Sheet1")
if len(rows) > 1001 {
if len(rows) > 1003 {
err = resp.FailedToParseFile.WithError(errors.New("ip数量不可超过1000"))
return
}
for i := 0; i < len(rows); i++ {
//默认跳过第一
if i < 1 {
//默认跳过前两
if i < 2 {
continue
}
......@@ -371,11 +370,11 @@ func ExportIp(c *gin.Context) {
SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("导出类型解析错误")), nil)
return
}
if id == "" {
if cast.ToInt(detectionType) == 1 && id == "" {
SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("id为空")), nil)
return
}
if uuid == "" {
if cast.ToInt(detectionType) == 0 && uuid == "" {
SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("uuid为空")), nil)
return
}
......@@ -390,7 +389,7 @@ func ExportIp(c *gin.Context) {
c.Writer.Header().Add("Content-Transfer-Encoding", "binary")
c.Writer.Header().Add("Content-Disposition", "filename="+fileName)
c.File(conf.Options.TempDirPrefix + fileName)
c.File("/app/xlsx/" + fileName)
}
// ListHostManage 列表
......
......@@ -3,6 +3,7 @@ package controller
import (
"github.com/gin-gonic/gin"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/router/middleware/header"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/service"
......@@ -17,7 +18,12 @@ func AddMetricConfig(c *gin.Context) {
}
svc := service.MetricConfigSvc{User: header.GetUser(c)}
err := svc.Add(req)
db, err := client.GetDbClient()
if err != nil {
SendJsonResponse(c, resp.DbConnectError.WithError(err), nil)
return
}
_, err = svc.Add(db.NewSession(), req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
......@@ -33,7 +39,12 @@ func UpdateMetricConfig(c *gin.Context) {
}
svc := service.MetricConfigSvc{User: header.GetUser(c)}
err := svc.Update(req)
db, err := client.GetDbClient()
if err != nil {
SendJsonResponse(c, resp.DbConnectError.WithError(err), nil)
return
}
err = svc.Update(db.NewSession(), req)
if err != nil {
SendJsonResponse(c, resp.FAIL.WithError(err), nil)
return
......
......@@ -11,7 +11,7 @@ import (
// TaskHistoryList 任务历史列表
func TaskHistoryList(c *gin.Context) {
var req request.Pagination
var req request.TaskHistoryReq
if err := c.ShouldBind(&req); err != nil {
SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
return
......@@ -28,7 +28,7 @@ func TaskHistoryList(c *gin.Context) {
// TaskInfoList 任务历史详情列表
func TaskInfoList(c *gin.Context) {
var req request.TaskHistoryReq
var req request.TaskInfoListReq
if err := c.ShouldBind(&req); err != nil {
SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
return
......
package controller
import (
"github.com/gin-gonic/gin"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
)
// AddWorkOrderManage 新增业务工单管理
func AddWorkOrderManage(c *gin.Context) {
//var req request.AddTaskManageReq
//if err := c.ShouldBindJSON(&req); err != nil {
// SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
// return
//}
////参数校验
//if err := util.ValidateSimple(req, "TaskName,HostGroupId"); err != nil {
// SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
// return
//}
//
//taskManageSvc := service.TaskManageSvc{}
//err := taskManageSvc.AddTaskManage(req)
//if err != nil {
// SendJsonResponse(c, err, nil)
// return
//}
SendJsonResponse(c, resp.OK, nil)
}
//
//// EditTaskManage 编辑任务
//func EditTaskManage(c *gin.Context) {
// var req request.EditTaskManageReq
// if err := c.ShouldBindJSON(&req); err != nil {
// SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
// return
// }
// //参数校验
// if err := util.ValidateSimple(req, "Id,HostGroupId"); err != nil {
// SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
// return
// }
//
// taskManageSvc := service.TaskManageSvc{}
// err := taskManageSvc.EditTaskManage(req)
// if err != nil {
// SendJsonResponse(c, err, nil)
// return
// }
// SendJsonResponse(c, resp.OK, nil)
//}
//
//// DelTaskManage 删除任务
//func DelTaskManage(c *gin.Context) {
// var req request.DelTaskManageReq
// if err := c.ShouldBindJSON(&req); err != nil {
// SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
// return
// }
// //参数校验
// if err := util.ValidateSimple(req, "Id"); err != nil {
// SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
// return
// }
//
// taskManageSvc := service.TaskManageSvc{}
// err := taskManageSvc.DelTaskManage(req)
// if err != nil {
// SendJsonResponse(c, err, nil)
// return
// }
// SendJsonResponse(c, resp.OK, nil)
//}
//
//// DetailsTaskManage 任务详情
//func DetailsTaskManage(c *gin.Context) {
// var (
// err error
// id string
// )
//
// if id = c.Query("id"); id == "" {
// id = c.Param("id")
// }
// if id == "" {
// SendJsonResponse(c, resp.InvalidParam.WithError(errors.New("id为空")), nil)
// return
// }
//
// taskManageSvc := service.TaskManageSvc{}
// data, err := taskManageSvc.DetailsTaskManage(cast.ToInt(id))
// if err != nil {
// SendJsonResponse(c, err, nil)
// return
// }
// SendJsonResponse(c, resp.OK, data)
//}
//
//// ListTaskManage 任务列表
//func ListTaskManage(c *gin.Context) {
// var req request.ListTaskManageReq
// if err := c.ShouldBind(&req); err != nil {
// SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
// return
// }
//
// taskManageSvc := service.TaskManageSvc{}
// total, list, err := taskManageSvc.ListTaskManage(req)
// if err != nil {
// SendJsonPageResponse(c, err, nil, 0)
// return
// }
// SendJsonPageResponse(c, resp.OK, list, total)
//}
......@@ -29,6 +29,7 @@ func main() {
initTimeZone()
// init ansible hosts
initAnsibleHosts()
initTempDirPrefix()
pflag.Parse() // init start args
initConfig()
// init log config
......@@ -69,7 +70,7 @@ func initConfig() {
MinioAccessKey: util.SetEnvStr("MINIO_ACCESS_KEY", "beagleadmin"), // Minio Access Key
MinioSecretKey: util.SetEnvStr("MINIO_SECRET_KEY", "H76cPmwvH7vJ"), // Minio Secret
MinioBucket: util.SetEnvStr("MINIO_BUCKET", "so-operation"), // Minio Bucket
TempDirPrefix: util.SetEnvStr("TEMP_DIR_PREFIX", "/app/xlsx/"), //模板目录前缀
//TempDirPrefix: util.SetEnvStr("TEMP_DIR_PREFIX", "/app/xlsx/"), //模板目录前缀
PrometheusHost: util.SetEnvStr("PROMETHEUS_HOST", "https://prometheus.wodcloud.com"), // Prometheus Host
}
}
......@@ -129,3 +130,10 @@ func initAnsibleHosts() {
}
}
}
func initTempDirPrefix() {
err := os.Mkdir("/app/xlsx/", os.ModePerm)
if err != nil {
fmt.Println("创建目录失败!")
}
}
package router
import (
"fmt"
"github.com/gin-gonic/gin"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/controller"
)
// InitAlertRulesRouter 初始化预警规则配置路由
func InitAlertRulesRouter(e *gin.Engine) {
group := e.Group(fmt.Sprintf("%s/alert_rules", conf.Options.Prefix))
{
group.POST("", controller.AddAlertRules)
group.PUT("", controller.UpdateAlertRules)
group.DELETE("", controller.DeleteAlertRules)
group.GET("", controller.DetailAlertRules)
group.GET("list", controller.ListAlertRules)
}
}
......@@ -29,6 +29,7 @@ func Load(r *gin.Engine, middleware ...gin.HandlerFunc) {
}
base.POST("/add_file", controller.AddFile) //文件上传
base.GET("/download_file/:file_name/:ext/:opt", controller.DownloadFile) //文件下载
// 初始化自动化运维路由
InitAutomatedMaintenRouter(r)
......@@ -44,6 +45,10 @@ func Load(r *gin.Engine, middleware ...gin.HandlerFunc) {
InitSystemMenuRouter(r)
// 初始化指标配置路由
InitMetricConfigRouter(r)
// 初始化预警规则配置路由
InitAlertRulesRouter(r)
// 初始化prometheus路由
InitPrometheusRouter(r)
// 初始化工单管理路由
InitWorkOrderRouter(r)
}
package router
import (
"fmt"
"github.com/gin-gonic/gin"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/controller"
)
// InitWorkOrderRouter 初始化工单路由
func InitWorkOrderRouter(e *gin.Engine) {
so := e.Group(fmt.Sprintf("%s/work_order", conf.Options.Prefix))
//业务工单管理
manage := so.Group("/work_order_manage")
{
manage.POST("/add", controller.AddWorkOrderManage) // 新增
//manage.PUT("/edit", controller.EditTaskManage) // 编辑
//manage.DELETE("/del", controller.DelTaskManage) // 删除
//manage.GET("/details", controller.DetailsTaskManage) // 详情
//manage.GET("/list", controller.ListTaskManage) // 列表
//manage.POST("/exec/script", controller.ExecScript) // 立即执行
}
////任务历史
//taskHistory := so.Group("/task_history")
//{
// taskHistory.GET("/list", controller.TaskHistoryList) // 任务历史列表
// taskHistory.GET("/task_info_list", controller.TaskInfoList) // 任务历史详情列表
// taskHistory.GET("/task_exec_log", controller.TaskExecLog) // 任务执行日志
//}
//
////主机管理
//host := so.Group("/host_manage")
//{
// host.POST("/add", controller.AddHostManage) // 新增
// host.PUT("/edit", controller.EditHostManage) // 编辑
// host.DELETE("/del", controller.DelHostManage) // 删除
// host.GET("/details", controller.DetailsHostManage) // 详情
// host.GET("/page_list", controller.PageListHostManage) // 列表
// host.POST("/state", controller.StateHostManage) // 状态检测
// host.GET("/ip_exception_list", controller.HostIpExceptionList) // 主机ip异常列表
// host.GET("/export", controller.ExportIp) // 导出ip列表
// host.GET("/list", controller.ListHostManage) // 主机分组列表-不分页
//}
}
......@@ -11,23 +11,19 @@ import (
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/jsontime"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"sort"
"xorm.io/xorm"
)
type AlertClassSvc struct {
User entity.SystemUserInfo
}
func (m *AlertClassSvc) Add(req request.AddAlertClass) (err error) {
db, err := client.GetDbClient()
if err != nil {
err = resp.DbConnectError.WithError(err)
return err
}
func (m *AlertClassSvc) Add(session *xorm.Session, req request.AddAlertClass) (classId int, err error) {
now := jsontime.Now()
data := entity.AlertClass{
CreatedBy: "",
CreatedBy: m.User.SystemAccount,
CreatedAt: now,
UpdatedBy: "",
UpdatedBy: m.User.SystemAccount,
UpdatedAt: now,
}
_ = copier.Copy(&data, &req)
......@@ -37,23 +33,19 @@ func (m *AlertClassSvc) Add(req request.AddAlertClass) (err error) {
return
}
data.SortOrder = max + 1
_, err = db.NewSession().Insert(&data)
return nil
_, err = session.Insert(&data)
classId = data.ClassId
return
}
func (m *AlertClassSvc) Update(req request.UpdateAlertClass) error {
db, err := client.GetDbClient()
if err != nil {
err = resp.DbConnectError.WithError(err)
return err
}
func (m *AlertClassSvc) Update(session *xorm.Session, req request.UpdateAlertClass) error {
now := jsontime.Now()
data := entity.AlertClass{
UpdatedBy: "",
UpdatedBy: m.User.SystemAccount,
UpdatedAt: now,
}
_ = copier.Copy(&data, &req)
_, err = db.NewSession().Cols("class_name", "updated_by", "updated_at").ID(data.ClassId).Update(&data)
_, err := session.Cols("class_name", "updated_by", "updated_at").ID(data.ClassId).Update(&data)
if err != nil {
return err
}
......@@ -71,7 +63,7 @@ func (m *AlertClassSvc) Move(req request.MoveAlertClass) (err error) {
_ = copier.Copy(&data, &req)
var list []entity.AlertClass
_, err = db.NewSession().Where("class_id = ?", req.ClassId).Get(&data)
err = db.NewSession().Where("parent_id = ?", data.ParentId).OrderBy("sort_order asc").Find(&list)
err = db.NewSession().Where("parent_id = ?", data.ParentId).Where("source_from = 1").OrderBy("sort_order asc").Find(&list)
var previousIndex int
var nextIndex int
for i := 0; i < len(list); i++ {
......@@ -144,6 +136,7 @@ func (m *AlertClassSvc) List(req request.ListAlertClass) (resp response.AlertCla
}
session := db.NewSession()
defer session.Close()
session.Where("source_from = 1")
if req.ClassId != 0 {
session.Where("class_id = ?", req.ClassId)
}
......@@ -163,6 +156,7 @@ func (m *AlertClassSvc) Tree(req request.ListAlertClass) (resp []*response.Alert
session := db.NewSession()
defer session.Close()
var list []entity.AlertClass
session.Where("source_from = 1")
_, err = session.OrderBy("sort_order").FindAndCount(&list)
// TODO 对req进行过滤
resp, err = AlertClassTree(list)
......@@ -214,7 +208,7 @@ func (m *AlertClassSvc) SortOrderMax(parentId int) (max int, err error) {
}
_, err = db.NewSession().Table(new(entity.AlertClass)).
Select("max(sort_order)").
Where("parent_id = ?", parentId).Get(&max)
Where("parent_id = ?", parentId).Where("source_from = 1").Get(&max)
return
}
......
package service
import (
"github.com/google/uuid"
"github.com/jinzhu/copier"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/jsontime"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"xorm.io/xorm"
)
type AlertRulesSvc struct {
User entity.SystemUserInfo
}
func (m *AlertRulesSvc) Add(req request.AddAlertRules) error {
db, err := client.GetDbClient()
if err != nil {
err = resp.DbConnectError.WithError(err)
return err
}
now := jsontime.Now()
data := entity.AlertRules{
Id: uuid.New().String(),
CreatedBy: m.User.SystemAccount,
CreatedAt: now,
UpdatedBy: m.User.SystemAccount,
UpdatedAt: now,
}
_ = copier.Copy(&data, &req)
switch req.DetectionType {
case 1:
_, err = db.Update(&data)
if err != nil {
return err
}
case 2: // 自定义
_, err = db.Transaction(func(session *xorm.Session) (interface{}, error) {
// 添加自定义分类
var (
classParentId int
classId int
addMetricConfig request.AddMetricConfig
metricConfigId string
)
alertClassSvc := AlertClassSvc{User: m.User}
classParentId, err = alertClassSvc.Add(session, request.AddAlertClass{
ClassName: req.ClassParentName,
SortOrder: -1,
SourceFrom: 2,
})
if err != nil {
return nil, err
}
classId, err = alertClassSvc.Add(session, request.AddAlertClass{
ClassName: req.ClassName,
ParentId: classParentId,
SortOrder: -1,
SourceFrom: 2,
})
if err != nil {
return nil, err
}
data.ClassId = classId
// 添加指标配置
metricConfigSvc := MetricConfigSvc{User: m.User}
_ = copier.Copy(&addMetricConfig, &req)
addMetricConfig.SourceFrom = 2
addMetricConfig.MetricName = req.MetricConfigName
metricConfigId, err = metricConfigSvc.Add(session, addMetricConfig)
if err != nil {
return nil, err
}
data.MetricConfigId = metricConfigId
// 添加预警规则配置
_, err = session.Insert(&data)
return nil, err
})
}
// TODO 告警规则添加到普罗米修斯表
return nil
}
func (m *AlertRulesSvc) Update(req request.UpdateAlertRules) error {
db, err := client.GetDbClient()
if err != nil {
err = resp.DbConnectError.WithError(err)
return err
}
now := jsontime.Now()
data := entity.AlertRules{
UpdatedBy: m.User.SystemAccount,
UpdatedAt: now,
}
_ = copier.Copy(&data, &req)
session := db.NewSession()
var dbAlertRules entity.AlertRules
_, err = session.Table(data.TableName()).ID(data.Id).Get(&dbAlertRules)
if err != nil {
return err
}
switch req.DetectionType {
case 1:
_, err = db.Update(&data)
if err != nil {
return err
}
case 2: // 自定义
_, err = db.Transaction(func(session *xorm.Session) (interface{}, error) {
// 更新自定义分类
var (
updateMetricConfig request.UpdateMetricConfig
alertClassItem response.AlertClassItem
)
alertClassSvc := AlertClassSvc{User: m.User}
alertClassItem, err = alertClassSvc.GetDataById(request.DetailAlertClass{ClassId: dbAlertRules.ClassId})
if err != nil {
return nil, err
}
err = alertClassSvc.Update(session, request.UpdateAlertClass{
ClassId: dbAlertRules.ClassId,
ClassName: req.ClassName,
})
if err != nil {
return nil, err
}
err = alertClassSvc.Update(session, request.UpdateAlertClass{
ClassId: alertClassItem.ParentId,
ClassName: req.ClassParentName,
})
if err != nil {
return nil, err
}
// 更新指标配置
metricConfigSvc := MetricConfigSvc{User: m.User}
_ = copier.Copy(&updateMetricConfig, &req)
updateMetricConfig.SourceFrom = 2
updateMetricConfig.Id = dbAlertRules.MetricConfigId
err = metricConfigSvc.Update(session, updateMetricConfig)
if err != nil {
return nil, err
}
// 更新预警规则配置
_, err = session.Update(&data)
return nil, err
})
}
return nil
}
func (m *AlertRulesSvc) GetDataById(req request.DetailAlertRules) (resp response.AlertRulesItem, err error) {
db, err := client.GetDbClient()
if err != nil {
return
}
_, err = db.NewSession().Table(resp.TableName()).Where("id = ?", req.Id).Get(&resp)
return
}
func (m *AlertRulesSvc) List(req request.ListAlertRules) (resp response.MetricConfigList, err error) {
db, err := client.GetDbClient()
if err != nil {
return
}
session := db.NewSession()
defer session.Close()
if req.Id != "" {
session.Where("id = ?", req.Id)
}
if req.ClassId != 0 {
session.Where("class_id = ?", req.ClassId)
}
if req.MetricName != "" {
session.Where("metric_name LIKE ?", "%"+req.MetricName+"%")
}
if req.IsEnabled != 0 {
session.Where("is_enabled = ?", req.IsEnabled)
}
resp.TotalCount, err = session.Table(new(entity.AlertRules)).Limit(req.GetPageSize(), (req.GetPage()-1)*req.GetPageSize()).
OrderBy("id").FindAndCount(&resp.List)
return
}
func (m *AlertRulesSvc) Delete(ids []string) (err error) {
db, err := client.GetDbClient()
if err != nil {
return
}
// TODO 批量删除表中的多出数据
_, err = db.NewSession().In("id", ids).Delete(new(entity.AlertRules))
return
}
......@@ -7,12 +7,15 @@ import (
"github.com/google/uuid"
"github.com/minio/minio-go/v7"
"github.com/pkg/errors"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf"
"io"
"mime/multipart"
"net/http"
"net/url"
"path"
"time"
)
var maxFileByte int64 = 20971520 //20M
......@@ -111,3 +114,33 @@ func (d DocLibSvc) GetFile(fileName string) (obj io.Reader, err error) {
// return
//}
}
func (d DocLibSvc) DownloadFile(ctx *gin.Context, req request.DocLibGetReq) (docUrl *url.URL, err error) {
var (
minioClient *minio.Client
)
minioClient, err = client.GetMinioConnect()
if err != nil {
err = errors.Wrap(err, "getMinio")
return
}
remotePath := fmt.Sprintf("%s%s", req.FileName, req.Ext)
reqParams := make(url.Values)
switch req.Opt {
case "info":
return
case "preview":
reqParams.Set("response-Content-Type", req.Ext)
case "download":
reqParams.Set("response-Content-Disposition", fmt.Sprintf("attachment; filename=%s%s", req.FileName, req.Ext))
reqParams.Set("response-Content-Type", "application/octet-stream")
reqParams.Set("response-Content-Transfer-Encoding", "binary")
}
docUrl, err = minioClient.PresignedGetObject(ctx, conf.Options.MinioBucket, remotePath, time.Second*60*60, reqParams)
if err != nil {
err = errors.Wrap(err, "get file url from minio fail")
return
}
return
}
......@@ -10,7 +10,6 @@ import (
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/tools"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"os/exec"
......@@ -305,7 +304,9 @@ func (h *HostManageSvc) DetailsHostManage(id int) (hostManageRes response.HostMa
return
}
//查询主机列表
err = db.Table("host_manage_list").Where("is_delete = 0 AND host_group_id = ?", id).Find(&hostList)
err = db.Table("host_manage_list").Where("is_delete = 0 AND host_group_id = ?", id).
Select("string_agg(ip,',') as ip,port,voucher_type,user_name,password,host_file_url,count(1) as cnt").
GroupBy("ip_group,port,voucher_type,user_name,PASSWORD,host_file_url").Find(&hostList)
if err != nil {
err = resp.DbSelectError.WithError(err)
return
......@@ -321,18 +322,20 @@ func (h *HostManageSvc) DetailsHostManage(id int) (hostManageRes response.HostMa
if v.HostFileUrl != "" {
hostManageRes.HostFileUrl = v.HostFileUrl
}
hostManageRes.IpCnt = hostManageRes.IpCnt + v.Cnt
}
hostManageRes.Id = hostManage.Id
hostManageRes.HostName = hostManage.HostName
hostManageRes.TaskCnt = len(taskList)
hostManageRes.IpCnt = len(hostList)
//hostManageRes.IpCnt = len(hostList)
hostManageRes.CreateUser = hostManage.CreateUser
hostManageRes.CreateTime = hostManage.CreateTime
hostManageRes.UpdateUser = hostManage.UpdateUser
hostManageRes.UpdateTime = hostManage.UpdateTime
if hostManageRes.HostFileUrl == "" {
hostManageRes.HostList = hostList
}
hostManageRes.TaskList = taskList
return
......@@ -598,16 +601,16 @@ func (h *HostManageSvc) ExportIp(id, uuid string, detectionType int) (fileName s
if detectionType == 1 {
//列表检测导出
finder := db.Table("host_manage_list").Where("is_delete = 0 AND host_group_id = ?", cast.ToInt(id))
err = finder.Select("").Find(&hostManageList)
finder := db.Table("host_manage_list").Where("is_delete = 0 AND conn_status = 1 AND host_group_id = ?", cast.ToInt(id))
err = finder.Select("ip,port,voucher_type,user_name,password").Find(&hostManageList)
if err != nil {
err = resp.DbSelectError.WithError(err)
return
}
} else {
//新增/编辑检测导出
finder := db.Table("host_manage_list_cache").Where("id = ?", uuid)
err = finder.Select("").Find(&hostManageList)
finder := db.Table("host_manage_list_cache").Where("conn_status = 1 AND id = ?", uuid)
err = finder.Select("ip,port,voucher_type,user_name,password").Find(&hostManageList)
if err != nil {
err = resp.DbSelectError.WithError(err)
return
......@@ -666,7 +669,7 @@ func generatePushExportXlsx(push []ExportIpStr) (string, error) {
}
saveFileName := "IP列表导出数据.xlsx"
err := file.Save(conf.Options.TempDirPrefix + saveFileName)
err := file.Save("/app/xlsx/" + saveFileName)
return saveFileName, err
}
......
......@@ -8,53 +8,42 @@ import (
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/jsontime"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/util"
"xorm.io/xorm"
)
type MetricConfigSvc struct {
User entity.SystemUserInfo
}
func (m *MetricConfigSvc) Add(req request.AddMetricConfig) error {
db, err := client.GetDbClient()
if err != nil {
err = resp.DbConnectError.WithError(err)
return err
}
func (m *MetricConfigSvc) Add(session *xorm.Session, req request.AddMetricConfig) (id string, err error) {
now := jsontime.Now()
mc := entity.MetricConfig{
data := entity.MetricConfig{
Id: uuid.New().String(),
CreatedBy: "",
CreatedBy: m.User.SystemAccount,
CreatedAt: now,
UpdatedBy: "",
UpdatedBy: m.User.SystemAccount,
UpdatedAt: now,
}
_ = copier.Copy(&mc, &req)
mc.AlertRange = util.ConvertToString(req.AlertRange)
_, err = db.NewSession().Insert(&mc)
_ = copier.Copy(&data, &req)
data.AlertRange = util.ConvertToString(req.AlertRange)
_, err = session.Insert(&data)
if err != nil {
return err
return
}
return nil
id = data.Id
return
}
func (m *MetricConfigSvc) Update(req request.UpdateMetricConfig) error {
db, err := client.GetDbClient()
if err != nil {
err = resp.DbConnectError.WithError(err)
return err
}
func (m *MetricConfigSvc) Update(session *xorm.Session, req request.UpdateMetricConfig) error {
now := jsontime.Now()
mc := entity.MetricConfig{
UpdatedBy: "",
data := entity.MetricConfig{
UpdatedBy: m.User.SystemAccount,
UpdatedAt: now,
}
_ = copier.Copy(&mc, &req)
mc.AlertRange = util.ConvertToString(req.AlertRange)
_, err = db.NewSession().ID(req.Id).Update(&mc)
_ = copier.Copy(&data, &req)
data.AlertRange = util.ConvertToString(req.AlertRange)
_, err := session.ID(req.Id).Update(&data)
if err != nil {
return err
}
......@@ -70,7 +59,7 @@ func (m *MetricConfigSvc) GetDataById(req request.DetailMetricConfig) (resp resp
return
}
func (m *MetricConfigSvc) List(req request.ListMetricConfig) (resp response.UnitsList, err error) {
func (m *MetricConfigSvc) List(req request.ListMetricConfig) (resp response.MetricConfigList, err error) {
db, err := client.GetDbClient()
if err != nil {
return
......
......@@ -15,7 +15,7 @@ type TaskHistorySvc struct {
}
// TaskHistoryList 任务历史列表
func (t *TaskHistorySvc) TaskHistoryList(req request.Pagination) (total int64, taskHistoryListRes []response.TaskHistoryListRes, err error) {
func (t *TaskHistorySvc) TaskHistoryList(req request.TaskHistoryReq) (total int64, taskHistoryListRes []response.TaskHistoryListRes, err error) {
var (
//dueDate int
start time.Time
......@@ -32,6 +32,9 @@ func (t *TaskHistorySvc) TaskHistoryList(req request.Pagination) (total int64, t
" WHERE ID IN (SELECT MAX(ID) FROM task_history GROUP BY task_id) ORDER BY ID DESC) t2", "t1.id = t2.task_id").
Where("t1.is_delete = 0")
if req.Search != "" {
finder.Where("t1.task_name LIKE ?", "%"+req.Search+"%")
}
//查询任务历史
total, err = finder.Select("t2.state,t2.task_id,t1.task_name,t2.exec_start_time,t2.exec_end_time,t2.create_user").
Limit(req.PageSize, (req.Page-1)*req.PageSize).FindAndCount(&taskHistoryListRes)
......@@ -61,7 +64,7 @@ func (t *TaskHistorySvc) TaskHistoryList(req request.Pagination) (total int64, t
}
// TaskInfoList 任务历史详情列表
func (t *TaskHistorySvc) TaskInfoList(req request.TaskHistoryReq) (total int64, taskInfoListRes []response.TaskInfoListRes, err error) {
func (t *TaskHistorySvc) TaskInfoList(req request.TaskInfoListReq) (total int64, taskInfoListRes []response.TaskInfoListRes, err error) {
var (
//dueDate int
start time.Time
......@@ -74,7 +77,9 @@ func (t *TaskHistorySvc) TaskInfoList(req request.TaskHistoryReq) (total int64,
}
finder := db.Table("task_history").Where("task_id = ?", req.TaskId)
if req.Search != "" {
finder.Where("exec_desc LIKE ?", "%"+req.Search+"%")
}
//查询任务历史
total, err = finder.OrderBy("id desc").Limit(req.PageSize, (req.Page-1)*req.PageSize).FindAndCount(&taskInfoListRes)
if err != nil {
......
package service
import (
"bufio"
"context"
"errors"
"fmt"
......@@ -117,7 +118,7 @@ func (t *TaskManageSvc) DetailsTaskManage(id int) (taskManageRes response.TaskMa
//查询任务详情
finder := db.Table("task_manage").Alias("tm").
Where("is_delete = 0 AND id = ?", id)
_, err = finder.Select("tm.id,tm.task_name,tm.task_desc,tm.yaml_desc,tm.yaml_url,tm.create_user,tm.create_time," +
_, err = finder.Select("tm.id,tm.task_name,tm.task_desc,tm.yaml_desc,tm.yaml_url,tm.create_user,tm.create_time,tm.host_group_id," +
"(select count(1) from task_history th where th.task_id = tm.id) as exec_cnt," +
"(select count(1) from task_history th where th.task_id = tm.id and th.state = 1) as success_cnt," +
"(select count(1) from task_history th where th.task_id = tm.id and th.state = 2) as fail_cnt").Get(&taskManageRes)
......@@ -128,18 +129,27 @@ func (t *TaskManageSvc) DetailsTaskManage(id int) (taskManageRes response.TaskMa
//查询主机列表
hostList := make([]response.HostList, 0)
err = db.Table("host_manage_list").Where("is_delete = 0 AND host_group_id = ?", id).Find(&hostList)
err = db.Table("host_manage_list").Where("is_delete = 0 AND host_group_id = ?", taskManageRes.HostGroupId).
Select("string_agg(ip,',') as ip,port,voucher_type,user_name,password,host_file_url").
GroupBy("ip_group,port,voucher_type,user_name,PASSWORD,host_file_url").Find(&hostList)
if err != nil {
err = resp.DbSelectError.WithError(err)
return
}
//err = db.Table("host_manage_list").Where("is_delete = 0 AND host_group_id = ?", id).Find(&hostList)
//if err != nil {
// err = resp.DbSelectError.WithError(err)
// return
//}
for _, v := range hostList {
if v.HostFileUrl != "" {
taskManageRes.HostFileUrl = v.HostFileUrl
}
}
if taskManageRes.HostFileUrl == "" {
taskManageRes.HostList = hostList
}
return
}
......@@ -177,7 +187,7 @@ func (t *TaskManageSvc) ListTaskManage(req request.ListTaskManageReq) (total int
return
}
func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data interface{}, err error) {
func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data map[string]interface{}, err error) {
if req.ScriptUrl != "" {
minioClient, err := client.GetMinioConnect()
if err != nil {
......@@ -242,11 +252,19 @@ func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data interface{},
} else {
cmd = exec.Command("ansible-playbook", "-i", "/etc/ansible/hosts", "/etc/ansible/ansible.yml")
}
output, err := cmd.Output()
stdout, err := cmd.StdoutPipe()
if err != nil {
err = resp.CmdExecError.WithError(err)
return
}
fmt.Println(string(output))
return string(output), nil
return nil, resp.CmdExecError.WithError(err)
}
outputBuf := bufio.NewReader(stdout)
output, isPrefix, err := outputBuf.ReadLine()
//output, err := cmd.Output()
//if err != nil {
// err = resp.CmdExecError.WithError(err)
// return
//}
//fmt.Println(string(output))
data["step"] = isPrefix
data["output"] = string(output)
return data, nil
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment