Skip to content

Commit 2fa7853

Browse files
author
calvin
committed
support split table for internal storage
Signed-off-by: calvin <[email protected]>
1 parent 89b8466 commit 2fa7853

File tree

5 files changed

+100
-39
lines changed

5 files changed

+100
-39
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:

internalstorage-config.yaml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
type: "mysql"
2+
dsn: ""
3+
host: "10.6.212.13"
4+
port: 30870
5+
password: dangerous0
6+
user: root
7+
database: clusterpedia
8+
autoMigration: true
9+
divisionPolicy: GroupResource
10+
connPool:
11+
maxIdleConns: 5
12+
maxOpenConns: 40
13+
connMaxLifetime: 60m

pkg/storage/internalstorage/register.go

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

96-
return &StorageFactory{db}, nil
96+
return &StorageFactory{
97+
db: db,
98+
AutoMigration: cfg.AutoMigration,
99+
DivisionPolicy: cfg.DivisionPolicy,
100+
Mapper: cfg.Mapper,
101+
}, nil
97102
}
98103

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

pkg/storage/internalstorage/resource_storage.go

+28-19
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
type ResourceStorage struct {
3030
db *gorm.DB
3131
codec runtime.Codec
32+
table string
3233

3334
storageGroupResource schema.GroupResource
3435
storageVersion schema.GroupVersion
@@ -83,7 +84,7 @@ func (s *ResourceStorage) Create(ctx context.Context, cluster string, obj runtim
8384
resource.DeletedAt = sql.NullTime{Time: deletedAt.Time, Valid: true}
8485
}
8586

86-
result := s.db.WithContext(ctx).Create(&resource)
87+
result := s.db.WithContext(ctx).Table(s.table).Create(&resource)
8788
return InterpretResourceDBError(cluster, metaobj.GetName(), result.Error)
8889
}
8990

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

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)
120+
result := s.db.WithContext(ctx).
121+
Model(&Resource{}).
122+
Where(map[string]interface{}{
123+
"cluster": cluster,
124+
"group": s.storageGroupResource.Group,
125+
"version": s.storageVersion.Version,
126+
"resource": s.storageGroupResource.Resource,
127+
"namespace": metaobj.GetNamespace(),
128+
"name": metaobj.GetName(),
129+
}).
130+
Table(s.table).
131+
Updates(updatedResource)
132+
127133
return InterpretResourceDBError(cluster, metaobj.GetName(), result.Error)
128134
}
129135

@@ -144,14 +150,17 @@ func (c *ResourceStorage) ConvertDeletedObject(obj interface{}) (runtime.Object,
144150
}
145151

146152
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{})
153+
return s.db.Model(&Resource{}).
154+
Where(map[string]interface{}{
155+
"cluster": cluster,
156+
"group": s.storageGroupResource.Group,
157+
"version": s.storageVersion.Version,
158+
"resource": s.storageGroupResource.Resource,
159+
"namespace": namespace,
160+
"name": name,
161+
}).
162+
Table(s.table).
163+
Delete(&Resource{})
155164
}
156165

157166
func (s *ResourceStorage) Delete(ctx context.Context, cluster string, obj runtime.Object) error {
@@ -167,7 +176,7 @@ func (s *ResourceStorage) Delete(ctx context.Context, cluster string, obj runtim
167176
}
168177

169178
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{}{
179+
return s.db.WithContext(ctx).Model(&Resource{}).Table(s.table).Select("object").Where(map[string]interface{}{
171180
"cluster": cluster,
172181
"group": s.storageGroupResource.Group,
173182
"version": s.storageVersion.Version,
@@ -199,7 +208,7 @@ func (s *ResourceStorage) genListObjectsQuery(ctx context.Context, opts *interna
199208
result = &ResourceMetadataList{}
200209
}
201210

202-
query := s.db.WithContext(ctx).Model(&Resource{})
211+
query := s.db.WithContext(ctx).Model(&Resource{}).Table(s.table)
203212
query = query.Where(map[string]interface{}{
204213
"group": s.storageGroupResource.Group,
205214
"version": s.storageVersion.Version,

pkg/storage/internalstorage/storage.go

+49-15
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package internalstorage
33
import (
44
"context"
55
"fmt"
6+
"strings"
7+
"sync"
68

79
"gorm.io/gorm"
810
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -11,6 +13,8 @@ import (
1113
"github.com/clusterpedia-io/clusterpedia/pkg/storage"
1214
)
1315

16+
var mutex sync.Mutex
17+
1418
type StorageFactory struct {
1519
db *gorm.DB
1620
AutoMigration *bool
@@ -19,34 +23,54 @@ type StorageFactory struct {
1923
}
2024

2125
func (s *StorageFactory) AutoMigrate() error {
26+
return nil
27+
}
28+
29+
func (s *StorageFactory) GetSupportedRequestVerbs() []string {
30+
return []string{"get", "list"}
31+
}
32+
33+
func (s *StorageFactory) NewResourceStorage(config *storage.ResourceStorageConfig) (storage.ResourceStorage, error) {
34+
mutex.Lock()
35+
defer mutex.Unlock()
36+
37+
var table string
2238
if s.AutoMigration != nil && *s.AutoMigration {
2339
switch s.DivisionPolicy {
24-
if err := s.db.AutoMigrate(&Resource{}); err != nil {
25-
return err
26-
}
2740
case "", DivisionPolicyNone:
41+
table = "resources"
42+
43+
if exist := s.db.Migrator().HasTable(table); !exist {
44+
if err := s.db.AutoMigrate(&Resource{}); err != nil {
45+
return nil, err
46+
}
47+
}
2848
case DivisionPolicyGroupResource:
49+
gvr := schema.GroupVersionResource{
50+
Group: config.StorageGroupResource.Group,
51+
Version: config.StorageVersion.Version,
52+
Resource: config.StorageGroupResource.Resource,
53+
}
2954

30-
}
55+
table = GenerateTableFor(gvr)
56+
57+
if exist := s.db.Migrator().HasTable(table); !exist {
58+
if err := s.db.AutoMigrate(&Resource{}); err != nil {
59+
return nil, err
60+
}
3161

32-
if s.DivisionPolicy == "" || s.DivisionPolicy == DivisionPolicyNone {
33-
if err := s.db.AutoMigrate(&Resource{}); err != nil {
34-
return err
62+
err := s.db.Migrator().RenameTable("resources", table)
63+
if err != nil {
64+
return nil, err
65+
}
3566
}
3667
}
3768
}
3869

39-
return nil
40-
}
41-
42-
func (s *StorageFactory) GetSupportedRequestVerbs() []string {
43-
return []string{"get", "list"}
44-
}
45-
46-
func (s *StorageFactory) NewResourceStorage(config *storage.ResourceStorageConfig) (storage.ResourceStorage, error) {
4770
return &ResourceStorage{
4871
db: s.db,
4972
codec: config.Codec,
73+
table: table,
5074

5175
storageGroupResource: config.StorageGroupResource,
5276
storageVersion: config.StorageVersion,
@@ -116,3 +140,13 @@ func (s *StorageFactory) GetCollectionResources(ctx context.Context) ([]*interna
116140
func (s *StorageFactory) PrepareCluster(cluster string) error {
117141
return nil
118142
}
143+
144+
// GenerateTableFor return table name using gvr string
145+
func GenerateTableFor(gvr schema.GroupVersionResource) string {
146+
if gvr.Group == "" {
147+
return fmt.Sprintf("%s_%s", gvr.Version, gvr.Resource)
148+
}
149+
150+
group := strings.ReplaceAll(gvr.Group, ".", "_")
151+
return fmt.Sprintf("%s_%s_%s", group, gvr.Version, gvr.Resource)
152+
}

0 commit comments

Comments
 (0)