diff --git a/controller/northbound/server/topology.go b/controller/northbound/server/topology.go index e922dc87794c38e80fba914ad04e7efacc151299..eb332419dad8be18da52c0bd84ade975f39770d5 100644 --- a/controller/northbound/server/topology.go +++ b/controller/northbound/server/topology.go @@ -36,7 +36,7 @@ func NewTopologyServer( } // AddLink adds a new link to the topology -func (t Topology) AddLink(ctx context.Context, request *apb.AddLinkRequest) (*apb.AddLinkResponse, error) { +func (t *Topology) AddLink(ctx context.Context, request *apb.AddLinkRequest) (*apb.AddLinkResponse, error) { sourceNode, sourcePort, err := t.ensureNodeAndPortExists(request.Link.SourceNode, request.Link.SourcePort) if err != nil { return nil, status.Errorf(codes.Aborted, "%v", err) @@ -67,7 +67,7 @@ func (t Topology) AddLink(ctx context.Context, request *apb.AddLinkRequest) (*ap } // GetTopology returns the current topology in the form of all links -func (t Topology) GetTopology(ctx context.Context, request *apb.GetTopologyRequest) (*apb.GetTopologyResponse, error) { +func (t *Topology) GetTopology(ctx context.Context, request *apb.GetTopologyRequest) (*apb.GetTopologyResponse, error) { topo, err := t.topologyService.GetAll() if err != nil { return nil, status.Errorf(codes.Aborted, "%v", err) @@ -103,7 +103,7 @@ func (t Topology) GetTopology(ctx context.Context, request *apb.GetTopologyReque }, nil } -func (t Topology) ensureNodeAndPortExists(incomingNode *apb.Node, incomingPort *apb.Port) (nodes.Node, ports.Port, error) { +func (t *Topology) ensureNodeAndPortExists(incomingNode *apb.Node, incomingPort *apb.Port) (nodes.Node, ports.Port, error) { node, err := t.nodeService.EnsureExists( nodes.Node{ ID: getExistingOrCreateNewUUIDFromString(incomingNode.Id), diff --git a/controller/northbound/server/topology_test.go b/controller/northbound/server/topology_test.go index 00916e50994534309dfe112445af1e7d83a0925c..e9e8e5f9072ef6cceff3ed69db52db3633f56584 100644 --- a/controller/northbound/server/topology_test.go +++ b/controller/northbound/server/topology_test.go @@ -12,6 +12,7 @@ import ( "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" + "github.com/google/uuid" ) @@ -48,16 +49,21 @@ func getTestTopologyService() topology.Service { return topologyService } -func getTestTopologyServer() *Topology { +func getTestTopologyServer( + t *testing.T, + nodesToAdd []nodes.Node, + portsToAdd []ports.Port, + linksToAdd []links.Link, +) *Topology { eventService := eventservice.NewMockEventService() - nodeStore := store.NewGenericStore[nodes.Node]() + nodeStore := getTestStoreWithNodes(t, nodesToAdd) nodeService := nodes.NewNodeService(nodeStore, eventService) - portStore := store.NewGenericStore[ports.Port]() + portStore := getTestStoreWithPorts(t, portsToAdd) portService := ports.NewPortService(portStore, eventService) - linkStore := store.NewGenericStore[links.Link]() + linkStore := getTestStoreWithLinks(t, linksToAdd) topologyService := topology.NewTopologyService(linkStore, nodeService, portService, eventService) s := NewTopologyServer(topologyService, nodeService, portService) @@ -65,6 +71,84 @@ func getTestTopologyServer() *Topology { return s } +func getTestSourceNode() nodes.Node { + return nodes.Node{ + ID: uuid.MustParse("44fb4aa4-c53c-4cf9-a081-5aabc61c7610"), + Name: "Test-Source-Node", + } +} + +func getTestTargetNode() nodes.Node { + return nodes.Node{ + ID: uuid.MustParse("44fb4aa4-c53c-4cf9-a081-5aabc61c7612"), + Name: "Test-Target-Node", + } +} + +func getTestSourcePort() ports.Port { + return ports.Port{ + ID: uuid.MustParse("1fa479e7-d393-4d45-822d-485cc1f05fce"), + Name: "Test-Source-Port", + } +} + +func getTestTargetPort() ports.Port { + return ports.Port{ + ID: uuid.MustParse("1fa479e7-d393-4d45-822d-485cc1f05fc2"), + Name: "Test-Target-Port", + } +} + +func getTestLinkInternal() links.Link { + return links.Link{ + ID: uuid.MustParse("5eb474f1-428e-4503-ba68-dcf9bef53467"), + Name: "Test-Link", + SourceNode: getTestSourceNode(), + TargetNode: getTestTargetNode(), + SourcePort: getTestSourcePort(), + TargetPort: getTestTargetPort(), + } +} + +func getTestStoreWithLinks(t *testing.T, nodes []links.Link) topology.Store { + store := store.NewGenericStore[links.Link]() + + for _, node := range nodes { + err := store.Add(node) + if err != nil { + t.Fatalf("failed to prepare test store while adding node: %v", err) + } + } + + return store +} + +func getTestStoreWithNodes(t *testing.T, nodesToAdd []nodes.Node) nodes.Store { + store := store.NewGenericStore[nodes.Node]() + + for _, node := range nodesToAdd { + err := store.Add(node) + if err != nil { + t.Fatalf("failed to prepare test store while adding node: %v", err) + } + } + + return store +} + +func getTestStoreWithPorts(t *testing.T, portsToAdd []ports.Port) ports.Store { + store := store.NewGenericStore[ports.Port]() + + for _, port := range portsToAdd { + err := store.Add(port) + if err != nil { + t.Fatalf("failed to prepare test store while adding port: %v", err) + } + } + + return store +} + func getTestLink() *apb.Link { return &apb.Link{ Name: "test-link", @@ -96,7 +180,11 @@ func TestNewTopologyServer(t *testing.T) { nodeService: getTestNodeService(), portService: getTestPortService(), }, - want: getTestTopologyServer(), + want: &Topology{ + topologyService: getTestTopologyService(), + nodeService: getTestNodeService(), + portService: getTestPortService(), + }, }, } for _, tt := range tests { @@ -109,18 +197,29 @@ func TestNewTopologyServer(t *testing.T) { } func TestTopology_AddLink(t *testing.T) { + type fields struct { + ports []ports.Port + nodes []nodes.Node + links []links.Link + } type args struct { ctx context.Context request *apb.AddLinkRequest } tests := []struct { name string + fields fields args args want *apb.AddLinkResponse wantErr bool }{ { name: "should add a new link", + fields: fields{ + ports: []ports.Port{}, + nodes: []nodes.Node{}, + links: []links.Link{}, + }, args: args{ ctx: context.TODO(), request: &apb.AddLinkRequest{ @@ -135,7 +234,7 @@ func TestTopology_AddLink(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tr := getTestTopologyServer() + tr := getTestTopologyServer(t, tt.fields.nodes, tt.fields.ports, tt.fields.links) got, err := tr.AddLink(tt.args.ctx, tt.args.request) if (err != nil) != tt.wantErr { t.Errorf("Topology.AddLink() error = %v, wantErr %v", err, tt.wantErr) @@ -150,10 +249,9 @@ func TestTopology_AddLink(t *testing.T) { func TestTopology_GetTopology(t *testing.T) { type fields struct { - UnimplementedTopologyServiceServer apb.UnimplementedTopologyServiceServer - topologyService topology.Service - nodeService nodes.Service - portService ports.Service + ports []ports.Port + nodes []nodes.Node + links []links.Link } type args struct { ctx context.Context @@ -166,88 +264,54 @@ func TestTopology_GetTopology(t *testing.T) { want *apb.GetTopologyResponse wantErr bool }{ - // TODO: Add test cases. + { + name: "should add a new link", + fields: fields{ + ports: []ports.Port{getTestSourcePort(), getTestTargetPort()}, + nodes: []nodes.Node{getTestSourceNode(), getTestTargetNode()}, + links: []links.Link{getTestLinkInternal()}, + }, + args: args{ + ctx: context.TODO(), + request: &apb.GetTopologyRequest{}, + }, + want: &apb.GetTopologyResponse{ + Status: apb.Status_STATUS_OK, + Toplogy: &apb.Topology{ + Links: []*apb.Link{ + { + Id: "5eb474f1-428e-4503-ba68-dcf9bef53467", + Name: "Test-Link", + SourceNode: &apb.Node{ + Id: "44fb4aa4-c53c-4cf9-a081-5aabc61c7610", Name: "Test-Source-Node", + }, + SourcePort: &apb.Port{ + Id: "1fa479e7-d393-4d45-822d-485cc1f05fce", + }, + TargetNode: &apb.Node{ + Id: "44fb4aa4-c53c-4cf9-a081-5aabc61c7612", Name: "Test-Target-Node", + }, + TargetPort: &apb.Port{ + Id: "1fa479e7-d393-4d45-822d-485cc1f05fc2", + }, + }, + }, + }, + }, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tr := Topology{ - UnimplementedTopologyServiceServer: tt.fields.UnimplementedTopologyServiceServer, - topologyService: tt.fields.topologyService, - nodeService: tt.fields.nodeService, - portService: tt.fields.portService, - } + tr := getTestTopologyServer(t, tt.fields.nodes, tt.fields.ports, tt.fields.links) got, err := tr.GetTopology(tt.args.ctx, tt.args.request) if (err != nil) != tt.wantErr { t.Errorf("Topology.GetTopology() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { + if !reflect.DeepEqual(got.Toplogy, tt.want.Toplogy) { t.Errorf("Topology.GetTopology() = %v, want %v", got, tt.want) } }) } } - -func TestTopology_ensureNodeAndPortExists(t *testing.T) { - type fields struct { - UnimplementedTopologyServiceServer apb.UnimplementedTopologyServiceServer - topologyService topology.Service - nodeService nodes.Service - portService ports.Service - } - type args struct { - incomingNode *apb.Node - incomingPort *apb.Port - } - tests := []struct { - name string - fields fields - args args - want nodes.Node - want1 ports.Port - wantErr bool - }{ - // TODO: Add test cases. - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - tr := Topology{ - UnimplementedTopologyServiceServer: tt.fields.UnimplementedTopologyServiceServer, - topologyService: tt.fields.topologyService, - nodeService: tt.fields.nodeService, - portService: tt.fields.portService, - } - got, got1, err := tr.ensureNodeAndPortExists(tt.args.incomingNode, tt.args.incomingPort) - if (err != nil) != tt.wantErr { - t.Errorf("Topology.ensureNodeAndPortExists() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("Topology.ensureNodeAndPortExists() got = %v, want %v", got, tt.want) - } - if !reflect.DeepEqual(got1, tt.want1) { - t.Errorf("Topology.ensureNodeAndPortExists() got1 = %v, want %v", got1, tt.want1) - } - }) - } -} - -func Test_getExistingOrCreateNewUUIDFromString(t *testing.T) { - type args struct { - id string - } - tests := []struct { - name string - args args - want uuid.UUID - }{ - // TODO: Add test cases. - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := getExistingOrCreateNewUUIDFromString(tt.args.id); !reflect.DeepEqual(got, tt.want) { - t.Errorf("getExistingOrCreateNewUUIDFromString() = %v, want %v", got, tt.want) - } - }) - } -}