diff --git a/controllers/ext_client.go b/controllers/ext_client.go index 1d9fd7a4..af3ffccc 100644 --- a/controllers/ext_client.go +++ b/controllers/ext_client.go @@ -14,6 +14,7 @@ import ( "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/models" + "github.com/gravitl/netmaker/mq" "github.com/skip2/go-qrcode" ) @@ -238,6 +239,10 @@ func createExtClient(w http.ResponseWriter, r *http.Request) { return } 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) { @@ -289,6 +294,13 @@ func deleteExtClient(w http.ResponseWriter, r *http.Request) { returnErrorResponse(w, r, formatError(err, "internal")) 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"), "Deleted extclient client", params["clientid"], "from network", params["network"]) returnSuccessResponse(w, r, params["clientid"]+" deleted.") diff --git a/logic/nodes.go b/logic/nodes.go index 29caa405..90f3c4bb 100644 --- a/logic/nodes.go +++ b/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") } +// 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 func validateServer(currentNode, newNode *models.Node) bool { return (newNode.Address == currentNode.Address && diff --git a/mq/mq.go b/mq/mq.go index 4d1851ae..c7b3ddec 100644 --- a/mq/mq.go +++ b/mq/mq.go @@ -133,6 +133,31 @@ func PublishPeerUpdate(newNode *models.Node) error { 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 func GetID(topic string) (string, error) { parts := strings.Split(topic, "/")