[management] Enforce peer or peer groups requirement for network routers (#5894)

This commit is contained in:
Bethuel Mmbaga
2026-04-16 13:12:19 +03:00
committed by GitHub
parent 95bc01e48f
commit 08f624507d
4 changed files with 65 additions and 20 deletions
@@ -105,6 +105,12 @@ func (h *routersHandler) createRouter(w http.ResponseWriter, r *http.Request) {
router.NetworkID = networkID router.NetworkID = networkID
router.AccountID = accountID router.AccountID = accountID
router.Enabled = true router.Enabled = true
if err := router.Validate(); err != nil {
util.WriteErrorResponse(err.Error(), http.StatusBadRequest, w)
return
}
router, err = h.routersManager.CreateRouter(r.Context(), userID, router) router, err = h.routersManager.CreateRouter(r.Context(), userID, router)
if err != nil { if err != nil {
util.WriteError(r.Context(), err, w) util.WriteError(r.Context(), err, w)
@@ -157,6 +163,11 @@ func (h *routersHandler) updateRouter(w http.ResponseWriter, r *http.Request) {
router.ID = mux.Vars(r)["routerId"] router.ID = mux.Vars(r)["routerId"]
router.AccountID = accountID router.AccountID = accountID
if err := router.Validate(); err != nil {
util.WriteErrorResponse(err.Error(), http.StatusBadRequest, w)
return
}
router, err = h.routersManager.UpdateRouter(r.Context(), userID, router) router, err = h.routersManager.UpdateRouter(r.Context(), userID, router)
if err != nil { if err != nil {
util.WriteError(r.Context(), err, w) util.WriteError(r.Context(), err, w)
@@ -1170,13 +1170,17 @@ func Test_NetworkRouters_Create(t *testing.T) {
Metric: 100, Metric: 100,
Enabled: true, Enabled: true,
}, },
expectedStatus: http.StatusOK, expectedStatus: http.StatusBadRequest,
verifyResponse: func(t *testing.T, router *api.NetworkRouter) { },
t.Helper() {
assert.NotEmpty(t, router.Id) name: "Create router without peer and peer_groups",
assert.Equal(t, peerID, *router.Peer) networkId: "testNetworkId",
assert.Equal(t, 1, len(*router.PeerGroups)) requestBody: &api.NetworkRouterRequest{
Masquerade: true,
Metric: 100,
Enabled: true,
}, },
expectedStatus: http.StatusBadRequest,
}, },
{ {
name: "Create router in non-existing network", name: "Create router in non-existing network",
@@ -1341,13 +1345,18 @@ func Test_NetworkRouters_Update(t *testing.T) {
Metric: 100, Metric: 100,
Enabled: true, Enabled: true,
}, },
expectedStatus: http.StatusOK, expectedStatus: http.StatusBadRequest,
verifyResponse: func(t *testing.T, router *api.NetworkRouter) { },
t.Helper() {
assert.Equal(t, "testRouterId", router.Id) name: "Update router without peer and peer_groups",
assert.Equal(t, peerID, *router.Peer) networkId: "testNetworkId",
assert.Equal(t, 1, len(*router.PeerGroups)) routerId: "testRouterId",
requestBody: &api.NetworkRouterRequest{
Masquerade: true,
Metric: 100,
Enabled: true,
}, },
expectedStatus: http.StatusBadRequest,
}, },
} }
@@ -21,11 +21,7 @@ type NetworkRouter struct {
} }
func NewNetworkRouter(accountID string, networkID string, peer string, peerGroups []string, masquerade bool, metric int, enabled bool) (*NetworkRouter, error) { func NewNetworkRouter(accountID string, networkID string, peer string, peerGroups []string, masquerade bool, metric int, enabled bool) (*NetworkRouter, error) {
if peer != "" && len(peerGroups) > 0 { r := &NetworkRouter{
return nil, errors.New("peer and peerGroups cannot be set at the same time")
}
return &NetworkRouter{
ID: xid.New().String(), ID: xid.New().String(),
AccountID: accountID, AccountID: accountID,
NetworkID: networkID, NetworkID: networkID,
@@ -34,7 +30,25 @@ func NewNetworkRouter(accountID string, networkID string, peer string, peerGroup
Masquerade: masquerade, Masquerade: masquerade,
Metric: metric, Metric: metric,
Enabled: enabled, Enabled: enabled,
}, nil }
if err := r.Validate(); err != nil {
return nil, err
}
return r, nil
}
func (n *NetworkRouter) Validate() error {
if n.Peer != "" && len(n.PeerGroups) > 0 {
return errors.New("peer and peer_groups cannot be set at the same time")
}
if n.Peer == "" && len(n.PeerGroups) == 0 {
return errors.New("either peer or peer_groups must be provided")
}
return nil
} }
func (n *NetworkRouter) ToAPIResponse() *api.NetworkRouter { func (n *NetworkRouter) ToAPIResponse() *api.NetworkRouter {
@@ -38,7 +38,7 @@ func TestNewNetworkRouter(t *testing.T) {
expectedError: false, expectedError: false,
}, },
{ {
name: "Valid with no peer or peerGroups", name: "Invalid with no peer or peerGroups",
networkID: "network-3", networkID: "network-3",
accountID: "account-3", accountID: "account-3",
peer: "", peer: "",
@@ -46,7 +46,18 @@ func TestNewNetworkRouter(t *testing.T) {
masquerade: true, masquerade: true,
metric: 300, metric: 300,
enabled: true, enabled: true,
expectedError: false, expectedError: true,
},
{
name: "Invalid with empty peerGroups slice",
networkID: "network-5",
accountID: "account-5",
peer: "",
peerGroups: []string{},
masquerade: true,
metric: 500,
enabled: true,
expectedError: true,
}, },
// Invalid cases // Invalid cases