diff --git a/src/bean/entity/alert_class.go b/src/bean/entity/alert_class.go index d7726fe7d858c6963d37017b0a5b7136dd09f237..801f530b924277033533296ff127cd357785a5d8 100644 --- a/src/bean/entity/alert_class.go +++ b/src/bean/entity/alert_class.go @@ -3,14 +3,15 @@ package entity import "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/jsontime" type AlertClass struct { - ClassId int `json:"class_id" xorm:"'class_id' pk autoincr" ` // 主键id - 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'"` // 排序 - 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'"` // 更新时间 + ClassId int `json:"class_id" xorm:"'class_id' pk autoincr" ` // 主键id + 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'"` // 更新人 + UpdatedAt jsontime.Time `json:"updated_at" xorm:"'updated_at'"` // 更新时间 } func (m *AlertClass) TableName() string { diff --git a/src/bean/entity/alert_rules.go b/src/bean/entity/alert_rules.go new file mode 100644 index 0000000000000000000000000000000000000000..b322fe4389129cc6e43e120dc0b240a78d351825 --- /dev/null +++ b/src/bean/entity/alert_rules.go @@ -0,0 +1,41 @@ +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"` +} diff --git a/src/bean/entity/metric_config.go b/src/bean/entity/metric_config.go index 984e79c34c59967a3f440b9baa33beec0b269fc4..74ad45c6acb00e227d7799196ed1acad71d1f7aa 100644 --- a/src/bean/entity/metric_config.go +++ b/src/bean/entity/metric_config.go @@ -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'"` // 更新人 diff --git a/src/bean/entity/work_order.go b/src/bean/entity/work_order.go new file mode 100644 index 0000000000000000000000000000000000000000..87aba387f7f8f206fbc269b6096a3bbe2feca95d --- /dev/null +++ b/src/bean/entity/work_order.go @@ -0,0 +1,19 @@ +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" ` // 修改时间 +} diff --git a/src/bean/vo/request/alert_class.go b/src/bean/vo/request/alert_class.go index 91c4b532ee73f9ccf98809a0dc8e9b9b9e8d8f2b..49046eaf1044954bafe6e75ee125fd89e507de6f 100644 --- a/src/bean/vo/request/alert_class.go +++ b/src/bean/vo/request/alert_class.go @@ -1,9 +1,10 @@ package request 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"` + 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 { diff --git a/src/bean/vo/request/alert_rules.go b/src/bean/vo/request/alert_rules.go new file mode 100644 index 0000000000000000000000000000000000000000..0624303673bdff97ba9950a418d2999e5d8543bc --- /dev/null +++ b/src/bean/vo/request/alert_rules.go @@ -0,0 +1,75 @@ +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 +} diff --git a/src/bean/vo/request/doc_lib.go b/src/bean/vo/request/doc_lib.go index 725b8fc210d39a62328ca5206e351ffd995fc29e..7b227c95e75a0348379f05f8a3795cdd57e3d40c 100644 --- a/src/bean/vo/request/doc_lib.go +++ b/src/bean/vo/request/doc_lib.go @@ -1 +1,7 @@ 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"` //操作 +} diff --git a/src/bean/vo/request/metric_config.go b/src/bean/vo/request/metric_config.go index bf5191f509f4a607faf21a4bba96f495e461084b..6c070d02ceb63a778d6b2577237b5deea2eb84a4 100644 --- a/src/bean/vo/request/metric_config.go +++ b/src/bean/vo/request/metric_config.go @@ -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 { diff --git a/src/bean/vo/request/task_history.go b/src/bean/vo/request/task_history.go index 4b7db6b96e7fe0eeebdb18e7386866d3f951b72a..8599649e444f7edf325213bdc38360acd6d7f201 100644 --- a/src/bean/vo/request/task_history.go +++ b/src/bean/vo/request/task_history.go @@ -1,6 +1,12 @@ package request type TaskHistoryReq struct { - TaskId int `json:"task_id" form:"task_id" binding:"required"` // 主键ID + 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 } diff --git a/src/bean/vo/response/alert_rules.go b/src/bean/vo/response/alert_rules.go new file mode 100644 index 0000000000000000000000000000000000000000..928b253a8d159a55cd2d1f7609f7530b7eee1cb2 --- /dev/null +++ b/src/bean/vo/response/alert_rules.go @@ -0,0 +1,12 @@ +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"` +} diff --git a/src/bean/vo/response/host_manage.go b/src/bean/vo/response/host_manage.go index c659c63adb27377af86224b7bc036f1d79e99a0c..909ed279601fe8795d94fefb6d50049f1fbe9f55 100644 --- a/src/bean/vo/response/host_manage.go +++ b/src/bean/vo/response/host_manage.go @@ -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 { diff --git a/src/bean/vo/response/metric_config.go b/src/bean/vo/response/metric_config.go index 470084e1f4ad13d2dc065291c90b5db367af2214..175ed1de60023f5ddf4bd7acd3b47a8e25fb2595 100644 --- a/src/bean/vo/response/metric_config.go +++ b/src/bean/vo/response/metric_config.go @@ -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"` } diff --git a/src/bean/vo/response/task_manage.go b/src/bean/vo/response/task_manage.go index b231330db4720f79be0e0a55e78341ffbcdfc69b..9a620245e6822fd6828ea82a3f3a2a78108c42f5 100644 --- a/src/bean/vo/response/task_manage.go +++ b/src/bean/vo/response/task_manage.go @@ -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文件 diff --git a/src/common/conf/options.go b/src/common/conf/options.go index 36e0d11ac72086b1aeb91195c602d5b3416e62a6..06e1a5671e1ace04fc7b18501f1cfad0be40a2ba 100644 --- a/src/common/conf/options.go +++ b/src/common/conf/options.go @@ -30,7 +30,7 @@ type Config struct { MinioAccessKey string MinioSecretKey string MinioBucket string - TempDirPrefix string + //TempDirPrefix string PrometheusHost string } diff --git a/src/controller/alert_class.go b/src/controller/alert_class.go index 859393f5b9805fce7323ccfe659ac2f150faccc4..2d787b5a4bd40ae862de208044c6c7d57ef69e44 100644 --- a/src/controller/alert_class.go +++ b/src/controller/alert_class.go @@ -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 diff --git a/src/controller/alert_rules.go b/src/controller/alert_rules.go new file mode 100644 index 0000000000000000000000000000000000000000..481d0d66350c2984698f452dd7784084d1c3d7d3 --- /dev/null +++ b/src/controller/alert_rules.go @@ -0,0 +1,99 @@ +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) +} diff --git a/src/controller/doc_lib.go b/src/controller/doc_lib.go index 78a17e686e483c7ba4eeac7c7db6692d5b0ba4c7..2d7f70650b844567d4daf6ec815996c8eef9a09f 100644 --- a/src/controller/doc_lib.go +++ b/src/controller/doc_lib.go @@ -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()) + } +} diff --git a/src/controller/host_manage.go b/src/controller/host_manage.go index 86c1ffbf2963072b753b4b93c4b06b6d8121985f..070363b0d59d2285cc6830f93753ebeb4f210f27 100644 --- a/src/controller/host_manage.go +++ b/src/controller/host_manage.go @@ -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 列表 diff --git a/src/controller/metric_config.go b/src/controller/metric_config.go index a0a5d83b39ac8b4de22429fb5019ddc1eb344e9d..fc62d3751c193f74bb65f8047ce6741c9fd00420 100644 --- a/src/controller/metric_config.go +++ b/src/controller/metric_config.go @@ -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 diff --git a/src/controller/task_history.go b/src/controller/task_history.go index c52494cd427651ee9b840dd3e34d52a93f77af09..904794b4b075c83add901c29171020e69f35f44e 100644 --- a/src/controller/task_history.go +++ b/src/controller/task_history.go @@ -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 diff --git a/src/controller/work_order_manage.go b/src/controller/work_order_manage.go new file mode 100644 index 0000000000000000000000000000000000000000..a4afe15cc445dab2c9e99002d4548b87a0cc9181 --- /dev/null +++ b/src/controller/work_order_manage.go @@ -0,0 +1,114 @@ +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) +//} diff --git a/src/main.go b/src/main.go index 9af936c1420dce4172bdaf2c25479f288cc3df4f..a3d132fd05e2e640ec2469aa31557f15ccf7ecf3 100644 --- a/src/main.go +++ b/src/main.go @@ -29,6 +29,7 @@ func main() { initTimeZone() // init ansible hosts initAnsibleHosts() + initTempDirPrefix() pflag.Parse() // init start args initConfig() // init log config @@ -59,17 +60,17 @@ func initConfig() { RedisURL: util.SetEnvStr("REDIS_URL", "localhost:7001"), RedisDB: 0, RedisTag: "bg", - LogDirPrefix: util.SetEnvStr("LOG_DIR_PREFIX", "/app/log"), // 日志目录 - LogDirName: util.SetEnvStr("LOG_NAME", "syslog"), // 日志名称 - LogSaveDays: util.SetEnvInt("LOG_SAVE_DAYS", 7), // 日志最大存储天数 - LogMode: util.SetEnvInt("LOG_MODE", 1), // 1.标准打印 2.输出文件 - ArgBool: util.SetEnvBool("ARG_BOOL", false), // 示例参数 - ArgInt: util.SetEnvInt("ARG_INT", 10), // 示例参数 - MinioServer: util.SetEnvStr("MINIO_SERVER", "https://cache.wodcloud.com"), // Minio 服务地址 - 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/"), //模板目录前缀 + LogDirPrefix: util.SetEnvStr("LOG_DIR_PREFIX", "/app/log"), // 日志目录 + LogDirName: util.SetEnvStr("LOG_NAME", "syslog"), // 日志名称 + LogSaveDays: util.SetEnvInt("LOG_SAVE_DAYS", 7), // 日志最大存储天数 + LogMode: util.SetEnvInt("LOG_MODE", 1), // 1.标准打印 2.输出文件 + ArgBool: util.SetEnvBool("ARG_BOOL", false), // 示例参数 + ArgInt: util.SetEnvInt("ARG_INT", 10), // 示例参数 + MinioServer: util.SetEnvStr("MINIO_SERVER", "https://cache.wodcloud.com"), // Minio 服务地址 + 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/"), //模板目录前缀 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("创建目录失败!") + } +} diff --git a/src/router/alertrulesrouter.go.go b/src/router/alertrulesrouter.go.go new file mode 100644 index 0000000000000000000000000000000000000000..8562b3fd81f701f9f882d246ff3793001632dbbd --- /dev/null +++ b/src/router/alertrulesrouter.go.go @@ -0,0 +1,20 @@ +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) + } +} diff --git a/src/router/router.go b/src/router/router.go index c6eca32bea94b60fd508fc5625732ba37ed3eae3..d344ad06c9f5cb140441c4044e4fbfda18f2a420 100644 --- a/src/router/router.go +++ b/src/router/router.go @@ -28,7 +28,8 @@ func Load(r *gin.Engine, middleware ...gin.HandlerFunc) { base.GET("/example/list", controller.GetExampleList) // 示例获取列表 } - base.POST("/add_file", controller.AddFile) //文件上传 + 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) } diff --git a/src/router/workorderrouter.go b/src/router/workorderrouter.go new file mode 100644 index 0000000000000000000000000000000000000000..4bc2d3e12bede546d2ba77bc3dab0bc9a83e1907 --- /dev/null +++ b/src/router/workorderrouter.go @@ -0,0 +1,45 @@ +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) // 主机分组列表-不分页 + //} +} diff --git a/src/service/alert_class.go b/src/service/alert_class.go index ac987adff94038e62fa367273f060635c10941be..d4e3e6ad5d1833205eb5369194ff26d7b475f3d6 100644 --- a/src/service/alert_class.go +++ b/src/service/alert_class.go @@ -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 } diff --git a/src/service/alert_rules.go b/src/service/alert_rules.go new file mode 100644 index 0000000000000000000000000000000000000000..ec3c993a108943cba8b8937b38cd7c91660cd096 --- /dev/null +++ b/src/service/alert_rules.go @@ -0,0 +1,203 @@ +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 +} diff --git a/src/service/doc_lib.go b/src/service/doc_lib.go index b1fc7e8632e34828fd83bbbad2c06a5acf36cadd..75d20526bdcdc821f89c9a66bce7ecea0e891449 100644 --- a/src/service/doc_lib.go +++ b/src/service/doc_lib.go @@ -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 +} diff --git a/src/service/host_manage.go b/src/service/host_manage.go index 39a647e917332d5eb78325227dadafd22064c37a..93a28060b1d513bcd6671fff129c696e4b5da320 100644 --- a/src/service/host_manage.go +++ b/src/service/host_manage.go @@ -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 - hostManageRes.HostList = hostList + 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 } diff --git a/src/service/metric_config.go b/src/service/metric_config.go index 6961c1cfd1944ebe4aa9849187db331af76f49dc..fc266b864483cf40e860cd1bcc48c732390802e0 100644 --- a/src/service/metric_config.go +++ b/src/service/metric_config.go @@ -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 diff --git a/src/service/task_history.go b/src/service/task_history.go index 8b5b43068847c51bc85347b5a07972b646e4bc5c..f7d64561f8a0a34436396b91b130da66a58013c1 100644 --- a/src/service/task_history.go +++ b/src/service/task_history.go @@ -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 { diff --git a/src/service/task_manage.go b/src/service/task_manage.go index e2809409e65f93afdde52080cbd961e89fbca486..c22ea385d736037731ea002fe317961233d4b785 100644 --- a/src/service/task_manage.go +++ b/src/service/task_manage.go @@ -1,6 +1,7 @@ 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 } - } - taskManageRes.HostList = hostList + 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 + return nil, resp.CmdExecError.WithError(err) } - fmt.Println(string(output)) - return string(output), nil + 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 }