123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package bridge
- import (
- "encoding/json"
- "errors"
- "io/ioutil"
- "os"
- )
- /*
- Bridge.go
- This module handle File System Handler bridging cross different storage pool
- Tricky to use, use with your own risk and make sure admin permission is
- nessary for all request to this module.
- */
- type Record struct {
- Filename string
- }
- type BridgeConfig struct {
- FSHUUID string
- SPOwner string
- }
- func NewBridgeRecord(filename string) *Record {
- return &Record{
- Filename: filename,
- }
- }
- //Read bridge record
- func (r *Record) ReadConfig() ([]*BridgeConfig, error) {
- result := []*BridgeConfig{}
- if _, err := os.Stat(r.Filename); os.IsNotExist(err) {
- //File not exists. Create it
- js, _ := json.Marshal([]*BridgeConfig{})
- ioutil.WriteFile(r.Filename, js, 0775)
- }
- content, err := ioutil.ReadFile(r.Filename)
- if err != nil {
- return result, err
- }
- err = json.Unmarshal(content, &result)
- if err != nil {
- return result, err
- }
- return result, nil
- }
- //Append a new config into the Bridge Record
- func (r *Record) AppendToConfig(config *BridgeConfig) error {
- currentConfigs, err := r.ReadConfig()
- if err != nil {
- return err
- }
- //Check if this config already exists
- for _, previousConfig := range currentConfigs {
- if previousConfig.FSHUUID == config.FSHUUID && previousConfig.SPOwner == config.SPOwner {
- //Already exists
- return errors.New("Idential config already registered")
- }
- }
- currentConfigs = append(currentConfigs, config)
- err = r.WriteConfig(currentConfigs)
- return err
- }
- //Remove a given config from file
- func (r *Record) RemoveFromConfig(FSHUUID string, groupOwner string) error {
- currentConfigs, err := r.ReadConfig()
- if err != nil {
- return err
- }
- newConfigs := []*BridgeConfig{}
- for _, config := range currentConfigs {
- if !(config.SPOwner == groupOwner && config.FSHUUID == FSHUUID) {
- newConfigs = append(newConfigs, config)
- }
- }
- err = r.WriteConfig(newConfigs)
- return err
- }
- //Check if the given UUID in this pool is a bridge object
- func (r *Record) IsBridgedFSH(FSHUUID string, groupOwner string) (bool, error) {
- currentConfigs, err := r.ReadConfig()
- if err != nil {
- return false, err
- }
- for _, config := range currentConfigs {
- if config.SPOwner == groupOwner && config.FSHUUID == FSHUUID {
- return true, nil
- }
- }
- return false, nil
- }
- //Write FSHConfig to disk
- func (r *Record) WriteConfig(config []*BridgeConfig) error {
- js, _ := json.MarshalIndent(config, "", " ")
- err := ioutil.WriteFile(r.Filename, js, 0775)
- return err
- }
|