Skip to content

Commit d865443

Browse files
author
calvin
committed
support split table for internal storage
Signed-off-by: calvin <[email protected]>
1 parent 29c0306 commit d865443

File tree

7 files changed

+188
-99
lines changed

7 files changed

+188
-99
lines changed

examples/pediacluster.yaml

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ kind: PediaCluster
33
metadata:
44
name: cluster-example
55
spec:
6-
apiserver: "https://10.30.43.43:6443"
7-
caData:
6+
apiserver: "https://10.6.212.13:6443"
7+
caData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJUFZqajZCRkt2Nmt3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeU1qZ3dPRFF5TURSYUZ3MHpNekV5TWpVd09EUTNNRFJhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUM3VksrangrL2RxbDNKNW45N0VLSUYzdG0zT0FsUC9OeHBuL1F1NDkxdmxtWFRRQ2xHQ2NSOG1JaXcKVDZvODVDTm5YZG53NUEvdGRSM3l5Q0RlNlNwTm00NENMRWJxaDJmUXE2RXJoMGNBNFJVeWlwVCtXZVgxVHBSTQp6MDU5Y3pwT0twMllrbTZINmM0UWwxSktSb3F0OHpHelRCMHdDOG1IcUtMRlpqWFBZckYrRXdBWi9XaGlQaVQ3CjFRc3cyRjQyR2cvYk5ZVHAxclFVRU40NmxCZE1PNVF2Ykg0RlNGekY4OENhZUJOTlJBdUczZWp5L0doRWVUb0wKVGQ3RWgvS3REZWptK01mK1N4SWNMdzdOZTA2UnJSSThReWkrRUlBUEJiN0F4Sk9KTlphZWpsWG9PdGk2SEZaSApMV0xXY0I1VzlCa0lZWms2UmVHc2J2OWxYdzNWQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSUFE0eDQxQnZUOG9ra3lld1hMVVorV0Fzc2xqQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQllTNVBrYmtmOAp1Z3Y4eE1aRk1QZExWY3AzV3hWQllSQ1RaTDdZR2tQUTlFMHNsdHROWDF1bG9UektuNzF2ZlphMDRJdW03UHZyCmhOTW9yajQzZE9lSTkrYWxaRTJDQmJPRHg3djNZS2JSQVdNODdIMUt2S0E3Q3NCaCszV1lad1BrQlNNOEZVRmgKVmZLREFxMjF2SU1XakZNVVpUV3VSUDZjYTNPTUhCT0dxOWRQRTdGMXBNMnNOV0lCN2wwQlpKQjM5SEhOK09Wbwp1MURnRkw2a0hLakR5bkZTcFJuc0lhVzd4ejFhZjlocEJkUWNYZTU3RGtEUUh5QkFSNDh0a0k1bUt0OTM1VENnCldFdzhpbklxRHFsaDVUMkZ3UERCRHdLeTBGMDREdFpCWnk1UlhIaWp3YTFYYk94eUc5Sk8zU1dvNXIwLzFOblAKZFJKdlVFYUtyQ1BTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
88
tokenData:
9-
certData:
10-
keyData:
9+
certData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJRjRsd2Y0dlQvN0l3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeU1qZ3dPRFF5TURSYUZ3MHlOREV5TWpjd09EUTNNRGRhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXoxQlNrcyt1VmhoWTByU2sKS1o5SU5sazBqd1VQWGpXbGVGZGVCeHBJd29ETWFBSlAzckFUeGNJa3FvRmlDWXJPNDJSUWgrSzdzWkdYTUhJbQptYXUwZUxmVVdNdCsvY3Bma0NtYTFiVnBsWm5nVjZNYjlwU2N4cmp6ZFpmWU9pMVlwU0hGN1dhOFZ2Z1Q1VFJwCjV4ZlFJK2F4Y21RY0h6QW42Sm1rbnpIZ1crbXI4WmUvRXRHbUlheTREbCtnQ2lTLzVsOXU1QVdtb2p5RHpSU2IKQnVtVVNEeEpoR0JYSG40cGFPNXYwVFpQRzV1THZDR2dGR2ZXbk92TzQ5WUJ4U29ZYWxwbm9PTHl4WVBQMDI5cQoxSE1FVEJsejhEUTE0a1EwYUl2SWxiWVdubTQyKytMQy9UcTd3M1JnbW8rRzJtaVNuTFRSM3dHc2dOVlJSRUdFCjJNOGtGUUlEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JSUFE0eDQxQnZUOG9ra3lld1hMVVorV0FzcwpsakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQ3hrN2xJejkwUnp5L01QSitFWDdPaU1XTjZKZmZJcHBvbjFKCmNtOGxoK015cEZNWnU4NWEzNTA3SWF3NlBXKzExQk1nbU4wc1BCL1MzS014U05LVUp1cFp5VlNCK1lud2VTTVMKekxTbnF6MzhDeVQrODUrb2lEQUt0SFZDZnltR3hPSHNXQ2FGVE5UdHJhYTFnNUI3MCtrNXpvakpMWnV3L3ZMeQpJRGxvM3U1elRPczJEV1hMQ3gxdXI1WWxSYnVybGh4Z0VGUXJncDUvOW9Mc1dNNGl3c2R0NW94Q0tTTVg4YXBuCjVrZmVtQ3BQenFrcXV2Rmt6WVVaczJZNGRCVGhKSCs4QVBJd0lFOW1FTG9KOTBZQWpLVGtwcGV6Ymhtc3RNZGIKTjBZZEZ6UEd2cXpoQzlpM3J4ZmR5RnQ1QTZrcG9GNnQrdTNwWkNKa0Q1SG84RGpla0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
10+
keyData: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBejFCU2tzK3VWaGhZMHJTa0taOUlObGswandVUFhqV2xlRmRlQnhwSXdvRE1hQUpQCjNyQVR4Y0lrcW9GaUNZck80MlJRaCtLN3NaR1hNSEltbWF1MGVMZlVXTXQrL2NwZmtDbWExYlZwbFpuZ1Y2TWIKOXBTY3hyanpkWmZZT2kxWXBTSEY3V2E4VnZnVDVUUnA1eGZRSStheGNtUWNIekFuNkpta256SGdXK21yOFplLwpFdEdtSWF5NERsK2dDaVMvNWw5dTVBV21vanlEelJTYkJ1bVVTRHhKaEdCWEhuNHBhTzV2MFRaUEc1dUx2Q0dnCkZHZlduT3ZPNDlZQnhTb1lhbHBub09MeXhZUFAwMjlxMUhNRVRCbHo4RFExNGtRMGFJdklsYllXbm00MisrTEMKL1RxN3czUmdtbytHMm1pU25MVFIzd0dzZ05WUlJFR0UyTThrRlFJREFRQUJBb0lCQUN1dEFXaDZwb0R1NmkraAo3UC96MWJQVmdWUXNQYnVjVTdzUnRQYU1IQTRXTW5vckdvYVEwK21TNkVTZnMzYk5McDhMY0VmZ2hhaDRRc0RyCkc2UytYdXdiMW5uS2pYdU1XaXUyQ0MvRDQzV29FSEtHSTRzRWJpOFRvZjhCT1lXd0xmL0VLTDNHS2lHc2JBeWEKeVVEdGJHVlQ0Y2gydk5INVJEOGx0MS91a3hUcHVjRXdZYTRhUGRyNXBTTitSWk5SS3NmWlJQandDQi9YMFNuUwpJYXJuYjVIdXkvemlNZ3ZGM1VJWlVLclVUT2hNOWUxdjVlM3h0c29JSWlreEtSUnRITjJEMDFYUFpmMnVRSkY2ClNvRGUxaWZwS0tFVFRXR3dxbnAvTitKMzdhY1BRV0FVU0g4Nnd2UGxYd0F2QTRrTVRtSWhtQ2xsRGVUZENzSlAKZ1lZNUk3VUNnWUVBNm5BdFhBckNnQXkwb2xTb3VhcEc0cE5IRHdQcmhIRUx1OWRDRGpYZmtQQ0ZORmRrWjcyZwphL0VIUHI4UTRLQ0s3Y3ZhK2t4ZVpDcnhybUlVc0xkMW1kTHVZZzZOdjNEVjhpK0lNSk14NW9reDZaYnZrdUFPClBaVlpDOGVmK0VibDR3ME5TWmZWT3pFRm92elBNWENya01wbHFQWkR2TXRGR25rRXc5dTNnNk1DZ1lFQTRtR0EKNFVCMm5DK2tDUEtxY0ZrYWxlY3p6T20rVlpkTWRwSVFqODBSd1NsdDRoQXZvU3Z6YnRFWVFhQW5uOU9hSnZoWQpQSXMxbmc4aWZPUm9WTyt6bmg1ZkZTdnZIWjRQcXFnWW56cFp4cFd4NCsrZTlpcW1CbGRQaXl6Ny9kYld4S094Ck54bnljekVIYml6SFhiTXFOUjREaXZseGsrNWt4MXFoaDJ4QTlPY0NnWUJzSlVOSGFrOCs4cDJCSkx5UXFWUDUKd1NiT2JtaCt1QWRKcDRyNU16RG1rNDFmRDlGcGFiaFBFdWpjc1JjQUNBOE9rek40c3pIMzB6ZVowZlRwY0RmMwp0YTN4M2ZUVmt4K2VrUDZxS2J5ak5EYXFJczV4V3BvM0htWHRZVEVTUHVKZFV2QUdPdHhLYWRySHpRZG5MeXAxCnFHZ3RBUzFPTWhhMmw0enpMTEFETVFLQmdGNDRzTmlQNlE0V3NoSmJWZDhPNXdiUFJQc2JxbkdiV0dMZFpuRkQKckFrV2dqcWQvQVQ3OHdVRG1ESHdRNjI4OTZNU3FEOEN2ZDA4ZFdFLys4Q21SNzhlNnZvMzMvMFd4WFNGSkVKWgptZllTWmdqMXVkYkJaM3FxS2x4RjY5ZjU3RWZKemIrZVdBL2pyekVIQ0MrU201V2lHVjFsZHdWWUtxL2lvK3BtCmZ4NnZBb0dCQU9TeWpOWkw5eHhJVGx6bDBzMFRDb1R1YTIzSlBORjlTakNuVElRak9NUlhhNnUxdnBocXNKTFcKSEhyNy84NUFZQWZ1clp2VitzVzcvcnZmSmFaMStVeW4yeUF1THJFeE5CWmNJVC94WWZweFlVNDhnQ3dvZW8zQgorZ083NXdFUDRuUHEvNC81cWF3VnRkWkhveXhYWk9KTkFYUkl3eUdPc211Y0wrN0Q3WGd4Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
1111
syncResources:
1212
- group: apps
1313
resources:

pkg/storage/internalstorage/config.go

+5-25
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import (
1515
"gopkg.in/natefinch/lumberjack.v2"
1616
"gorm.io/gorm/logger"
1717
"k8s.io/klog/v2"
18-
19-
clusterv1alpha2 "github.com/clusterpedia-io/api/cluster/v1alpha2"
2018
)
2119

2220
const (
@@ -29,9 +27,9 @@ const (
2927
type DivisionPolicy string
3028

3129
const (
32-
DivisionPolicyNone DivisionPolicy = "None"
33-
DivisionPolicyGroupResource DivisionPolicy = "GroupResource"
34-
DivisionPolicyCustom DivisionPolicy = "Custom"
30+
DivisionPolicyNone DivisionPolicy = "None"
31+
DivisionPolicyGroupVersionResource DivisionPolicy = "GVR"
32+
DivisionPolicyCustom DivisionPolicy = "Custom"
3533
)
3634

3735
type Config struct {
@@ -58,30 +56,12 @@ type Config struct {
5856

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

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

6562
Log *LogConfig `yaml:"log"`
6663
}
6764

68-
type ResourceMapper struct {
69-
Table *Table `yaml:"table"`
70-
Resources []clusterv1alpha2.ClusterGroupResources `yaml:"resources"`
71-
}
72-
73-
type Table struct {
74-
Name string `yaml:"name"`
75-
ExtraFields []ExtraField `yaml:"extraFields"`
76-
}
77-
78-
type ExtraField struct {
79-
Name string `yaml:"name"`
80-
PlainPath string `yaml:"plainPath"`
81-
Type string `yaml:"type"`
82-
Index string `yaml:"index"`
83-
}
84-
8565
type LogConfig struct {
8666
Stdout bool `yaml:"stdout"`
8767
Level string `yaml:"level"`

pkg/storage/internalstorage/register.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,19 @@ func NewStorageFactory(configPath string) (storage.StorageFactory, error) {
9393
sqlDB.SetMaxOpenConns(connPool.MaxOpenConns)
9494
sqlDB.SetConnMaxLifetime(connPool.ConnMaxLifetime)
9595

96-
return &StorageFactory{db}, nil
96+
if !cfg.SkipAutoMigration && (cfg.DivisionPolicy == DivisionPolicyNone || cfg.DivisionPolicy == "") {
97+
if exist := db.Migrator().HasTable("resources"); !exist {
98+
if err := db.AutoMigrate(&Resource{}); err != nil {
99+
return nil, err
100+
}
101+
}
102+
}
103+
104+
return &StorageFactory{
105+
db: db,
106+
SkipAutoMigration: cfg.SkipAutoMigration,
107+
DivisionPolicy: cfg.DivisionPolicy,
108+
}, nil
97109
}
98110

99111
func newLogger(cfg *Config) (logger.Interface, error) {

pkg/storage/internalstorage/resource_storage.go

+37-29
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ import (
2727
)
2828

2929
type ResourceStorage struct {
30-
db *gorm.DB
31-
codec runtime.Codec
32-
30+
db *gorm.DB
31+
model interface{}
32+
codec runtime.Codec
3333
storageGroupResource schema.GroupResource
3434
storageVersion schema.GroupVersion
3535
memoryVersion schema.GroupVersion
@@ -83,7 +83,7 @@ func (s *ResourceStorage) Create(ctx context.Context, cluster string, obj runtim
8383
resource.DeletedAt = sql.NullTime{Time: deletedAt.Time, Valid: true}
8484
}
8585

86-
result := s.db.WithContext(ctx).Create(&resource)
86+
result := s.db.WithContext(ctx).Model(s.model).Create(&resource)
8787
return InterpretResourceDBError(cluster, metaobj.GetName(), result.Error)
8888
}
8989

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

119-
result := s.db.WithContext(ctx).Model(&Resource{}).Where(map[string]interface{}{
120-
"cluster": cluster,
121-
"group": s.storageGroupResource.Group,
122-
"version": s.storageVersion.Version,
123-
"resource": s.storageGroupResource.Resource,
124-
"namespace": metaobj.GetNamespace(),
125-
"name": metaobj.GetName(),
126-
}).Updates(updatedResource)
119+
result := s.db.WithContext(ctx).
120+
Model(s.model).
121+
Where(map[string]interface{}{
122+
"cluster": cluster,
123+
"group": s.storageGroupResource.Group,
124+
"version": s.storageVersion.Version,
125+
"resource": s.storageGroupResource.Resource,
126+
"namespace": metaobj.GetNamespace(),
127+
"name": metaobj.GetName(),
128+
}).
129+
Updates(updatedResource)
130+
127131
return InterpretResourceDBError(cluster, metaobj.GetName(), result.Error)
128132
}
129133

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

146150
func (s *ResourceStorage) deleteObject(cluster, namespace, name string) *gorm.DB {
147-
return s.db.Model(&Resource{}).Where(map[string]interface{}{
148-
"cluster": cluster,
149-
"group": s.storageGroupResource.Group,
150-
"version": s.storageVersion.Version,
151-
"resource": s.storageGroupResource.Resource,
152-
"namespace": namespace,
153-
"name": name,
154-
}).Delete(&Resource{})
151+
return s.db.Model(s.model).
152+
Where(map[string]interface{}{
153+
"cluster": cluster,
154+
"group": s.storageGroupResource.Group,
155+
"version": s.storageVersion.Version,
156+
"resource": s.storageGroupResource.Resource,
157+
"namespace": namespace,
158+
"name": name,
159+
}).Delete(&Resource{})
155160
}
156161

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

169174
func (s *ResourceStorage) genGetObjectQuery(ctx context.Context, cluster, namespace, name string) *gorm.DB {
170-
return s.db.WithContext(ctx).Model(&Resource{}).Select("object").Where(map[string]interface{}{
171-
"cluster": cluster,
172-
"group": s.storageGroupResource.Group,
173-
"version": s.storageVersion.Version,
174-
"resource": s.storageGroupResource.Resource,
175-
"namespace": namespace,
176-
"name": name,
177-
})
175+
return s.db.WithContext(ctx).
176+
Model(s.model).
177+
Select("object").
178+
Where(map[string]interface{}{
179+
"cluster": cluster,
180+
"group": s.storageGroupResource.Group,
181+
"version": s.storageVersion.Version,
182+
"resource": s.storageGroupResource.Resource,
183+
"namespace": namespace,
184+
"name": name,
185+
})
178186
}
179187

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

202-
query := s.db.WithContext(ctx).Model(&Resource{})
210+
query := s.db.WithContext(ctx).Model(s.model)
203211
query = query.Where(map[string]interface{}{
204212
"group": s.storageGroupResource.Group,
205213
"version": s.storageVersion.Version,

pkg/storage/internalstorage/resource_storage_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ func TestResourceStorage_Update(t *testing.T) {
465465

466466
func newTestResourceStorage(db *gorm.DB, storageGVK schema.GroupVersionResource) *ResourceStorage {
467467
return &ResourceStorage{
468-
db: db,
468+
db: db.Table("resources").Model(&Resource{}),
469469
storageGroupResource: storageGVK.GroupResource(),
470470
storageVersion: storageGVK.GroupVersion(),
471471
}

pkg/storage/internalstorage/storage.go

+105-38
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package internalstorage
33
import (
44
"context"
55
"fmt"
6+
"strings"
67

78
"gorm.io/gorm"
89
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -12,30 +13,13 @@ import (
1213
)
1314

1415
type StorageFactory struct {
15-
db *gorm.DB
16-
AutoMigration *bool
17-
DivisionPolicy DivisionPolicy
18-
Mapper []ResourceMapper
16+
db *gorm.DB
17+
model interface{}
18+
SkipAutoMigration bool
19+
DivisionPolicy DivisionPolicy
1920
}
2021

2122
func (s *StorageFactory) AutoMigrate() error {
22-
if s.AutoMigration != nil && *s.AutoMigration {
23-
switch s.DivisionPolicy {
24-
if err := s.db.AutoMigrate(&Resource{}); err != nil {
25-
return err
26-
}
27-
case "", DivisionPolicyNone:
28-
case DivisionPolicyGroupResource:
29-
30-
}
31-
32-
if s.DivisionPolicy == "" || s.DivisionPolicy == DivisionPolicyNone {
33-
if err := s.db.AutoMigrate(&Resource{}); err != nil {
34-
return err
35-
}
36-
}
37-
}
38-
3923
return nil
4024
}
4125

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

4630
func (s *StorageFactory) NewResourceStorage(config *storage.ResourceStorageConfig) (storage.ResourceStorage, error) {
47-
return &ResourceStorage{
48-
db: s.db,
49-
codec: config.Codec,
31+
gvr := schema.GroupVersionResource{
32+
Group: config.StorageGroupResource.Group,
33+
Version: config.StorageVersion.Version,
34+
Resource: config.StorageGroupResource.Resource,
35+
}
36+
table := s.tableName(gvr)
37+
38+
var model interface{}
39+
switch s.DivisionPolicy {
40+
case DivisionPolicyGroupVersionResource:
41+
model = &GroupVersionResource{}
42+
if !s.SkipAutoMigration {
43+
if exist := s.db.Migrator().HasTable(table); !exist {
44+
if err := s.db.AutoMigrate(&GroupVersionResource{}); err != nil {
45+
return nil, err
46+
}
47+
48+
if err := s.db.Migrator().RenameTable("group_version_resources", table); err != nil {
49+
if !s.db.Migrator().HasTable(table) {
50+
return nil, err
51+
}
52+
}
53+
}
54+
}
55+
default:
56+
model = &Resource{}
57+
}
58+
59+
s.model = model
5060

61+
return &ResourceStorage{
62+
db: s.db.Table(table),
63+
model: model,
64+
codec: config.Codec,
5165
storageGroupResource: config.StorageGroupResource,
5266
storageVersion: config.StorageVersion,
5367
memoryVersion: config.MemoryVersion,
@@ -64,12 +78,22 @@ func (s *StorageFactory) NewCollectionResourceStorage(cr *internal.CollectionRes
6478
}
6579

6680
func (s *StorageFactory) GetResourceVersions(ctx context.Context, cluster string) (map[schema.GroupVersionResource]map[string]interface{}, error) {
81+
tables, err := s.db.Migrator().GetTables()
82+
if err != nil {
83+
return nil, err
84+
}
85+
6786
var resources []Resource
68-
result := s.db.WithContext(ctx).Select("group", "version", "resource", "namespace", "name", "resource_version").
69-
Where(map[string]interface{}{"cluster": cluster}).
70-
Find(&resources)
71-
if result.Error != nil {
72-
return nil, InterpretDBError(cluster, result.Error)
87+
for _, table := range tables {
88+
result := s.db.WithContext(ctx).
89+
Model(s.model).
90+
Table(table).
91+
Select("group", "version", "resource", "namespace", "name", "resource_version").
92+
Where(map[string]interface{}{"cluster": cluster}).
93+
Find(&resources)
94+
if result.Error != nil {
95+
return nil, InterpretDBError(cluster, result.Error)
96+
}
7397
}
7498

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

93117
func (s *StorageFactory) CleanCluster(ctx context.Context, cluster string) error {
94-
result := s.db.WithContext(ctx).Where(map[string]interface{}{"cluster": cluster}).Delete(&Resource{})
95-
return InterpretDBError(cluster, result.Error)
118+
tables, err := s.db.Migrator().GetTables()
119+
if err != nil {
120+
return err
121+
}
122+
123+
for _, table := range tables {
124+
result := s.db.WithContext(ctx).Table(table).Model(s.model).Where(map[string]interface{}{"cluster": cluster}).Delete(&Resource{})
125+
if result.Error != nil {
126+
return InterpretDBError(cluster, result.Error)
127+
}
128+
}
129+
130+
return nil
96131
}
97132

98133
func (s *StorageFactory) CleanClusterResource(ctx context.Context, cluster string, gvr schema.GroupVersionResource) error {
99-
result := s.db.WithContext(ctx).Where(map[string]interface{}{
100-
"cluster": cluster,
101-
"group": gvr.Group,
102-
"version": gvr.Version,
103-
"resource": gvr.Resource,
104-
}).Delete(&Resource{})
105-
return InterpretDBError(fmt.Sprintf("%s/%s", cluster, gvr), result.Error)
134+
err := s.db.Transaction(func(db *gorm.DB) error {
135+
result := s.db.WithContext(ctx).
136+
Table(s.tableName(gvr)).
137+
Model(s.model).
138+
Where(map[string]interface{}{
139+
"cluster": cluster,
140+
"group": gvr.Group,
141+
"version": gvr.Version,
142+
"resource": gvr.Resource,
143+
}).
144+
Delete(&Resource{})
145+
146+
if result.Error != nil {
147+
return result.Error
148+
}
149+
150+
return nil
151+
})
152+
153+
return InterpretDBError(fmt.Sprintf("%s/%s", cluster, gvr), err)
106154
}
107155

108156
func (s *StorageFactory) GetCollectionResources(ctx context.Context) ([]*internal.CollectionResource, error) {
@@ -116,3 +164,22 @@ func (s *StorageFactory) GetCollectionResources(ctx context.Context) ([]*interna
116164
func (s *StorageFactory) PrepareCluster(cluster string) error {
117165
return nil
118166
}
167+
168+
// GenerateTableFor return table name using gvr string
169+
func GenerateTableFor(gvr schema.GroupVersionResource) string {
170+
if gvr.Group == "" {
171+
return fmt.Sprintf("%s_%s", gvr.Version, gvr.Resource)
172+
}
173+
174+
group := strings.ReplaceAll(gvr.Group, ".", "_")
175+
return fmt.Sprintf("%s_%s_%s", group, gvr.Version, gvr.Resource)
176+
}
177+
178+
func (s *StorageFactory) tableName(gvr schema.GroupVersionResource) string {
179+
table := "resources"
180+
if s.DivisionPolicy == DivisionPolicyGroupVersionResource {
181+
table = GenerateTableFor(gvr)
182+
}
183+
184+
return table
185+
}

0 commit comments

Comments
 (0)