From 9dee2d60b9540f7b01ca4ab6ce28e9cbf642d367 Mon Sep 17 00:00:00 2001 From: Dmitri Dolguikh Date: Wed, 29 Jul 2026 18:19:34 +0200 Subject: [PATCH] added support for networkresources Signed-off-by: Dmitri Dolguikh --- .../network_map_db/pgsql/group_test.go | 22 +++++++ .../network_map_db/pgsql/nameserver.go | 57 +++++++++++++++++++ .../network_map_db/pgsql/network_resource.go | 57 +++++++++++++++++++ .../networkmap/nmdata/network_resource.go | 2 +- 4 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 management/internals/network_map_db/pgsql/nameserver.go create mode 100644 management/internals/network_map_db/pgsql/network_resource.go diff --git a/management/internals/network_map_db/pgsql/group_test.go b/management/internals/network_map_db/pgsql/group_test.go index 517bafe66..67cb5fb25 100644 --- a/management/internals/network_map_db/pgsql/group_test.go +++ b/management/internals/network_map_db/pgsql/group_test.go @@ -127,6 +127,28 @@ func TestGetNSGroups(t *testing.T) { // ) } +func TestGetNetworkResources(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) + + res, err := s.GetNetworkResources(ctx, "cag86v2t2r9s73d0416g") //"ckd7ee2fic3c73dtendg") + assert.NoError(t, err) + + fmt.Print(res) + // 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/nameserver.go b/management/internals/network_map_db/pgsql/nameserver.go new file mode 100644 index 000000000..508c1d172 --- /dev/null +++ b/management/internals/network_map_db/pgsql/nameserver.go @@ -0,0 +1,57 @@ +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 ( + GetNameserversQuery = ` + select id, public_id, name, description, name_servers, groups, "primary", domains, enabled, search_domains_enabled + from name_server_groups + where account_id=$1 + ` +) + +func (pg *PgStore) GetNameServerGroups(ctx context.Context, accountId string) ([]nmdata.NameServerGroup, error) { + rows, err := pg.pool.Query(ctx, GetNameserversQuery, accountId) + if err != nil { + return nil, err + } + + nsgroups, err := pgx.CollectRows(rows, pgx.RowToStructByName[nameserverGroup]) + if err != nil { + return nil, err + } + + toret := make([]nmdata.NameServerGroup, 0, len(nsgroups)) + for _, nsg := range nsgroups { + group := nmdata.NameServerGroup{} + err := networkmapdb.FromSqlTypesToSharedTypes( + reflect.ValueOf(&nsg).Elem(), reflect.ValueOf(&group).Elem()) + if err != nil { + return nil, err + } + toret = append(toret, group) + } + return toret, nil +} + +type nameserverGroup struct { + ID string + PublicID sql.NullString + Name sql.NullString + Description sql.NullString + NameServers json.RawMessage + Groups json.RawMessage + Primary sql.NullBool + Domains json.RawMessage + Enabled sql.NullBool + SearchDomainsEnabled sql.NullBool +} diff --git a/management/internals/network_map_db/pgsql/network_resource.go b/management/internals/network_map_db/pgsql/network_resource.go new file mode 100644 index 000000000..228fe2878 --- /dev/null +++ b/management/internals/network_map_db/pgsql/network_resource.go @@ -0,0 +1,57 @@ +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 ( + GetNetworkResourcesQuery = ` + select id, network_id, account_id, public_id, name, description, type, domain, prefix, enabled + from network_resources + where account_id=$1 + ` +) + +func (pg *PgStore) GetNetworkResources(ctx context.Context, accountId string) ([]nmdata.NetworkResource, error) { + rows, err := pg.pool.Query(ctx, GetNetworkResourcesQuery, accountId) + if err != nil { + return nil, err + } + + netresorces, err := pgx.CollectRows(rows, pgx.RowToStructByName[networkresource]) + if err != nil { + return nil, err + } + + toret := make([]nmdata.NetworkResource, 0, len(netresorces)) + for _, nres := range netresorces { + resource := nmdata.NetworkResource{} + err := networkmapdb.FromSqlTypesToSharedTypes( + reflect.ValueOf(&nres).Elem(), reflect.ValueOf(&resource).Elem()) + if err != nil { + return nil, err + } + toret = append(toret, resource) + } + return toret, nil +} + +type networkresource struct { + ID string + NetworkID sql.NullString + AccountID sql.NullString + PublicID sql.NullString + Name sql.NullString + Description sql.NullString + Type sql.NullString + Domain sql.NullString + Prefix json.RawMessage + Enabled sql.NullBool +} diff --git a/shared/management/networkmap/nmdata/network_resource.go b/shared/management/networkmap/nmdata/network_resource.go index ba3358b18..44f3c477b 100644 --- a/shared/management/networkmap/nmdata/network_resource.go +++ b/shared/management/networkmap/nmdata/network_resource.go @@ -11,7 +11,7 @@ type NetworkResource struct { Name string Description string Type string - Address string + Address string // TODO: isn't persisted in the DB Domain string Prefix netip.Prefix Enabled bool