-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstorage.bridge.go
144 lines (123 loc) · 3.72 KB
/
storage.bridge.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package main
import (
"errors"
fs "imuslab.com/arozos/mod/filesystem"
storage "imuslab.com/arozos/mod/storage"
)
/*
Storage functions related to bridged FSH
*/
//Initiate bridged storage pool configs
func BridgeStoragePoolInit() {
bridgeRecords, err := bridgeManager.ReadConfig()
if err != nil {
systemWideLogger.PrintAndLog("Storage", "Fail to read File System Handler bridge config", err)
return
}
for _, bridgeConf := range bridgeRecords {
fsh, err := GetFsHandlerByUUID(bridgeConf.FSHUUID)
if err != nil {
//This fsh is not found. Skip this
continue
}
basePool, err := GetStoragePoolByOwner(bridgeConf.SPOwner)
if err != nil {
//This fsh is not found. Skip this
continue
}
err = BridgeFSHandlerToGroup(fsh, basePool)
if err != nil {
systemWideLogger.PrintAndLog("Storage", "Failed to bridge "+fsh.UUID+":/ to "+basePool.Owner+err.Error(), err)
}
systemWideLogger.PrintAndLog("Storage", fsh.UUID+":/ bridged to "+basePool.Owner+" Storage Pool", nil)
}
}
func BridgeStoragePoolForGroup(group string) {
bridgeRecords, err := bridgeManager.ReadConfig()
if err != nil {
systemWideLogger.PrintAndLog("Storage", "Failed to bridge FSH for group "+group, err)
return
}
for _, bridgeConf := range bridgeRecords {
if bridgeConf.SPOwner == group {
fsh, err := GetFsHandlerByUUID(bridgeConf.FSHUUID)
if err != nil {
//This fsh is not found. Skip this
continue
}
basePool, err := GetStoragePoolByOwner(bridgeConf.SPOwner)
if err != nil {
//This fsh is not found. Skip this
continue
}
err = BridgeFSHandlerToGroup(fsh, basePool)
if err != nil {
systemWideLogger.PrintAndLog("Storage", "Failed to bridge "+fsh.UUID+":/ to "+basePool.Owner+err.Error(), err)
}
systemWideLogger.PrintAndLog("Storage", fsh.UUID+":/ bridged to "+basePool.Owner+" Storage Pool", nil)
}
}
}
//Debridge all bridged FSH from this group, origin (i.e. not bridged) fsh will be skipped
func DebridgeAllFSHandlerFromGroup(group string) error {
targetSp, err := GetStoragePoolByOwner(group)
if err != nil {
return err
}
originFsh := []*fs.FileSystemHandler{}
for _, fsh := range targetSp.Storages {
isBridged, err := bridgeManager.IsBridgedFSH(fsh.UUID, group)
if err != nil {
return err
}
if !isBridged {
//Append the fsh that is not bridged into the origin list
originFsh = append(originFsh, fsh)
} else {
systemWideLogger.PrintAndLog("Storage", fsh.UUID+":/ de-bridged from "+group+" Storage Pool", nil)
}
}
targetPg := permissionHandler.GetPermissionGroupByName(group)
if targetPg == nil {
return errors.New("permission group not exists")
}
newSp, err := storage.NewStoragePool(originFsh, group)
if err != nil {
return err
}
targetPg.StoragePool = newSp
return nil
}
//Bridge a FSH to a given Storage Pool
func BridgeFSHandlerToGroup(fsh *fs.FileSystemHandler, sp *storage.StoragePool) error {
//Check if the fsh already exists in the basepool
for _, thisFSH := range sp.Storages {
if thisFSH.UUID == fsh.UUID {
return errors.New("Target File System Handler already bridged to this pool")
}
}
sp.Storages = append(sp.Storages, fsh)
return nil
}
//Debridge a fsh from a given group by fsh ID
func DebridgeFSHandlerFromGroup(fshUUID string, sp *storage.StoragePool) error {
isBridged, err := bridgeManager.IsBridgedFSH(fshUUID, sp.Owner)
if err != nil || !isBridged {
return errors.New("FSH not bridged")
}
newStorageList := []*fs.FileSystemHandler{}
fshExists := false
for _, fsh := range sp.Storages {
if fsh.UUID != fshUUID {
newStorageList = append(newStorageList, fsh)
} else {
fshExists = true
}
}
if fshExists {
sp.Storages = newStorageList
return nil
} else {
return errors.New("Target File System Handler not found")
}
}