Newer
Older
package nucleus
import (
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
"encoding/json"
"os"
"sync"
"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
"code.fbi.h-da.de/danet/gosdn/controller/store"
log "github.com/sirupsen/logrus"
)
// FilesystemPluginStore is used to store Plugins.
type FilesystemPluginStore struct {
fileMutex sync.Mutex
pathToPluginFile string
}
// NewFilesystemPluginStore returns a filesystem implementation for a plugin store.
func NewFilesystemPluginStore() plugin.Store {
if err := store.EnsureFilesystemStorePathExists(store.PluginFilenameSuffix); err != nil {
log.Error(err)
}
return &FilesystemPluginStore{
pathToPluginFile: store.GetCompletePathToFileStore(store.PluginFilenameSuffix),
fileMutex: sync.Mutex{},
}
}
func (s *FilesystemPluginStore) readAllPluginsFromFile() ([]plugin.LoadedPlugin, error) {
var loadedPlugins []plugin.LoadedPlugin
content, err := os.ReadFile(s.pathToPluginFile)
if err != nil {
return nil, err
}
err = json.Unmarshal(content, &loadedPlugins)
if err != nil {
return nil, err
}
return loadedPlugins, nil
}
func (s *FilesystemPluginStore) writeAllPluginsToFile(plugins []plugin.LoadedPlugin) error {
serializedData, err := json.Marshal(plugins)
if err != nil {
return err
}
err = os.WriteFile(s.pathToPluginFile, serializedData, 0600)
if err != nil {
return err
}
return nil
}
// Add adds a Plugin.
func (s *FilesystemPluginStore) Add(ctx context.Context, pluginToAdd plugin.Plugin) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
plugins, err := s.readAllPluginsFromFile()
if err != nil {
return err
}
var loadedPlugin plugin.LoadedPlugin
loadedPlugin, err = store.TransformObjectToLoadedObject[plugin.Plugin, plugin.LoadedPlugin](pluginToAdd)
if err != nil {
return err
}
plugins = append(plugins, loadedPlugin)
err = s.writeAllPluginsToFile(plugins)
if err != nil {
return err
}
return nil
}
// Update updates an existing plugin.
func (s *FilesystemPluginStore) Update(ctx context.Context, pluginToUpdate plugin.Plugin) error {
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
loadedPluginToUpdate, err := store.TransformObjectToLoadedObject[plugin.Plugin, plugin.LoadedPlugin](pluginToUpdate)
if err != nil {
return err
}
plugins, err := s.readAllPluginsFromFile()
if err != nil {
return err
}
for i, plugin := range plugins {
if plugin.ID == pluginToUpdate.ID().String() {
plugins[i] = loadedPluginToUpdate
err = s.writeAllPluginsToFile(plugins)
if err != nil {
return err
}
return nil
}
}
return &customerrs.CouldNotUpdateError{Identifier: pluginToUpdate.ID(), Type: pluginToUpdate, Err: err}
}
// Delete deletes an Plugin.
func (s *FilesystemPluginStore) Delete(ctx context.Context, pluginToDelete plugin.Plugin) error {
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
plugins, err := s.readAllPluginsFromFile()
if err != nil {
return err
}
for i, plugin := range plugins {
if plugin.ID == pluginToDelete.ID().String() {
//remove item from slice
plugins[i] = plugins[len(plugins)-1]
plugins = plugins[:len(plugins)-1]
err = s.writeAllPluginsToFile(plugins)
if err != nil {
return err
}
return nil
}
}
return &customerrs.CouldNotDeleteError{Identifier: pluginToDelete.ID(), Type: pluginToDelete, Err: err}
}
// Get takes a Plugin's UUID or name and returns the Plugin. If the requested
// Plugin does not exist an error is returned.
func (s *FilesystemPluginStore) Get(ctx context.Context, query store.Query) (plugin.LoadedPlugin, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
var plugin plugin.LoadedPlugin
plugins, err := s.readAllPluginsFromFile()
if err != nil {
return plugin, err
}
for _, plugin := range plugins {
if plugin.ID == query.ID.String() {
return plugin, nil
}
}
return plugin, &customerrs.CouldNotFindError{ID: query.ID, Name: query.Name}
}
// GetAll returns all Plugins.
func (s *FilesystemPluginStore) GetAll(ctx context.Context) ([]plugin.LoadedPlugin, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
plugins, err := s.readAllPluginsFromFile()
return plugins, err
}