support tags system on ext clients

This commit is contained in:
abhishek9686
2024-10-17 19:33:43 +04:00
parent 6c1208ad81
commit d2918ccc2f
4 changed files with 134 additions and 22 deletions

View File

@@ -106,8 +106,19 @@ func createTag(w http.ResponseWriter, r *http.Request) {
return return
} }
go func() { go func() {
for _, nodeID := range req.TaggedNodes { for _, node := range req.TaggedNodes {
node, err := logic.GetNodeByID(nodeID) if node.IsStatic {
extclient, err := logic.GetExtClient(node.StaticNode.ClientID, node.StaticNode.Network)
if err == nil && extclient.RemoteAccessClientID == "" {
if extclient.Tags == nil {
extclient.Tags = make(map[models.TagID]struct{})
}
extclient.Tags[tag.ID] = struct{}{}
logic.SaveExtClient(&extclient)
}
continue
}
node, err := logic.GetNodeByID(node.ID)
if err != nil { if err != nil {
continue continue
} }

View File

@@ -727,11 +727,31 @@ func GetTagMapWithNodes(netID models.NetworkID) (tagNodesMap map[models.TagID][]
tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI) tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
} }
} }
return return AddTagMapWithStaticNodes(netID, tagNodesMap)
}
func AddTagMapWithStaticNodes(netID models.NetworkID,
tagNodesMap map[models.TagID][]models.Node) map[models.TagID][]models.Node {
extclients, err := GetNetworkExtClients(netID.String())
if err != nil {
return tagNodesMap
}
for _, extclient := range extclients {
if extclient.Tags == nil || extclient.RemoteAccessClientID != "" {
continue
}
for tagID := range extclient.Tags {
tagNodesMap[tagID] = append(tagNodesMap[tagID], models.Node{
IsStatic: true,
StaticNode: extclient,
})
}
}
return tagNodesMap
} }
func GetNodesWithTag(tagID models.TagID) map[string]models.Node { func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
nMap := make(map[string]models.Node) nMap := make(map[string]models.Node)
tag, err := GetTag(tagID) tag, err := GetTag(tagID)
if err != nil { if err != nil {
@@ -746,5 +766,41 @@ func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
nMap[nodeI.ID.String()] = nodeI nMap[nodeI.ID.String()] = nodeI
} }
} }
return AddStaticNodesWithTag(tag, nMap)
}
func AddStaticNodesWithTag(tag models.Tag, nMap map[string]models.Node) map[string]models.Node {
extclients, err := GetNetworkExtClients(tag.Network.String())
if err != nil {
return nMap
}
for _, extclient := range extclients {
if extclient.RemoteAccessClientID != "" {
continue
}
nMap[extclient.ClientID] = models.Node{
IsStatic: true,
StaticNode: extclient,
}
}
return nMap
}
func GetStaticNodeWithTag(tagID models.TagID) map[string]models.Node {
nMap := make(map[string]models.Node)
tag, err := GetTag(tagID)
if err != nil {
return nMap
}
extclients, err := GetNetworkExtClients(tag.Network.String())
if err != nil {
return nMap
}
for _, extclient := range extclients {
nMap[extclient.ClientID] = models.Node{
IsStatic: true,
StaticNode: extclient,
}
}
return nMap return nMap
} }

View File

@@ -80,7 +80,7 @@ func ListTagsWithNodes(netID models.NetworkID) ([]models.TagListResp, error) {
tagRespI := models.TagListResp{ tagRespI := models.TagListResp{
Tag: tagI, Tag: tagI,
UsedByCnt: len(tagsNodeMap[tagI.ID]), UsedByCnt: len(tagsNodeMap[tagI.ID]),
TaggedNodes: tagsNodeMap[tagI.ID], TaggedNodes: GetAllNodesAPI(tagsNodeMap[tagI.ID]),
} }
resp = append(resp, tagRespI) resp = append(resp, tagRespI)
} }
@@ -134,46 +134,91 @@ func ListNetworkTags(netID models.NetworkID) ([]models.Tag, error) {
func UpdateTag(req models.UpdateTagReq, newID models.TagID) { func UpdateTag(req models.UpdateTagReq, newID models.TagID) {
tagMutex.Lock() tagMutex.Lock()
defer tagMutex.Unlock() defer tagMutex.Unlock()
var err error
tagNodesMap := GetNodesWithTag(req.ID) tagNodesMap := GetNodesWithTag(req.ID)
for _, nodeID := range req.TaggedNodes { for _, apiNode := range req.TaggedNodes {
node, err := GetNodeByID(nodeID) node := models.Node{}
if err != nil { if apiNode.IsStatic {
continue if apiNode.StaticNode.RemoteAccessClientID != "" {
continue
}
extclient, err := GetExtClient(apiNode.StaticNode.ClientID, apiNode.StaticNode.Network)
if err != nil {
continue
}
node.IsStatic = true
node.StaticNode = extclient
} else {
node, err = GetNodeByID(apiNode.ID)
if err != nil {
continue
}
} }
if _, ok := tagNodesMap[node.ID.String()]; !ok { if _, ok := tagNodesMap[node.ID.String()]; !ok {
if node.StaticNode.Tags == nil {
node.StaticNode.Tags = make(map[models.TagID]struct{})
}
if node.Tags == nil { if node.Tags == nil {
node.Tags = make(map[models.TagID]struct{}) node.Tags = make(map[models.TagID]struct{})
} }
if newID != "" { if newID != "" {
node.Tags[newID] = struct{}{} node.Tags[newID] = struct{}{}
node.StaticNode.Tags[newID] = struct{}{}
} else { } else {
node.Tags[req.ID] = struct{}{} node.Tags[req.ID] = struct{}{}
node.StaticNode.Tags[req.ID] = struct{}{}
}
if node.IsStatic {
SaveExtClient(&node.StaticNode)
} else {
UpsertNode(&node)
} }
UpsertNode(&node)
} else { } else {
if newID != "" { if newID != "" {
delete(node.Tags, req.ID) delete(node.Tags, req.ID)
delete(node.StaticNode.Tags, req.ID)
node.StaticNode.Tags[newID] = struct{}{}
node.Tags[newID] = struct{}{} node.Tags[newID] = struct{}{}
UpsertNode(&node) if node.IsStatic {
SaveExtClient(&node.StaticNode)
} else {
UpsertNode(&node)
}
} }
delete(tagNodesMap, node.ID.String()) delete(tagNodesMap, node.ID.String())
} }
} }
for _, deletedTaggedNode := range tagNodesMap { for _, deletedTaggedNode := range tagNodesMap {
deletedTaggedHost := deletedTaggedNode delete(deletedTaggedNode.Tags, req.ID)
delete(deletedTaggedHost.Tags, req.ID) delete(deletedTaggedNode.StaticNode.Tags, req.ID)
UpsertNode(&deletedTaggedHost) if deletedTaggedNode.IsStatic {
SaveExtClient(&deletedTaggedNode.StaticNode)
} else {
UpsertNode(&deletedTaggedNode)
}
} }
go func(req models.UpdateTagReq) { go func(req models.UpdateTagReq) {
if newID != "" { if newID != "" {
tagNodesMap = GetNodesWithTag(req.ID) tagNodesMap = GetNodesWithTag(req.ID)
for _, nodeI := range tagNodesMap { for _, nodeI := range tagNodesMap {
nodeI := nodeI nodeI := nodeI
if nodeI.StaticNode.Tags == nil {
nodeI.StaticNode.Tags = make(map[models.TagID]struct{})
}
if nodeI.Tags == nil {
nodeI.Tags = make(map[models.TagID]struct{})
}
delete(nodeI.Tags, req.ID) delete(nodeI.Tags, req.ID)
delete(nodeI.StaticNode.Tags, req.ID)
nodeI.Tags[newID] = struct{}{} nodeI.Tags[newID] = struct{}{}
UpsertNode(&nodeI) nodeI.StaticNode.Tags[newID] = struct{}{}
if nodeI.IsStatic {
SaveExtClient(&nodeI.StaticNode)
} else {
UpsertNode(&nodeI)
}
} }
} }
}(req) }(req)

View File

@@ -30,23 +30,23 @@ type Tag struct {
type CreateTagReq struct { type CreateTagReq struct {
TagName string `json:"tag_name"` TagName string `json:"tag_name"`
Network NetworkID `json:"network"` Network NetworkID `json:"network"`
TaggedNodes []string `json:"tagged_nodes"` TaggedNodes []ApiNode `json:"tagged_nodes"`
} }
type TagListResp struct { type TagListResp struct {
Tag Tag
UsedByCnt int `json:"used_by_count"` UsedByCnt int `json:"used_by_count"`
TaggedNodes []Node `json:"tagged_nodes"` TaggedNodes []ApiNode `json:"tagged_nodes"`
} }
type TagListRespNodes struct { type TagListRespNodes struct {
Tag Tag
UsedByCnt int `json:"used_by_count"` UsedByCnt int `json:"used_by_count"`
TaggedNodes []Node `json:"tagged_nodes"` TaggedNodes []ApiNode `json:"tagged_nodes"`
} }
type UpdateTagReq struct { type UpdateTagReq struct {
Tag Tag
NewName string `json:"new_name"` NewName string `json:"new_name"`
TaggedNodes []string `json:"tagged_nodes"` TaggedNodes []ApiNode `json:"tagged_nodes"`
} }