@@ -3,6 +3,8 @@ package internalstorage
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "strings"
7
+ "sync"
6
8
7
9
"gorm.io/gorm"
8
10
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -11,6 +13,8 @@ import (
11
13
"github.com/clusterpedia-io/clusterpedia/pkg/storage"
12
14
)
13
15
16
+ var mutex sync.Mutex
17
+
14
18
type StorageFactory struct {
15
19
db * gorm.DB
16
20
AutoMigration * bool
@@ -19,31 +23,47 @@ type StorageFactory struct {
19
23
}
20
24
21
25
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
+
22
37
if s .AutoMigration != nil && * s .AutoMigration {
23
38
switch s .DivisionPolicy {
24
- if err := s .db .AutoMigrate (& Resource {}); err != nil {
25
- return err
26
- }
27
39
case "" , DivisionPolicyNone :
40
+ if exist := s .db .Migrator ().HasTable ("resources" ); ! exist {
41
+ if err := s .db .AutoMigrate (& Resource {}); err != nil {
42
+ return nil , err
43
+ }
44
+ }
28
45
case DivisionPolicyGroupResource :
46
+ gvr := schema.GroupVersionResource {
47
+ Group : config .StorageGroupResource .Group ,
48
+ Version : config .StorageVersion .Version ,
49
+ Resource : config .StorageGroupResource .Resource ,
50
+ }
29
51
30
- }
52
+ table := GenerateTableFor (gvr )
53
+
54
+ if exist := s .db .Migrator ().HasTable (table ); ! exist {
55
+ if err := s .db .AutoMigrate (& Resource {}); err != nil {
56
+ return nil , err
57
+ }
31
58
32
- if s .DivisionPolicy == "" || s .DivisionPolicy == DivisionPolicyNone {
33
- if err := s .db .AutoMigrate (& Resource {}); err != nil {
34
- return err
59
+ err := s .db .Migrator ().RenameTable ("resources" , table )
60
+ if err != nil {
61
+ return nil , err
62
+ }
35
63
}
36
64
}
37
65
}
38
66
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 ) {
47
67
return & ResourceStorage {
48
68
db : s .db ,
49
69
codec : config .Codec ,
@@ -116,3 +136,9 @@ func (s *StorageFactory) GetCollectionResources(ctx context.Context) ([]*interna
116
136
func (s * StorageFactory ) PrepareCluster (cluster string ) error {
117
137
return nil
118
138
}
139
+
140
+ // GenerateTableFor return table name using gvr string
141
+ func GenerateTableFor (gvr schema.GroupVersionResource ) string {
142
+ group := strings .ReplaceAll (gvr .Group , "." , "_" )
143
+ return fmt .Sprintf ("%s_%s_%s" , group , gvr .Version , gvr .Resource )
144
+ }
0 commit comments