diff --git a/Makefile b/Makefile index 0d864891..2bea24f7 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ NOW = $(shell date -u '+%Y%m%d%I%M%S') -RELEASE_VERSION = 5.4.1 +RELEASE_VERSION = 5.5.0 APP = n9e SERVER_BIN = $(APP) diff --git a/docker/initsql/a-n9e.sql b/docker/initsql/a-n9e.sql index 5b7c7dc2..1fb76388 100644 --- a/docker/initsql/a-n9e.sql +++ b/docker/initsql/a-n9e.sql @@ -128,6 +128,8 @@ insert into `role_operation`(role_name, operation) values('Standard', '/job-task CREATE TABLE `busi_group` ( `id` bigint unsigned not null auto_increment, `name` varchar(191) not null, + `label_enable` tinyint(1) not null default 0, + `label_value` varchar(191) not null default '' comment 'if label_enable: label_value can not be blank', `create_at` bigint not null default 0, `create_by` varchar(64) not null default '', `update_at` bigint not null default 0, diff --git a/src/models/busi_group.go b/src/models/busi_group.go index f3cf22d3..d275c0fb 100644 --- a/src/models/busi_group.go +++ b/src/models/busi_group.go @@ -9,13 +9,15 @@ import ( ) type BusiGroup struct { - Id int64 `json:"id" gorm:"primaryKey"` - Name string `json:"name"` - CreateAt int64 `json:"create_at"` - CreateBy string `json:"create_by"` - UpdateAt int64 `json:"update_at"` - UpdateBy string `json:"update_by"` - UserGroups []UserGroupWithPermFlag `json:"user_groups" gorm:"-"` + Id int64 `json:"id" gorm:"primaryKey"` + Name string `json:"name"` + LabelEnable int `json:"label_enable"` + LabelValue string `json:"label_value"` + CreateAt int64 `json:"create_at"` + CreateBy string `json:"create_by"` + UpdateAt int64 `json:"update_at"` + UpdateBy string `json:"update_by"` + UserGroups []UserGroupWithPermFlag `json:"user_groups" gorm:"-"` } type UserGroupWithPermFlag struct { @@ -51,6 +53,21 @@ func (bg *BusiGroup) FillUserGroups() error { return nil } +func BusiGroupGetMap() (map[int64]*BusiGroup, error) { + var lst []*BusiGroup + err := DB().Find(&lst).Error + if err != nil { + return nil, err + } + + ret := make(map[int64]*BusiGroup) + for i := 0; i < len(lst); i++ { + ret[lst[i].Id] = lst[i] + } + + return ret, nil +} + func BusiGroupGet(where string, args ...interface{}) (*BusiGroup, error) { var lst []*BusiGroup err := DB().Where(where, args...).Find(&lst).Error @@ -196,8 +213,8 @@ func (bg *BusiGroup) DelMembers(members []BusiGroupMember, username string) erro }).Error } -func (bg *BusiGroup) Update(name string, updateBy string) error { - if bg.Name == name { +func (bg *BusiGroup) Update(name string, labelEnable int, labelValue string, updateBy string) error { + if bg.Name == name && bg.LabelEnable == labelEnable && bg.LabelValue == labelValue { return nil } @@ -210,14 +227,29 @@ func (bg *BusiGroup) Update(name string, updateBy string) error { return errors.New("BusiGroup already exists") } + if labelEnable == 1 { + exists, err = BusiGroupExists("label_enable = 1 and label_value = ? and id <> ?", labelValue, bg.Id) + if err != nil { + return errors.WithMessage(err, "failed to count BusiGroup") + } + + if exists { + return errors.New("BusiGroup already exists") + } + } else { + labelValue = "" + } + return DB().Model(bg).Updates(map[string]interface{}{ - "name": name, - "update_at": time.Now().Unix(), - "update_by": updateBy, + "name": name, + "label_enable": labelEnable, + "label_value": labelValue, + "update_at": time.Now().Unix(), + "update_by": updateBy, }).Error } -func BusiGroupAdd(name string, members []BusiGroupMember, creator string) error { +func BusiGroupAdd(name string, labelEnable int, labelValue string, members []BusiGroupMember, creator string) error { exists, err := BusiGroupExists("name=?", name) if err != nil { return errors.WithMessage(err, "failed to count BusiGroup") @@ -227,6 +259,19 @@ func BusiGroupAdd(name string, members []BusiGroupMember, creator string) error return errors.New("BusiGroup already exists") } + if labelEnable == 1 { + exists, err = BusiGroupExists("label_enable = 1 and label_value = ?", labelValue) + if err != nil { + return errors.WithMessage(err, "failed to count BusiGroup") + } + + if exists { + return errors.New("BusiGroup already exists") + } + } else { + labelValue = "" + } + count := len(members) for i := 0; i < count; i++ { ug, err := UserGroupGet("id=?", members[i].UserGroupId) @@ -241,11 +286,13 @@ func BusiGroupAdd(name string, members []BusiGroupMember, creator string) error now := time.Now().Unix() obj := &BusiGroup{ - Name: name, - CreateAt: now, - CreateBy: creator, - UpdateAt: now, - UpdateBy: creator, + Name: name, + LabelEnable: labelEnable, + LabelValue: labelValue, + CreateAt: now, + CreateBy: creator, + UpdateAt: now, + UpdateBy: creator, } return DB().Transaction(func(tx *gorm.DB) error { diff --git a/src/models/target.go b/src/models/target.go index 5e94fd0c..85ebc0c5 100644 --- a/src/models/target.go +++ b/src/models/target.go @@ -127,6 +127,19 @@ func TargetGetsByCluster(cluster string) ([]*Target, error) { var lst []*Target err := session.Find(&lst).Error + if err == nil { + bgcache, err := BusiGroupGetMap() + if err != nil { + return nil, err + } + + for i := 0; i < len(lst); i++ { + err = lst[i].FillGroup(bgcache) + if err != nil { + return nil, err + } + } + } return lst, err } diff --git a/src/server/memsto/target_cache.go b/src/server/memsto/target_cache.go index 7b915e7e..e8eb63ab 100644 --- a/src/server/memsto/target_cache.go +++ b/src/server/memsto/target_cache.go @@ -122,6 +122,13 @@ func syncTargets() error { } lst[i].TagsMap[arr[0]] = arr[1] } + + // handle BusiGroup's LabelValue + // BusiGroup的LabelValue就相当于一个特殊的标签来对待 + if lst[i].GroupObj != nil && lst[i].GroupObj.LabelEnable == 1 { + lst[i].TagsMap["busigroup"] = lst[i].GroupObj.LabelValue + } + m[lst[i].Ident] = lst[i] } diff --git a/src/webapi/router/router_busi_group.go b/src/webapi/router/router_busi_group.go index 4bba2c66..bbc0b774 100644 --- a/src/webapi/router/router_busi_group.go +++ b/src/webapi/router/router_busi_group.go @@ -12,8 +12,10 @@ import ( ) type busiGroupForm struct { - Name string `json:"name" binding:"required"` - Members []models.BusiGroupMember `json:"members"` + Name string `json:"name" binding:"required"` + LabelEnable int `json:"label_enable"` + LabelValue string `json:"label_value"` + Members []models.BusiGroupMember `json:"members"` } func busiGroupAdd(c *gin.Context) { @@ -37,7 +39,7 @@ func busiGroupAdd(c *gin.Context) { } username := c.MustGet("username").(string) - ginx.Dangerous(models.BusiGroupAdd(f.Name, f.Members, username)) + ginx.Dangerous(models.BusiGroupAdd(f.Name, f.LabelEnable, f.LabelValue, f.Members, username)) // 如果创建成功,拿着name去查,应该可以查到 newbg, err := models.BusiGroupGet("name=?", f.Name) @@ -57,7 +59,7 @@ func busiGroupPut(c *gin.Context) { username := c.MustGet("username").(string) targetbg := c.MustGet("busi_group").(*models.BusiGroup) - ginx.NewRender(c).Message(targetbg.Update(f.Name, username)) + ginx.NewRender(c).Message(targetbg.Update(f.Name, f.LabelEnable, f.LabelValue, username)) } func busiGroupMemberAdd(c *gin.Context) { diff --git a/src/webapi/router/router_mw.go b/src/webapi/router/router_mw.go index e162e196..1722384d 100644 --- a/src/webapi/router/router_mw.go +++ b/src/webapi/router/router_mw.go @@ -311,7 +311,7 @@ func createTokens(signingKey, userIdentity string) (*TokenDetails, error) { func verifyToken(signingKey, tokenString string) (*jwt.Token, error) { if tokenString == "" { - return nil, fmt.Errorf("Bearer token not found") + return nil, fmt.Errorf("bearer token not found") } token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {