storage.bridge.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package main
  2. import (
  3. "errors"
  4. "log"
  5. fs "imuslab.com/arozos/mod/filesystem"
  6. storage "imuslab.com/arozos/mod/storage"
  7. )
  8. /*
  9. Storage functions related to bridged FSH
  10. */
  11. //Initiate bridged storage pool configs
  12. func BridgeStoragePoolInit() {
  13. bridgeRecords, err := bridgeManager.ReadConfig()
  14. if err != nil {
  15. log.Println("[ERROR] Fail to read File System Handler bridge config")
  16. return
  17. }
  18. for _, bridgeConf := range bridgeRecords {
  19. fsh, err := GetFsHandlerByUUID(bridgeConf.FSHUUID)
  20. if err != nil {
  21. //This fsh is not found. Skip this
  22. continue
  23. }
  24. basePool, err := GetStoragePoolByOwner(bridgeConf.SPOwner)
  25. if err != nil {
  26. //This fsh is not found. Skip this
  27. continue
  28. }
  29. err = BridgeFSHandlerToGroup(fsh, basePool)
  30. if err != nil {
  31. log.Println("Failed to bridge "+fsh.UUID+":/ to "+basePool.Owner, err.Error())
  32. }
  33. log.Println(fsh.UUID + ":/ bridged to " + basePool.Owner + " Storage Pool")
  34. }
  35. }
  36. func BridgeStoragePoolForGroup(group string) {
  37. bridgeRecords, err := bridgeManager.ReadConfig()
  38. if err != nil {
  39. log.Println("Failed to bridge FSH for group " + group)
  40. return
  41. }
  42. for _, bridgeConf := range bridgeRecords {
  43. if bridgeConf.SPOwner == group {
  44. fsh, err := GetFsHandlerByUUID(bridgeConf.FSHUUID)
  45. if err != nil {
  46. //This fsh is not found. Skip this
  47. continue
  48. }
  49. basePool, err := GetStoragePoolByOwner(bridgeConf.SPOwner)
  50. if err != nil {
  51. //This fsh is not found. Skip this
  52. continue
  53. }
  54. err = BridgeFSHandlerToGroup(fsh, basePool)
  55. if err != nil {
  56. log.Println("Failed to bridge "+fsh.UUID+":/ to "+basePool.Owner, err.Error())
  57. }
  58. log.Println(fsh.UUID + ":/ bridged to " + basePool.Owner + " Storage Pool")
  59. }
  60. }
  61. }
  62. //Bridge a FSH to a given Storage Pool
  63. func BridgeFSHandlerToGroup(fsh *fs.FileSystemHandler, sp *storage.StoragePool) error {
  64. //Check if the fsh already exists in the basepool
  65. for _, thisFSH := range sp.Storages {
  66. if thisFSH.UUID == fsh.UUID {
  67. return errors.New("Target File System Handler already bridged to this pool")
  68. }
  69. }
  70. sp.Storages = append(sp.Storages, fsh)
  71. return nil
  72. }
  73. func DebridgeFSHandlerFromGroup(fshUUID string, sp *storage.StoragePool) error {
  74. isBridged, err := bridgeManager.IsBridgedFSH(fshUUID, sp.Owner)
  75. if err != nil || !isBridged {
  76. return errors.New("FSH not bridged")
  77. }
  78. newStorageList := []*fs.FileSystemHandler{}
  79. fshExists := false
  80. for _, fsh := range sp.Storages {
  81. if fsh.UUID != fshUUID {
  82. newStorageList = append(newStorageList, fsh)
  83. } else {
  84. fshExists = true
  85. }
  86. }
  87. if fshExists {
  88. sp.Storages = newStorageList
  89. return nil
  90. } else {
  91. return errors.New("Target File System Handler not found")
  92. }
  93. }