mirror of
https://github.com/netbirdio/netbird.git
synced 2025-02-02 03:19:34 +01:00
wip: generate routes for resource with no policy
Signed-off-by: bcmmbaga <bethuelmbaga12@gmail.com>
This commit is contained in:
parent
dfa453abe7
commit
57eac8824f
@ -2174,6 +2174,7 @@ func TestAccount_GetPeerNetworkResourceFirewallRules(t *testing.T) {
|
|||||||
peerHIp = "100.65.29.55"
|
peerHIp = "100.65.29.55"
|
||||||
peerJIp = "100.65.29.65"
|
peerJIp = "100.65.29.65"
|
||||||
peerKIp = "100.65.29.66"
|
peerKIp = "100.65.29.66"
|
||||||
|
peerMIp = "100.65.29.67"
|
||||||
)
|
)
|
||||||
|
|
||||||
account := &types.Account{
|
account := &types.Account{
|
||||||
@ -2241,6 +2242,20 @@ func TestAccount_GetPeerNetworkResourceFirewallRules(t *testing.T) {
|
|||||||
IP: net.ParseIP(peerKIp),
|
IP: net.ParseIP(peerKIp),
|
||||||
Status: &nbpeer.PeerStatus{},
|
Status: &nbpeer.PeerStatus{},
|
||||||
},
|
},
|
||||||
|
"peerL": {
|
||||||
|
ID: "peerL",
|
||||||
|
IP: net.ParseIP("100.65.19.186"),
|
||||||
|
Key: "peerL",
|
||||||
|
Status: &nbpeer.PeerStatus{},
|
||||||
|
Meta: nbpeer.PeerSystemMeta{
|
||||||
|
GoOS: "linux",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"peerM": {
|
||||||
|
ID: "peerM",
|
||||||
|
IP: net.ParseIP(peerMIp),
|
||||||
|
Status: &nbpeer.PeerStatus{},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Groups: map[string]*types.Group{
|
Groups: map[string]*types.Group{
|
||||||
"router1": {
|
"router1": {
|
||||||
@ -2310,6 +2325,11 @@ func TestAccount_GetPeerNetworkResourceFirewallRules(t *testing.T) {
|
|||||||
Name: "Contractors",
|
Name: "Contractors",
|
||||||
Peers: []string{},
|
Peers: []string{},
|
||||||
},
|
},
|
||||||
|
"pipeline": {
|
||||||
|
ID: "pipeline",
|
||||||
|
Name: "Pipeline",
|
||||||
|
Peers: []string{"peerM"},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Networks: []*networkTypes.Network{
|
Networks: []*networkTypes.Network{
|
||||||
{
|
{
|
||||||
@ -2328,6 +2348,10 @@ func TestAccount_GetPeerNetworkResourceFirewallRules(t *testing.T) {
|
|||||||
ID: "network4",
|
ID: "network4",
|
||||||
Name: "QA Network",
|
Name: "QA Network",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ID: "network5",
|
||||||
|
Name: "Pipeline Network",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
NetworkRouters: []*routerTypes.NetworkRouter{
|
NetworkRouters: []*routerTypes.NetworkRouter{
|
||||||
{
|
{
|
||||||
@ -2358,6 +2382,13 @@ func TestAccount_GetPeerNetworkResourceFirewallRules(t *testing.T) {
|
|||||||
Masquerade: false,
|
Masquerade: false,
|
||||||
Metric: 9999,
|
Metric: 9999,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ID: "router5",
|
||||||
|
NetworkID: "network5",
|
||||||
|
Peer: "peerL",
|
||||||
|
Masquerade: false,
|
||||||
|
Metric: 9999,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
NetworkResources: []*resourceTypes.NetworkResource{
|
NetworkResources: []*resourceTypes.NetworkResource{
|
||||||
{
|
{
|
||||||
@ -2388,6 +2419,13 @@ func TestAccount_GetPeerNetworkResourceFirewallRules(t *testing.T) {
|
|||||||
Type: "domain",
|
Type: "domain",
|
||||||
Domain: "example.com",
|
Domain: "example.com",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ID: "resource5",
|
||||||
|
NetworkID: "network5",
|
||||||
|
Name: "Resource 5",
|
||||||
|
Type: "host",
|
||||||
|
Prefix: netip.MustParsePrefix("10.12.12.1/32"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Policies: []*types.Policy{
|
Policies: []*types.Policy{
|
||||||
{
|
{
|
||||||
@ -2471,6 +2509,24 @@ func TestAccount_GetPeerNetworkResourceFirewallRules(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ID: "policyResource5",
|
||||||
|
Name: "policyResource5",
|
||||||
|
Enabled: true,
|
||||||
|
Rules: []*types.PolicyRule{
|
||||||
|
{
|
||||||
|
ID: "ruleResource5",
|
||||||
|
Name: "ruleResource5",
|
||||||
|
Bidirectional: true,
|
||||||
|
Enabled: true,
|
||||||
|
Protocol: types.PolicyRuleProtocolTCP,
|
||||||
|
Action: types.PolicyTrafficActionAccept,
|
||||||
|
Ports: []string{"8080"},
|
||||||
|
Sources: []string{"pipeline"},
|
||||||
|
DestinationResource: types.Resource{ID: "resource5"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2577,5 +2633,32 @@ func TestAccount_GetPeerNetworkResourceFirewallRules(t *testing.T) {
|
|||||||
// peerC is part of distribution groups for resource2 but should not receive the firewall rules
|
// peerC is part of distribution groups for resource2 but should not receive the firewall rules
|
||||||
firewallRules = account.GetPeerRoutesFirewallRules(context.Background(), "peerC", validatedPeers)
|
firewallRules = account.GetPeerRoutesFirewallRules(context.Background(), "peerC", validatedPeers)
|
||||||
assert.Len(t, firewallRules, 0)
|
assert.Len(t, firewallRules, 0)
|
||||||
|
|
||||||
|
// peerL is the single routing peer for resource5
|
||||||
|
firewallRules = account.GetPeerNetworkResourceFirewallRules(context.Background(), "peerL", validatedPeers)
|
||||||
|
assert.Len(t, firewallRules, 1)
|
||||||
|
|
||||||
|
expectedFirewallRules = []*types.RouteFirewallRule{
|
||||||
|
{
|
||||||
|
SourceRanges: []string{"100.65.29.67/32"},
|
||||||
|
Action: "accept",
|
||||||
|
Destination: "10.12.12.1/32",
|
||||||
|
Protocol: "tcp",
|
||||||
|
Port: 8080,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
assert.ElementsMatch(t, orderRuleSourceRanges(firewallRules), orderRuleSourceRanges(expectedFirewallRules))
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("validate routes for network resources", func(t *testing.T) {
|
||||||
|
routesToSync := account.GetNetworkResourcesRoutesToSync(context.Background(), "peerL", []*nbpeer.Peer{})
|
||||||
|
assert.Len(t, routesToSync, 1)
|
||||||
|
|
||||||
|
routesToSync = account.GetNetworkResourcesRoutesToSync(context.Background(), "peerM", []*nbpeer.Peer{})
|
||||||
|
assert.Len(t, routesToSync, 1)
|
||||||
|
|
||||||
|
//routesToSync = account.GetNetworkResourcesRoutesToSync(context.Background(), "peerC", []*nbpeer.Peer{})
|
||||||
|
//assert.Len(t, routesToSync, 1)
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1278,16 +1278,100 @@ func (a *Account) getNetworkResourceGroups(resourceID string) []*Group {
|
|||||||
|
|
||||||
// GetNetworkResourcesRoutesToSync returns network routes for syncing with a specific peer and its ACL peers.
|
// GetNetworkResourcesRoutesToSync returns network routes for syncing with a specific peer and its ACL peers.
|
||||||
func (a *Account) GetNetworkResourcesRoutesToSync(ctx context.Context, peerID string, aclPeers []*nbpeer.Peer) []*route.Route {
|
func (a *Account) GetNetworkResourcesRoutesToSync(ctx context.Context, peerID string, aclPeers []*nbpeer.Peer) []*route.Route {
|
||||||
routes := a.getRoutingPeerNetworkResourcesRoutes(ctx, peerID)
|
//routes := a.getRoutingPeerNetworkResourcesRoutes(ctx, peerID)
|
||||||
peerRoutesMembership := make(LookupMap)
|
//peerRoutesMembership := make(LookupMap)
|
||||||
for _, r := range routes {
|
//for _, r := range routes {
|
||||||
peerRoutesMembership[string(r.GetHAUniqueID())] = struct{}{}
|
// peerRoutesMembership[string(r.GetHAUniqueID())] = struct{}{}
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
|
////peersToConnect := make(map[string]struct{})
|
||||||
|
//
|
||||||
|
resources := make([]*resourceTypes.NetworkResource, 0)
|
||||||
|
|
||||||
for _, peer := range aclPeers {
|
for _, resource := range a.NetworkResources {
|
||||||
peerRoutes := a.getRoutingPeerNetworkResourcesRoutes(ctx, peer.ID)
|
|
||||||
filteredRoutes := a.filterRoutesFromPeersOfSameHAGroup(peerRoutes, peerRoutesMembership)
|
for _, router := range a.NetworkRouters {
|
||||||
routes = append(routes, filteredRoutes...)
|
if router.NetworkID == resource.NetworkID {
|
||||||
|
if router.Peer == peerID {
|
||||||
|
resources = append(resources, resource)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, peerGroup := range router.PeerGroups {
|
||||||
|
g := a.Groups[peerGroup]
|
||||||
|
if g != nil {
|
||||||
|
if slices.Contains(router.PeerGroups, peerID) {
|
||||||
|
resources = append(resources, resource)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
resourceAppliedPolicies := a.GetPoliciesForNetworkResource(resource.ID)
|
||||||
|
|
||||||
|
for _, policy := range resourceAppliedPolicies {
|
||||||
|
sourceGroups := policy.SourceGroups()
|
||||||
|
|
||||||
|
for _, sourceGroup := range sourceGroups {
|
||||||
|
group := a.GetGroup(sourceGroup)
|
||||||
|
if group == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// peer is part of the policy source which is the distribution group for the resource
|
||||||
|
// peerID should be able to connect with routing peers
|
||||||
|
if slices.Contains(group.Peers, peerID) {
|
||||||
|
resources = append(resources, resource)
|
||||||
|
|
||||||
|
// for _, groupID := range router.PeerGroups {
|
||||||
|
// g := a.GetGroup(groupID)
|
||||||
|
// if g != nil {
|
||||||
|
// for _, id := range g.Peers {
|
||||||
|
// peersToConnect[id] = struct{}{}
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if router.Peer != "" {
|
||||||
|
// peersToConnect[router.Peer] = struct{}{}
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
////for _, peer := range aclPeers {
|
||||||
|
//// peerRoutes := a.getRoutingPeerNetworkResourcesRoutes(ctx, peer.ID)
|
||||||
|
//// filteredRoutes := a.filterRoutesFromPeersOfSameHAGroup(peerRoutes, peerRoutesMembership)
|
||||||
|
//// routes = append(routes, filteredRoutes...)
|
||||||
|
////}
|
||||||
|
//
|
||||||
|
routes := make([]*route.Route, 0)
|
||||||
|
|
||||||
|
for _, resource := range resources {
|
||||||
|
for _, router := range a.NetworkRouters {
|
||||||
|
if router.NetworkID == resource.NetworkID {
|
||||||
|
|
||||||
|
resourceRoutingPeers := make([]string, 0)
|
||||||
|
for _, groupID := range router.PeerGroups {
|
||||||
|
group := a.GetGroup(groupID)
|
||||||
|
if group == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
resourceRoutingPeers = append(resourceRoutingPeers, group.Peers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if router.Peer != "" {
|
||||||
|
resourceRoutingPeers = append(resourceRoutingPeers, router.Peer)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, peerId := range resourceRoutingPeers {
|
||||||
|
routes = append(routes, a.getNetworkResourcesRoutesG(resources, router, peerId)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return routes
|
return routes
|
||||||
@ -1341,16 +1425,16 @@ func (a *Account) GetPoliciesForNetworkResource(resourceId string) []*Policy {
|
|||||||
func (a *Account) GetPoliciesAppliedInNetwork(networkID string) []string {
|
func (a *Account) GetPoliciesAppliedInNetwork(networkID string) []string {
|
||||||
networkResources := a.getNetworkResources(networkID)
|
networkResources := a.getNetworkResources(networkID)
|
||||||
|
|
||||||
policieIDs := map[string]struct{}{}
|
policiesIDs := map[string]struct{}{}
|
||||||
for _, resource := range networkResources {
|
for _, resource := range networkResources {
|
||||||
resourceAppliedPolicies := a.GetPoliciesForNetworkResource(resource.ID)
|
resourceAppliedPolicies := a.GetPoliciesForNetworkResource(resource.ID)
|
||||||
for _, policy := range resourceAppliedPolicies {
|
for _, policy := range resourceAppliedPolicies {
|
||||||
policieIDs[policy.ID] = struct{}{}
|
policiesIDs[policy.ID] = struct{}{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result := make([]string, 0, len(policieIDs))
|
result := make([]string, 0, len(policiesIDs))
|
||||||
for id := range policieIDs {
|
for id := range policiesIDs {
|
||||||
result = append(result, id)
|
result = append(result, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1372,6 +1456,24 @@ func (a *Account) getNetworkResourcesRoutes(resources []*resourceTypes.NetworkRe
|
|||||||
return routes
|
return routes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getNetworkResourcesRoutes convert the network resources list to routes list.
|
||||||
|
func (a *Account) getNetworkResourcesRoutesG(resources []*resourceTypes.NetworkResource, router *routerTypes.NetworkRouter, peerId string) []*route.Route {
|
||||||
|
routes := make([]*route.Route, 0, len(resources))
|
||||||
|
for _, resource := range resources {
|
||||||
|
resourceAppliedPolicies := a.GetPoliciesForNetworkResource(resource.ID)
|
||||||
|
|
||||||
|
// distribute the resource routes only if there is policy applied to it
|
||||||
|
if len(resourceAppliedPolicies) > 0 {
|
||||||
|
peer := a.GetPeer(peerId)
|
||||||
|
if peer != nil {
|
||||||
|
routes = append(routes, resource.ToRoute(peer, router))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return routes
|
||||||
|
}
|
||||||
|
|
||||||
// getPoliciesSourcePeers collects all unique peers from the source groups defined in the given policies.
|
// getPoliciesSourcePeers collects all unique peers from the source groups defined in the given policies.
|
||||||
func getPoliciesSourcePeers(policies []*Policy, groups map[string]*Group) map[string]struct{} {
|
func getPoliciesSourcePeers(policies []*Policy, groups map[string]*Group) map[string]struct{} {
|
||||||
sourcePeers := make(map[string]struct{})
|
sourcePeers := make(map[string]struct{})
|
||||||
|
@ -114,3 +114,12 @@ func (p *Policy) RuleGroups() []string {
|
|||||||
|
|
||||||
return groups
|
return groups
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SourceGroups returns a slice of all unique source groups referenced in the policy's rules.
|
||||||
|
func (p *Policy) SourceGroups() []string {
|
||||||
|
groups := make([]string, 0)
|
||||||
|
for _, rule := range p.Rules {
|
||||||
|
groups = append(groups, rule.Sources...)
|
||||||
|
}
|
||||||
|
return groups
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user