From 692441279b887387bf3deafc9ff3d6a500382920 Mon Sep 17 00:00:00 2001 From: 0xdcarns Date: Tue, 7 Mar 2023 09:58:48 -0500 Subject: [PATCH] added ability to remove legacy nodes --- controllers/controller.go | 1 + controllers/legacy.go | 35 +++++++++++++++++++++++++++++ controllers/node.go | 9 ++++++-- logic/legacy.go | 46 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 controllers/legacy.go create mode 100644 logic/legacy.go diff --git a/controllers/controller.go b/controllers/controller.go index 7fa39889..7abef20b 100644 --- a/controllers/controller.go +++ b/controllers/controller.go @@ -27,6 +27,7 @@ var HttpHandlers = []interface{}{ loggerHandlers, hostHandlers, enrollmentKeyHandlers, + legacyHandlers, } // HandleRESTRequests - handles the rest requests diff --git a/controllers/legacy.go b/controllers/legacy.go new file mode 100644 index 00000000..d47db645 --- /dev/null +++ b/controllers/legacy.go @@ -0,0 +1,35 @@ +package controller + +import ( + "net/http" + + "github.com/gorilla/mux" + "github.com/gravitl/netmaker/logger" + "github.com/gravitl/netmaker/logic" +) + +func legacyHandlers(r *mux.Router) { + r.HandleFunc("/api/v1/legacy/nodes", logic.SecurityCheck(true, http.HandlerFunc(wipeLegacyNodes))).Methods(http.MethodDelete) +} + +// swagger:route DELETE /api/v1/legacy/nodes nodes wipeLegacyNodes +// +// Delete all legacy nodes from DB. +// +// Schemes: https +// +// Security: +// oauth +// +// Responses: +// 200: wipeLegacyNodesResponse +func wipeLegacyNodes(w http.ResponseWriter, r *http.Request) { + // Set header + w.Header().Set("Content-Type", "application/json") + if err := logic.RemoveAllLegacyNodes(); err != nil { + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) + logger.Log(0, "error occurred when removing legacy nodes", err.Error()) + } + logger.Log(0, r.Header.Get("user"), "wiped legacy nodes") + logic.ReturnSuccessResponse(w, r, "wiped all legacy nodes") +} diff --git a/controllers/node.go b/controllers/node.go index e9b56b08..85efb6a1 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -975,8 +975,13 @@ func deleteNode(w http.ResponseWriter, r *http.Request) { fromNode := r.Header.Get("requestfrom") == "node" node, err := logic.GetNodeByID(nodeid) if err != nil { - logger.Log(0, "error retrieving node to delete", err.Error()) - logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) + if logic.CheckAndRemoveLegacyNode(nodeid) { + logger.Log(0, "removed legacy node", nodeid) + logic.ReturnSuccessResponse(w, r, nodeid+" deleted.") + } else { + logger.Log(0, "error retrieving node to delete", err.Error()) + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) + } return } if r.Header.Get("ismaster") != "yes" { diff --git a/logic/legacy.go b/logic/legacy.go new file mode 100644 index 00000000..5f858a3d --- /dev/null +++ b/logic/legacy.go @@ -0,0 +1,46 @@ +package logic + +import ( + "encoding/json" + + "github.com/gravitl/netmaker/database" + "github.com/gravitl/netmaker/logger" + "github.com/gravitl/netmaker/models" +) + +// IsLegacyNode - checks if a node is legacy or not +func IsLegacyNode(nodeID string) bool { + record, err := database.FetchRecord(database.NODES_TABLE_NAME, nodeID) + if err != nil { + return false + } + var currentNode models.Node + var legacyNode models.LegacyNode + currentNodeErr := json.Unmarshal([]byte(record), ¤tNode) + legacyNodeErr := json.Unmarshal([]byte(record), &legacyNode) + return currentNodeErr != nil && legacyNodeErr == nil +} + +// CheckAndRemoveLegacyNode - checks for legacy node and removes +func CheckAndRemoveLegacyNode(nodeID string) bool { + if IsLegacyNode(nodeID) { + if err := database.DeleteRecord(database.NODES_TABLE_NAME, nodeID); err == nil { + return true + } + } + return false +} + +// RemoveAllLegacyNodes - fetches all legacy nodes from DB and removes +func RemoveAllLegacyNodes() error { + records, err := database.FetchRecords(database.NODES_TABLE_NAME) + if err != nil { + return err + } + for k := range records { + if CheckAndRemoveLegacyNode(k) { + logger.Log(0, "removed legacy node", k) + } + } + return nil +}