From 3b5c8e2298b7e08292f00b60625f960f03195d92 Mon Sep 17 00:00:00 2001 From: Dmitri Dolguikh Date: Fri, 31 Jul 2026 12:29:35 +0200 Subject: [PATCH] started moving pg-specific nmap tests to integration_tests/management/network_map_db/pgsql Signed-off-by: Dmitri Dolguikh --- .../network_map_db/pgsql/group_test.go | 39 ++++++ .../network_map_db/pgsql/main_test.go | 115 ++++++++++++++++++ .../network_map_db/pgsql/account_settings.go | 2 +- .../internals/network_map_db/pgsql/dns.go | 2 +- .../internals/network_map_db/pgsql/group.go | 2 +- .../network_map_db/pgsql/group_test.go | 2 +- .../network_map_db/pgsql/nameserver.go | 2 +- .../internals/network_map_db/pgsql/network.go | 2 +- .../network_map_db/pgsql/network_resource.go | 2 +- .../network_map_db/pgsql/network_router.go | 2 +- .../internals/network_map_db/pgsql/peer.go | 2 +- .../network_map_db/pgsql/pg_store.go | 4 +- .../internals/network_map_db/pgsql/policy.go | 2 +- .../internals/network_map_db/pgsql/posture.go | 2 +- .../internals/network_map_db/pgsql/route.go | 2 +- 15 files changed, 168 insertions(+), 14 deletions(-) create mode 100644 integration_tests/management/network_map_db/pgsql/group_test.go create mode 100644 integration_tests/management/network_map_db/pgsql/main_test.go diff --git a/integration_tests/management/network_map_db/pgsql/group_test.go b/integration_tests/management/network_map_db/pgsql/group_test.go new file mode 100644 index 000000000..3c5426741 --- /dev/null +++ b/integration_tests/management/network_map_db/pgsql/group_test.go @@ -0,0 +1,39 @@ +package networkmap_pgsql + +import ( + "context" + "testing" + + networkmap_pgsql "github.com/netbirdio/netbird/management/internals/network_map_db/pgsql" + "github.com/netbirdio/netbird/shared/management/networkmap/nmdata" + "github.com/stretchr/testify/assert" +) + +func TestXXX(t *testing.T) { + ctx := context.TODO() + + s, err := networkmap_pgsql.NewPostgresqlStore(ctx, dsn) + assert.NoError(t, err) + + _, err = s.Pool.Query(ctx, + "insert into accounts (id) VALUES('account-id-1')") + assert.NoError(t, err) + + _, err = s.Pool.Query(ctx, + "insert into groups (id, account_id, name, resources, public_id) VALUES('test-group-id-1','account-id-1','test-group-1', '[{\"ID\":\"host-id-1\",\"Type\":\"host\"}]','public-id-1')") + assert.NoError(t, err) + _, err = s.Pool.Query(ctx, + "insert into groups (id, account_id, name, resources, public_id) VALUES('test-group-id-2','account-id-1','test-group-2', '[{\"ID\":\"subnet-id-1\",\"Type\":\"subnet\"}, {\"ID\":\"host-id-2\",\"Type\":\"host\"}]','public-id-2')") + assert.NoError(t, err) + + groups, err := s.GetGroups(ctx, "account-id-1") + assert.NoError(t, err) + assert.Contains(t, + groups, + nmdata.Group{Name: "test-group-1", PublicID: "public-id-1", Resources: []nmdata.Resource{{ID: "host-id-1", Type: "host"}}}, + ) + assert.Contains(t, + groups, + nmdata.Group{Name: "test-group-2", PublicID: "public-id-2", Resources: []nmdata.Resource{{ID: "subnet-id-1", Type: "subnet"}, {ID: "host-id-2", Type: "host"}}}, + ) +} diff --git a/integration_tests/management/network_map_db/pgsql/main_test.go b/integration_tests/management/network_map_db/pgsql/main_test.go new file mode 100644 index 000000000..dc329ebed --- /dev/null +++ b/integration_tests/management/network_map_db/pgsql/main_test.go @@ -0,0 +1,115 @@ +package networkmap_pgsql + +import ( + "context" + "fmt" + "os" + "regexp" + "strings" + "testing" + "time" + + "github.com/google/uuid" + + log "github.com/sirupsen/logrus" + "gorm.io/driver/postgres" + "gorm.io/gorm" + + gormstore "github.com/netbirdio/netbird/management/server/store" + "github.com/netbirdio/netbird/management/server/testutil" +) + +var dsn string + +func TestMain(m *testing.M) { + _, tmpdsn, err := testutil.CreatePostgresTestContainer() + if err != nil { + log.Fatalf("error starting postres container %v", err) + } + + var db *gorm.DB + for i := range 5 { + db, err = gorm.Open(postgres.Open(tmpdsn), &gorm.Config{}) + + if err == nil { + break + } + + if i < 5 { + waitTime := time.Duration(100*(i+1)) * time.Millisecond + time.Sleep(waitTime) + continue + } + + log.Fatalf("error connecting to postres db %v", err) + } + + var cleanup func() + dsn, cleanup, err = createRandomDB(tmpdsn, db) + sqlDB, _ := db.DB() + if sqlDB != nil { + sqlDB.Close() + } + if err != nil { + log.Fatalf("error creating postres db %v", err) + } + + _, err = gormstore.NewPostgresqlStoreForTests(context.TODO(), dsn, nil, false) + if err != nil { + log.Fatalf("error running migrations %v", err) + } + + code := m.Run() + + cleanup() + + os.Exit(code) +} + +func createRandomDB(dsn string, db *gorm.DB) (string, func(), error) { + dbName := fmt.Sprintf("test_db_%s", strings.ReplaceAll(uuid.New().String(), "-", "_")) + + if err := db.Exec(fmt.Sprintf("CREATE DATABASE %s", dbName)).Error; err != nil { + return "", nil, fmt.Errorf("failed to create database: %v", err) + } + + originalDSN := dsn + + cleanup := func() { + var dropDB *gorm.DB + var err error + + dropDB, err = gorm.Open(postgres.Open(originalDSN), &gorm.Config{ + SkipDefaultTransaction: true, + PrepareStmt: false, + }) + if err != nil { + log.Errorf("failed to connect for dropping database %s: %v", dbName, err) + return + } + defer func() { + if sqlDB, _ := dropDB.DB(); sqlDB != nil { + sqlDB.Close() + } + }() + + if sqlDB, _ := dropDB.DB(); sqlDB != nil { + sqlDB.SetMaxOpenConns(1) + sqlDB.SetMaxIdleConns(0) + sqlDB.SetConnMaxLifetime(time.Second) + } + + err = dropDB.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS %s WITH (FORCE)", dbName)).Error + + if err != nil { + log.Errorf("failed to drop database %s: %v", dbName, err) + } + } + + return replaceDBName(dsn, dbName), cleanup, nil +} + +func replaceDBName(dsn, newDBName string) string { + re := regexp.MustCompile(`(?P
[:/@])(?P[^/?]+)(?P\?|$)`)
+	return re.ReplaceAllString(dsn, `${pre}`+newDBName+`${post}`)
+}
diff --git a/management/internals/network_map_db/pgsql/account_settings.go b/management/internals/network_map_db/pgsql/account_settings.go
index 5ac3175be..6f4713b96 100644
--- a/management/internals/network_map_db/pgsql/account_settings.go
+++ b/management/internals/network_map_db/pgsql/account_settings.go
@@ -21,7 +21,7 @@ const (
 )
 
 func (pg *PgStore) GetAccountSettings(ctx context.Context, accountId string) (nmdata.AccountSettingsInfo, error) {
-	rows, err := pg.pool.Query(ctx, GetAccountSettingsQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetAccountSettingsQuery, accountId)
 	if err != nil {
 		return nmdata.AccountSettingsInfo{}, err
 	}
diff --git a/management/internals/network_map_db/pgsql/dns.go b/management/internals/network_map_db/pgsql/dns.go
index ee4545422..cdbcaf298 100644
--- a/management/internals/network_map_db/pgsql/dns.go
+++ b/management/internals/network_map_db/pgsql/dns.go
@@ -26,7 +26,7 @@ const (
 )
 
 func (pg *PgStore) GetAccountZones(ctx context.Context, accountId string) ([]nmdata.CustomZone, error) {
-	rows, err := pg.pool.Query(ctx, GetAccountZonesQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetAccountZonesQuery, accountId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/management/internals/network_map_db/pgsql/group.go b/management/internals/network_map_db/pgsql/group.go
index b279b57af..12386aec3 100644
--- a/management/internals/network_map_db/pgsql/group.go
+++ b/management/internals/network_map_db/pgsql/group.go
@@ -24,7 +24,7 @@ const (
 )
 
 func (pg *PgStore) GetGroups(ctx context.Context, accountId string) ([]nmdata.Group, error) {
-	rows, err := pg.pool.Query(ctx, GetGroupsQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetGroupsQuery, accountId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/management/internals/network_map_db/pgsql/group_test.go b/management/internals/network_map_db/pgsql/group_test.go
index 47566cef8..e3f752d43 100644
--- a/management/internals/network_map_db/pgsql/group_test.go
+++ b/management/internals/network_map_db/pgsql/group_test.go
@@ -25,7 +25,7 @@ func TestGetGroups(t *testing.T) {
 	//	err = loadSQL(ctx, s.pool, initDb)
 	//assert.NoError(t, err)
 
-	_, err = s.pool.Query(ctx, "insert into groups (id, account_id, name, resources, public_id) VALUES('test-group-id-1','ck7bnf2t2r9s739pkug0','test-group-1', '[{\"ID\":\"cui7q2jl0ubs73d8qpi0\",\"Type\":\"host\"}]','public-id-1')")
+	_, err = s.Pool.Query(ctx, "insert into groups (id, account_id, name, resources, public_id) VALUES('test-group-id-1','ck7bnf2t2r9s739pkug0','test-group-1', '[{\"ID\":\"cui7q2jl0ubs73d8qpi0\",\"Type\":\"host\"}]','public-id-1')")
 	assert.NoError(t, err)
 
 	groups, err := s.GetGroups(ctx, "ck7bnf2t2r9s739pkug0") //"ckd7ee2fic3c73dtendg")
diff --git a/management/internals/network_map_db/pgsql/nameserver.go b/management/internals/network_map_db/pgsql/nameserver.go
index 14c8aea7c..57761fceb 100644
--- a/management/internals/network_map_db/pgsql/nameserver.go
+++ b/management/internals/network_map_db/pgsql/nameserver.go
@@ -20,7 +20,7 @@ const (
 )
 
 func (pg *PgStore) GetNameServerGroups(ctx context.Context, accountId string) ([]nmdata.NameServerGroup, error) {
-	rows, err := pg.pool.Query(ctx, GetNameserversQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetNameserversQuery, accountId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/management/internals/network_map_db/pgsql/network.go b/management/internals/network_map_db/pgsql/network.go
index 711e30a6d..33786b49e 100644
--- a/management/internals/network_map_db/pgsql/network.go
+++ b/management/internals/network_map_db/pgsql/network.go
@@ -20,7 +20,7 @@ const (
 )
 
 func (pg *PgStore) GetNetwork(ctx context.Context, accountId string) (nmdata.Network, error) {
-	rows, err := pg.pool.Query(ctx, GetNetworkQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetNetworkQuery, accountId)
 	if err != nil {
 		return nmdata.Network{}, err
 	}
diff --git a/management/internals/network_map_db/pgsql/network_resource.go b/management/internals/network_map_db/pgsql/network_resource.go
index 2e2ca2ed6..1a4073015 100644
--- a/management/internals/network_map_db/pgsql/network_resource.go
+++ b/management/internals/network_map_db/pgsql/network_resource.go
@@ -20,7 +20,7 @@ const (
 )
 
 func (pg *PgStore) GetNetworkResources(ctx context.Context, accountId string) ([]nmdata.NetworkResource, error) {
-	rows, err := pg.pool.Query(ctx, GetNetworkResourcesQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetNetworkResourcesQuery, accountId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/management/internals/network_map_db/pgsql/network_router.go b/management/internals/network_map_db/pgsql/network_router.go
index f08d4ec96..1415ac6e3 100644
--- a/management/internals/network_map_db/pgsql/network_router.go
+++ b/management/internals/network_map_db/pgsql/network_router.go
@@ -20,7 +20,7 @@ const (
 )
 
 func (pg *PgStore) GetNetworkRouters(ctx context.Context, accountId string) ([]nmdata.NetworkRouter, error) {
-	rows, err := pg.pool.Query(ctx, GetNetworkRouterQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetNetworkRouterQuery, accountId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/management/internals/network_map_db/pgsql/peer.go b/management/internals/network_map_db/pgsql/peer.go
index 46bf2c4f8..38b2a800c 100644
--- a/management/internals/network_map_db/pgsql/peer.go
+++ b/management/internals/network_map_db/pgsql/peer.go
@@ -22,7 +22,7 @@ const (
 )
 
 func (pg *PgStore) GetPeers(ctx context.Context, accountId string) ([]nmdata.Peer, error) {
-	rows, err := pg.pool.Query(ctx, GetPeersQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetPeersQuery, accountId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/management/internals/network_map_db/pgsql/pg_store.go b/management/internals/network_map_db/pgsql/pg_store.go
index b7a3ffc43..9c7b98682 100644
--- a/management/internals/network_map_db/pgsql/pg_store.go
+++ b/management/internals/network_map_db/pgsql/pg_store.go
@@ -19,7 +19,7 @@ const (
 var _ networkmapdb.NetworkMapDBStore = &PgStore{}
 
 type PgStore struct {
-	pool *pgxpool.Pool
+	Pool *pgxpool.Pool
 }
 
 func NewPostgresqlStore(ctx context.Context, dsn string) (*PgStore, error) {
@@ -28,7 +28,7 @@ func NewPostgresqlStore(ctx context.Context, dsn string) (*PgStore, error) {
 		return nil, err
 	}
 
-	return &PgStore{pool: pool}, nil
+	return &PgStore{Pool: pool}, nil
 }
 
 func connectToPgDb(ctx context.Context, dsn string) (*pgxpool.Pool, error) {
diff --git a/management/internals/network_map_db/pgsql/policy.go b/management/internals/network_map_db/pgsql/policy.go
index 6011af5db..35cca1ee8 100644
--- a/management/internals/network_map_db/pgsql/policy.go
+++ b/management/internals/network_map_db/pgsql/policy.go
@@ -23,7 +23,7 @@ const (
 )
 
 func (pg *PgStore) GetPolicies(ctx context.Context, accountId string) ([]nmdata.Policy, error) {
-	rows, err := pg.pool.Query(ctx, GetPoliciesQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetPoliciesQuery, accountId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/management/internals/network_map_db/pgsql/posture.go b/management/internals/network_map_db/pgsql/posture.go
index 1af85319c..23010e527 100644
--- a/management/internals/network_map_db/pgsql/posture.go
+++ b/management/internals/network_map_db/pgsql/posture.go
@@ -19,7 +19,7 @@ const (
 )
 
 func (pg *PgStore) GetPostureChecks(ctx context.Context, accountId string) ([]nmdata.PostureChecks, error) {
-	rows, err := pg.pool.Query(ctx, GetPostureChecksQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetPostureChecksQuery, accountId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/management/internals/network_map_db/pgsql/route.go b/management/internals/network_map_db/pgsql/route.go
index 3b43914dd..ecc176aaf 100644
--- a/management/internals/network_map_db/pgsql/route.go
+++ b/management/internals/network_map_db/pgsql/route.go
@@ -22,7 +22,7 @@ const (
 )
 
 func (pg *PgStore) GetRoutes(ctx context.Context, accountId string) ([]nmdata.Route, error) {
-	rows, err := pg.pool.Query(ctx, GetRoutesQuery, accountId)
+	rows, err := pg.Pool.Query(ctx, GetRoutesQuery, accountId)
 	if err != nil {
 		return nil, err
 	}