Bladeren bron

send update to iot client relayed node deletion

Abhishek Kondur 2 jaren geleden
bovenliggende
commit
b3b9b9f088
2 gewijzigde bestanden met toevoegingen van 34 en 2 verwijderingen
  1. 19 2
      controllers/node.go
  2. 15 0
      logic/relay.go

+ 19 - 2
controllers/node.go

@@ -681,7 +681,24 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(apiNode)
 	runUpdates(newNode, ifaceDelta)
-	go func(aclUpdate, relayupdate bool, newNode *models.Node) {
+	go func(aclUpdate, relayupdate bool, currNode, newNode *models.Node) {
+		if relayupdate {
+			// need to check if relayed node deleted IOT client, if so should tell it to delete it's relay peer
+			deletedRelayedID := logic.GetDeletedRelayedNode(*currNode, *newNode)
+			deletedRelayedNode, err := logic.GetNodeByID(deletedRelayedID)
+			if err == nil {
+				h, err := logic.GetHost(deletedRelayedNode.HostID.String())
+				if err == nil {
+					if h.OS == models.OS_Types.IoT {
+						if err = mq.PublishSingleHostPeerUpdate(context.Background(), h, currNode, nil); err != nil {
+							logger.Log(1, "failed to publish peer update to host", h.ID.String(), ": ", err.Error())
+						}
+					}
+				}
+
+			}
+
+		}
 		if aclUpdate || relayupdate {
 			if err := mq.PublishPeerUpdate(); err != nil {
 				logger.Log(0, "error during node ACL update for node", newNode.ID.String())
@@ -690,7 +707,7 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 		if err := mq.PublishReplaceDNS(&currentNode, newNode, host); err != nil {
 			logger.Log(1, "failed to publish dns update", err.Error())
 		}
-	}(aclUpdate, relayupdate, newNode)
+	}(aclUpdate, relayupdate, &currentNode, newNode)
 }
 
 // swagger:route DELETE /api/nodes/{network}/{nodeid} nodes deleteNode

+ 15 - 0
logic/relay.go

@@ -134,6 +134,21 @@ func UpdateRelayed(relay string, oldNodes []string, newNodes []string) []models.
 	return SetRelayedNodes(true, relay, newNodes)
 }
 
+func GetDeletedRelayedNode(currRelay, updatedRelay models.Node) (deletedRelayedNodeID string) {
+	updatedRelayedNodeMap := make(map[string]struct{})
+	for _, relayedNodeID := range updatedRelay.RelayedNodes {
+		updatedRelayedNodeMap[relayedNodeID] = struct{}{}
+	}
+
+	for _, relayedNodeID := range currRelay.RelayedNodes {
+		if _, ok := updatedRelayedNodeMap[relayedNodeID]; !ok {
+			deletedRelayedNodeID = relayedNodeID
+			break
+		}
+	}
+	return
+}
+
 // DeleteRelay - deletes a relay
 func DeleteRelay(network, nodeid string) ([]models.Node, models.Node, error) {
 	var returnnodes []models.Node