bridge.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package bridge
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "os"
  6. )
  7. /*
  8. Bridge.go
  9. This module handle File System Handler bridging cross different storage pool
  10. Tricky to use, use with your own risk and make sure admin permission is
  11. nessary for all request to this module.
  12. */
  13. type Record struct {
  14. Filename string
  15. }
  16. type BridgeConfig struct {
  17. FSHUUID string
  18. SPOwner string
  19. }
  20. func NewBridgeRecord(filename string) *Record {
  21. return &Record{
  22. Filename: filename,
  23. }
  24. }
  25. // Read bridge record
  26. func (r *Record) ReadConfig() ([]*BridgeConfig, error) {
  27. result := []*BridgeConfig{}
  28. if _, err := os.Stat(r.Filename); os.IsNotExist(err) {
  29. //File not exists. Create it
  30. js, _ := json.Marshal([]*BridgeConfig{})
  31. os.WriteFile(r.Filename, js, 0775)
  32. }
  33. content, err := os.ReadFile(r.Filename)
  34. if err != nil {
  35. return result, err
  36. }
  37. err = json.Unmarshal(content, &result)
  38. if err != nil {
  39. return result, err
  40. }
  41. return result, nil
  42. }
  43. // Append a new config into the Bridge Record
  44. func (r *Record) AppendToConfig(config *BridgeConfig) error {
  45. currentConfigs, err := r.ReadConfig()
  46. if err != nil {
  47. return err
  48. }
  49. //Check if this config already exists
  50. for _, previousConfig := range currentConfigs {
  51. if previousConfig.FSHUUID == config.FSHUUID && previousConfig.SPOwner == config.SPOwner {
  52. //Already exists
  53. return errors.New("Idential config already registered")
  54. }
  55. }
  56. currentConfigs = append(currentConfigs, config)
  57. err = r.WriteConfig(currentConfigs)
  58. return err
  59. }
  60. // Remove a given config from file
  61. func (r *Record) RemoveFromConfig(FSHUUID string, groupOwner string) error {
  62. currentConfigs, err := r.ReadConfig()
  63. if err != nil {
  64. return err
  65. }
  66. newConfigs := []*BridgeConfig{}
  67. for _, config := range currentConfigs {
  68. if !(config.SPOwner == groupOwner && config.FSHUUID == FSHUUID) {
  69. newConfigs = append(newConfigs, config)
  70. }
  71. }
  72. err = r.WriteConfig(newConfigs)
  73. return err
  74. }
  75. // Check if the given UUID in this pool is a bridge object
  76. func (r *Record) IsBridgedFSH(FSHUUID string, groupOwner string) (bool, error) {
  77. currentConfigs, err := r.ReadConfig()
  78. if err != nil {
  79. return false, err
  80. }
  81. for _, config := range currentConfigs {
  82. if config.SPOwner == groupOwner && config.FSHUUID == FSHUUID {
  83. return true, nil
  84. }
  85. }
  86. return false, nil
  87. }
  88. // Write FSHConfig to disk
  89. func (r *Record) WriteConfig(config []*BridgeConfig) error {
  90. js, _ := json.MarshalIndent(config, "", " ")
  91. err := os.WriteFile(r.Filename, js, 0775)
  92. return err
  93. }