diff --git a/integration_tests/management/network_map_db/pgsql/network_router_test.go b/integration_tests/management/network_map_db/pgsql/network_router_test.go index f06de3ec3..fa7ea2a04 100644 --- a/integration_tests/management/network_map_db/pgsql/network_router_test.go +++ b/integration_tests/management/network_map_db/pgsql/network_router_test.go @@ -6,15 +6,11 @@ import ( "context" "testing" - "github.com/netbirdio/netbird/management/server/types" "github.com/netbirdio/netbird/shared/management/networkmap/nmdata" "github.com/stretchr/testify/assert" ) func TestGetNetworkRouters(t *testing.T) { - if engine == string(types.SqliteStoreEngine) { - t.Skip() - } ctx := context.TODO() execQuery(t, ctx, diff --git a/management/internals/network_map_db/sqlite/network_router.go b/management/internals/network_map_db/sqlite/network_router.go new file mode 100644 index 000000000..d5887b33f --- /dev/null +++ b/management/internals/network_map_db/sqlite/network_router.go @@ -0,0 +1,74 @@ +package networkmap_sqlite + +import ( + "context" + "database/sql" + "fmt" + "reflect" + + networkmapdb "github.com/netbirdio/netbird/management/internals/network_map_db" + "github.com/netbirdio/netbird/shared/management/networkmap/nmdata" +) + +const ( + GetNetworkRouterQuery = ` + select public_id, peer, network_id, masquerade, metric, enabled, peer_groups, group_peers.peer_id + from network_routers, json_each(peer_groups) + left join group_peers on group_peers.account_id=? and group_peers.group_id=json_each.value + where network_routers.account_id=? + ` +) + +func (sc *SqliteStoreConn) GetNetworkRouters(ctx context.Context, accountId string) (map[string]map[string]*nmdata.NetworkRouter, error) { + rows, err := sc.Conn.QueryContext(ctx, GetNetworkRouterQuery, accountId, accountId) + if err != nil { + return nil, err + } + + routers, err := networkmapdb.CollectRowsForSqlite[networkrouter](rows) + if err != nil { + return nil, err + } + + toret := make(map[string]map[string]*nmdata.NetworkRouter) + for _, router := range routers { + if !router.Enabled.Bool { + continue + } + + networkId := router.NetworkID.String + if networkId == "" { + return nil, fmt.Errorf("router with public_id %s doesn't have network_id set", router.PublicID.String) + } + + nmdatarouter := nmdata.NetworkRouter{} + err := networkmapdb.FromSqlTypesToSharedTypes(reflect.ValueOf(&router), reflect.ValueOf(&nmdatarouter)) + if err != nil { + return nil, err + } + + if toret[networkId] == nil { + toret[networkId] = make(map[string]*nmdata.NetworkRouter) + } + if router.Peer.String != "" { + toret[networkId][router.Peer.String] = &nmdatarouter + continue + } + if router.PeerViaGroups.String != "" { + toret[networkId][router.PeerViaGroups.String] = &nmdatarouter + } + } + + return toret, nil +} + +type networkrouter struct { + PublicID sql.NullString + Peer sql.NullString `nmap:"skip"` + NetworkID sql.NullString `nmap:"skip"` + Masquerade sql.NullBool + Metric sql.NullInt64 + Enabled sql.NullBool + PeerGroups []byte `nmap:"json"` + PeerViaGroups sql.NullString `nmap:"skip"` +} diff --git a/management/internals/network_map_db/sqlite/sqlite_store.go b/management/internals/network_map_db/sqlite/sqlite_store.go index c0205e9cb..980d0c493 100644 --- a/management/internals/network_map_db/sqlite/sqlite_store.go +++ b/management/internals/network_map_db/sqlite/sqlite_store.go @@ -91,9 +91,6 @@ func (s *SqliteStoreConn) GetPolicies(ctx context.Context, accountId string) ([] func (s *SqliteStoreConn) GetRoutes(ctx context.Context, accountId string) ([]nmdata.Route, error) { return nil, nil } -func (s *SqliteStoreConn) GetNetworkRouters(ctx context.Context, accountId string) (map[string]map[string]*nmdata.NetworkRouter, error) { - return nil, nil -} func (s *SqliteStoreConn) GetNetwork(ctx context.Context, accountId string) (nmdata.Network, error) { return nmdata.Network{}, nil }