Browse Source

Merge pull request #1947 from gravitl/GRA-985/host_delete_logic

Gra 985/host delete logic
dcarns 2 years ago
parent
commit
394f386f32
3 changed files with 42 additions and 3 deletions
  1. 6 1
      controllers/hosts.go
  2. 27 0
      logic/hosts.go
  3. 9 2
      mq/handlers.go

+ 6 - 1
controllers/hosts.go

@@ -154,7 +154,12 @@ func deleteHost(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
 		return
 	}
-	// TODO: publish host update with delete action using MQ
+	if err = mq.HostUpdate(&models.HostUpdate{
+		Action: models.DeleteHost,
+		Host:   *currHost,
+	}); err != nil {
+		logger.Log(0, r.Header.Get("user"), "failed to send delete host update: ", currHost.ID.String(), err.Error())
+	}
 
 	if err = mq.DeleteMqClient(currHost.ID.String()); err != nil {
 		logger.Log(0, "error removing DynSec credentials for host:", currHost.Name, err.Error())

+ 27 - 0
logic/hosts.go

@@ -151,6 +151,11 @@ func RemoveHost(h *models.Host) error {
 	return database.DeleteRecord(database.HOSTS_TABLE_NAME, h.ID.String())
 }
 
+// RemoveHostByID - removes a given host by id from server
+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 {
@@ -241,6 +246,28 @@ func DissasociateNodeFromHost(n *models.Node, h *models.Host) error {
 	return UpsertHost(h)
 }
 
+// DisassociateAllNodesFromHost - deletes all nodes of the host
+func DisassociateAllNodesFromHost(hostID string) error {
+	host, err := GetHost(hostID)
+	if err != nil {
+		return err
+	}
+	for _, nodeID := range host.Nodes {
+		node, err := GetNodeByID(nodeID)
+		if err != nil {
+			logger.Log(0, "failed to get host node", err.Error())
+			continue
+		}
+		if err := DeleteNode(&node, true); err != nil {
+			logger.Log(0, "failed to delete node", node.ID.String(), err.Error())
+			continue
+		}
+		logger.Log(3, "deleted node", node.ID.String(), "of host", host.ID.String())
+	}
+	host.Nodes = []string{}
+	return UpsertHost(host)
+}
+
 // GetDefaultHosts - retrieve all hosts marked as default from DB
 func GetDefaultHosts() []models.Host {
 	defaultHostList := []models.Host{}

+ 9 - 2
mq/handlers.go

@@ -152,8 +152,15 @@ func UpdateHost(client mqtt.Client, msg mqtt.Message) {
 				return
 			}
 		case models.DeleteHost:
-			// TODO: logic to delete host on the server
-
+			if err := logic.DisassociateAllNodesFromHost(currentHost.ID.String()); err != nil {
+				logger.Log(0, "failed to delete all nodes of host: ", currentHost.ID.String(), err.Error())
+				return
+			}
+			if err := logic.RemoveHostByID(currentHost.ID.String()); err != nil {
+				logger.Log(0, "failed to delete host: ", currentHost.ID.String(), err.Error())
+				return
+			}
+			sendPeerUpdate = true
 		}
 		if sendPeerUpdate {
 			err := PublishPeerUpdate()