removed condition on 1 yop per account

This commit is contained in:
crn4
2026-04-21 15:12:52 +02:00
parent e62521132c
commit 8fe2b5ec1e
5 changed files with 12 additions and 49 deletions

View File

@@ -1,12 +1,9 @@
package proxy
import (
"errors"
"time"
)
var ErrAccountProxyAlreadyExists = errors.New("account already has a registered proxy")
const (
StatusConnected = "connected"
StatusDisconnected = "disconnected"
@@ -28,7 +25,7 @@ type Proxy struct {
ID string `gorm:"primaryKey;type:varchar(255)"`
ClusterAddress string `gorm:"type:varchar(255);not null;index:idx_proxy_cluster_status"`
IPAddress string `gorm:"type:varchar(45)"`
AccountID *string `gorm:"type:varchar(255);uniqueIndex:idx_proxy_account_id_unique"`
AccountID *string `gorm:"type:varchar(255);index:idx_proxy_account_id"`
LastSeen time.Time `gorm:"not null;index:idx_proxy_last_seen"`
ConnectedAt *time.Time
DisconnectedAt *time.Time

View File

@@ -194,23 +194,6 @@ func (s *ProxyServiceServer) GetMappingUpdate(req *proto.GetMappingUpdateRequest
if token != nil && token.AccountID != nil {
accountID = token.AccountID
existingProxy, err := s.proxyManager.GetAccountProxy(ctx, *accountID)
if err != nil {
if s, ok := nbstatus.FromError(err); ok && s.ErrorType == nbstatus.NotFound {
log.WithContext(ctx).Debugf("no existing BYOP proxy for account %s", *accountID)
} else {
return status.Errorf(codes.Internal, "failed to check existing proxy: %v", err)
}
}
if existingProxy != nil && existingProxy.ID != proxyID {
if existingProxy.Status == proxy.StatusConnected {
return status.Errorf(codes.ResourceExhausted, "limit of 1 self-hosted proxy per account")
}
if err := s.proxyManager.DeleteProxy(ctx, existingProxy.ID); err != nil {
log.WithContext(ctx).Warnf("failed to cleanup disconnected proxy %s: %v", existingProxy.ID, err)
}
}
available, err := s.proxyManager.IsClusterAddressAvailable(ctx, proxyAddress, *accountID)
if err != nil {
return status.Errorf(codes.Internal, "check cluster address: %v", err)
@@ -248,9 +231,6 @@ func (s *ProxyServiceServer) GetMappingUpdate(req *proto.GetMappingUpdateRequest
if err := s.proxyManager.Connect(ctx, proxyID, proxyAddress, peerInfo, accountID, caps); err != nil {
if accountID != nil {
cancel()
if errors.Is(err, proxy.ErrAccountProxyAlreadyExists) {
return status.Errorf(codes.ResourceExhausted, "limit of 1 self-hosted proxy per account")
}
return status.Errorf(codes.Internal, "failed to register BYOP proxy: %v", err)
}
log.WithContext(ctx).Warnf("Failed to register proxy %s in database: %v", proxyID, err)

View File

@@ -17,7 +17,6 @@ import (
"time"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgconn"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/rs/xid"
log "github.com/sirupsen/logrus"
@@ -5476,26 +5475,11 @@ func (s *SqlStore) SaveProxy(ctx context.Context, p *proxy.Proxy) error {
result := s.db.WithContext(ctx).Save(p)
if result.Error != nil {
log.WithContext(ctx).Errorf("failed to save proxy: %v", result.Error)
if isUniqueConstraintError(result.Error) {
return proxy.ErrAccountProxyAlreadyExists
}
return status.Errorf(status.Internal, "failed to save proxy")
}
return nil
}
func isUniqueConstraintError(err error) bool {
var pgErr *pgconn.PgError
if errors.As(err, &pgErr) && pgErr.Code == "23505" {
return true
}
errStr := err.Error()
return strings.Contains(errStr, "UNIQUE constraint") ||
strings.Contains(errStr, "duplicate key") ||
strings.Contains(errStr, "Duplicate entry") ||
strings.Contains(errStr, "Error 1062")
}
func (s *SqlStore) DisconnectProxy(ctx context.Context, proxyID string) error {
now := time.Now()
result := s.db.WithContext(ctx).

View File

@@ -502,6 +502,9 @@ func getMigrationsPostAuto(ctx context.Context) []migrationFunc {
func(db *gorm.DB) error {
return migration.CreateIndexIfNotExists[nbpeer.Peer](ctx, db, "idx_peers_key_unique", "key")
},
func(db *gorm.DB) error {
return migration.DropIndex[proxy.Proxy](ctx, db, "idx_proxy_account_id_unique")
},
}
}