Skip to content

Commit

Permalink
support split table for internal storage
Browse files Browse the repository at this point in the history
Signed-off-by: calvin <wen.chen@daocloud.io>
  • Loading branch information
calvin committed Mar 25, 2024
1 parent 29c0306 commit d865443
Show file tree
Hide file tree
Showing 7 changed files with 188 additions and 99 deletions.
8 changes: 4 additions & 4 deletions examples/pediacluster.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ kind: PediaCluster
metadata:
name: cluster-example
spec:
apiserver: "https://10.30.43.43:6443"
caData:
apiserver: "https://10.6.212.13:6443"
caData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJUFZqajZCRkt2Nmt3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeU1qZ3dPRFF5TURSYUZ3MHpNekV5TWpVd09EUTNNRFJhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUM3VksrangrL2RxbDNKNW45N0VLSUYzdG0zT0FsUC9OeHBuL1F1NDkxdmxtWFRRQ2xHQ2NSOG1JaXcKVDZvODVDTm5YZG53NUEvdGRSM3l5Q0RlNlNwTm00NENMRWJxaDJmUXE2RXJoMGNBNFJVeWlwVCtXZVgxVHBSTQp6MDU5Y3pwT0twMllrbTZINmM0UWwxSktSb3F0OHpHelRCMHdDOG1IcUtMRlpqWFBZckYrRXdBWi9XaGlQaVQ3CjFRc3cyRjQyR2cvYk5ZVHAxclFVRU40NmxCZE1PNVF2Ykg0RlNGekY4OENhZUJOTlJBdUczZWp5L0doRWVUb0wKVGQ3RWgvS3REZWptK01mK1N4SWNMdzdOZTA2UnJSSThReWkrRUlBUEJiN0F4Sk9KTlphZWpsWG9PdGk2SEZaSApMV0xXY0I1VzlCa0lZWms2UmVHc2J2OWxYdzNWQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSUFE0eDQxQnZUOG9ra3lld1hMVVorV0Fzc2xqQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQllTNVBrYmtmOAp1Z3Y4eE1aRk1QZExWY3AzV3hWQllSQ1RaTDdZR2tQUTlFMHNsdHROWDF1bG9UektuNzF2ZlphMDRJdW03UHZyCmhOTW9yajQzZE9lSTkrYWxaRTJDQmJPRHg3djNZS2JSQVdNODdIMUt2S0E3Q3NCaCszV1lad1BrQlNNOEZVRmgKVmZLREFxMjF2SU1XakZNVVpUV3VSUDZjYTNPTUhCT0dxOWRQRTdGMXBNMnNOV0lCN2wwQlpKQjM5SEhOK09Wbwp1MURnRkw2a0hLakR5bkZTcFJuc0lhVzd4ejFhZjlocEJkUWNYZTU3RGtEUUh5QkFSNDh0a0k1bUt0OTM1VENnCldFdzhpbklxRHFsaDVUMkZ3UERCRHdLeTBGMDREdFpCWnk1UlhIaWp3YTFYYk94eUc5Sk8zU1dvNXIwLzFOblAKZFJKdlVFYUtyQ1BTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
tokenData:
certData:
keyData:
certData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJRjRsd2Y0dlQvN0l3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeU1qZ3dPRFF5TURSYUZ3MHlOREV5TWpjd09EUTNNRGRhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXoxQlNrcyt1VmhoWTByU2sKS1o5SU5sazBqd1VQWGpXbGVGZGVCeHBJd29ETWFBSlAzckFUeGNJa3FvRmlDWXJPNDJSUWgrSzdzWkdYTUhJbQptYXUwZUxmVVdNdCsvY3Bma0NtYTFiVnBsWm5nVjZNYjlwU2N4cmp6ZFpmWU9pMVlwU0hGN1dhOFZ2Z1Q1VFJwCjV4ZlFJK2F4Y21RY0h6QW42Sm1rbnpIZ1crbXI4WmUvRXRHbUlheTREbCtnQ2lTLzVsOXU1QVdtb2p5RHpSU2IKQnVtVVNEeEpoR0JYSG40cGFPNXYwVFpQRzV1THZDR2dGR2ZXbk92TzQ5WUJ4U29ZYWxwbm9PTHl4WVBQMDI5cQoxSE1FVEJsejhEUTE0a1EwYUl2SWxiWVdubTQyKytMQy9UcTd3M1JnbW8rRzJtaVNuTFRSM3dHc2dOVlJSRUdFCjJNOGtGUUlEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JSUFE0eDQxQnZUOG9ra3lld1hMVVorV0FzcwpsakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQ3hrN2xJejkwUnp5L01QSitFWDdPaU1XTjZKZmZJcHBvbjFKCmNtOGxoK015cEZNWnU4NWEzNTA3SWF3NlBXKzExQk1nbU4wc1BCL1MzS014U05LVUp1cFp5VlNCK1lud2VTTVMKekxTbnF6MzhDeVQrODUrb2lEQUt0SFZDZnltR3hPSHNXQ2FGVE5UdHJhYTFnNUI3MCtrNXpvakpMWnV3L3ZMeQpJRGxvM3U1elRPczJEV1hMQ3gxdXI1WWxSYnVybGh4Z0VGUXJncDUvOW9Mc1dNNGl3c2R0NW94Q0tTTVg4YXBuCjVrZmVtQ3BQenFrcXV2Rmt6WVVaczJZNGRCVGhKSCs4QVBJd0lFOW1FTG9KOTBZQWpLVGtwcGV6Ymhtc3RNZGIKTjBZZEZ6UEd2cXpoQzlpM3J4ZmR5RnQ1QTZrcG9GNnQrdTNwWkNKa0Q1SG84RGpla0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
keyData: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBejFCU2tzK3VWaGhZMHJTa0taOUlObGswandVUFhqV2xlRmRlQnhwSXdvRE1hQUpQCjNyQVR4Y0lrcW9GaUNZck80MlJRaCtLN3NaR1hNSEltbWF1MGVMZlVXTXQrL2NwZmtDbWExYlZwbFpuZ1Y2TWIKOXBTY3hyanpkWmZZT2kxWXBTSEY3V2E4VnZnVDVUUnA1eGZRSStheGNtUWNIekFuNkpta256SGdXK21yOFplLwpFdEdtSWF5NERsK2dDaVMvNWw5dTVBV21vanlEelJTYkJ1bVVTRHhKaEdCWEhuNHBhTzV2MFRaUEc1dUx2Q0dnCkZHZlduT3ZPNDlZQnhTb1lhbHBub09MeXhZUFAwMjlxMUhNRVRCbHo4RFExNGtRMGFJdklsYllXbm00MisrTEMKL1RxN3czUmdtbytHMm1pU25MVFIzd0dzZ05WUlJFR0UyTThrRlFJREFRQUJBb0lCQUN1dEFXaDZwb0R1NmkraAo3UC96MWJQVmdWUXNQYnVjVTdzUnRQYU1IQTRXTW5vckdvYVEwK21TNkVTZnMzYk5McDhMY0VmZ2hhaDRRc0RyCkc2UytYdXdiMW5uS2pYdU1XaXUyQ0MvRDQzV29FSEtHSTRzRWJpOFRvZjhCT1lXd0xmL0VLTDNHS2lHc2JBeWEKeVVEdGJHVlQ0Y2gydk5INVJEOGx0MS91a3hUcHVjRXdZYTRhUGRyNXBTTitSWk5SS3NmWlJQandDQi9YMFNuUwpJYXJuYjVIdXkvemlNZ3ZGM1VJWlVLclVUT2hNOWUxdjVlM3h0c29JSWlreEtSUnRITjJEMDFYUFpmMnVRSkY2ClNvRGUxaWZwS0tFVFRXR3dxbnAvTitKMzdhY1BRV0FVU0g4Nnd2UGxYd0F2QTRrTVRtSWhtQ2xsRGVUZENzSlAKZ1lZNUk3VUNnWUVBNm5BdFhBckNnQXkwb2xTb3VhcEc0cE5IRHdQcmhIRUx1OWRDRGpYZmtQQ0ZORmRrWjcyZwphL0VIUHI4UTRLQ0s3Y3ZhK2t4ZVpDcnhybUlVc0xkMW1kTHVZZzZOdjNEVjhpK0lNSk14NW9reDZaYnZrdUFPClBaVlpDOGVmK0VibDR3ME5TWmZWT3pFRm92elBNWENya01wbHFQWkR2TXRGR25rRXc5dTNnNk1DZ1lFQTRtR0EKNFVCMm5DK2tDUEtxY0ZrYWxlY3p6T20rVlpkTWRwSVFqODBSd1NsdDRoQXZvU3Z6YnRFWVFhQW5uOU9hSnZoWQpQSXMxbmc4aWZPUm9WTyt6bmg1ZkZTdnZIWjRQcXFnWW56cFp4cFd4NCsrZTlpcW1CbGRQaXl6Ny9kYld4S094Ck54bnljekVIYml6SFhiTXFOUjREaXZseGsrNWt4MXFoaDJ4QTlPY0NnWUJzSlVOSGFrOCs4cDJCSkx5UXFWUDUKd1NiT2JtaCt1QWRKcDRyNU16RG1rNDFmRDlGcGFiaFBFdWpjc1JjQUNBOE9rek40c3pIMzB6ZVowZlRwY0RmMwp0YTN4M2ZUVmt4K2VrUDZxS2J5ak5EYXFJczV4V3BvM0htWHRZVEVTUHVKZFV2QUdPdHhLYWRySHpRZG5MeXAxCnFHZ3RBUzFPTWhhMmw0enpMTEFETVFLQmdGNDRzTmlQNlE0V3NoSmJWZDhPNXdiUFJQc2JxbkdiV0dMZFpuRkQKckFrV2dqcWQvQVQ3OHdVRG1ESHdRNjI4OTZNU3FEOEN2ZDA4ZFdFLys4Q21SNzhlNnZvMzMvMFd4WFNGSkVKWgptZllTWmdqMXVkYkJaM3FxS2x4RjY5ZjU3RWZKemIrZVdBL2pyekVIQ0MrU201V2lHVjFsZHdWWUtxL2lvK3BtCmZ4NnZBb0dCQU9TeWpOWkw5eHhJVGx6bDBzMFRDb1R1YTIzSlBORjlTakNuVElRak9NUlhhNnUxdnBocXNKTFcKSEhyNy84NUFZQWZ1clp2VitzVzcvcnZmSmFaMStVeW4yeUF1THJFeE5CWmNJVC94WWZweFlVNDhnQ3dvZW8zQgorZ083NXdFUDRuUHEvNC81cWF3VnRkWkhveXhYWk9KTkFYUkl3eUdPc211Y0wrN0Q3WGd4Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
syncResources:
- group: apps
resources:
Expand Down
30 changes: 5 additions & 25 deletions pkg/storage/internalstorage/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import (
"gopkg.in/natefinch/lumberjack.v2"
"gorm.io/gorm/logger"
"k8s.io/klog/v2"

clusterv1alpha2 "github.com/clusterpedia-io/api/cluster/v1alpha2"
)

const (
Expand All @@ -29,9 +27,9 @@ const (
type DivisionPolicy string

const (
DivisionPolicyNone DivisionPolicy = "None"
DivisionPolicyGroupResource DivisionPolicy = "GroupResource"
DivisionPolicyCustom DivisionPolicy = "Custom"
DivisionPolicyNone DivisionPolicy = "None"
DivisionPolicyGroupVersionResource DivisionPolicy = "GVR"
DivisionPolicyCustom DivisionPolicy = "Custom"
)

type Config struct {
Expand All @@ -58,30 +56,12 @@ type Config struct {

Params map[string]string `yaml:"params"`

AutoMigration *bool `yaml:"autoMigration"` // If set to false, no tables will be created
DivisionPolicy DivisionPolicy `yaml:"divisionPolicy"`
Mapper []ResourceMapper `yaml:"mapper"` // Only DivisionPolicy is DivisionPolicyCustom it need to specify the mapping between resource and table
SkipAutoMigration bool `yaml:"skipAutoMigration"` // If set to false, no tables will be created
DivisionPolicy DivisionPolicy `yaml:"divisionPolicy"`

Log *LogConfig `yaml:"log"`
}

type ResourceMapper struct {
Table *Table `yaml:"table"`
Resources []clusterv1alpha2.ClusterGroupResources `yaml:"resources"`
}

type Table struct {
Name string `yaml:"name"`
ExtraFields []ExtraField `yaml:"extraFields"`
}

type ExtraField struct {
Name string `yaml:"name"`
PlainPath string `yaml:"plainPath"`
Type string `yaml:"type"`
Index string `yaml:"index"`
}

type LogConfig struct {
Stdout bool `yaml:"stdout"`
Level string `yaml:"level"`
Expand Down
14 changes: 13 additions & 1 deletion pkg/storage/internalstorage/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,19 @@ func NewStorageFactory(configPath string) (storage.StorageFactory, error) {
sqlDB.SetMaxOpenConns(connPool.MaxOpenConns)
sqlDB.SetConnMaxLifetime(connPool.ConnMaxLifetime)

return &StorageFactory{db}, nil
if !cfg.SkipAutoMigration && (cfg.DivisionPolicy == DivisionPolicyNone || cfg.DivisionPolicy == "") {
if exist := db.Migrator().HasTable("resources"); !exist {
if err := db.AutoMigrate(&Resource{}); err != nil {
return nil, err
}
}
}

return &StorageFactory{
db: db,
SkipAutoMigration: cfg.SkipAutoMigration,
DivisionPolicy: cfg.DivisionPolicy,
}, nil
}

func newLogger(cfg *Config) (logger.Interface, error) {
Expand Down
66 changes: 37 additions & 29 deletions pkg/storage/internalstorage/resource_storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ import (
)

type ResourceStorage struct {
db *gorm.DB
codec runtime.Codec

db *gorm.DB
model interface{}
codec runtime.Codec
storageGroupResource schema.GroupResource
storageVersion schema.GroupVersion
memoryVersion schema.GroupVersion
Expand Down Expand Up @@ -83,7 +83,7 @@ func (s *ResourceStorage) Create(ctx context.Context, cluster string, obj runtim
resource.DeletedAt = sql.NullTime{Time: deletedAt.Time, Valid: true}
}

result := s.db.WithContext(ctx).Create(&resource)
result := s.db.WithContext(ctx).Model(s.model).Create(&resource)
return InterpretResourceDBError(cluster, metaobj.GetName(), result.Error)
}

Expand Down Expand Up @@ -116,14 +116,18 @@ func (s *ResourceStorage) Update(ctx context.Context, cluster string, obj runtim
updatedResource["deleted_at"] = sql.NullTime{Time: deletedAt.Time, Valid: true}
}

result := s.db.WithContext(ctx).Model(&Resource{}).Where(map[string]interface{}{
"cluster": cluster,
"group": s.storageGroupResource.Group,
"version": s.storageVersion.Version,
"resource": s.storageGroupResource.Resource,
"namespace": metaobj.GetNamespace(),
"name": metaobj.GetName(),
}).Updates(updatedResource)
result := s.db.WithContext(ctx).
Model(s.model).
Where(map[string]interface{}{
"cluster": cluster,
"group": s.storageGroupResource.Group,
"version": s.storageVersion.Version,
"resource": s.storageGroupResource.Resource,
"namespace": metaobj.GetNamespace(),
"name": metaobj.GetName(),
}).
Updates(updatedResource)

return InterpretResourceDBError(cluster, metaobj.GetName(), result.Error)
}

Expand All @@ -144,14 +148,15 @@ func (s *ResourceStorage) ConvertDeletedObject(obj interface{}) (runtime.Object,
}

func (s *ResourceStorage) deleteObject(cluster, namespace, name string) *gorm.DB {
return s.db.Model(&Resource{}).Where(map[string]interface{}{
"cluster": cluster,
"group": s.storageGroupResource.Group,
"version": s.storageVersion.Version,
"resource": s.storageGroupResource.Resource,
"namespace": namespace,
"name": name,
}).Delete(&Resource{})
return s.db.Model(s.model).
Where(map[string]interface{}{
"cluster": cluster,
"group": s.storageGroupResource.Group,
"version": s.storageVersion.Version,
"resource": s.storageGroupResource.Resource,
"namespace": namespace,
"name": name,
}).Delete(&Resource{})
}

func (s *ResourceStorage) Delete(ctx context.Context, cluster string, obj runtime.Object) error {
Expand All @@ -167,14 +172,17 @@ func (s *ResourceStorage) Delete(ctx context.Context, cluster string, obj runtim
}

func (s *ResourceStorage) genGetObjectQuery(ctx context.Context, cluster, namespace, name string) *gorm.DB {
return s.db.WithContext(ctx).Model(&Resource{}).Select("object").Where(map[string]interface{}{
"cluster": cluster,
"group": s.storageGroupResource.Group,
"version": s.storageVersion.Version,
"resource": s.storageGroupResource.Resource,
"namespace": namespace,
"name": name,
})
return s.db.WithContext(ctx).
Model(s.model).
Select("object").
Where(map[string]interface{}{
"cluster": cluster,
"group": s.storageGroupResource.Group,
"version": s.storageVersion.Version,
"resource": s.storageGroupResource.Resource,
"namespace": namespace,
"name": name,
})
}

func (s *ResourceStorage) Get(ctx context.Context, cluster, namespace, name string, into runtime.Object) error {
Expand All @@ -199,7 +207,7 @@ func (s *ResourceStorage) genListObjectsQuery(ctx context.Context, opts *interna
result = &ResourceMetadataList{}
}

query := s.db.WithContext(ctx).Model(&Resource{})
query := s.db.WithContext(ctx).Model(s.model)
query = query.Where(map[string]interface{}{
"group": s.storageGroupResource.Group,
"version": s.storageVersion.Version,
Expand Down
2 changes: 1 addition & 1 deletion pkg/storage/internalstorage/resource_storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ func TestResourceStorage_Update(t *testing.T) {

func newTestResourceStorage(db *gorm.DB, storageGVK schema.GroupVersionResource) *ResourceStorage {
return &ResourceStorage{
db: db,
db: db.Table("resources").Model(&Resource{}),
storageGroupResource: storageGVK.GroupResource(),
storageVersion: storageGVK.GroupVersion(),
}
Expand Down
143 changes: 105 additions & 38 deletions pkg/storage/internalstorage/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package internalstorage
import (
"context"
"fmt"
"strings"

"gorm.io/gorm"
"k8s.io/apimachinery/pkg/runtime/schema"
Expand All @@ -12,30 +13,13 @@ import (
)

type StorageFactory struct {
db *gorm.DB
AutoMigration *bool
DivisionPolicy DivisionPolicy
Mapper []ResourceMapper
db *gorm.DB
model interface{}
SkipAutoMigration bool
DivisionPolicy DivisionPolicy
}

func (s *StorageFactory) AutoMigrate() error {
if s.AutoMigration != nil && *s.AutoMigration {
switch s.DivisionPolicy {
if err := s.db.AutoMigrate(&Resource{}); err != nil {
return err
}
case "", DivisionPolicyNone:
case DivisionPolicyGroupResource:

}

if s.DivisionPolicy == "" || s.DivisionPolicy == DivisionPolicyNone {
if err := s.db.AutoMigrate(&Resource{}); err != nil {
return err
}
}
}

return nil
}

Expand All @@ -44,10 +28,40 @@ func (s *StorageFactory) GetSupportedRequestVerbs() []string {
}

func (s *StorageFactory) NewResourceStorage(config *storage.ResourceStorageConfig) (storage.ResourceStorage, error) {
return &ResourceStorage{
db: s.db,
codec: config.Codec,
gvr := schema.GroupVersionResource{
Group: config.StorageGroupResource.Group,
Version: config.StorageVersion.Version,
Resource: config.StorageGroupResource.Resource,
}
table := s.tableName(gvr)

var model interface{}
switch s.DivisionPolicy {
case DivisionPolicyGroupVersionResource:
model = &GroupVersionResource{}
if !s.SkipAutoMigration {
if exist := s.db.Migrator().HasTable(table); !exist {
if err := s.db.AutoMigrate(&GroupVersionResource{}); err != nil {
return nil, err
}

if err := s.db.Migrator().RenameTable("group_version_resources", table); err != nil {
if !s.db.Migrator().HasTable(table) {
return nil, err
}
}
}
}
default:
model = &Resource{}
}

s.model = model

return &ResourceStorage{
db: s.db.Table(table),
model: model,
codec: config.Codec,
storageGroupResource: config.StorageGroupResource,
storageVersion: config.StorageVersion,
memoryVersion: config.MemoryVersion,
Expand All @@ -64,12 +78,22 @@ func (s *StorageFactory) NewCollectionResourceStorage(cr *internal.CollectionRes
}

func (s *StorageFactory) GetResourceVersions(ctx context.Context, cluster string) (map[schema.GroupVersionResource]map[string]interface{}, error) {
tables, err := s.db.Migrator().GetTables()
if err != nil {
return nil, err
}

var resources []Resource
result := s.db.WithContext(ctx).Select("group", "version", "resource", "namespace", "name", "resource_version").
Where(map[string]interface{}{"cluster": cluster}).
Find(&resources)
if result.Error != nil {
return nil, InterpretDBError(cluster, result.Error)
for _, table := range tables {
result := s.db.WithContext(ctx).
Model(s.model).
Table(table).
Select("group", "version", "resource", "namespace", "name", "resource_version").
Where(map[string]interface{}{"cluster": cluster}).
Find(&resources)
if result.Error != nil {
return nil, InterpretDBError(cluster, result.Error)
}
}

resourceversions := make(map[schema.GroupVersionResource]map[string]interface{})
Expand All @@ -91,18 +115,42 @@ func (s *StorageFactory) GetResourceVersions(ctx context.Context, cluster string
}

func (s *StorageFactory) CleanCluster(ctx context.Context, cluster string) error {
result := s.db.WithContext(ctx).Where(map[string]interface{}{"cluster": cluster}).Delete(&Resource{})
return InterpretDBError(cluster, result.Error)
tables, err := s.db.Migrator().GetTables()
if err != nil {
return err
}

for _, table := range tables {
result := s.db.WithContext(ctx).Table(table).Model(s.model).Where(map[string]interface{}{"cluster": cluster}).Delete(&Resource{})
if result.Error != nil {
return InterpretDBError(cluster, result.Error)
}
}

return nil
}

func (s *StorageFactory) CleanClusterResource(ctx context.Context, cluster string, gvr schema.GroupVersionResource) error {
result := s.db.WithContext(ctx).Where(map[string]interface{}{
"cluster": cluster,
"group": gvr.Group,
"version": gvr.Version,
"resource": gvr.Resource,
}).Delete(&Resource{})
return InterpretDBError(fmt.Sprintf("%s/%s", cluster, gvr), result.Error)
err := s.db.Transaction(func(db *gorm.DB) error {
result := s.db.WithContext(ctx).
Table(s.tableName(gvr)).
Model(s.model).
Where(map[string]interface{}{
"cluster": cluster,
"group": gvr.Group,
"version": gvr.Version,
"resource": gvr.Resource,
}).
Delete(&Resource{})

if result.Error != nil {
return result.Error
}

return nil
})

return InterpretDBError(fmt.Sprintf("%s/%s", cluster, gvr), err)
}

func (s *StorageFactory) GetCollectionResources(ctx context.Context) ([]*internal.CollectionResource, error) {
Expand All @@ -116,3 +164,22 @@ func (s *StorageFactory) GetCollectionResources(ctx context.Context) ([]*interna
func (s *StorageFactory) PrepareCluster(cluster string) error {
return nil
}

// GenerateTableFor return table name using gvr string
func GenerateTableFor(gvr schema.GroupVersionResource) string {
if gvr.Group == "" {
return fmt.Sprintf("%s_%s", gvr.Version, gvr.Resource)
}

group := strings.ReplaceAll(gvr.Group, ".", "_")
return fmt.Sprintf("%s_%s_%s", group, gvr.Version, gvr.Resource)
}

func (s *StorageFactory) tableName(gvr schema.GroupVersionResource) string {
table := "resources"
if s.DivisionPolicy == DivisionPolicyGroupVersionResource {
table = GenerateTableFor(gvr)
}

return table
}
Loading

0 comments on commit d865443

Please sign in to comment.