mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-05 08:47:35 +08:00
refactor validation for node creation
This commit is contained in:
@@ -59,61 +59,15 @@ func GetPeersList(networkName string) ([]models.PeersResponse, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ValidateNodeCreate(networkName string, node models.Node) error {
|
func ValidateNodeCreate(networkName string, node models.Node) error {
|
||||||
|
|
||||||
v := validator.New()
|
v := validator.New()
|
||||||
_ = v.RegisterValidation("address_check", func(fl validator.FieldLevel) bool {
|
|
||||||
isIpv4 := functions.IsIpNet(node.Address)
|
|
||||||
empty := node.Address == ""
|
|
||||||
return (empty || isIpv4)
|
|
||||||
})
|
|
||||||
_ = v.RegisterValidation("address6_check", func(fl validator.FieldLevel) bool {
|
|
||||||
isIpv6 := functions.IsIpNet(node.Address6)
|
|
||||||
empty := node.Address6 == ""
|
|
||||||
return (empty || isIpv6)
|
|
||||||
})
|
|
||||||
_ = v.RegisterValidation("endpoint_check", func(fl validator.FieldLevel) bool {
|
|
||||||
//var isFieldUnique bool = functions.IsFieldUnique(networkName, "endpoint", node.Endpoint)
|
|
||||||
isIp := functions.IsIpNet(node.Endpoint)
|
|
||||||
notEmptyCheck := node.Endpoint != ""
|
|
||||||
return (notEmptyCheck && isIp)
|
|
||||||
})
|
|
||||||
_ = v.RegisterValidation("localaddress_check", func(fl validator.FieldLevel) bool {
|
|
||||||
//var isFieldUnique bool = functions.IsFieldUnique(networkName, "endpoint", node.Endpoint)
|
|
||||||
isIp := functions.IsIpNet(node.LocalAddress)
|
|
||||||
empty := node.LocalAddress == ""
|
|
||||||
return (empty || isIp)
|
|
||||||
})
|
|
||||||
|
|
||||||
_ = v.RegisterValidation("macaddress_unique", func(fl validator.FieldLevel) bool {
|
_ = v.RegisterValidation("macaddress_unique", func(fl validator.FieldLevel) bool {
|
||||||
var isFieldUnique bool = functions.IsFieldUnique(networkName, "macaddress", node.MacAddress)
|
var isFieldUnique bool = functions.IsFieldUnique(networkName, "macaddress", node.MacAddress)
|
||||||
return isFieldUnique
|
return isFieldUnique
|
||||||
})
|
})
|
||||||
|
|
||||||
_ = v.RegisterValidation("macaddress_valid", func(fl validator.FieldLevel) bool {
|
|
||||||
_, err := net.ParseMAC(node.MacAddress)
|
|
||||||
return err == nil
|
|
||||||
})
|
|
||||||
|
|
||||||
_ = v.RegisterValidation("name_valid", func(fl validator.FieldLevel) bool {
|
|
||||||
isvalid := functions.NameInNodeCharSet(node.Name)
|
|
||||||
return isvalid
|
|
||||||
})
|
|
||||||
|
|
||||||
_ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
|
_ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
|
||||||
_, err := node.GetNetwork()
|
_, err := node.GetNetwork()
|
||||||
return err == nil
|
return err == nil
|
||||||
})
|
})
|
||||||
_ = v.RegisterValidation("pubkey_check", func(fl validator.FieldLevel) bool {
|
|
||||||
notEmptyCheck := node.PublicKey != ""
|
|
||||||
isBase64 := functions.IsBase64(node.PublicKey)
|
|
||||||
return (notEmptyCheck && isBase64)
|
|
||||||
})
|
|
||||||
_ = v.RegisterValidation("password_check", func(fl validator.FieldLevel) bool {
|
|
||||||
notEmptyCheck := node.Password != ""
|
|
||||||
goodLength := len(node.Password) > 5
|
|
||||||
return (notEmptyCheck && goodLength)
|
|
||||||
})
|
|
||||||
|
|
||||||
err := v.Struct(node)
|
err := v.Struct(node)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -124,7 +78,7 @@ func ValidateNodeCreate(networkName string, node models.Node) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func ValidateNodeUpdate(networkName string, node models.Node) error {
|
func ValidateNodeUpdate(networkName string, node models.NodeUpdate) error {
|
||||||
|
|
||||||
v := validator.New()
|
v := validator.New()
|
||||||
_ = v.RegisterValidation("address_check", func(fl validator.FieldLevel) bool {
|
_ = v.RegisterValidation("address_check", func(fl validator.FieldLevel) bool {
|
||||||
@@ -188,7 +142,7 @@ func ValidateNodeUpdate(networkName string, node models.Node) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func UpdateNode(nodechange models.Node, node models.Node) (models.Node, error) {
|
func UpdateNode(nodechange models.NodeUpdate, node models.Node) (models.Node, error) {
|
||||||
//Question: Is there a better way of doing this than a bunch of "if" statements? probably...
|
//Question: Is there a better way of doing this than a bunch of "if" statements? probably...
|
||||||
//Eventually, lets have a better way to check if any of the fields are filled out...
|
//Eventually, lets have a better way to check if any of the fields are filled out...
|
||||||
queryMac := node.MacAddress
|
queryMac := node.MacAddress
|
||||||
|
@@ -13,6 +13,12 @@ type NodeValidationTC struct {
|
|||||||
errorMessage string
|
errorMessage string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NodeValidationUpdateTC struct {
|
||||||
|
testname string
|
||||||
|
node models.NodeUpdate
|
||||||
|
errorMessage string
|
||||||
|
}
|
||||||
|
|
||||||
func TestCreateNode(t *testing.T) {
|
func TestCreateNode(t *testing.T) {
|
||||||
}
|
}
|
||||||
func TestDeleteNode(t *testing.T) {
|
func TestDeleteNode(t *testing.T) {
|
||||||
@@ -43,28 +49,28 @@ func TestValidateNodeCreate(t *testing.T) {
|
|||||||
node: models.Node{
|
node: models.Node{
|
||||||
Address: "256.0.0.1",
|
Address: "256.0.0.1",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'Address' failed on the 'address_check' tag",
|
errorMessage: "Field validation for 'Address' failed on the 'ipv4' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "BadAddress6",
|
testname: "BadAddress6",
|
||||||
node: models.Node{
|
node: models.Node{
|
||||||
Address6: "2607::abcd:efgh::1",
|
Address6: "2607::abcd:efgh::1",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'Address6' failed on the 'address6_check' tag",
|
errorMessage: "Field validation for 'Address6' failed on the 'ipv6' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "BadLocalAddress",
|
testname: "BadLocalAddress",
|
||||||
node: models.Node{
|
node: models.Node{
|
||||||
LocalAddress: "10.0.200.300",
|
LocalAddress: "10.0.200.300",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'LocalAddress' failed on the 'localaddress_check' tag",
|
errorMessage: "Field validation for 'LocalAddress' failed on the 'ip' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "InvalidName",
|
testname: "InvalidName",
|
||||||
node: models.Node{
|
node: models.Node{
|
||||||
Name: "mynode*",
|
Name: "mynode*",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'Name' failed on the 'name_valid' tag",
|
errorMessage: "Field validation for 'Name' failed on the 'alphanum' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "NameTooLong",
|
testname: "NameTooLong",
|
||||||
@@ -88,18 +94,32 @@ func TestValidateNodeCreate(t *testing.T) {
|
|||||||
errorMessage: "Field validation for 'ListenPort' failed on the 'max' tag",
|
errorMessage: "Field validation for 'ListenPort' failed on the 'max' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "PublicKeyInvalid",
|
testname: "PublicKeyEmpty",
|
||||||
node: models.Node{
|
node: models.Node{
|
||||||
PublicKey: "",
|
PublicKey: "",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'PublicKey' failed on the 'pubkey_check' tag",
|
errorMessage: "Field validation for 'PublicKey' failed on the 'required' tag",
|
||||||
|
},
|
||||||
|
NodeValidationTC{
|
||||||
|
testname: "PublicKeyInvalid",
|
||||||
|
node: models.Node{
|
||||||
|
PublicKey: "junk%key",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'PublicKey' failed on the 'base64' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "EndpointInvalid",
|
testname: "EndpointInvalid",
|
||||||
node: models.Node{
|
node: models.Node{
|
||||||
Endpoint: "10.2.0.300",
|
Endpoint: "10.2.0.300",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'Endpoint' failed on the 'endpoint_check' tag",
|
errorMessage: "Field validation for 'Endpoint' failed on the 'ip' tag",
|
||||||
|
},
|
||||||
|
NodeValidationTC{
|
||||||
|
testname: "EndpointEmpty",
|
||||||
|
node: models.Node{
|
||||||
|
Endpoint: "",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'Endpoint' failed on the 'required' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "PersistentKeepaliveMax",
|
testname: "PersistentKeepaliveMax",
|
||||||
@@ -113,7 +133,7 @@ func TestValidateNodeCreate(t *testing.T) {
|
|||||||
node: models.Node{
|
node: models.Node{
|
||||||
MacAddress: "01:02:03:04:05",
|
MacAddress: "01:02:03:04:05",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'MacAddress' failed on the 'macaddress_valid' tag",
|
errorMessage: "Field validation for 'MacAddress' failed on the 'mac' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "MacAddressMissing",
|
testname: "MacAddressMissing",
|
||||||
@@ -127,14 +147,14 @@ func TestValidateNodeCreate(t *testing.T) {
|
|||||||
node: models.Node{
|
node: models.Node{
|
||||||
Password: "",
|
Password: "",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'Password' failed on the 'password_check' tag",
|
errorMessage: "Field validation for 'Password' failed on the 'required' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "ShortPassword",
|
testname: "ShortPassword",
|
||||||
node: models.Node{
|
node: models.Node{
|
||||||
Password: "1234",
|
Password: "1234",
|
||||||
},
|
},
|
||||||
errorMessage: "Field validation for 'Password' failed on the 'password_check' tag",
|
errorMessage: "Field validation for 'Password' failed on the 'min' tag",
|
||||||
},
|
},
|
||||||
NodeValidationTC{
|
NodeValidationTC{
|
||||||
testname: "NoNetwork",
|
testname: "NoNetwork",
|
||||||
@@ -170,18 +190,119 @@ func TestValidateNodeCreate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
func TestValidateNodeUpdate(t *testing.T) {
|
func TestValidateNodeUpdate(t *testing.T) {
|
||||||
//cases
|
//cases
|
||||||
t.Run("BlankAddress", func(t *testing.T) {
|
cases := []NodeValidationUpdateTC{
|
||||||
})
|
NodeValidationUpdateTC{
|
||||||
t.Run("BlankAddress6", func(t *testing.T) {
|
testname: "BadAddress",
|
||||||
})
|
node: models.NodeUpdate{
|
||||||
t.Run("Blank", func(t *testing.T) {
|
Address: "256.0.0.1",
|
||||||
})
|
},
|
||||||
|
errorMessage: "Field validation for 'Address' failed on the 'address_check' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "BadAddress6",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
Address6: "2607::abcd:efgh::1",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'Address6' failed on the 'address6_check' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "BadLocalAddress",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
LocalAddress: "10.0.200.300",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'LocalAddress' failed on the 'localaddress_check' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "InvalidName",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
Name: "mynode*",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'Name' failed on the 'name_valid' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "NameTooLong",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
Name: "mynodexmynode",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'Name' failed on the 'max' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "ListenPortMin",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
ListenPort: 1023,
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'ListenPort' failed on the 'min' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "ListenPortMax",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
ListenPort: 65536,
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'ListenPort' failed on the 'max' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "PublicKeyInvalid",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
PublicKey: "",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'PublicKey' failed on the 'pubkey_check' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "EndpointInvalid",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
Endpoint: "10.2.0.300",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'Endpoint' failed on the 'endpoint_check' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "PersistentKeepaliveMax",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
PersistentKeepalive: 1001,
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'PersistentKeepalive' failed on the 'max' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "MacAddressInvalid",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
MacAddress: "01:02:03:04:05",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'MacAddress' failed on the 'macaddress_valid' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "MacAddressMissing",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
MacAddress: "",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'MacAddress' failed on the 'required' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "EmptyPassword",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
Password: "",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'Password' failed on the 'password_check' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "ShortPassword",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
Password: "1234",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'Password' failed on the 'password_check' tag",
|
||||||
|
},
|
||||||
|
NodeValidationUpdateTC{
|
||||||
|
testname: "NoNetwork",
|
||||||
|
node: models.NodeUpdate{
|
||||||
|
Network: "badnet",
|
||||||
|
},
|
||||||
|
errorMessage: "Field validation for 'Network' failed on the 'network_exists' tag",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range cases {
|
||||||
|
t.Run(tc.testname, func(t *testing.T) {
|
||||||
|
err := ValidateNodeUpdate("skynet", tc.node)
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
assert.Contains(t, err.Error(), tc.errorMessage)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// for _, tc := range cases {
|
|
||||||
// t.Run(tc.testname, func(t *testing.T) {
|
|
||||||
// err := ValidateNodeUpdate(tc.node)
|
|
||||||
// assert.NotNil(t, err)
|
|
||||||
// assert.Contains(t, err.Error(), tc.errorMessage)
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/gravitl/netmaker/functions"
|
||||||
nodepb "github.com/gravitl/netmaker/grpc"
|
nodepb "github.com/gravitl/netmaker/grpc"
|
||||||
"github.com/gravitl/netmaker/models"
|
"github.com/gravitl/netmaker/models"
|
||||||
"github.com/gravitl/netmaker/functions"
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
@@ -15,12 +16,12 @@ import (
|
|||||||
type NodeServiceServer struct {
|
type NodeServiceServer struct {
|
||||||
NodeDB *mongo.Collection
|
NodeDB *mongo.Collection
|
||||||
nodepb.UnimplementedNodeServiceServer
|
nodepb.UnimplementedNodeServiceServer
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.ReadNodeReq) (*nodepb.ReadNodeRes, error) {
|
func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.ReadNodeReq) (*nodepb.ReadNodeRes, error) {
|
||||||
// convert string id (from proto) to mongoDB ObjectId
|
// convert string id (from proto) to mongoDB ObjectId
|
||||||
macaddress := req.GetMacaddress()
|
macaddress := req.GetMacaddress()
|
||||||
networkName := req.GetNetwork()
|
networkName := req.GetNetwork()
|
||||||
network, _ := functions.GetParentNetwork(networkName)
|
network, _ := functions.GetParentNetwork(networkName)
|
||||||
|
|
||||||
node, err := GetNode(macaddress, networkName)
|
node, err := GetNode(macaddress, networkName)
|
||||||
@@ -30,31 +31,30 @@ func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.ReadNodeRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if node == nil {
|
if node == nil {
|
||||||
return nil, status.Errorf(codes.NotFound, fmt.Sprintf("Could not find node with Mac Address %s: %v", req.GetMacaddress(), err))
|
return nil, status.Errorf(codes.NotFound, fmt.Sprintf("Could not find node with Mac Address %s: %v", req.GetMacaddress(), err))
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
// Cast to ReadNodeRes type
|
// Cast to ReadNodeRes type
|
||||||
response := &nodepb.ReadNodeRes{
|
response := &nodepb.ReadNodeRes{
|
||||||
Node: &nodepb.Node{
|
Node: &nodepb.Node{
|
||||||
Macaddress: node.MacAddress,
|
Macaddress: node.MacAddress,
|
||||||
Name: node.Name,
|
Name: node.Name,
|
||||||
Address: node.Address,
|
Address: node.Address,
|
||||||
Endpoint: node.Endpoint,
|
Endpoint: node.Endpoint,
|
||||||
Password: node.Password,
|
Password: node.Password,
|
||||||
Nodenetwork: node.Network,
|
Nodenetwork: node.Network,
|
||||||
Interface: node.Interface,
|
Interface: node.Interface,
|
||||||
Localaddress: node.LocalAddress,
|
Localaddress: node.LocalAddress,
|
||||||
Postdown: node.PostDown,
|
Postdown: node.PostDown,
|
||||||
Postup: node.PostUp,
|
Postup: node.PostUp,
|
||||||
Checkininterval: node.CheckInInterval,
|
Checkininterval: node.CheckInInterval,
|
||||||
Ispending: node.IsPending,
|
Ispending: node.IsPending,
|
||||||
Publickey: node.PublicKey,
|
Publickey: node.PublicKey,
|
||||||
Listenport: node.ListenPort,
|
Listenport: node.ListenPort,
|
||||||
Keepalive: node.PersistentKeepalive,
|
Keepalive: node.PersistentKeepalive,
|
||||||
Islocal: *network.IsLocal,
|
Islocal: *network.IsLocal,
|
||||||
Localrange: network.LocalRange,
|
Localrange: network.LocalRange,
|
||||||
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return response, nil
|
return response, nil
|
||||||
@@ -67,54 +67,52 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.CreateNo
|
|||||||
// Now we have to convert this into a NodeItem type to convert into BSON
|
// Now we have to convert this into a NodeItem type to convert into BSON
|
||||||
node := models.Node{
|
node := models.Node{
|
||||||
// ID: primitive.NilObjectID,
|
// ID: primitive.NilObjectID,
|
||||||
MacAddress: data.GetMacaddress(),
|
MacAddress: data.GetMacaddress(),
|
||||||
LocalAddress: data.GetLocaladdress(),
|
LocalAddress: data.GetLocaladdress(),
|
||||||
Name: data.GetName(),
|
Name: data.GetName(),
|
||||||
Address: data.GetAddress(),
|
Address: data.GetAddress(),
|
||||||
AccessKey: data.GetAccesskey(),
|
AccessKey: data.GetAccesskey(),
|
||||||
Endpoint: data.GetEndpoint(),
|
Endpoint: data.GetEndpoint(),
|
||||||
PersistentKeepalive: data.GetKeepalive(),
|
PersistentKeepalive: data.GetKeepalive(),
|
||||||
Password: data.GetPassword(),
|
Password: data.GetPassword(),
|
||||||
Interface: data.GetInterface(),
|
Interface: data.GetInterface(),
|
||||||
Network: data.GetNodenetwork(),
|
Network: data.GetNodenetwork(),
|
||||||
IsPending: data.GetIspending(),
|
IsPending: data.GetIspending(),
|
||||||
PublicKey: data.GetPublickey(),
|
PublicKey: data.GetPublickey(),
|
||||||
ListenPort: data.GetListenport(),
|
ListenPort: data.GetListenport(),
|
||||||
}
|
}
|
||||||
|
|
||||||
err := ValidateNodeCreate(node.Network, node)
|
err := ValidateNodeCreate(node.Network, node)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// return internal gRPC error to be handled later
|
// return internal gRPC error to be handled later
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check to see if key is valid
|
//Check to see if key is valid
|
||||||
//TODO: Triple inefficient!!! This is the third call to the DB we make for networks
|
//TODO: Triple inefficient!!! This is the third call to the DB we make for networks
|
||||||
validKey := functions.IsKeyValid(node.Network, node.AccessKey)
|
validKey := functions.IsKeyValid(node.Network, node.AccessKey)
|
||||||
network, err := functions.GetParentNetwork(node.Network)
|
network, err := functions.GetParentNetwork(node.Network)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, status.Errorf(codes.NotFound, fmt.Sprintf("Could not find network: %v", err))
|
return nil, status.Errorf(codes.NotFound, fmt.Sprintf("Could not find network: %v", err))
|
||||||
} else {
|
} else {
|
||||||
fmt.Println("Creating node in network " + network.NetID)
|
fmt.Println("Creating node in network " + network.NetID)
|
||||||
fmt.Println("Network is local? " + strconv.FormatBool(*network.IsLocal))
|
fmt.Println("Network is local? " + strconv.FormatBool(*network.IsLocal))
|
||||||
fmt.Println("Range if local: " + network.LocalRange)
|
fmt.Println("Range if local: " + network.LocalRange)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !validKey {
|
||||||
|
//Check to see if network will allow manual sign up
|
||||||
if !validKey {
|
//may want to switch this up with the valid key check and avoid a DB call that way.
|
||||||
//Check to see if network will allow manual sign up
|
if *network.AllowManualSignUp {
|
||||||
//may want to switch this up with the valid key check and avoid a DB call that way.
|
node.IsPending = true
|
||||||
if *network.AllowManualSignUp {
|
} else {
|
||||||
node.IsPending = true
|
return nil, status.Errorf(
|
||||||
} else {
|
codes.Internal,
|
||||||
return nil, status.Errorf(
|
|
||||||
codes.Internal,
|
|
||||||
fmt.Sprintf("Invalid key, and network does not allow no-key signups"),
|
fmt.Sprintf("Invalid key, and network does not allow no-key signups"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
node, err = CreateNode(node, node.Network)
|
node, err = CreateNode(node, node.Network)
|
||||||
|
|
||||||
@@ -128,118 +126,114 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.CreateNo
|
|||||||
// return the node in a CreateNodeRes type
|
// return the node in a CreateNodeRes type
|
||||||
response := &nodepb.CreateNodeRes{
|
response := &nodepb.CreateNodeRes{
|
||||||
Node: &nodepb.Node{
|
Node: &nodepb.Node{
|
||||||
Macaddress: node.MacAddress,
|
Macaddress: node.MacAddress,
|
||||||
Localaddress: node.LocalAddress,
|
Localaddress: node.LocalAddress,
|
||||||
Name: node.Name,
|
Name: node.Name,
|
||||||
Address: node.Address,
|
Address: node.Address,
|
||||||
Endpoint: node.Endpoint,
|
Endpoint: node.Endpoint,
|
||||||
Password: node.Password,
|
Password: node.Password,
|
||||||
Interface: node.Interface,
|
Interface: node.Interface,
|
||||||
Nodenetwork: node.Network,
|
Nodenetwork: node.Network,
|
||||||
Ispending: node.IsPending,
|
Ispending: node.IsPending,
|
||||||
Publickey: node.PublicKey,
|
Publickey: node.PublicKey,
|
||||||
Listenport: node.ListenPort,
|
Listenport: node.ListenPort,
|
||||||
Keepalive: node.PersistentKeepalive,
|
Keepalive: node.PersistentKeepalive,
|
||||||
Islocal: *network.IsLocal,
|
Islocal: *network.IsLocal,
|
||||||
Localrange: network.LocalRange,
|
Localrange: network.LocalRange,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
err = SetNetworkNodesLastModified(node.Network)
|
err = SetNetworkNodesLastModified(node.Network)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, status.Errorf(codes.NotFound, fmt.Sprintf("Could not update network last modified date: %v", err))
|
return nil, status.Errorf(codes.NotFound, fmt.Sprintf("Could not update network last modified date: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
return response, nil
|
return response, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *NodeServiceServer) CheckIn(ctx context.Context, req *nodepb.CheckInReq) (*nodepb.CheckInRes, error) {
|
func (s *NodeServiceServer) CheckIn(ctx context.Context, req *nodepb.CheckInReq) (*nodepb.CheckInRes, error) {
|
||||||
// Get the protobuf node type from the protobuf request type
|
// Get the protobuf node type from the protobuf request type
|
||||||
// Essentially doing req.Node to access the struct with a nil check
|
// Essentially doing req.Node to access the struct with a nil check
|
||||||
data := req.GetNode()
|
data := req.GetNode()
|
||||||
//postchanges := req.GetPostchanges()
|
//postchanges := req.GetPostchanges()
|
||||||
// Now we have to convert this into a NodeItem type to convert into BSON
|
// Now we have to convert this into a NodeItem type to convert into BSON
|
||||||
node := models.Node{
|
node := models.Node{
|
||||||
// ID: primitive.NilObjectID,
|
// ID: primitive.NilObjectID,
|
||||||
MacAddress: data.GetMacaddress(),
|
MacAddress: data.GetMacaddress(),
|
||||||
Address: data.GetAddress(),
|
Address: data.GetAddress(),
|
||||||
Endpoint: data.GetEndpoint(),
|
Endpoint: data.GetEndpoint(),
|
||||||
Network: data.GetNodenetwork(),
|
Network: data.GetNodenetwork(),
|
||||||
Password: data.GetPassword(),
|
Password: data.GetPassword(),
|
||||||
LocalAddress: data.GetLocaladdress(),
|
LocalAddress: data.GetLocaladdress(),
|
||||||
ListenPort: data.GetListenport(),
|
ListenPort: data.GetListenport(),
|
||||||
PersistentKeepalive: data.GetKeepalive(),
|
PersistentKeepalive: data.GetKeepalive(),
|
||||||
PublicKey: data.GetPublickey(),
|
PublicKey: data.GetPublickey(),
|
||||||
}
|
}
|
||||||
|
|
||||||
checkinresponse, err := NodeCheckIn(node, node.Network)
|
checkinresponse, err := NodeCheckIn(node, node.Network)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// return internal gRPC error to be handled later
|
// return internal gRPC error to be handled later
|
||||||
if checkinresponse == (models.CheckInResponse{}) || !checkinresponse.IsPending {
|
if checkinresponse == (models.CheckInResponse{}) || !checkinresponse.IsPending {
|
||||||
return nil, status.Errorf(
|
return nil, status.Errorf(
|
||||||
codes.Internal,
|
codes.Internal,
|
||||||
fmt.Sprintf("Internal error: %v", err),
|
fmt.Sprintf("Internal error: %v", err),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// return the node in a CreateNodeRes type
|
// return the node in a CreateNodeRes type
|
||||||
response := &nodepb.CheckInRes{
|
response := &nodepb.CheckInRes{
|
||||||
Checkinresponse: &nodepb.CheckInResponse{
|
Checkinresponse: &nodepb.CheckInResponse{
|
||||||
Success: checkinresponse.Success,
|
Success: checkinresponse.Success,
|
||||||
Needpeerupdate: checkinresponse.NeedPeerUpdate,
|
Needpeerupdate: checkinresponse.NeedPeerUpdate,
|
||||||
Needdelete: checkinresponse.NeedDelete,
|
Needdelete: checkinresponse.NeedDelete,
|
||||||
Needconfigupdate: checkinresponse.NeedConfigUpdate,
|
Needconfigupdate: checkinresponse.NeedConfigUpdate,
|
||||||
Needkeyupdate: checkinresponse.NeedKeyUpdate,
|
Needkeyupdate: checkinresponse.NeedKeyUpdate,
|
||||||
Nodemessage: checkinresponse.NodeMessage,
|
Nodemessage: checkinresponse.NodeMessage,
|
||||||
Ispending: checkinresponse.IsPending,
|
Ispending: checkinresponse.IsPending,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return response, nil
|
return response, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.UpdateNodeReq) (*nodepb.UpdateNodeRes, error) {
|
func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.UpdateNodeReq) (*nodepb.UpdateNodeRes, error) {
|
||||||
// Get the node data from the request
|
// Get the node data from the request
|
||||||
data := req.GetNode()
|
data := req.GetNode()
|
||||||
// Now we have to convert this into a NodeItem type to convert into BSON
|
// Now we have to convert this into a NodeItem type to convert into BSON
|
||||||
nodechange := models.Node{
|
nodechange := models.NodeUpdate{
|
||||||
// ID: primitive.NilObjectID,
|
// ID: primitive.NilObjectID,
|
||||||
MacAddress: data.GetMacaddress(),
|
MacAddress: data.GetMacaddress(),
|
||||||
Name: data.GetName(),
|
Name: data.GetName(),
|
||||||
Address: data.GetAddress(),
|
Address: data.GetAddress(),
|
||||||
LocalAddress: data.GetLocaladdress(),
|
LocalAddress: data.GetLocaladdress(),
|
||||||
Endpoint: data.GetEndpoint(),
|
Endpoint: data.GetEndpoint(),
|
||||||
Password: data.GetPassword(),
|
Password: data.GetPassword(),
|
||||||
PersistentKeepalive: data.GetKeepalive(),
|
PersistentKeepalive: data.GetKeepalive(),
|
||||||
Network: data.GetNodenetwork(),
|
Network: data.GetNodenetwork(),
|
||||||
Interface: data.GetInterface(),
|
Interface: data.GetInterface(),
|
||||||
PostDown: data.GetPostdown(),
|
PostDown: data.GetPostdown(),
|
||||||
PostUp: data.GetPostup(),
|
PostUp: data.GetPostup(),
|
||||||
IsPending: data.GetIspending(),
|
IsPending: data.GetIspending(),
|
||||||
PublicKey: data.GetPublickey(),
|
PublicKey: data.GetPublickey(),
|
||||||
ListenPort: data.GetListenport(),
|
ListenPort: data.GetListenport(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Convert the Id string to a MongoDB ObjectId
|
// Convert the Id string to a MongoDB ObjectId
|
||||||
macaddress := nodechange.MacAddress
|
macaddress := nodechange.MacAddress
|
||||||
networkName := nodechange.Network
|
networkName := nodechange.Network
|
||||||
network, _ := functions.GetParentNetwork(networkName)
|
network, _ := functions.GetParentNetwork(networkName)
|
||||||
|
|
||||||
|
|
||||||
err := ValidateNodeUpdate(networkName, nodechange)
|
err := ValidateNodeUpdate(networkName, nodechange)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
|
||||||
|
|
||||||
node, err := functions.GetNodeByMacAddress(networkName, macaddress)
|
|
||||||
if err != nil {
|
|
||||||
return nil, status.Errorf(
|
|
||||||
codes.NotFound,
|
|
||||||
fmt.Sprintf("Could not find node with supplied Mac Address: %v", err),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node, err := functions.GetNodeByMacAddress(networkName, macaddress)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Errorf(
|
||||||
|
codes.NotFound,
|
||||||
|
fmt.Sprintf("Could not find node with supplied Mac Address: %v", err),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
newnode, err := UpdateNode(nodechange, node)
|
newnode, err := UpdateNode(nodechange, node)
|
||||||
|
|
||||||
@@ -251,23 +245,22 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.UpdateNo
|
|||||||
}
|
}
|
||||||
return &nodepb.UpdateNodeRes{
|
return &nodepb.UpdateNodeRes{
|
||||||
Node: &nodepb.Node{
|
Node: &nodepb.Node{
|
||||||
Macaddress: newnode.MacAddress,
|
Macaddress: newnode.MacAddress,
|
||||||
Localaddress: newnode.LocalAddress,
|
Localaddress: newnode.LocalAddress,
|
||||||
Name: newnode.Name,
|
Name: newnode.Name,
|
||||||
Address: newnode.Address,
|
Address: newnode.Address,
|
||||||
Endpoint: newnode.Endpoint,
|
Endpoint: newnode.Endpoint,
|
||||||
Password: newnode.Password,
|
Password: newnode.Password,
|
||||||
Interface: newnode.Interface,
|
Interface: newnode.Interface,
|
||||||
Postdown: newnode.PostDown,
|
Postdown: newnode.PostDown,
|
||||||
Postup: newnode.PostUp,
|
Postup: newnode.PostUp,
|
||||||
Nodenetwork: newnode.Network,
|
Nodenetwork: newnode.Network,
|
||||||
Ispending: newnode.IsPending,
|
Ispending: newnode.IsPending,
|
||||||
Publickey: newnode.PublicKey,
|
Publickey: newnode.PublicKey,
|
||||||
Listenport: newnode.ListenPort,
|
Listenport: newnode.ListenPort,
|
||||||
Keepalive: newnode.PersistentKeepalive,
|
Keepalive: newnode.PersistentKeepalive,
|
||||||
Islocal: *network.IsLocal,
|
Islocal: *network.IsLocal,
|
||||||
Localrange: network.LocalRange,
|
Localrange: network.LocalRange,
|
||||||
|
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@@ -287,12 +280,11 @@ func (s *NodeServiceServer) DeleteNode(ctx context.Context, req *nodepb.DeleteNo
|
|||||||
|
|
||||||
fmt.Println("updating network last modified of " + req.GetNetworkName())
|
fmt.Println("updating network last modified of " + req.GetNetworkName())
|
||||||
err = SetNetworkNodesLastModified(req.GetNetworkName())
|
err = SetNetworkNodesLastModified(req.GetNetworkName())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error updating Network")
|
fmt.Println("Error updating Network")
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return nil, status.Errorf(codes.NotFound, fmt.Sprintf("Could not update network last modified date: %v", err))
|
return nil, status.Errorf(codes.NotFound, fmt.Sprintf("Could not update network last modified date: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return &nodepb.DeleteNodeRes{
|
return &nodepb.DeleteNodeRes{
|
||||||
Success: true,
|
Success: true,
|
||||||
@@ -310,34 +302,32 @@ func (s *NodeServiceServer) GetPeers(req *nodepb.GetPeersReq, stream nodepb.Node
|
|||||||
return status.Errorf(codes.Internal, fmt.Sprintf("Unknown internal error: %v", err))
|
return status.Errorf(codes.Internal, fmt.Sprintf("Unknown internal error: %v", err))
|
||||||
}
|
}
|
||||||
// cursor.Next() returns a boolean, if false there are no more items and loop will break
|
// cursor.Next() returns a boolean, if false there are no more items and loop will break
|
||||||
for i := 0; i < len(peers); i++ {
|
for i := 0; i < len(peers); i++ {
|
||||||
|
|
||||||
// If no error is found send node over stream
|
// If no error is found send node over stream
|
||||||
stream.Send(&nodepb.GetPeersRes{
|
stream.Send(&nodepb.GetPeersRes{
|
||||||
Peers: &nodepb.PeersResponse{
|
Peers: &nodepb.PeersResponse{
|
||||||
Address: peers[i].Address,
|
Address: peers[i].Address,
|
||||||
Endpoint: peers[i].Endpoint,
|
Endpoint: peers[i].Endpoint,
|
||||||
Gatewayrange: peers[i].GatewayRange,
|
Gatewayrange: peers[i].GatewayRange,
|
||||||
Isgateway: peers[i].IsGateway,
|
Isgateway: peers[i].IsGateway,
|
||||||
Publickey: peers[i].PublicKey,
|
Publickey: peers[i].PublicKey,
|
||||||
Keepalive: peers[i].KeepAlive,
|
Keepalive: peers[i].KeepAlive,
|
||||||
Listenport: peers[i].ListenPort,
|
Listenport: peers[i].ListenPort,
|
||||||
Localaddress: peers[i].LocalAddress,
|
Localaddress: peers[i].LocalAddress,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
node, err := functions.GetNodeByMacAddress(req.GetNetwork(), req.GetMacaddress())
|
node, err := functions.GetNodeByMacAddress(req.GetNetwork(), req.GetMacaddress())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return status.Errorf(codes.Internal, fmt.Sprintf("Could not get node: %v", err))
|
return status.Errorf(codes.Internal, fmt.Sprintf("Could not get node: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
err = TimestampNode(node, false, true, false)
|
err = TimestampNode(node, false, true, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return status.Errorf(codes.Internal, fmt.Sprintf("Internal error occurred: %v", err))
|
return status.Errorf(codes.Internal, fmt.Sprintf("Internal error occurred: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@@ -689,7 +689,7 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var nodechange models.Node
|
var nodechange models.NodeUpdate
|
||||||
|
|
||||||
// we decode our body request params
|
// we decode our body request params
|
||||||
_ = json.NewDecoder(r.Body).Decode(&nodechange)
|
_ = json.NewDecoder(r.Body).Decode(&nodechange)
|
||||||
|
@@ -18,6 +18,38 @@ var seededRand *rand.Rand = rand.New(
|
|||||||
|
|
||||||
//node struct
|
//node struct
|
||||||
type Node struct {
|
type Node struct {
|
||||||
|
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
|
||||||
|
Address string `json:"address" bson:"address" validate:"omitempty,ipv4"`
|
||||||
|
Address6 string `json:"address6" bson:"address6" validate:"omitempty,ipv6"`
|
||||||
|
LocalAddress string `json:"localaddress" bson:"localaddress" validate:"omitempty,ip"`
|
||||||
|
Name string `json:"name" bson:"name" validate:"omitempty,alphanum,max=12"`
|
||||||
|
ListenPort int32 `json:"listenport" bson:"listenport" validate:"omitempty,numeric,min=1024,max=65535"`
|
||||||
|
PublicKey string `json:"publickey" bson:"publickey" validate:"required,base64"`
|
||||||
|
Endpoint string `json:"endpoint" bson:"endpoint" validate:"required,ip"`
|
||||||
|
PostUp string `json:"postup" bson:"postup"`
|
||||||
|
PostDown string `json:"postdown" bson:"postdown"`
|
||||||
|
AllowedIPs string `json:"allowedips" bson:"allowedips"`
|
||||||
|
PersistentKeepalive int32 `json:"persistentkeepalive" bson:"persistentkeepalive" validate:"omitempty,numeric,max=1000"`
|
||||||
|
SaveConfig *bool `json:"saveconfig" bson:"saveconfig"`
|
||||||
|
AccessKey string `json:"accesskey" bson:"accesskey"`
|
||||||
|
Interface string `json:"interface" bson:"interface"`
|
||||||
|
LastModified int64 `json:"lastmodified" bson:"lastmodified"`
|
||||||
|
KeyUpdateTimeStamp int64 `json:"keyupdatetimestamp" bson:"keyupdatetimestamp"`
|
||||||
|
ExpirationDateTime int64 `json:"expdatetime" bson:"expdatetime"`
|
||||||
|
LastPeerUpdate int64 `json:"lastpeerupdate" bson:"lastpeerupdate"`
|
||||||
|
LastCheckIn int64 `json:"lastcheckin" bson:"lastcheckin"`
|
||||||
|
MacAddress string `json:"macaddress" bson:"macaddress" validate:"required,mac,macaddress_unique"`
|
||||||
|
CheckInInterval int32 `json:"checkininterval" bson:"checkininterval"`
|
||||||
|
Password string `json:"password" bson:"password" validate:"required,min=6"`
|
||||||
|
Network string `json:"network" bson:"network" validate:"network_exists"`
|
||||||
|
IsPending bool `json:"ispending" bson:"ispending"`
|
||||||
|
IsGateway bool `json:"isgateway" bson:"isgateway"`
|
||||||
|
GatewayRange string `json:"gatewayrange" bson:"gatewayrange"`
|
||||||
|
PostChanges string `json:"postchanges" bson:"postchanges"`
|
||||||
|
}
|
||||||
|
|
||||||
|
//node update struct --- only validations are different
|
||||||
|
type NodeUpdate struct {
|
||||||
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
|
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
|
||||||
Address string `json:"address" bson:"address" validate:"address_check"`
|
Address string `json:"address" bson:"address" validate:"address_check"`
|
||||||
Address6 string `json:"address6" bson:"address6" validate:"address6_check"`
|
Address6 string `json:"address6" bson:"address6" validate:"address6_check"`
|
||||||
@@ -48,6 +80,29 @@ type Node struct {
|
|||||||
PostChanges string `json:"postchanges" bson:"postchanges"`
|
PostChanges string `json:"postchanges" bson:"postchanges"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Duplicated function for NodeUpdates
|
||||||
|
func (node *NodeUpdate) GetNetwork() (Network, error) {
|
||||||
|
|
||||||
|
var network Network
|
||||||
|
|
||||||
|
collection := mongoconn.NetworkDB
|
||||||
|
//collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
||||||
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
|
||||||
|
filter := bson.M{"netid": node.Network}
|
||||||
|
err := collection.FindOne(ctx, filter).Decode(&network)
|
||||||
|
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
//log.Fatal(err)
|
||||||
|
return network, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return network, err
|
||||||
|
}
|
||||||
|
|
||||||
//TODO: Contains a fatal error return. Need to change
|
//TODO: Contains a fatal error return. Need to change
|
||||||
//Used in contexts where it's not the Parent network.
|
//Used in contexts where it's not the Parent network.
|
||||||
func (node *Node) GetNetwork() (Network, error) {
|
func (node *Node) GetNetwork() (Network, error) {
|
||||||
|
Reference in New Issue
Block a user