go-common/app/admin/ep/merlin/service/tree.go
2019-04-22 18:49:16 +08:00

178 lines
5.1 KiB
Go

package service
import (
"context"
"go-common/app/admin/ep/merlin/model"
"go-common/library/ecode"
)
const (
_startsWith = "startswith"
_merlinHostnameRegex = ".*-[0-9]-0"
)
// UserTreeAsOption get user tree as option.
func (s *Service) UserTreeAsOption(c context.Context, sessionID string) (firstRetMap []map[string]interface{}, err error) {
var treeMap *model.UserTree
if treeMap, err = s.dao.UserTree(c, sessionID); err != nil {
err = ecode.MerlinGetUserTreeFailed
return
}
if treeMap.Bilibili == nil {
return
}
firstLevelMapTmp := treeMap.Bilibili
if firstLevelMapTmp["children"] == nil {
return
}
firstLevelMap := firstLevelMapTmp["children"].(map[string]interface{})
for firstLevelKey, firstLevelChildren := range firstLevelMap {
secondLevelMapTmp := firstLevelChildren.(map[string]interface{})
if secondLevelMapTmp["children"] == nil {
continue
}
secondLevelMap := secondLevelMapTmp["children"].(map[string]interface{})
var secondRetMap []map[string]interface{}
for secondLevelKey, secondLevelChildren := range secondLevelMap {
thirdLevelMapTmp := secondLevelChildren.(map[string]interface{})
if thirdLevelMapTmp["children"] == nil {
continue
}
thirdLevelMap := thirdLevelMapTmp["children"].(map[string]interface{})
var thirdRetMap []map[string]interface{}
for thirdLevelKey, thirdLevelChildren := range thirdLevelMap {
if thirdLevelKey != "" && thirdLevelChildren != nil {
childID := int64(thirdLevelChildren.(map[string]interface{})["id"].(float64))
thirdTmp := make(map[string]interface{})
thirdTmp["label"] = thirdLevelKey
v := new(struct {
ID int64 `json:"id"`
Name string `json:"name"`
})
v.ID = childID
v.Name = thirdLevelKey
thirdTmp["value"] = v
thirdRetMap = append(thirdRetMap, thirdTmp)
}
}
if secondLevelKey != "" {
secondTmp := make(map[string]interface{})
secondTmp["value"] = secondLevelKey
secondTmp["label"] = secondLevelKey
secondTmp["children"] = thirdRetMap
secondRetMap = append(secondRetMap, secondTmp)
}
}
if firstLevelKey != "" {
firstTmp := make(map[string]interface{})
firstTmp["value"] = firstLevelKey
firstTmp["label"] = firstLevelKey
firstTmp["children"] = secondRetMap
firstRetMap = append(firstRetMap, firstTmp)
}
}
return
}
// VerifyTreeContainerNode verify tree containers.
func (s *Service) VerifyTreeContainerNode(c context.Context, sessionID string, tnr *model.TreeNode) (err error) {
var (
sonMap map[string]interface{}
ok bool
)
if sonMap, err = s.dao.TreeSon(c, sessionID, tnr.TreePath()); err != nil {
err = ecode.MerlinGetUserTreeFailed
return
}
if sonMap, ok = sonMap["dev"].(map[string]interface{}); !ok {
err = ecode.MerlinLoseTreeContainerNodeErr
return
}
if sonMap, ok = sonMap["children"].(map[string]interface{}); !ok {
err = ecode.MerlinLoseTreeContainerNodeErr
return
}
if sonMap["containers"] == nil {
err = ecode.MerlinLoseTreeContainerNodeErr
}
return
}
// TreeRoleAsAuditor tree role as auditor.
func (s *Service) TreeRoleAsAuditor(c context.Context, sessionID, firstNode string) (auditors []string, err error) {
var treeRoles []*model.TreeRole
if treeRoles, err = s.dao.TreeRoles(c, sessionID, firstNode); err != nil {
return
}
for _, treeRole := range treeRoles {
if treeRole.Role == model.TreeRoleAdmin {
auditors = append(auditors, treeRole.UserName)
}
}
return
}
// TreeMachineIsExist tree machine is exist.
func (s *Service) TreeMachineIsExist(c context.Context, podName string, tn *model.TreeNode) (b bool, err error) {
var (
pathAndPodNameMap = make(map[string][]string)
result map[string]bool
)
pathAndPodNameMap[tn.TreePath()] = []string{podName}
if result, err = s.TreeMachinesIsExist(c, pathAndPodNameMap); err != nil {
return
}
b = result[podName]
return
}
// TreeMachinesIsExist tree machines is exist.
func (s *Service) TreeMachinesIsExist(c context.Context, pathAndMachinesMap map[string][]string) (machinesIsExist map[string]bool, err error) {
var (
treeAppInstances map[string][]*model.TreeAppInstance
paths []string
)
machinesIsExist = make(map[string]bool)
for path, machineNames := range pathAndMachinesMap {
paths = append(paths, path)
for _, machineName := range machineNames {
machinesIsExist[machineName] = false
}
}
if treeAppInstances, err = s.dao.TreeAppInstance(c, paths); err != nil {
return
}
for _, machinesInTree := range treeAppInstances {
for _, machineInTree := range machinesInTree {
if _, ok := machinesIsExist[machineInTree.HostName]; ok {
machinesIsExist[machineInTree.HostName] = true
}
}
}
return
}
// QueryTreeInstanceForMerlin query TreeInstance for merlin.
func (s *Service) QueryTreeInstanceForMerlin(c context.Context, sessionID string, tn *model.TreeNode) (res map[string]*model.TreeInstance, err error) {
tir := &model.TreeInstanceRequest{
HostnameRegex: _merlinHostnameRegex,
}
if path := tn.TreePathWithoutEmptyField(); path != "" {
tir.Path = path
tir.PathFuzzy = _startsWith
}
res, err = s.dao.QueryTreeInstances(c, sessionID, tir)
return
}