Browse Source

added associate and dissasociate functions

0xdcarns 2 years ago
parent
commit
df614d6d4f
3 changed files with 30 additions and 12 deletions
  1. 6 0
      controllers/hosts.go
  2. 15 5
      logic/hosts.go
  3. 9 7
      logic/nodes.go

+ 6 - 0
controllers/hosts.go

@@ -8,6 +8,7 @@ import (
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/servercfg"
 )
 
 type hostNetworksUpdatePayload struct {
@@ -154,6 +155,11 @@ func updateHostNetworks(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// TODO: add and remove hosts to networks (nodes)
+	if err = logic.UpdateHostNetworks(currHost, servercfg.GetServer(), payload.Networks); err != nil {
+		logger.Log(0, r.Header.Get("user"), "failed to update host networks:", err.Error())
+		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
+		return
+	}
 
 	logger.Log(2, r.Header.Get("user"), "updated host networks", currHost.Name)
 	w.WriteHeader(http.StatusOK)

+ 15 - 5
logic/hosts.go

@@ -154,7 +154,7 @@ func RemoveHost(h *models.Host) error {
 			id := h.Nodes[i]
 			n, err := GetNodeByID(id)
 			if err == nil {
-				if err = DeleteNodeByID(&n); err != nil {
+				if err = DissasociateNodeFromHost(&n, h); err != nil {
 					return err // must remove associated nodes before removing a host
 				}
 			}
@@ -164,7 +164,7 @@ func RemoveHost(h *models.Host) error {
 }
 
 // UpdateHostNetworks - updates a given host's networks
-func UpdateHostNetworks(h *models.Host, nets []string) error {
+func UpdateHostNetworks(h *models.Host, server string, nets []string) error {
 	if len(h.Nodes) > 0 {
 		for i := range h.Nodes {
 			n, err := GetNodeByID(h.Nodes[i])
@@ -180,7 +180,7 @@ func UpdateHostNetworks(h *models.Host, nets []string) error {
 				}
 			}
 			if !found { // remove the node/host from that network
-				if err = DeleteNodeByID(&n); err != nil {
+				if err = DissasociateNodeFromHost(&n, h); err != nil {
 					return err
 				}
 			}
@@ -192,8 +192,13 @@ func UpdateHostNetworks(h *models.Host, nets []string) error {
 	for i := range nets {
 		// create a node for each non zero network remaining
 		if len(nets[i]) > 0 {
-			// TODO create a node with given hostid
-			logger.Log(0, "I will create a node here")
+			newNode := models.Node{}
+			newNode.Server = server
+			newNode.Network = nets[i]
+			if err := AssociateNodeToHost(&newNode, h); err != nil {
+				return err
+			}
+			logger.Log(1, "added new node", newNode.ID.String(), "to host", h.Name)
 		}
 	}
 
@@ -201,6 +206,7 @@ func UpdateHostNetworks(h *models.Host, nets []string) error {
 }
 
 // AssociateNodeToHost - associates and creates a node with a given host
+// should be the only way nodes get created as of 0.18
 func AssociateNodeToHost(n *models.Node, h *models.Host) error {
 	if len(h.ID.String()) == 0 || h.ID == uuid.Nil {
 		return ErrInvalidHostID
@@ -215,6 +221,7 @@ func AssociateNodeToHost(n *models.Node, h *models.Host) error {
 }
 
 // DissasociateNodeFromHost - deletes a node and removes from host nodes
+// should be the only way nodes are deleted as of 0.18
 func DissasociateNodeFromHost(n *models.Node, h *models.Host) error {
 	if len(h.ID.String()) == 0 || h.ID == uuid.Nil {
 		return ErrInvalidHostID
@@ -237,6 +244,9 @@ func DissasociateNodeFromHost(n *models.Node, h *models.Host) error {
 			return fmt.Errorf("node %s, not found in host, %s", n.ID.String(), h.ID.String())
 		}
 	}
+	if err := deleteNodeByID(n); err != nil {
+		return err
+	}
 	h.Nodes = RemoveStringSlice(h.Nodes, index)
 	return UpsertHost(h)
 }

+ 9 - 7
logic/nodes.go

@@ -85,19 +85,22 @@ func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
 // DeleteNode - marks node for deletion if called by UI or deletes node if called by node
 func DeleteNode(node *models.Node, purge bool) error {
 	if !purge {
-		newnode := node
+		newnode := *node
 		newnode.PendingDelete = true
 		newnode.Action = models.NODE_DELETE
-		if err := UpdateNode(node, newnode); err != nil {
+		if err := UpdateNode(node, &newnode); err != nil {
 			return err
 		}
 		return nil
 	}
-	if err := DeleteNodeByID(node); err != nil {
+	host, err := GetHost(node.HostID.String())
+	if err != nil {
+		return err
+	}
+	if err := DissasociateNodeFromHost(node, host); err != nil {
 		return err
 	}
 	if servercfg.Is_EE {
-		host, _ := GetHost(node.HostID.String())
 		if err := EnterpriseResetAllPeersFailovers(node.ID.String(), node.Network); err != nil {
 			logger.Log(0, "failed to reset failover lists during node delete for node", host.Name, node.Network)
 		}
@@ -106,8 +109,8 @@ func DeleteNode(node *models.Node, purge bool) error {
 	return nil
 }
 
-// DeleteNodeByID - deletes a node from database
-func DeleteNodeByID(node *models.Node) error {
+// deleteNodeByID - deletes a node from database
+func deleteNodeByID(node *models.Node) error {
 	var err error
 	var key = node.ID.String()
 	//delete any ext clients as required
@@ -620,7 +623,6 @@ func PurgePendingNodes(ctx context.Context) {
 						} else {
 							logger.Log(0, "purged node ", node.ID.String())
 						}
-
 					}
 				}
 			}