Browse Source

ext client logic for peer updates

afeiszli 3 years ago
parent
commit
f6b1711439
3 changed files with 47 additions and 0 deletions
  1. 12 0
      controllers/ext_client.go
  2. 10 0
      logic/nodes.go
  3. 25 0
      mq/mq.go

+ 12 - 0
controllers/ext_client.go

@@ -14,6 +14,7 @@ import (
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/mq"
 	"github.com/skip2/go-qrcode"
 	"github.com/skip2/go-qrcode"
 )
 )
 
 
@@ -238,6 +239,10 @@ func createExtClient(w http.ResponseWriter, r *http.Request) {
 		return
 		return
 	}
 	}
 	w.WriteHeader(http.StatusOK)
 	w.WriteHeader(http.StatusOK)
+	err = mq.PublishExtPeerUpdate(nodeid)
+	if err != nil {
+		logger.Log(1, "error setting ext peers on "+nodeid+": "+err.Error())
+	}
 }
 }
 
 
 func updateExtClient(w http.ResponseWriter, r *http.Request) {
 func updateExtClient(w http.ResponseWriter, r *http.Request) {
@@ -289,6 +294,13 @@ func deleteExtClient(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 		return
 	}
 	}
+	/*
+		// we dont currently have logic to get the nodeid when we delete ext clients, apparently
+		err = mq.PublishExtPeerUpdate(nodeid)
+		if err != nil {
+			logger.Log("error setting ext peers on " + nodeid + ": " + err.Error())
+		}
+	*/
 	logger.Log(1, r.Header.Get("user"),
 	logger.Log(1, r.Header.Get("user"),
 		"Deleted extclient client", params["clientid"], "from network", params["network"])
 		"Deleted extclient client", params["clientid"], "from network", params["network"])
 	returnSuccessResponse(w, r, params["clientid"]+" deleted.")
 	returnSuccessResponse(w, r, params["clientid"]+" deleted.")

+ 10 - 0
logic/nodes.go

@@ -601,6 +601,16 @@ func GetNetworkServerLocal(network string) (models.Node, error) {
 	return models.Node{}, errors.New("could not find node for local server")
 	return models.Node{}, errors.New("could not find node for local server")
 }
 }
 
 
+// IsLocalServer - get network server node ID if exists
+func IsLocalServer(node *models.Node) bool {
+	var islocal bool
+	local, err := GetNetworkServerLocal(node.Network)
+	if err != nil {
+		return islocal
+	}
+	return node.ID != "" && local.ID == node.ID
+}
+
 // validateServer - make sure servers dont change port or address
 // validateServer - make sure servers dont change port or address
 func validateServer(currentNode, newNode *models.Node) bool {
 func validateServer(currentNode, newNode *models.Node) bool {
 	return (newNode.Address == currentNode.Address &&
 	return (newNode.Address == currentNode.Address &&

+ 25 - 0
mq/mq.go

@@ -133,6 +133,31 @@ func PublishPeerUpdate(newNode *models.Node) error {
 	return nil
 	return nil
 }
 }
 
 
+// PublishPeerUpdate --- deterines and publishes a peer update to all the peers of a node
+func PublishExtPeerUpdate(nodeid string) error {
+	node, err := logic.GetNodeByID(nodeid)
+	if logic.IsLocalServer(&node) {
+		if err = logic.ServerUpdate(&node, false); err != nil {
+			logger.Log(1, "server node:", node.ID, "failed to update peers with ext clients")
+			return err
+		} else {
+			return nil
+		}
+	}
+	if !servercfg.IsMessageQueueBackend() {
+		return nil
+	}
+	peerUpdate, err := logic.GetPeerUpdate(&node)
+	if err != nil {
+		return err
+	}
+	data, err := json.Marshal(&peerUpdate)
+	if err != nil {
+		return err
+	}
+	return publish(&node, fmt.Sprintf("peers/%s/%s", node.Network, node.ID), data)
+}
+
 // GetID -- decodes a message queue topic and returns the embedded node.ID
 // GetID -- decodes a message queue topic and returns the embedded node.ID
 func GetID(topic string) (string, error) {
 func GetID(topic string) (string, error) {
 	parts := strings.Split(topic, "/")
 	parts := strings.Split(topic, "/")