Newer
Older
package nucleus
import (
"encoding/json"
"io/ioutil"
"sync"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus/errors"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"github.com/google/uuid"
)
// FilesystemSbiStore is used to store SouthboundInterfaces
type FilesystemSbiStore struct {
sbiStoreName string
pndUUID uuid.UUID
fileMutex sync.Mutex
pathToSbiFile string
}
// NewFilesystemSbiStore returns a filesystem implementation for a pnd store.
func NewFilesystemSbiStore(pndUUID uuid.UUID) southbound.Store {
sbiFilenameForUUID := store.GetStoreFilenameForUUID(pndUUID, store.SbiFilenameSuffix)
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
store.EnsureFilesystemStorePathExists(sbiFilenameForUUID)
return &FilesystemSbiStore{
pathToSbiFile: store.GetCompletePathToFileStore(sbiFilenameForUUID),
fileMutex: sync.Mutex{},
pndUUID: pndUUID,
}
}
func (s *FilesystemSbiStore) readAllSbisFromFile() ([]southbound.LoadedSbi, error) {
var loadedSbis []southbound.LoadedSbi
content, err := ioutil.ReadFile(s.pathToSbiFile)
if err != nil {
return nil, err
}
err = json.Unmarshal(content, &loadedSbis)
if err != nil {
return nil, err
}
return loadedSbis, nil
}
func (s *FilesystemSbiStore) writeAllSbisToFile(sbis []southbound.LoadedSbi) error {
serializedData, err := json.Marshal(sbis)
if err != nil {
return err
}
err = ioutil.WriteFile(s.pathToSbiFile, serializedData, 0600)
if err != nil {
return err
}
return nil
}
// Add adds a SBI.
func (s *FilesystemSbiStore) Add(sbiToAdd southbound.SouthboundInterface) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
sbis, err := s.readAllSbisFromFile()
if err != nil {
return err
}
var loadedSbi southbound.LoadedSbi
loadedSbi, err = store.TransformObjectToLoadedObject[southbound.SouthboundInterface, southbound.LoadedSbi](sbiToAdd)
if err != nil {
return err
}
sbis = append(sbis, loadedSbi)
err = s.writeAllSbisToFile(sbis)
if err != nil {
return err
}
return nil
}
// Delete deletes an SBI.
func (s *FilesystemSbiStore) Delete(sbiToDelete southbound.SouthboundInterface) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
sbis, err := s.readAllSbisFromFile()
if err != nil {
return err
}
for i, sbi := range sbis {
if sbi.ID == sbiToDelete.ID().String() {
//remove item from slice
sbis[i] = sbis[len(sbis)-1]
sbis = sbis[:len(sbis)-1]
err = s.writeAllSbisToFile(sbis)
if err != nil {
return err
}
return nil
}
}
return &errors.ErrCouldNotDelete{Identifier: sbiToDelete.ID(), Type: sbiToDelete, Err: err}
}
// Get takes a SouthboundInterface's UUID or name and returns the SouthboundInterface. If the requested
// SouthboundInterface does not exist an error is returned.
func (s *FilesystemSbiStore) Get(query store.Query) (southbound.LoadedSbi, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
var sbi southbound.LoadedSbi
sbis, err := s.readAllSbisFromFile()
if err != nil {
return sbi, err
}
for _, sbi := range sbis {
if sbi.ID == query.ID.String() {
return sbi, nil
Fabian Seidl
committed
return sbi, &errors.ErrCouldNotFind{ID: query.ID, Name: query.Name}
}
// GetAll returns all SBIs
func (s *FilesystemSbiStore) GetAll() ([]southbound.LoadedSbi, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
sbis, err := s.readAllSbisFromFile()
return sbis, err
}