Skip to content

Commit 45bb954

Browse files
committed
feat(NET-709): add node metadata for remote gateways
1 parent 058338f commit 45bb954

File tree

4 files changed

+26
-3
lines changed

4 files changed

+26
-3
lines changed

controllers/node.go

+15
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import (
66
"net/http"
77
"strings"
88

9+
"github.com/go-playground/validator/v10"
910
"github.com/gorilla/mux"
1011
"github.com/gravitl/netmaker/database"
1112
"github.com/gravitl/netmaker/logger"
1213
"github.com/gravitl/netmaker/logic"
1314
"github.com/gravitl/netmaker/models"
1415
"github.com/gravitl/netmaker/mq"
1516
"github.com/gravitl/netmaker/servercfg"
17+
"github.com/gravitl/netmaker/validation"
1618
"golang.org/x/crypto/bcrypt"
1719
"golang.org/x/exp/slog"
1820
)
@@ -635,6 +637,19 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
635637
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
636638
return
637639
}
640+
v := validator.New()
641+
_ = v.RegisterValidation("id_unique", func(fl validator.FieldLevel) bool {
642+
return true
643+
})
644+
_ = v.RegisterValidation("checkyesornoorunset", func(f1 validator.FieldLevel) bool {
645+
return validation.CheckYesOrNoOrUnset(f1)
646+
})
647+
err = v.Struct(newData)
648+
if err != nil {
649+
slog.Error("error validating request body.", "error:", err)
650+
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
651+
return
652+
}
638653
newNode := newData.ConvertToServerNode(&currentNode)
639654
relayUpdate := logic.RelayUpdates(&currentNode, newNode)
640655
_, err = logic.GetHost(newNode.HostID.String())

logic/gateway.go

+4
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ func CreateIngressGateway(netid string, nodeid string, ingress models.IngressReq
174174
node.IngressGatewayRange6 = network.AddressRange6
175175
node.IngressDNS = ingress.ExtclientDNS
176176
node.SetLastModified()
177+
if node.Metadata == "" {
178+
node.Metadata = "This host can be used for remote access"
179+
}
177180
err = UpsertNode(&node)
178181
if err != nil {
179182
return models.Node{}, err
@@ -224,6 +227,7 @@ func DeleteIngressGateway(nodeid string) (models.Node, []models.ExtClient, error
224227
node.IsIngressGateway = false
225228
node.IsInternetGateway = false
226229
node.IngressGatewayRange = ""
230+
node.Metadata = ""
227231
err = UpsertNode(&node)
228232
if err != nil {
229233
return models.Node{}, removedClients, err

models/api_node.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import (
1111
type ApiNode struct {
1212
ID string `json:"id,omitempty" validate:"required,min=5,id_unique"`
1313
HostID string `json:"hostid,omitempty" validate:"required,min=5,id_unique"`
14-
Address string `json:"address" validate:"omitempty,ipv4"`
15-
Address6 string `json:"address6" validate:"omitempty,ipv6"`
16-
LocalAddress string `json:"localaddress" validate:"omitempty,ipv4"`
14+
Address string `json:"address" validate:"omitempty,cidrv4"`
15+
Address6 string `json:"address6" validate:"omitempty,cidrv6"`
16+
LocalAddress string `json:"localaddress" validate:"omitempty,cidr"`
1717
AllowedIPs []string `json:"allowedips"`
1818
LastModified int64 `json:"lastmodified"`
1919
ExpirationDateTime int64 `json:"expdatetime"`
@@ -37,6 +37,7 @@ type ApiNode struct {
3737
InternetGateway string `json:"internetgateway"`
3838
Connected bool `json:"connected"`
3939
PendingDelete bool `json:"pendingdelete"`
40+
Metadata string `json:"metadata" validate:"max=256"`
4041
// == PRO ==
4142
DefaultACL string `json:"defaultacl,omitempty" validate:"checkyesornoorunset"`
4243
IsFailOver bool `json:"is_fail_over"`
@@ -104,6 +105,7 @@ func (a *ApiNode) ConvertToServerNode(currentNode *Node) *Node {
104105
convertedNode.LastCheckIn = time.Unix(a.LastCheckIn, 0)
105106
convertedNode.LastPeerUpdate = time.Unix(a.LastPeerUpdate, 0)
106107
convertedNode.ExpirationDateTime = time.Unix(a.ExpirationDateTime, 0)
108+
convertedNode.Metadata = a.Metadata
107109
return &convertedNode
108110
}
109111

@@ -158,6 +160,7 @@ func (nm *Node) ConvertToAPINode() *ApiNode {
158160
apiNode.IsFailOver = nm.IsFailOver
159161
apiNode.FailOverPeers = nm.FailOverPeers
160162
apiNode.FailedOverBy = nm.FailedOverBy
163+
apiNode.Metadata = nm.Metadata
161164
return &apiNode
162165
}
163166

models/node.go

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ type Node struct {
8787
EgressGatewayRequest EgressGatewayRequest `json:"egressgatewayrequest" bson:"egressgatewayrequest" yaml:"egressgatewayrequest"`
8888
IngressGatewayRange string `json:"ingressgatewayrange" bson:"ingressgatewayrange" yaml:"ingressgatewayrange"`
8989
IngressGatewayRange6 string `json:"ingressgatewayrange6" bson:"ingressgatewayrange6" yaml:"ingressgatewayrange6"`
90+
Metadata string `json:"metadata"`
9091
// == PRO ==
9192
DefaultACL string `json:"defaultacl,omitempty" bson:"defaultacl,omitempty" yaml:"defaultacl,omitempty" validate:"checkyesornoorunset"`
9293
OwnerID string `json:"ownerid,omitempty" bson:"ownerid,omitempty" yaml:"ownerid,omitempty"`

0 commit comments

Comments
 (0)