Newer
Older
package nucleus
import (
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
"reflect"
// Storable provides an interface for the controller's storage architecture.
}
type store map[uuid.UUID]Storable
func (s store) exists(id uuid.UUID) bool {
_, ok := s[id]
return ok
}
func (s store) add(item Storable) error {
return &ErrAlreadyExists{item: item}
}
log.WithFields(log.Fields{
"type": reflect.TypeOf(item),
return nil
}
func (s store) get(id uuid.UUID) (Storable, error) {
if !s.exists(id) {
return nil, &ErrNotFound{id: id}
}
log.WithFields(log.Fields{
"uuid": id,
}).Info("storable was accessed")
return s[id], nil
}
func (s store) delete(id uuid.UUID) error {
if !s.exists(id) {
return &ErrNotFound{id: id}
}
log.WithFields(log.Fields{
"uuid": id,
}).Info("storable has been deleted")
return nil
}
func (s store) UUIDs() []uuid.UUID {
keys := make([]uuid.UUID, len(s))
i := 0
for k := range s {
keys[i] = k
i++
}
return keys
}
type sbiStore struct {
store
}
func (s sbiStore) get(id uuid.UUID) (SouthboundInterface, error) {
item, err := s.store.get(id)
if err != nil {
return nil, err
}
sbi, ok := item.(SouthboundInterface)
if !ok {
return nil, &ErrInvalidTypeAssertion{
v: sbi,
t: "SouthboundInterface",
}
}
log.WithFields(log.Fields{
"uuid": id,
}).Info("southbound interface was accessed")
return sbi, nil
}
type pndStore struct {
store
}
func (s pndStore) get(id uuid.UUID) (PrincipalNetworkDomain, error) {
item, err := s.store.get(id)
if err != nil {
return nil, err
}
pnd, ok := item.(PrincipalNetworkDomain)
if !ok {
return nil, &ErrInvalidTypeAssertion{
v: pnd,
t: "PrincipalNetworkDomain",
}
}
log.WithFields(log.Fields{
"uuid": id,
}).Info("principal network domain was accessed")
return pnd, nil
}
type deviceStore struct {
store
}
func (s deviceStore) get(id uuid.UUID) (*Device, error) {
item, err := s.store.get(id)
if err != nil {
return nil, err
}
device, ok := item.(*Device)
if !ok {
return nil, &ErrInvalidTypeAssertion{
v: device,
t: "Device",
}
}
log.WithFields(log.Fields{
"uuid": id,
}).Info("device was accessed")