-
André Sterba authoredAndré Sterba authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
topologyService.go 2.75 KiB
package topology
import (
"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/topology/links"
"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes"
"code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
"code.fbi.h-da.de/danet/gosdn/controller/topology/store"
)
const (
// LinkEventTopic is the used topic for link related entity changes
LinkEventTopic = "link"
)
// Service defines an interface for a Service
type Service interface {
AddLink(links.Link) error
UpdateLink(links.Link) error
DeleteLink(links.Link) error
Get(store.Query) (links.Link, error)
GetAll() ([]links.Link, error)
}
// service is a service for ports
type service struct {
store Store
nodeService nodes.Service
portService ports.Service
eventService eventInterfaces.Service
}
// NewTopologyService creates a new TopologyService
func NewTopologyService(
store Store,
nodeService nodes.Service,
portService ports.Service,
eventService eventInterfaces.Service,
) Service {
return &service{
store: store,
nodeService: nodeService,
portService: portService,
eventService: eventService,
}
}
// AddLink adds a new link to the topology
func (t *service) AddLink(link links.Link) error {
// These checks are also happening in the current NBI implementation.
// This should be refactored to only to these checks here.
_, err := t.nodeService.EnsureExists(link.SourceNode)
if err != nil {
return err
}
_, err = t.portService.EnsureExists(link.SourcePort)
if err != nil {
return err
}
_, err = t.nodeService.EnsureExists(link.TargetNode)
if err != nil {
return err
}
_, err = t.portService.EnsureExists(link.TargetPort)
if err != nil {
return err
}
err = t.store.Add(link)
if err != nil {
return err
}
t.eventService.PublishEvent(LinkEventTopic, event.NewAddEvent(link.ID))
return nil
}
// UpdateLink updates an existing link
func (t *service) UpdateLink(link links.Link) error {
err := t.store.Update(link)
if err != nil {
return err
}
t.eventService.PublishEvent(LinkEventTopic, event.NewUpdateEvent(link.ID))
return nil
}
// DeleteLink deletes a link
func (t *service) DeleteLink(link links.Link) error {
err := t.store.Delete(link)
if err != nil {
return err
}
t.eventService.PublishEvent(LinkEventTopic, event.NewDeleteEvent(link.ID))
return nil
}
// GetAll returns the current topology
func (t *service) GetAll() ([]links.Link, error) {
topo, err := t.store.GetAll()
if err != nil {
return topo, err
}
return topo, nil
}
// GetAll returns the current topology
func (t *service) Get(query store.Query) (links.Link, error) {
link, err := t.store.Get(query)
if err != nil {
return link, err
}
return link, nil
}