소스 검색

associate tags to network level

abhishek9686 11 달 전
부모
커밋
c64dc852ae
3개의 변경된 파일46개의 추가작업 그리고 22개의 파일을 삭제
  1. 29 15
      controllers/tags.go
  2. 3 3
      logic/tags.go
  3. 14 4
      models/tags.go

+ 29 - 15
controllers/tags.go

@@ -3,6 +3,7 @@ package controller
 import (
 	"encoding/json"
 	"errors"
+	"fmt"
 	"net/http"
 	"net/url"
 	"strings"
@@ -63,6 +64,25 @@ func createTag(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 		return
 	}
+	// check if tag network exists
+	_, err = logic.GetNetwork(req.Network.String())
+	if err != nil {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to get network details for "+req.Network.String()), "badrequest"))
+		return
+	}
+	// check if tag exists
+	tag := models.Tag{
+		ID:        models.TagID(fmt.Sprintf("%s.%s", req.Network, req.TagName)),
+		TagName:   req.TagName,
+		Network:   req.Network,
+		CreatedBy: user.UserName,
+		CreatedAt: time.Now(),
+	}
+	err = logic.InsertTag(tag)
+	if err != nil {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
+		return
+	}
 	go func() {
 		for _, hostID := range req.TaggedHosts {
 			h, err := logic.GetHost(hostID)
@@ -72,21 +92,11 @@ func createTag(w http.ResponseWriter, r *http.Request) {
 			if h.Tags == nil {
 				h.Tags = make(map[models.TagID]struct{})
 			}
-			h.Tags[req.ID] = struct{}{}
+			h.Tags[tag.ID] = struct{}{}
 			logic.UpsertHost(h)
 		}
 	}()
 
-	tag := models.Tag{
-		ID:        req.ID,
-		CreatedBy: user.UserName,
-		CreatedAt: time.Now(),
-	}
-	err = logic.InsertTag(tag)
-	if err != nil {
-		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
-		return
-	}
 	logic.ReturnSuccessResponseWithJson(w, r, req, "created tag successfully")
 }
 
@@ -105,21 +115,25 @@ func updateTag(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 		return
 	}
+
 	tag, err := logic.GetTag(updateTag.ID)
 	if err != nil {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 		return
 	}
-	updateTag.NewID = models.TagID(strings.TrimSpace(updateTag.NewID.String()))
-	if updateTag.NewID.String() != "" {
-		tag.ID = updateTag.NewID
+	updateTag.NewName = strings.TrimSpace(updateTag.NewName)
+	var newID models.TagID
+	if updateTag.NewName != "" {
+		newID = models.TagID(fmt.Sprintf("%s.%s", tag.Network, updateTag.NewName))
+		tag.ID = newID
+		tag.TagName = updateTag.NewName
 		err = logic.InsertTag(tag)
 		if err != nil {
 			logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 			return
 		}
 	}
-	go logic.UpdateTag(updateTag)
+	go logic.UpdateTag(updateTag, newID)
 	logic.ReturnSuccessResponse(w, r, "updating tags")
 }
 

+ 3 - 3
logic/tags.go

@@ -97,7 +97,7 @@ func ListTags() ([]models.Tag, error) {
 }
 
 // UpdateTag - updates and syncs hosts with tag update
-func UpdateTag(req models.UpdateTagReq) {
+func UpdateTag(req models.UpdateTagReq, newID models.TagID) {
 	tagMutex.Lock()
 	defer tagMutex.Unlock()
 	tagHostsMap := GetHostsWithTag(req.ID)
@@ -122,12 +122,12 @@ func UpdateTag(req models.UpdateTagReq) {
 		UpsertHost(&deletedTaggedHost)
 	}
 	go func(req models.UpdateTagReq) {
-		if req.NewID != "" {
+		if newID != "" {
 			tagHostsMap = GetHostsWithTag(req.ID)
 			for _, hostI := range tagHostsMap {
 				hostI := hostI
 				delete(hostI.Tags, req.ID)
-				hostI.Tags[req.NewID] = struct{}{}
+				hostI.Tags[newID] = struct{}{}
 				UpsertHost(&hostI)
 			}
 		}

+ 14 - 4
models/tags.go

@@ -1,6 +1,9 @@
 package models
 
-import "time"
+import (
+	"fmt"
+	"time"
+)
 
 type TagID string
 
@@ -8,15 +11,22 @@ func (id TagID) String() string {
 	return string(id)
 }
 
+func (t Tag) GetIDFromName() string {
+	return fmt.Sprintf("%s.%s", t.Network, t.TagName)
+}
+
 type Tag struct {
 	ID        TagID     `json:"id"`
+	TagName   string    `json:"tag_name"`
+	Network   NetworkID `json:"network"`
 	CreatedBy string    `json:"created_by"`
 	CreatedAt time.Time `json:"created_at"`
 }
 
 type CreateTagReq struct {
-	ID          TagID    `json:"id"`
-	TaggedHosts []string `json:"tagged_hosts"`
+	TagName     string    `json:"tag_name"`
+	Network     NetworkID `json:"network"`
+	TaggedHosts []string  `json:"tagged_hosts"`
 }
 
 type TagListResp struct {
@@ -27,6 +37,6 @@ type TagListResp struct {
 
 type UpdateTagReq struct {
 	Tag
-	NewID       TagID    `json:"new_id"`
+	NewName     string   `json:"new_name"`
 	TaggedHosts []string `json:"tagged_hosts"`
 }