Browse Source

Merge pull request #1955 from gravitl/GRA-988/add_host_to_network

Gra 988/add host to network
dcarns 2 years ago
parent
commit
d7b6baceb2
2 changed files with 45 additions and 61 deletions
  1. 34 25
      controllers/hosts.go
  2. 11 36
      logic/hosts.go

+ 34 - 25
controllers/hosts.go

@@ -2,6 +2,8 @@ package controller
 
 import (
 	"encoding/json"
+	"errors"
+	"fmt"
 	"net/http"
 	"reflect"
 
@@ -10,7 +12,6 @@ import (
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/mq"
-	"github.com/gravitl/netmaker/servercfg"
 )
 
 type hostNetworksUpdatePayload struct {
@@ -21,7 +22,7 @@ func hostHandlers(r *mux.Router) {
 	r.HandleFunc("/api/hosts", logic.SecurityCheck(true, http.HandlerFunc(getHosts))).Methods(http.MethodGet)
 	r.HandleFunc("/api/hosts/{hostid}", logic.SecurityCheck(true, http.HandlerFunc(updateHost))).Methods(http.MethodPut)
 	r.HandleFunc("/api/hosts/{hostid}", logic.SecurityCheck(true, http.HandlerFunc(deleteHost))).Methods(http.MethodDelete)
-	r.HandleFunc("/api/hosts/{hostid}/networks", logic.SecurityCheck(true, http.HandlerFunc(updateHostNetworks))).Methods(http.MethodPut)
+	r.HandleFunc("/api/hosts/{hostid}/networks/{network}", logic.SecurityCheck(true, http.HandlerFunc(addHostToNetwork))).Methods(http.MethodPost)
 	r.HandleFunc("/api/hosts/{hostid}/relay", logic.SecurityCheck(false, http.HandlerFunc(createHostRelay))).Methods(http.MethodPost)
 	r.HandleFunc("/api/hosts/{hostid}/relay", logic.SecurityCheck(false, http.HandlerFunc(deleteHostRelay))).Methods(http.MethodDelete)
 }
@@ -171,9 +172,9 @@ func deleteHost(w http.ResponseWriter, r *http.Request) {
 	json.NewEncoder(w).Encode(apiHostData)
 }
 
-// swagger:route PUT /api/hosts hosts updateHostNetworks
+// swagger:route POST /api/hosts/{hostid}/networks/{network} hosts addHostToNetwork
 //
-// Given a list of networks, a host is updated accordingly.
+// Given a network, a host is added to the network.
 //
 //			Schemes: https
 //
@@ -181,41 +182,49 @@ func deleteHost(w http.ResponseWriter, r *http.Request) {
 //	  		oauth
 //
 //			Responses:
-//				200: updateHostNetworks
-func updateHostNetworks(w http.ResponseWriter, r *http.Request) {
-	var payload hostNetworksUpdatePayload
-	err := json.NewDecoder(r.Body).Decode(&payload)
-	if 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
-	}
+//				200: addHostToNetwork
+func addHostToNetwork(w http.ResponseWriter, r *http.Request) {
 
-	// confirm host exists
 	var params = mux.Vars(r)
 	hostid := params["hostid"]
+	network := params["network"]
+	if hostid == "" || network == "" {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("hostid or network cannot be empty"), "badrequest"))
+		return
+	}
+	// confirm host exists
 	currHost, err := logic.GetHost(hostid)
 	if err != nil {
-		logger.Log(0, r.Header.Get("user"), "failed to find host:", err.Error())
+		logger.Log(0, r.Header.Get("user"), "failed to find host:", hostid, err.Error())
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
 		return
 	}
 
-	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())
+	newNode, err := logic.UpdateHostNetwork(currHost, network, true)
+	if err != nil {
+		logger.Log(0, r.Header.Get("user"), "failed to add host to network:", hostid, network, err.Error())
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
 		return
 	}
-
-	if err = mq.ModifyClient(&mq.MqClient{
-		ID:       currHost.ID.String(),
-		Text:     currHost.Name,
-		Networks: payload.Networks,
+	logger.Log(1, "added new node", newNode.ID.String(), "to host", currHost.Name)
+	if err = mq.HostUpdate(&models.HostUpdate{
+		Action: models.JoinHostToNetwork,
+		Host:   *currHost,
+		Node:   *newNode,
 	}); err != nil {
-		logger.Log(0, r.Header.Get("user"), "failed to update host networks roles in DynSec:", err.Error())
+		logger.Log(0, r.Header.Get("user"), "failed to update host to join network:", hostid, network, err.Error())
+	}
+	networks := logic.GetHostNetworks(currHost.ID.String())
+	if len(networks) > 0 {
+		if err = mq.ModifyClient(&mq.MqClient{
+			ID:       currHost.ID.String(),
+			Text:     currHost.Name,
+			Networks: networks,
+		}); err != nil {
+			logger.Log(0, r.Header.Get("user"), "failed to update host networks roles in DynSec:", hostid, err.Error())
+		}
 	}
 
-	logger.Log(2, r.Header.Get("user"), "updated host networks", currHost.Name)
+	logger.Log(2, r.Header.Get("user"), fmt.Sprintf("added host %s to network %s", currHost.Name, network))
 	w.WriteHeader(http.StatusOK)
-	json.NewEncoder(w).Encode(payload)
 }

+ 11 - 36
logic/hosts.go

@@ -9,6 +9,7 @@ import (
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/servercfg"
 	"golang.org/x/crypto/bcrypt"
 )
 
@@ -156,46 +157,20 @@ func RemoveHostByID(hostID string) error {
 	return database.DeleteRecord(database.HOSTS_TABLE_NAME, hostID)
 }
 
-// UpdateHostNetworks - updates a given host's networks
-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])
-			if err != nil {
-				return err
-			}
-			// loop through networks and remove need for updating existing networks
-			found := false
-			for j := range nets {
-				if len(nets[j]) > 0 && nets[j] == n.Network {
-					nets[j] = "" // mark as ignore
-					found = true
-				}
-			}
-			if !found { // remove the node/host from that network
-				if err = DissasociateNodeFromHost(&n, h); err != nil {
-					return err
-				}
-			}
-		}
-	} else {
-		h.Nodes = []string{}
-	}
+// UpdateHostNetwork - adds/deletes host from a network
+func UpdateHostNetwork(h *models.Host, network string, add bool) (*models.Node, error) {
 
-	for i := range nets {
-		// create a node for each non zero network remaining
-		if len(nets[i]) > 0 {
-			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)
+	if add {
+		newNode := models.Node{}
+		newNode.Server = servercfg.GetServer()
+		newNode.Network = network
+		if err := AssociateNodeToHost(&newNode, h); err != nil {
+			return nil, err
 		}
+		return &newNode, nil
 	}
 
-	return nil
+	return nil, errors.New("failed to update host networks")
 }
 
 // AssociateNodeToHost - associates and creates a node with a given host