mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-16 07:16:38 +00:00
[management] update account delete with proper proxy domain and service cleanup (#5817)
This commit is contained in:
@@ -30,3 +30,8 @@ func (d *Domain) EventMeta() map[string]any {
|
|||||||
"validated": d.Validated,
|
"validated": d.Validated,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Domain) Copy() *Domain {
|
||||||
|
dCopy := *d
|
||||||
|
return &dCopy
|
||||||
|
}
|
||||||
|
|||||||
@@ -742,11 +742,6 @@ func (am *DefaultAccountManager) DeleteAccount(ctx context.Context, accountID, u
|
|||||||
return status.Errorf(status.Internal, "failed to build user infos for account %s: %v", accountID, err)
|
return status.Errorf(status.Internal, "failed to build user infos for account %s: %v", accountID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = am.serviceManager.DeleteAllServices(ctx, accountID, userID)
|
|
||||||
if err != nil {
|
|
||||||
return status.Errorf(status.Internal, "failed to delete service %s: %v", accountID, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, otherUser := range account.Users {
|
for _, otherUser := range account.Users {
|
||||||
if otherUser.Id == userID {
|
if otherUser.Id == userID {
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/netbirdio/netbird/shared/management/status"
|
|
||||||
"github.com/prometheus/client_golang/prometheus/push"
|
"github.com/prometheus/client_golang/prometheus/push"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
@@ -23,6 +22,9 @@ import (
|
|||||||
"go.opentelemetry.io/otel/metric/noop"
|
"go.opentelemetry.io/otel/metric/noop"
|
||||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||||
|
|
||||||
|
"github.com/netbirdio/netbird/management/internals/modules/reverseproxy/domain"
|
||||||
|
"github.com/netbirdio/netbird/shared/management/status"
|
||||||
|
|
||||||
nbdns "github.com/netbirdio/netbird/dns"
|
nbdns "github.com/netbirdio/netbird/dns"
|
||||||
"github.com/netbirdio/netbird/management/internals/controllers/network_map"
|
"github.com/netbirdio/netbird/management/internals/controllers/network_map"
|
||||||
"github.com/netbirdio/netbird/management/internals/controllers/network_map/controller"
|
"github.com/netbirdio/netbird/management/internals/controllers/network_map/controller"
|
||||||
@@ -1815,6 +1817,13 @@ func TestAccount_Copy(t *testing.T) {
|
|||||||
Targets: []*service.Target{},
|
Targets: []*service.Target{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Domains: []*domain.Domain{
|
||||||
|
{
|
||||||
|
ID: "domain1",
|
||||||
|
Domain: "test.com",
|
||||||
|
AccountID: "account1",
|
||||||
|
},
|
||||||
|
},
|
||||||
NetworkMapCache: &types.NetworkMapBuilder{},
|
NetworkMapCache: &types.NetworkMapBuilder{},
|
||||||
}
|
}
|
||||||
account.InitOnce()
|
account.InitOnce()
|
||||||
|
|||||||
@@ -396,6 +396,11 @@ func (s *SqlStore) DeleteAccount(ctx context.Context, account *types.Account) er
|
|||||||
return result.Error
|
return result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = tx.Select(clause.Associations).Delete(account.Services, "account_id = ?", account.Id)
|
||||||
|
if result.Error != nil {
|
||||||
|
return result.Error
|
||||||
|
}
|
||||||
|
|
||||||
result = tx.Select(clause.Associations).Delete(account)
|
result = tx.Select(clause.Associations).Delete(account)
|
||||||
if result.Error != nil {
|
if result.Error != nil {
|
||||||
return result.Error
|
return result.Error
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
nbdns "github.com/netbirdio/netbird/dns"
|
nbdns "github.com/netbirdio/netbird/dns"
|
||||||
|
proxydomain "github.com/netbirdio/netbird/management/internals/modules/reverseproxy/domain"
|
||||||
|
rpservice "github.com/netbirdio/netbird/management/internals/modules/reverseproxy/service"
|
||||||
"github.com/netbirdio/netbird/management/internals/modules/zones"
|
"github.com/netbirdio/netbird/management/internals/modules/zones"
|
||||||
"github.com/netbirdio/netbird/management/internals/modules/zones/records"
|
"github.com/netbirdio/netbird/management/internals/modules/zones/records"
|
||||||
resourceTypes "github.com/netbirdio/netbird/management/server/networks/resources/types"
|
resourceTypes "github.com/netbirdio/netbird/management/server/networks/resources/types"
|
||||||
@@ -350,6 +352,35 @@ func TestSqlite_DeleteAccount(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
account.Services = []*rpservice.Service{
|
||||||
|
{
|
||||||
|
ID: "service_id",
|
||||||
|
AccountID: account.Id,
|
||||||
|
Name: "test service",
|
||||||
|
Domain: "svc.example.com",
|
||||||
|
Enabled: true,
|
||||||
|
Targets: []*rpservice.Target{
|
||||||
|
{
|
||||||
|
AccountID: account.Id,
|
||||||
|
ServiceID: "service_id",
|
||||||
|
Host: "localhost",
|
||||||
|
Port: 8080,
|
||||||
|
Protocol: "http",
|
||||||
|
Enabled: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
account.Domains = []*proxydomain.Domain{
|
||||||
|
{
|
||||||
|
ID: "domain_id",
|
||||||
|
Domain: "custom.example.com",
|
||||||
|
AccountID: account.Id,
|
||||||
|
Validated: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
err = store.SaveAccount(context.Background(), account)
|
err = store.SaveAccount(context.Background(), account)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@@ -411,6 +442,20 @@ func TestSqlite_DeleteAccount(t *testing.T) {
|
|||||||
require.NoError(t, err, "expecting no error after removing DeleteAccount when searching for network resources")
|
require.NoError(t, err, "expecting no error after removing DeleteAccount when searching for network resources")
|
||||||
require.Len(t, resources, 0, "expecting no network resources to be found after DeleteAccount")
|
require.Len(t, resources, 0, "expecting no network resources to be found after DeleteAccount")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domains, err := store.ListCustomDomains(context.Background(), account.Id)
|
||||||
|
require.NoError(t, err, "expecting no error after DeleteAccount when searching for custom domains")
|
||||||
|
require.Len(t, domains, 0, "expecting no custom domains to be found after DeleteAccount")
|
||||||
|
|
||||||
|
var services []*rpservice.Service
|
||||||
|
err = store.(*SqlStore).db.Model(&rpservice.Service{}).Find(&services, "account_id = ?", account.Id).Error
|
||||||
|
require.NoError(t, err, "expecting no error after DeleteAccount when searching for services")
|
||||||
|
require.Len(t, services, 0, "expecting no services to be found after DeleteAccount")
|
||||||
|
|
||||||
|
var targets []*rpservice.Target
|
||||||
|
err = store.(*SqlStore).db.Model(&rpservice.Target{}).Find(&targets, "account_id = ?", account.Id).Error
|
||||||
|
require.NoError(t, err, "expecting no error after DeleteAccount when searching for service targets")
|
||||||
|
require.Len(t, targets, 0, "expecting no service targets to be found after DeleteAccount")
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_GetAccount(t *testing.T) {
|
func Test_GetAccount(t *testing.T) {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
nbdns "github.com/netbirdio/netbird/dns"
|
nbdns "github.com/netbirdio/netbird/dns"
|
||||||
|
"github.com/netbirdio/netbird/management/internals/modules/reverseproxy/domain"
|
||||||
"github.com/netbirdio/netbird/management/internals/modules/reverseproxy/service"
|
"github.com/netbirdio/netbird/management/internals/modules/reverseproxy/service"
|
||||||
resourceTypes "github.com/netbirdio/netbird/management/server/networks/resources/types"
|
resourceTypes "github.com/netbirdio/netbird/management/server/networks/resources/types"
|
||||||
routerTypes "github.com/netbirdio/netbird/management/server/networks/routers/types"
|
routerTypes "github.com/netbirdio/netbird/management/server/networks/routers/types"
|
||||||
@@ -265,6 +266,7 @@ func setupBenchmarkDB(b testing.TB) (*SqlStore, func(), string) {
|
|||||||
&nbdns.NameServerGroup{}, &posture.Checks{}, &networkTypes.Network{},
|
&nbdns.NameServerGroup{}, &posture.Checks{}, &networkTypes.Network{},
|
||||||
&routerTypes.NetworkRouter{}, &resourceTypes.NetworkResource{},
|
&routerTypes.NetworkRouter{}, &resourceTypes.NetworkResource{},
|
||||||
&types.AccountOnboarding{}, &service.Service{}, &service.Target{},
|
&types.AccountOnboarding{}, &service.Service{}, &service.Target{},
|
||||||
|
&domain.Domain{},
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := len(models) - 1; i >= 0; i-- {
|
for i := len(models) - 1; i >= 0; i-- {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import (
|
|||||||
|
|
||||||
"github.com/netbirdio/netbird/client/ssh/auth"
|
"github.com/netbirdio/netbird/client/ssh/auth"
|
||||||
nbdns "github.com/netbirdio/netbird/dns"
|
nbdns "github.com/netbirdio/netbird/dns"
|
||||||
|
proxydomain "github.com/netbirdio/netbird/management/internals/modules/reverseproxy/domain"
|
||||||
"github.com/netbirdio/netbird/management/internals/modules/reverseproxy/service"
|
"github.com/netbirdio/netbird/management/internals/modules/reverseproxy/service"
|
||||||
"github.com/netbirdio/netbird/management/internals/modules/zones"
|
"github.com/netbirdio/netbird/management/internals/modules/zones"
|
||||||
"github.com/netbirdio/netbird/management/internals/modules/zones/records"
|
"github.com/netbirdio/netbird/management/internals/modules/zones/records"
|
||||||
@@ -101,6 +102,7 @@ type Account struct {
|
|||||||
DNSSettings DNSSettings `gorm:"embedded;embeddedPrefix:dns_settings_"`
|
DNSSettings DNSSettings `gorm:"embedded;embeddedPrefix:dns_settings_"`
|
||||||
PostureChecks []*posture.Checks `gorm:"foreignKey:AccountID;references:id"`
|
PostureChecks []*posture.Checks `gorm:"foreignKey:AccountID;references:id"`
|
||||||
Services []*service.Service `gorm:"foreignKey:AccountID;references:id"`
|
Services []*service.Service `gorm:"foreignKey:AccountID;references:id"`
|
||||||
|
Domains []*proxydomain.Domain `gorm:"foreignKey:AccountID;references:id"`
|
||||||
// Settings is a dictionary of Account settings
|
// Settings is a dictionary of Account settings
|
||||||
Settings *Settings `gorm:"embedded;embeddedPrefix:settings_"`
|
Settings *Settings `gorm:"embedded;embeddedPrefix:settings_"`
|
||||||
Networks []*networkTypes.Network `gorm:"foreignKey:AccountID;references:id"`
|
Networks []*networkTypes.Network `gorm:"foreignKey:AccountID;references:id"`
|
||||||
@@ -911,6 +913,11 @@ func (a *Account) Copy() *Account {
|
|||||||
services = append(services, svc.Copy())
|
services = append(services, svc.Copy())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domains := []*proxydomain.Domain{}
|
||||||
|
for _, domain := range a.Domains {
|
||||||
|
domains = append(domains, domain.Copy())
|
||||||
|
}
|
||||||
|
|
||||||
return &Account{
|
return &Account{
|
||||||
Id: a.Id,
|
Id: a.Id,
|
||||||
CreatedBy: a.CreatedBy,
|
CreatedBy: a.CreatedBy,
|
||||||
@@ -936,6 +943,7 @@ func (a *Account) Copy() *Account {
|
|||||||
Onboarding: a.Onboarding,
|
Onboarding: a.Onboarding,
|
||||||
NetworkMapCache: a.NetworkMapCache,
|
NetworkMapCache: a.NetworkMapCache,
|
||||||
nmapInitOnce: a.nmapInitOnce,
|
nmapInitOnce: a.nmapInitOnce,
|
||||||
|
Domains: domains,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user