Skip to content
Snippets Groups Projects
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
}