mirror of
https://github.com/gravitl/netmaker.git
synced 2024-09-20 15:26:04 +08:00
Merge pull request #1961 from gravitl/gra-967-migrate-function
reworked migrate function
This commit is contained in:
commit
eb608dc90b
78
controllers/migrate.go
Normal file
78
controllers/migrate.go
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"github.com/gravitl/netmaker/database"
|
||||||
|
"github.com/gravitl/netmaker/logger"
|
||||||
|
"github.com/gravitl/netmaker/logic"
|
||||||
|
"github.com/gravitl/netmaker/models"
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// swagger:route PUT /api/nodes/{network}/{nodeid}/migrate nodes migrateNode
|
||||||
|
//
|
||||||
|
// Used to migrate a legacy node.
|
||||||
|
//
|
||||||
|
// Schemes: https
|
||||||
|
//
|
||||||
|
// Security:
|
||||||
|
// oauth
|
||||||
|
//
|
||||||
|
// Responses:
|
||||||
|
// 200: nodeJoinResponse
|
||||||
|
func migrate(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// we decode our body request params
|
||||||
|
data := models.MigrationData{}
|
||||||
|
err := json.NewDecoder(r.Body).Decode(&data)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
params := mux.Vars(r)
|
||||||
|
//check authorization
|
||||||
|
record, err := database.FetchRecord(database.NODES_TABLE_NAME, data.LegacyNodeID)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log(0, "no record for legacy node", data.LegacyNodeID, err.Error())
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var legacyNode models.LegacyNode
|
||||||
|
if err = json.Unmarshal([]byte(record), &legacyNode); err != nil {
|
||||||
|
logger.Log(0, "error decoding legacy node", err.Error())
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := bcrypt.CompareHashAndPassword([]byte(legacyNode.Password), []byte(data.Password)); err != nil {
|
||||||
|
logger.Log(0, "error decoding legacy password", err.Error())
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "unauthorized"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
network, err := logic.GetNetwork(params["network"])
|
||||||
|
if err != nil {
|
||||||
|
logger.Log(0, "error retrieving network: ", err.Error())
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
key, err := logic.CreateAccessKey(models.AccessKey{}, network)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log(0, "error creating key: ", err.Error())
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data.JoinData.Key = key.Value
|
||||||
|
payload, err := json.Marshal(data.JoinData)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log(0, "error encoding data: ", err.Error())
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
r.Body = io.NopCloser(strings.NewReader(string(payload)))
|
||||||
|
r.ContentLength = int64(len(string(payload)))
|
||||||
|
createNode(w, r)
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -26,7 +25,7 @@ func nodeHandlers(r *mux.Router) {
|
||||||
r.HandleFunc("/api/nodes/{network}", authorize(false, true, "network", http.HandlerFunc(getNetworkNodes))).Methods(http.MethodGet)
|
r.HandleFunc("/api/nodes/{network}", authorize(false, true, "network", http.HandlerFunc(getNetworkNodes))).Methods(http.MethodGet)
|
||||||
r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(getNode))).Methods(http.MethodGet)
|
r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(getNode))).Methods(http.MethodGet)
|
||||||
r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(false, true, "node", http.HandlerFunc(updateNode))).Methods(http.MethodPut)
|
r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(false, true, "node", http.HandlerFunc(updateNode))).Methods(http.MethodPut)
|
||||||
r.HandleFunc("/api/nodes/{network}/{nodeid}/migrate", authorize(true, true, "node", http.HandlerFunc(migrate))).Methods(http.MethodPut)
|
r.HandleFunc("/api/nodes/{network}/{nodeid}/migrate", migrate).Methods(http.MethodPost)
|
||||||
r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(deleteNode))).Methods(http.MethodDelete)
|
r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(deleteNode))).Methods(http.MethodDelete)
|
||||||
r.HandleFunc("/api/nodes/{network}/{nodeid}/createrelay", authorize(false, true, "user", http.HandlerFunc(createRelay))).Methods(http.MethodPost)
|
r.HandleFunc("/api/nodes/{network}/{nodeid}/createrelay", authorize(false, true, "user", http.HandlerFunc(createRelay))).Methods(http.MethodPost)
|
||||||
r.HandleFunc("/api/nodes/{network}/{nodeid}/deleterelay", authorize(false, true, "user", http.HandlerFunc(deleteRelay))).Methods(http.MethodDelete)
|
r.HandleFunc("/api/nodes/{network}/{nodeid}/deleterelay", authorize(false, true, "user", http.HandlerFunc(deleteRelay))).Methods(http.MethodDelete)
|
||||||
|
@ -176,7 +175,6 @@ func nodeauth(next http.Handler) http.HandlerFunc {
|
||||||
for _, key := range network.AccessKeys {
|
for _, key := range network.AccessKeys {
|
||||||
if key.Value == token {
|
if key.Value == token {
|
||||||
found = true
|
found = true
|
||||||
logic.DecrimentKey(network.NetID, key.Value)
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -552,6 +550,7 @@ func createNode(w http.ResponseWriter, r *http.Request) {
|
||||||
logic.ReturnErrorResponse(w, r, errorResponse)
|
logic.ReturnErrorResponse(w, r, errorResponse)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
logic.DecrimentKey(networkName, data.Key)
|
||||||
user, err := pro.GetNetworkUser(networkName, promodels.NetworkUserID(keyName))
|
user, err := pro.GetNetworkUser(networkName, promodels.NetworkUserID(keyName))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if user.ID != "" {
|
if user.ID != "" {
|
||||||
|
@ -836,51 +835,6 @@ func deleteIngressGateway(w http.ResponseWriter, r *http.Request) {
|
||||||
runUpdates(&node, true)
|
runUpdates(&node, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// swagger:route PUT /api/nodes/{network}/{nodeid}/migrate nodes migrateNode
|
|
||||||
//
|
|
||||||
// Used to migrate a legacy node.
|
|
||||||
//
|
|
||||||
// Schemes: https
|
|
||||||
//
|
|
||||||
// Security:
|
|
||||||
// oauth
|
|
||||||
//
|
|
||||||
// Responses:
|
|
||||||
// 200: nodeJoinResponse
|
|
||||||
func migrate(w http.ResponseWriter, r *http.Request) {
|
|
||||||
// we decode our body request params
|
|
||||||
data := models.JoinData{}
|
|
||||||
err := json.NewDecoder(r.Body).Decode(&data)
|
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
|
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
params := mux.Vars(r)
|
|
||||||
network, err := logic.GetNetwork(params["network"])
|
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, "error retrieving network: ", err.Error())
|
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
key, err := logic.CreateAccessKey(models.AccessKey{}, network)
|
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, "error creating key: ", err.Error())
|
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
data.Key = key.Value
|
|
||||||
payload, err := json.Marshal(data)
|
|
||||||
if err != nil {
|
|
||||||
logger.Log(0, "error encoding data: ", err.Error())
|
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
r.Body = io.NopCloser(strings.NewReader(string(payload)))
|
|
||||||
r.ContentLength = int64(len(string(payload)))
|
|
||||||
createNode(w, r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// swagger:route PUT /api/nodes/{network}/{nodeid} nodes updateNode
|
// swagger:route PUT /api/nodes/{network}/{nodeid} nodes updateNode
|
||||||
//
|
//
|
||||||
// Update an individual node.
|
// Update an individual node.
|
||||||
|
|
8
models/migrate.go
Normal file
8
models/migrate.go
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
// MigrationData struct needed to create new v0.18.0 node from v.0.17.X node
|
||||||
|
type MigrationData struct {
|
||||||
|
JoinData JoinData
|
||||||
|
LegacyNodeID string
|
||||||
|
Password string
|
||||||
|
}
|
Loading…
Reference in a new issue