From 0647e6e1a59754b767aebee5091f6941f429122f Mon Sep 17 00:00:00 2001 From: the_aceix Date: Fri, 19 Jan 2024 16:17:18 +0000 Subject: [PATCH] feat(NET-709): add node metadata for remote gateways --- controllers/node.go | 15 +++++++++++++++ logic/gateway.go | 4 ++++ models/api_node.go | 9 ++++++--- models/node.go | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/controllers/node.go b/controllers/node.go index 3981dede9f..931f0e8e71 100644 --- a/controllers/node.go +++ b/controllers/node.go @@ -6,6 +6,7 @@ import ( "net/http" "strings" + "github.com/go-playground/validator/v10" "github.com/gorilla/mux" "github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/logger" @@ -13,6 +14,7 @@ import ( "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/mq" "github.com/gravitl/netmaker/servercfg" + "github.com/gravitl/netmaker/validation" "golang.org/x/crypto/bcrypt" "golang.org/x/exp/slog" ) @@ -635,6 +637,19 @@ func updateNode(w http.ResponseWriter, r *http.Request) { logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) return } + v := validator.New() + _ = v.RegisterValidation("id_unique", func(fl validator.FieldLevel) bool { + return true + }) + _ = v.RegisterValidation("checkyesornoorunset", func(f1 validator.FieldLevel) bool { + return validation.CheckYesOrNoOrUnset(f1) + }) + err = v.Struct(newData) + if err != nil { + slog.Error("error validating request body.", "error:", err) + logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest")) + return + } newNode := newData.ConvertToServerNode(¤tNode) relayUpdate := logic.RelayUpdates(¤tNode, newNode) _, err = logic.GetHost(newNode.HostID.String()) diff --git a/logic/gateway.go b/logic/gateway.go index a96511f5f9..546dc51dde 100644 --- a/logic/gateway.go +++ b/logic/gateway.go @@ -174,6 +174,9 @@ func CreateIngressGateway(netid string, nodeid string, ingress models.IngressReq node.IngressGatewayRange6 = network.AddressRange6 node.IngressDNS = ingress.ExtclientDNS node.SetLastModified() + if node.Metadata == "" { + node.Metadata = "This host can be used for remote access" + } err = UpsertNode(&node) if err != nil { return models.Node{}, err @@ -224,6 +227,7 @@ func DeleteIngressGateway(nodeid string) (models.Node, []models.ExtClient, error node.IsIngressGateway = false node.IsInternetGateway = false node.IngressGatewayRange = "" + node.Metadata = "" err = UpsertNode(&node) if err != nil { return models.Node{}, removedClients, err diff --git a/models/api_node.go b/models/api_node.go index 7a841f180a..84acface4a 100644 --- a/models/api_node.go +++ b/models/api_node.go @@ -11,9 +11,9 @@ import ( type ApiNode struct { ID string `json:"id,omitempty" validate:"required,min=5,id_unique"` HostID string `json:"hostid,omitempty" validate:"required,min=5,id_unique"` - Address string `json:"address" validate:"omitempty,ipv4"` - Address6 string `json:"address6" validate:"omitempty,ipv6"` - LocalAddress string `json:"localaddress" validate:"omitempty,ipv4"` + Address string `json:"address" validate:"omitempty,ipv4,cidrv4"` + Address6 string `json:"address6" validate:"omitempty,cidrv6"` + LocalAddress string `json:"localaddress" validate:"omitempty,cidr"` AllowedIPs []string `json:"allowedips"` LastModified int64 `json:"lastmodified"` ExpirationDateTime int64 `json:"expdatetime"` @@ -37,6 +37,7 @@ type ApiNode struct { InternetGateway string `json:"internetgateway"` Connected bool `json:"connected"` PendingDelete bool `json:"pendingdelete"` + Metadata string `json:"metadata" validate:"max=256"` // == PRO == DefaultACL string `json:"defaultacl,omitempty" validate:"checkyesornoorunset"` IsFailOver bool `json:"is_fail_over"` @@ -104,6 +105,7 @@ func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node { convertedNode.LastCheckIn = time.Unix(a.LastCheckIn, 0) convertedNode.LastPeerUpdate = time.Unix(a.LastPeerUpdate, 0) convertedNode.ExpirationDateTime = time.Unix(a.ExpirationDateTime, 0) + convertedNode.Metadata = a.Metadata return &convertedNode } @@ -158,6 +160,7 @@ func (nm *Node) ConvertToAPINode() *ApiNode { apiNode.IsFailOver = nm.IsFailOver apiNode.FailOverPeers = nm.FailOverPeers apiNode.FailedOverBy = nm.FailedOverBy + apiNode.Metadata = nm.Metadata return &apiNode } diff --git a/models/node.go b/models/node.go index 05f1b4d520..fcbc651011 100644 --- a/models/node.go +++ b/models/node.go @@ -87,6 +87,7 @@ type Node struct { EgressGatewayRequest EgressGatewayRequest `json:"egressgatewayrequest" bson:"egressgatewayrequest" yaml:"egressgatewayrequest"` IngressGatewayRange string `json:"ingressgatewayrange" bson:"ingressgatewayrange" yaml:"ingressgatewayrange"` IngressGatewayRange6 string `json:"ingressgatewayrange6" bson:"ingressgatewayrange6" yaml:"ingressgatewayrange6"` + Metadata string `json:"metadata"` // == PRO == DefaultACL string `json:"defaultacl,omitempty" bson:"defaultacl,omitempty" yaml:"defaultacl,omitempty" validate:"checkyesornoorunset"` OwnerID string `json:"ownerid,omitempty" bson:"ownerid,omitempty" yaml:"ownerid,omitempty"`