mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-10 11:12:25 +08:00
Network update validation tests
This commit is contained in:
@@ -112,31 +112,30 @@ func getNetworks(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ValidateNetworkUpdate(network models.Network) error {
|
func ValidateNetworkUpdate(network models.NetworkUpdate) error {
|
||||||
|
|
||||||
v := validator.New()
|
v := validator.New()
|
||||||
|
|
||||||
_ = v.RegisterValidation("addressrange_valid", func(fl validator.FieldLevel) bool {
|
// _ = v.RegisterValidation("addressrange_valid", func(fl validator.FieldLevel) bool {
|
||||||
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||||
return isvalid
|
// return isvalid
|
||||||
})
|
// })
|
||||||
_ = v.RegisterValidation("addressrange6_valid", func(fl validator.FieldLevel) bool {
|
//_ = v.RegisterValidation("addressrange6_valid", func(fl validator.FieldLevel) bool {
|
||||||
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||||
return isvalid
|
// return isvalid
|
||||||
})
|
// })
|
||||||
|
|
||||||
_ = v.RegisterValidation("localrange_valid", func(fl validator.FieldLevel) bool {
|
// _ = v.RegisterValidation("localrange_valid", func(fl validator.FieldLevel) bool {
|
||||||
isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
// isvalid := fl.Field().String() == "" || functions.IsIpCIDR(fl.Field().String())
|
||||||
return isvalid
|
// return isvalid
|
||||||
})
|
// })
|
||||||
|
|
||||||
_ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool {
|
// _ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool {
|
||||||
return true
|
// return true
|
||||||
})
|
// })
|
||||||
|
|
||||||
_ = v.RegisterValidation("displayname_unique", func(fl validator.FieldLevel) bool {
|
// _ = v.RegisterValidation("displayname_unique", func(fl validator.FieldLevel) bool {
|
||||||
return true
|
// return true
|
||||||
})
|
// })
|
||||||
|
|
||||||
err := v.Struct(network)
|
err := v.Struct(network)
|
||||||
|
|
||||||
@@ -309,14 +308,13 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var networkChange models.Network
|
var networkChange models.NetworkUpdate
|
||||||
|
|
||||||
haschange := false
|
haschange := false
|
||||||
hasrangeupdate := false
|
hasrangeupdate := false
|
||||||
haslocalrangeupdate := false
|
haslocalrangeupdate := false
|
||||||
|
|
||||||
_ = json.NewDecoder(r.Body).Decode(&networkChange)
|
_ = json.NewDecoder(r.Body).Decode(&networkChange)
|
||||||
|
|
||||||
if networkChange.AddressRange == "" {
|
if networkChange.AddressRange == "" {
|
||||||
networkChange.AddressRange = network.AddressRange
|
networkChange.AddressRange = network.AddressRange
|
||||||
}
|
}
|
||||||
|
@@ -237,6 +237,112 @@ func TestSecurityCheck(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
func TestValidateNetworkUpdate(t *testing.T) {
|
func TestValidateNetworkUpdate(t *testing.T) {
|
||||||
|
//yes := true
|
||||||
|
//no := false
|
||||||
|
deleteNet()
|
||||||
|
//DeleteNetworks
|
||||||
|
cases := []NetworkValidationTestCase{
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "InvalidAddress",
|
||||||
|
network: models.Network{
|
||||||
|
AddressRange: "10.0.0.256",
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'AddressRange' failed on the 'cidr' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "InvalidAddress6",
|
||||||
|
network: models.Network{
|
||||||
|
AddressRange6: "2607::ag",
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'AddressRange6' failed on the 'cidr' tag",
|
||||||
|
},
|
||||||
|
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "BadDisplayName",
|
||||||
|
network: models.Network{
|
||||||
|
DisplayName: "skynet*",
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'DisplayName' failed on the 'alphanum' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "DisplayNameTooLong",
|
||||||
|
network: models.Network{
|
||||||
|
DisplayName: "Thisisareallylongdisplaynamethatistoolong",
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'DisplayName' failed on the 'max' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "DisplayNameTooShort",
|
||||||
|
network: models.Network{
|
||||||
|
DisplayName: "1",
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'DisplayName' failed on the 'min' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "InvalidNetID",
|
||||||
|
network: models.Network{
|
||||||
|
NetID: "contains spaces",
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'NetID' failed on the 'alphanum' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "NetIDTooLong",
|
||||||
|
network: models.Network{
|
||||||
|
NetID: "LongNetIDName",
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'NetID' failed on the 'max' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "ListenPortTooLow",
|
||||||
|
network: models.Network{
|
||||||
|
DefaultListenPort: 1023,
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'DefaultListenPort' failed on the 'min' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "ListenPortTooHigh",
|
||||||
|
network: models.Network{
|
||||||
|
DefaultListenPort: 65536,
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'DefaultListenPort' failed on the 'max' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "KeepAliveTooBig",
|
||||||
|
network: models.Network{
|
||||||
|
DefaultKeepalive: 1010,
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'DefaultKeepalive' failed on the 'max' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "InvalidLocalRange",
|
||||||
|
network: models.Network{
|
||||||
|
LocalRange: "192.168.0.1",
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'LocalRange' failed on the 'cidr' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "CheckInIntervalTooBig",
|
||||||
|
network: models.Network{
|
||||||
|
DefaultCheckInInterval: 100001,
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'max' tag",
|
||||||
|
},
|
||||||
|
NetworkValidationTestCase{
|
||||||
|
testname: "CheckInIntervalTooSmall",
|
||||||
|
network: models.Network{
|
||||||
|
DefaultCheckInInterval: 1,
|
||||||
|
},
|
||||||
|
errMessage: "Field validation for 'DefaultCheckInInterval' failed on the 'min' tag",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range cases {
|
||||||
|
t.Run(tc.testname, func(t *testing.T) {
|
||||||
|
network := models.NetworkUpdate(tc.network)
|
||||||
|
err := ValidateNetworkUpdate(network)
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
assert.Contains(t, err.Error(), tc.errMessage)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func TestValidateNetworkCreate(t *testing.T) {
|
func TestValidateNetworkCreate(t *testing.T) {
|
||||||
yes := true
|
yes := true
|
||||||
|
@@ -35,6 +35,33 @@ type Network struct {
|
|||||||
//can't have min=1 with omitempty
|
//can't have min=1 with omitempty
|
||||||
DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"`
|
DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"`
|
||||||
}
|
}
|
||||||
|
type NetworkUpdate struct {
|
||||||
|
ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
|
||||||
|
AddressRange string `json:"addressrange" bson:"addressrange" validate:"omitempty,cidr"`
|
||||||
|
|
||||||
|
// bug in validator --- required_with does not work with bools issue#683
|
||||||
|
// AddressRange6 string `json:"addressrange6" bson:"addressrange6" validate:"required_with=isdualstack true,cidrv6"`
|
||||||
|
AddressRange6 string `json:"addressrange6" bson:"addressrange6" validate:"omitempty,cidr"`
|
||||||
|
//can't have min=1 with omitempty
|
||||||
|
DisplayName string `json:"displayname,omitempty" bson:"displayname,omitempty" validate:"omitempty,alphanum,min=2,max=20"`
|
||||||
|
NetID string `json:"netid" bson:"netid" validate:"alphanum,min=1,max=12"`
|
||||||
|
NodesLastModified int64 `json:"nodeslastmodified" bson:"nodeslastmodified"`
|
||||||
|
NetworkLastModified int64 `json:"networklastmodified" bson:"networklastmodified"`
|
||||||
|
DefaultInterface string `json:"defaultinterface" bson:"defaultinterface"`
|
||||||
|
DefaultListenPort int32 `json:"defaultlistenport,omitempty" bson:"defaultlistenport,omitempty" validate:"omitempty,min=1024,max=65535"`
|
||||||
|
DefaultPostUp string `json:"defaultpostup" bson:"defaultpostup"`
|
||||||
|
DefaultPostDown string `json:"defaultpostdown" bson:"defaultpostdown"`
|
||||||
|
KeyUpdateTimeStamp int64 `json:"keyupdatetimestamp" bson:"keyupdatetimestamp"`
|
||||||
|
DefaultKeepalive int32 `json:"defaultkeepalive" bson:"defaultkeepalive" validate:"omitempty,max=1000"`
|
||||||
|
DefaultSaveConfig *bool `json:"defaultsaveconfig" bson:"defaultsaveconfig"`
|
||||||
|
AccessKeys []AccessKey `json:"accesskeys" bson:"accesskeys"`
|
||||||
|
AllowManualSignUp *bool `json:"allowmanualsignup" bson:"allowmanualsignup"`
|
||||||
|
IsLocal *bool `json:"islocal" bson:"islocal"`
|
||||||
|
IsDualStack *bool `json:"isdualstack" bson:"isdualstack"`
|
||||||
|
LocalRange string `json:"localrange" bson:"localrange" validate:"omitempty,cidr"`
|
||||||
|
//can't have min=1 with omitempty
|
||||||
|
DefaultCheckInInterval int32 `json:"checkininterval,omitempty" bson:"checkininterval,omitempty" validate:"omitempty,numeric,min=2,max=100000"`
|
||||||
|
}
|
||||||
|
|
||||||
//TODO:
|
//TODO:
|
||||||
//Not sure if we need the below two functions. Got rid of one of the calls. May want to revisit
|
//Not sure if we need the below two functions. Got rid of one of the calls. May want to revisit
|
||||||
|
Reference in New Issue
Block a user