Skip to content
Snippets Groups Projects
sbiService.go 2.86 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	"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"
    
    const (
    	// SbiEventTopic is the used topic for sbi related entity changes.
    	SbiEventTopic = "sbi"
    )
    
    
    // SbiService provides a sbi service implementation.
    type SbiService struct {
    
    	sbiStore     southbound.Store
    	eventService eventInterfaces.Service
    
    }
    
    // NewSbiService creates a sbi service.
    
    func NewSbiService(sbiStore southbound.Store, eventService eventInterfaces.Service) southbound.Service {
    
    		sbiStore:     sbiStore,
    		eventService: eventService,
    
    	}
    }
    
    // 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 {
    
    			log.Error(retryErr)
    		}
    
    	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
    	}
    
    
    	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 {
    
    			log.Error(retryErr)
    		}
    
    	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
    }