bridge.go 2.4 KB

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