Newer
Older
package nucleus
import (
Shrey Garg
committed
"os"
Fabian Seidl
committed
"code.fbi.h-da.de/danet/gosdn/controller/event"
eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
Fabian Seidl
committed
const (
// SbiEventTopic is the used topic for sbi related entity changes.
SbiEventTopic = "sbi"
)
// SbiService provides a sbi service implementation.
type SbiService struct {
Fabian Seidl
committed
sbiStore southbound.Store
eventService eventInterfaces.Service
}
// NewSbiService creates a sbi service.
Fabian Seidl
committed
func NewSbiService(sbiStore southbound.Store, eventService eventInterfaces.Service) southbound.Service {
return &SbiService{
Fabian Seidl
committed
sbiStore: sbiStore,
eventService: eventService,
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
}
}
// Get takes a SBI's UUID or name and returns the SBI.
func (s *SbiService) Get(query store.Query) (southbound.SouthboundInterface, error) {
loadedSbi, err := s.sbiStore.Get(query)
if err != nil {
return nil, err
}
device, err := s.createSbiFromStore(loadedSbi)
if err != nil {
return nil, err
}
return device, nil
}
// GetAll returns all stored SBIs.
func (s *SbiService) GetAll() ([]southbound.SouthboundInterface, error) {
var sbis []southbound.SouthboundInterface
loadedSbis, err := s.sbiStore.GetAll()
if err != nil {
return nil, err
}
for _, loadedSbi := range loadedSbis {
sbi, err := s.createSbiFromStore(loadedSbi)
if err != nil {
return nil, err
}
sbis = append(sbis, sbi)
}
return sbis, nil
}
// Add adds a sbi to the sbi store.
func (s *SbiService) Add(sbiToAdd southbound.SouthboundInterface) error {
err := s.sbiStore.Add(sbiToAdd)
if err != nil {
return err
}
pubEvent := event.NewAddEvent(sbiToAdd.ID())
if err := s.eventService.PublishEvent(SbiEventTopic, pubEvent); err != nil {
var retryErr error
go func() {
retryErr = s.eventService.RetryPublish(SbiEventTopic, pubEvent)
}()
if retryErr != nil {
Fabian Seidl
committed
return nil
}
// Delete deletes a sbi from the sbi store.
func (s *SbiService) Delete(sbiToDelete southbound.SouthboundInterface) error {
err := s.sbiStore.Delete(sbiToDelete)
if err != nil {
return err
}
Shrey Garg
committed
sbiPlugin, ok := sbiToDelete.(*SouthboundPlugin)
if ok {
if err := os.RemoveAll(sbiPlugin.Path()); err != nil {
return err
}
}
pubEvent := event.NewDeleteEvent(sbiToDelete.ID())
if err := s.eventService.PublishEvent(SbiEventTopic, pubEvent); err != nil {
var retryErr error
go func() {
retryErr = s.eventService.RetryPublish(SbiEventTopic, pubEvent)
}()
if retryErr != nil {
}
Fabian Seidl
committed
return nil
}
func (s *SbiService) createSbiFromStore(loadedSbi southbound.LoadedSbi) (southbound.SouthboundInterface, error) {
newSbi, err := NewSBI(loadedSbi.Type, uuid.MustParse(loadedSbi.ID))
if err != nil {
return nil, err
}
return newSbi, nil
}