Skip to content
Snippets Groups Projects
Commit fca3a7cc authored by André Sterba's avatar André Sterba
Browse files

Add event interactions to topology service

parent 66dc8cec
Branches
Tags
5 merge requests!376Add additional example application hostname-checker,!349Northbound refactoring to implement NIB concept for devices,!343Add basic application framework and example application to show interaction between events an NBI,!339Create basic venv-manager for use with arista,!324Provide prototype implementation for topology handling
Pipeline #107247 passed
...@@ -157,9 +157,17 @@ func bootstrapUnitTest() { ...@@ -157,9 +157,17 @@ func bootstrapUnitTest() {
portService := ports.NewPortService(portStore, eventService) portService := ports.NewPortService(portStore, eventService)
topoloyStore := store.NewGenericStore[links.Link]() topoloyStore := store.NewGenericStore[links.Link]()
topologyService := topology.NewTopologyService(topoloyStore, nodeService, portService) topologyService := topology.NewTopologyService(topoloyStore, nodeService, portService, eventService)
northbound := nbi.NewNBI(pndStore, userService, roleService, *jwtManager, topologyService, nodeService, portService) northbound := nbi.NewNBI(
pndStore,
userService,
roleService,
*jwtManager,
topologyService,
nodeService,
portService,
)
cpb.RegisterCoreServiceServer(s, northbound.Core) cpb.RegisterCoreServiceServer(s, northbound.Core)
ppb.RegisterPndServiceServer(s, northbound.Pnd) ppb.RegisterPndServiceServer(s, northbound.Pnd)
......
...@@ -88,6 +88,7 @@ func initialize() error { ...@@ -88,6 +88,7 @@ func initialize() error {
topology.NewDatabaseTopologyStore(), topology.NewDatabaseTopologyStore(),
nodeService, nodeService,
portService, portService,
eventService,
), ),
nodeService: nodeService, nodeService: nodeService,
portService: portService, portService: portService,
......
package topology package topology
import ( 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/links"
"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" "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/ports"
"code.fbi.h-da.de/danet/gosdn/controller/topology/store" "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 // Service defines an interface for a Service
type Service interface { type Service interface {
AddLink(links.Link) error AddLink(links.Link) error
...@@ -18,9 +25,10 @@ type Service interface { ...@@ -18,9 +25,10 @@ type Service interface {
// service is a service for ports // service is a service for ports
type service struct { type service struct {
store Store store Store
nodeService nodes.Service nodeService nodes.Service
portService ports.Service portService ports.Service
eventService eventInterfaces.Service
} }
// NewTopologyService creates a new TopologyService // NewTopologyService creates a new TopologyService
...@@ -28,11 +36,13 @@ func NewTopologyService( ...@@ -28,11 +36,13 @@ func NewTopologyService(
store Store, store Store,
nodeService nodes.Service, nodeService nodes.Service,
portService ports.Service, portService ports.Service,
eventService eventInterfaces.Service,
) Service { ) Service {
return &service{ return &service{
store: store, store: store,
nodeService: nodeService, nodeService: nodeService,
portService: portService, portService: portService,
eventService: eventService,
} }
} }
...@@ -63,6 +73,8 @@ func (t *service) AddLink(link links.Link) error { ...@@ -63,6 +73,8 @@ func (t *service) AddLink(link links.Link) error {
return err return err
} }
t.eventService.PublishEvent(LinkEventTopic, event.NewAddEvent(link.ID))
return nil return nil
} }
...@@ -73,6 +85,8 @@ func (t *service) UpdateLink(link links.Link) error { ...@@ -73,6 +85,8 @@ func (t *service) UpdateLink(link links.Link) error {
return err return err
} }
t.eventService.PublishEvent(LinkEventTopic, event.NewUpdateEvent(link.ID))
return nil return nil
} }
...@@ -83,6 +97,8 @@ func (t *service) DeleteLink(link links.Link) error { ...@@ -83,6 +97,8 @@ func (t *service) DeleteLink(link links.Link) error {
return err return err
} }
t.eventService.PublishEvent(LinkEventTopic, event.NewDeleteEvent(link.ID))
return nil return nil
} }
......
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"testing" "testing"
eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService" eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
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/links"
"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" "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/ports"
...@@ -97,9 +98,10 @@ func getTestStoreWithPorts(t *testing.T, portsToAdd []ports.Port) ports.Store { ...@@ -97,9 +98,10 @@ func getTestStoreWithPorts(t *testing.T, portsToAdd []ports.Port) ports.Store {
func TestNewTopologyService(t *testing.T) { func TestNewTopologyService(t *testing.T) {
type args struct { type args struct {
store Store store Store
nodeService nodes.Service nodeService nodes.Service
portService ports.Service portService ports.Service
eventService eventInterfaces.Service
} }
tests := []struct { tests := []struct {
name string name string
...@@ -109,20 +111,27 @@ func TestNewTopologyService(t *testing.T) { ...@@ -109,20 +111,27 @@ func TestNewTopologyService(t *testing.T) {
{ {
name: "should create a new topology service", name: "should create a new topology service",
args: args{ args: args{
store: getTestStoreWithLinks(t, []links.Link{}), store: getTestStoreWithLinks(t, []links.Link{}),
nodeService: nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()), nodeService: nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()),
portService: ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()), portService: ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()),
eventService: eventservice.NewMockEventService(),
}, },
want: NewTopologyService( want: NewTopologyService(
getTestStoreWithLinks(t, []links.Link{}), getTestStoreWithLinks(t, []links.Link{}),
nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()), nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()),
ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()), ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()),
eventservice.NewMockEventService(),
), ),
}, },
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
if got := NewTopologyService(tt.args.store, tt.args.nodeService, tt.args.portService); !reflect.DeepEqual(got, tt.want) { if got := NewTopologyService(
tt.args.store,
tt.args.nodeService,
tt.args.portService,
tt.args.eventService,
); !reflect.DeepEqual(got, tt.want) {
t.Errorf("NewNodeService() = %v, want %v", got, tt.want) t.Errorf("NewNodeService() = %v, want %v", got, tt.want)
} }
}) })
...@@ -131,9 +140,10 @@ func TestNewTopologyService(t *testing.T) { ...@@ -131,9 +140,10 @@ func TestNewTopologyService(t *testing.T) {
func TestTopologyService_AddLink(t *testing.T) { func TestTopologyService_AddLink(t *testing.T) {
type fields struct { type fields struct {
store Store store Store
nodeService nodes.Service nodeService nodes.Service
portService ports.Service portService ports.Service
eventService eventInterfaces.Service
} }
type args struct { type args struct {
link links.Link link links.Link
...@@ -163,6 +173,7 @@ func TestTopologyService_AddLink(t *testing.T) { ...@@ -163,6 +173,7 @@ func TestTopologyService_AddLink(t *testing.T) {
), ),
eventservice.NewMockEventService(), eventservice.NewMockEventService(),
), ),
eventService: eventservice.NewMockEventService(),
}, },
args: args{ args: args{
link: getTestLink(), link: getTestLink(),
...@@ -174,9 +185,10 @@ func TestTopologyService_AddLink(t *testing.T) { ...@@ -174,9 +185,10 @@ func TestTopologyService_AddLink(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
p := &service{ p := &service{
store: tt.fields.store, store: tt.fields.store,
nodeService: tt.fields.nodeService, nodeService: tt.fields.nodeService,
portService: tt.fields.portService, portService: tt.fields.portService,
eventService: tt.fields.eventService,
} }
err := p.AddLink(tt.args.link) err := p.AddLink(tt.args.link)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
...@@ -198,9 +210,10 @@ func TestTopologyService_AddLink(t *testing.T) { ...@@ -198,9 +210,10 @@ func TestTopologyService_AddLink(t *testing.T) {
func TestTopologyService_Update(t *testing.T) { func TestTopologyService_Update(t *testing.T) {
type fields struct { type fields struct {
store Store store Store
nodeService nodes.Service nodeService nodes.Service
portService ports.Service portService ports.Service
eventService eventInterfaces.Service
} }
type args struct { type args struct {
link links.Link link links.Link
...@@ -215,9 +228,10 @@ func TestTopologyService_Update(t *testing.T) { ...@@ -215,9 +228,10 @@ func TestTopologyService_Update(t *testing.T) {
{ {
name: "should update an existing link", name: "should update an existing link",
fields: fields{ fields: fields{
store: getTestStoreWithLinks(t, []links.Link{getTestLink()}), store: getTestStoreWithLinks(t, []links.Link{getTestLink()}),
nodeService: nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()), nodeService: nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()),
portService: ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()), portService: ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()),
eventService: eventservice.NewMockEventService(),
}, },
args: args{ args: args{
link: getTestLink(), link: getTestLink(),
...@@ -229,9 +243,10 @@ func TestTopologyService_Update(t *testing.T) { ...@@ -229,9 +243,10 @@ func TestTopologyService_Update(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
p := &service{ p := &service{
store: tt.fields.store, store: tt.fields.store,
nodeService: tt.fields.nodeService, nodeService: tt.fields.nodeService,
portService: tt.fields.portService, portService: tt.fields.portService,
eventService: tt.fields.eventService,
} }
err := p.UpdateLink(tt.args.link) err := p.UpdateLink(tt.args.link)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
...@@ -253,9 +268,10 @@ func TestTopologyService_Update(t *testing.T) { ...@@ -253,9 +268,10 @@ func TestTopologyService_Update(t *testing.T) {
func TestNodeService_Delete(t *testing.T) { func TestNodeService_Delete(t *testing.T) {
type fields struct { type fields struct {
store Store store Store
nodeService nodes.Service nodeService nodes.Service
portService ports.Service portService ports.Service
eventService eventInterfaces.Service
} }
type args struct { type args struct {
link links.Link link links.Link
...@@ -270,9 +286,10 @@ func TestNodeService_Delete(t *testing.T) { ...@@ -270,9 +286,10 @@ func TestNodeService_Delete(t *testing.T) {
{ {
name: "should delete an existing link", name: "should delete an existing link",
fields: fields{ fields: fields{
store: getTestStoreWithLinks(t, []links.Link{getTestLink()}), store: getTestStoreWithLinks(t, []links.Link{getTestLink()}),
nodeService: nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()), nodeService: nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()),
portService: ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()), portService: ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()),
eventService: eventservice.NewMockEventService(),
}, },
args: args{ args: args{
link: getTestLink(), link: getTestLink(),
...@@ -295,9 +312,10 @@ func TestNodeService_Delete(t *testing.T) { ...@@ -295,9 +312,10 @@ func TestNodeService_Delete(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
p := &service{ p := &service{
store: tt.fields.store, store: tt.fields.store,
nodeService: tt.fields.nodeService, nodeService: tt.fields.nodeService,
portService: tt.fields.portService, portService: tt.fields.portService,
eventService: tt.fields.eventService,
} }
if err := p.DeleteLink(tt.args.link); (err != nil) != tt.wantErr { if err := p.DeleteLink(tt.args.link); (err != nil) != tt.wantErr {
t.Errorf("service.Delete() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("service.Delete() error = %v, wantErr %v", err, tt.wantErr)
...@@ -308,9 +326,10 @@ func TestNodeService_Delete(t *testing.T) { ...@@ -308,9 +326,10 @@ func TestNodeService_Delete(t *testing.T) {
func TestTopologyService_Get(t *testing.T) { func TestTopologyService_Get(t *testing.T) {
type fields struct { type fields struct {
store Store store Store
nodeService nodes.Service nodeService nodes.Service
portService ports.Service portService ports.Service
eventService eventInterfaces.Service
} }
type args struct { type args struct {
query store.Query query store.Query
...@@ -356,9 +375,10 @@ func TestTopologyService_Get(t *testing.T) { ...@@ -356,9 +375,10 @@ func TestTopologyService_Get(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
p := &service{ p := &service{
store: tt.fields.store, store: tt.fields.store,
nodeService: tt.fields.nodeService, nodeService: tt.fields.nodeService,
portService: tt.fields.portService, portService: tt.fields.portService,
eventService: tt.fields.eventService,
} }
got, err := p.Get(tt.args.query) got, err := p.Get(tt.args.query)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
...@@ -374,9 +394,10 @@ func TestTopologyService_Get(t *testing.T) { ...@@ -374,9 +394,10 @@ func TestTopologyService_Get(t *testing.T) {
func TestTopologyService_GetAll(t *testing.T) { func TestTopologyService_GetAll(t *testing.T) {
type fields struct { type fields struct {
store Store store Store
nodeService nodes.Service nodeService nodes.Service
portService ports.Service portService ports.Service
eventService eventInterfaces.Service
} }
tests := []struct { tests := []struct {
name string name string
...@@ -387,9 +408,10 @@ func TestTopologyService_GetAll(t *testing.T) { ...@@ -387,9 +408,10 @@ func TestTopologyService_GetAll(t *testing.T) {
{ {
name: "should get all stored links", name: "should get all stored links",
fields: fields{ fields: fields{
store: getTestStoreWithLinks(t, []links.Link{getTestLink()}), store: getTestStoreWithLinks(t, []links.Link{getTestLink()}),
nodeService: nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()), nodeService: nodes.NewNodeService(getTestStoreWithNodes(t, []nodes.Node{}), eventservice.NewMockEventService()),
portService: ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()), portService: ports.NewPortService(getTestStoreWithPorts(t, []ports.Port{}), eventservice.NewMockEventService()),
eventService: eventservice.NewMockEventService(),
}, },
want: []links.Link{getTestLink()}, want: []links.Link{getTestLink()},
wantErr: false, wantErr: false,
...@@ -398,9 +420,10 @@ func TestTopologyService_GetAll(t *testing.T) { ...@@ -398,9 +420,10 @@ func TestTopologyService_GetAll(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
p := &service{ p := &service{
store: tt.fields.store, store: tt.fields.store,
nodeService: tt.fields.nodeService, nodeService: tt.fields.nodeService,
portService: tt.fields.portService, portService: tt.fields.portService,
eventService: tt.fields.eventService,
} }
got, err := p.GetAll() got, err := p.GetAll()
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment