From 42ce83a8f322fd1e955de03c63c145d5c03da7ad Mon Sep 17 00:00:00 2001 From: Dmitri Dolguikh Date: Wed, 29 Jul 2026 18:57:08 +0200 Subject: [PATCH] added support for account network Signed-off-by: Dmitri Dolguikh --- .../internals/network_map_db/db_store.go | 1 + .../network_map_db/pgsql/group_test.go | 22 +++++++++ .../internals/network_map_db/pgsql/network.go | 49 +++++++++++++++++++ .../server/types/account_networkmapdata.go | 2 +- shared/management/networkmap/decode.go | 2 +- .../management/networkmap/nmdata/network.go | 4 +- 6 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 management/internals/network_map_db/pgsql/network.go diff --git a/management/internals/network_map_db/db_store.go b/management/internals/network_map_db/db_store.go index ff6f51655..ce08ab245 100644 --- a/management/internals/network_map_db/db_store.go +++ b/management/internals/network_map_db/db_store.go @@ -25,6 +25,7 @@ type NetworkMapDBStore interface { GetNameServerGroups(ctx context.Context, accountId string) ([]nmdata.NameServerGroup, error) GetNetworkResources(ctx context.Context, accountId string) ([]nmdata.NetworkResource, error) GetNetworkRouters(ctx context.Context, accountId string) ([]nmdata.NetworkRouter, error) + GetNetwork(ctx context.Context, accountId string) (nmdata.Network, error) } type NetworkMapDBStoreImpl struct { diff --git a/management/internals/network_map_db/pgsql/group_test.go b/management/internals/network_map_db/pgsql/group_test.go index 570cbbb5a..39b7c0701 100644 --- a/management/internals/network_map_db/pgsql/group_test.go +++ b/management/internals/network_map_db/pgsql/group_test.go @@ -171,6 +171,28 @@ func TestGetNetworkRouters(t *testing.T) { // ) } +func TestGetNetwork(t *testing.T) { + ctx := context.TODO() + + s, err := NewPostgresqlStore(ctx, "postgresql://root:netbird@localhost:5432/netbird") + assert.NoError(t, err) + // err = loadSQL(ctx, s.pool, initDb) + //assert.NoError(t, err) + + n, err := s.GetNetwork(ctx, "d29f99jl0ubs73cm8ce0") //"ckd7ee2fic3c73dtendg") + assert.NoError(t, err) + + fmt.Print(n) + // assert.Contains(t, + // groups, + // nmdata.Group{Name: "test-group-1", PublicID: "public-id-1", Resources: []nmdata.Resource{{ID: "cui7q2jl0ubs73d8qpi0", Type: "host"}}}, + // ) + // assert.Contains(t, + // groups, + // nmdata.Group{Name: "All", PublicID: "d9aejspvcsu517nkh4a0", Resources: []nmdata.Resource{{ID: "cui7olrl0ubs73d8qpe0", Type: "subnet"}, {ID: "cui7q2jl0ubs73d8qpi0", Type: "host"}}}, + // ) +} + func loadSQL(ctx context.Context, pool *pgxpool.Pool, initdb string) error { queries := strings.Split(string(initdb), ";") diff --git a/management/internals/network_map_db/pgsql/network.go b/management/internals/network_map_db/pgsql/network.go new file mode 100644 index 000000000..f4c21a90e --- /dev/null +++ b/management/internals/network_map_db/pgsql/network.go @@ -0,0 +1,49 @@ +package networkmap_pgsql + +import ( + "context" + "database/sql" + "encoding/json" + "reflect" + + "github.com/jackc/pgx/v5" + networkmapdb "github.com/netbirdio/netbird/management/internals/network_map_db" + "github.com/netbirdio/netbird/shared/management/networkmap/nmdata" +) + +const ( + GetNetworkQuery = ` + select network_identifier as identifier, network_net as net, network_net_v6 as net_v6, network_dns as dns, network_serial as serial + from accounts + where id=$1 + ` +) + +func (pg *PgStore) GetNetwork(ctx context.Context, accountId string) (nmdata.Network, error) { + rows, err := pg.pool.Query(ctx, GetNetworkQuery, accountId) + if err != nil { + return nmdata.Network{}, err + } + + n, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[network]) + if err != nil { + return nmdata.Network{}, err + } + + toret := nmdata.Network{} + err = networkmapdb.FromSqlTypesToSharedTypes( + reflect.ValueOf(&n).Elem(), reflect.ValueOf(&toret).Elem()) + if err != nil { + return nmdata.Network{}, err + } + + return toret, nil +} + +type network struct { + Identifier sql.NullString + Net json.RawMessage + NetV6 json.RawMessage + Dns sql.NullString + Serial sql.NullInt64 +} diff --git a/management/server/types/account_networkmapdata.go b/management/server/types/account_networkmapdata.go index 72e5f251b..68a874761 100644 --- a/management/server/types/account_networkmapdata.go +++ b/management/server/types/account_networkmapdata.go @@ -332,7 +332,7 @@ func TwinNetwork(n *Network) *nmdata.Network { Net: nc.Net, NetV6: nc.NetV6, Dns: nc.Dns, - Serial: nc.Serial, + Serial: int64(nc.Serial), } } diff --git a/shared/management/networkmap/decode.go b/shared/management/networkmap/decode.go index 1ad483545..a7ae1665d 100644 --- a/shared/management/networkmap/decode.go +++ b/shared/management/networkmap/decode.go @@ -291,7 +291,7 @@ func decodeAccountNetwork(an *proto.AccountNetwork) *nmdata.Network { n := &nmdata.Network{ Identifier: an.Identifier, Dns: an.Dns, - Serial: an.Serial, + Serial: int64(an.Serial), } if an.NetCidr != "" { if _, ipnet, err := net.ParseCIDR(an.NetCidr); err == nil && ipnet != nil { diff --git a/shared/management/networkmap/nmdata/network.go b/shared/management/networkmap/nmdata/network.go index 4db8b1c45..72b6502ef 100644 --- a/shared/management/networkmap/nmdata/network.go +++ b/shared/management/networkmap/nmdata/network.go @@ -8,9 +8,9 @@ type Network struct { Net net.IPNet NetV6 net.IPNet Dns string - Serial uint64 + Serial int64 } func (n *Network) CurrentSerial() uint64 { - return n.Serial + return uint64(n.Serial) }