diff --git a/controller/northbound/server/topology.go b/controller/northbound/server/topology.go index 099afe5347d1d431a82e7b73ed93109d77d66e2c..27e7dd3618fcafb2c28e585e48f81dc86b1c2b95 100644 --- a/controller/northbound/server/topology.go +++ b/controller/northbound/server/topology.go @@ -78,8 +78,19 @@ func (t *TopologyServer) AddLink(ctx context.Context, request *topopb.AddLinkReq return nil, status.Errorf(codes.Aborted, "%v", err) } + // check if UUID is set + var id uuid.UUID + if requestId := request.Link.Id; requestId != "" { + id, err = uuid.Parse(requestId) + if err != nil { + return nil, err + } + } else { + id = uuid.New() + } + link := links.Link{ - ID: uuid.New(), + ID: id, Name: request.Link.Name, SourceNode: sourceNode, SourcePort: sourcePort, diff --git a/controller/topology/topologyService.go b/controller/topology/topologyService.go index b562a9d7b09e4c34a512007212c24cc2c0c10ee5..a1edd6464fa21ef0c2e869b68fff9be94993d335 100644 --- a/controller/topology/topologyService.go +++ b/controller/topology/topologyService.go @@ -51,25 +51,6 @@ func NewTopologyService( // AddLink adds a new link to the topology. func (t *TopoService) 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 - // } ctx := context.Background() err := t.store.Add(ctx, link) diff --git a/controller/topology/topologyStore.go b/controller/topology/topologyStore.go index 009d1eab7b78899a0d813a4815c35c7e5be971cf..f434248f2ea72c2d535e7600442ea0af3de5f910 100644 --- a/controller/topology/topologyStore.go +++ b/controller/topology/topologyStore.go @@ -62,7 +62,7 @@ func (s *DatabaseTopologyStore) Get(ctx context.Context, query query.Query) (lin } func (s *DatabaseTopologyStore) getByID(ctx context.Context, idOfTopology uuid.UUID) (loadedTopology links.Link, err error) { - result := s.collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfTopology.String()}}) + result := s.collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfTopology}}) if result == nil { return loadedTopology, customerrs.CouldNotFindError{ID: idOfTopology} } @@ -136,7 +136,7 @@ func (s *DatabaseTopologyStore) Update(ctx context.Context, linkToUpdate links.L err = s.collection. FindOneAndUpdate( - ctx, bson.M{"_id": linkToUpdate.ID.String()}, update, &opt). + ctx, bson.M{"_id": linkToUpdate.ID}, update, &opt). Decode(&updatedLink) if err != nil { return customerrs.CouldNotUpdateError{Identifier: linkToUpdate.ID, Type: linkToUpdate, Err: err} @@ -147,7 +147,7 @@ func (s *DatabaseTopologyStore) Update(ctx context.Context, linkToUpdate links.L // Delete deletes a link from the link store. func (s *DatabaseTopologyStore) Delete(ctx context.Context, linkToDelete links.Link) (err error) { - _, err = s.collection.DeleteOne(ctx, bson.D{primitive.E{Key: linkToDelete.ID.String()}}) + _, err = s.collection.DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: linkToDelete.ID}}) if err != nil { return err } diff --git a/integration-tests/topology_tests/topology_test.go b/integration-tests/topology_tests/topology_test.go index 5e6a44baffc7dcf14a55f9dc5dbef11bd8ac9a3d..54c625541f789fc5b616d995dc95dd988e99c70a 100644 --- a/integration-tests/topology_tests/topology_test.go +++ b/integration-tests/topology_tests/topology_test.go @@ -78,81 +78,78 @@ func TestCreateTopologyAndGetIt(t *testing.T) { assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.PrefixLength) } -// goSDN crashed due to validation errors in the topology service. If bug is fixed, uncomment and finish this test. -//func TestCreateTopologyFailsValidation(t *testing.T) { -// defer integration_test_utils.ApplySDNConfig(conn, ctx, defaultSDNConfig) -// -// addLinkRequest := topologyPb.AddLinkRequest{ -// Link: &topologyPb.Link{ -// Name: "Link1", -// SourceNode: &topologyPb.Node{Name: "Node1"}, -// TargetNode: &topologyPb.Node{Name: "Node2"}, -// SourcePort: &topologyPb.Port{Name: "Port1"}, -// TargetPort: &topologyPb.Port{Name: "Port2"}}, -// } -// -// topologyService := topologyPb.NewTopologyServiceClient(conn) -// _, err := topologyService.AddLink(ctx, &addLinkRequest) -// -// if err == nil { -// t.Errorf("Test expected an error, none received.") -// } -//} +func TestCreateTopologyFailsValidation(t *testing.T) { + defer integration_test_utils.ApplySDNConfig(conn, ctx, defaultSDNConfig) + + addLinkRequest := topologyPb.AddLinkRequest{ + Link: &topologyPb.Link{ + Name: "Link1", + SourceNode: &topologyPb.Node{Name: "Node1"}, + TargetNode: &topologyPb.Node{Name: "Node2"}, + SourcePort: &topologyPb.Port{Name: "Port1"}, + TargetPort: &topologyPb.Port{Name: "Port2"}}, + } + + topologyService := topologyPb.NewTopologyServiceClient(conn) + resp, err := topologyService.AddLink(ctx, &addLinkRequest) + assert.Error(t, err, "Test expected an error, none received.") + assert.Nil(t, resp, "Test expects the resp to be nil if an error is thrown beforehand.") +} // Test that creates a topology and then deletes it and checks that all topologies are deleted. // Can't delete topology because of bug in goSDN. If bug is fixed, uncomment and finish this test. -//func TestCreateThenDeleteTopologyAndGetEmptyTopologies(t *testing.T) { -// defer integration_test_utils.ApplySDNConfig(conn, ctx, defaultSDNConfig) -// -// addLinkRequest := topologyPb.AddLinkRequest{ -// Link: &topologyPb.Link{ -// Name: "Link1", -// SourceNode: &topologyPb.Node{Name: "Node1"}, -// TargetNode: &topologyPb.Node{Name: "Node2"}, -// SourcePort: &topologyPb.Port{Name: "Port1", -// Configuration: &topologyPb.Configuration{ -// Ip: "10.0.0.1", -// PrefixLength: 24}}, -// TargetPort: &topologyPb.Port{Name: "Port2", -// Configuration: &topologyPb.Configuration{ -// Ip: "10.0.0.2", -// PrefixLength: 24}}}, -// } -// -// topologyService := topologyPb.NewTopologyServiceClient(conn) -// _, err := topologyService.AddLink(ctx, &addLinkRequest) -// if err != nil { -// t.Errorf("Error while adding link: %v", err) -// } -// -// getTopolgyResponse, err := topologyService.GetTopology(ctx, &topologyPb.GetTopologyRequest{}) -// if err != nil { -// t.Errorf("Error while getting topology: %v", err) -// } -// -// assert.Equal(t, 1, len(getTopolgyResponse.Toplogy.Links)) -// assert.Equal(t, "Link1", getTopolgyResponse.Toplogy.Links[0].Name) -// assert.Equal(t, "Node1", getTopolgyResponse.Toplogy.Links[0].SourceNode.Name) -// assert.Equal(t, "Node2", getTopolgyResponse.Toplogy.Links[0].TargetNode.Name) -// assert.Equal(t, "Port1", getTopolgyResponse.Toplogy.Links[0].SourcePort.Name) -// assert.Equal(t, "10.0.0.1", getTopolgyResponse.Toplogy.Links[0].SourcePort.Configuration.Ip) -// assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].SourcePort.Configuration.PrefixLength) -// assert.Equal(t, "Port2", getTopolgyResponse.Toplogy.Links[0].TargetPort.Name) -// assert.Equal(t, "10.0.0.2", getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.Ip) -// assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.PrefixLength) -// -// deleteLinkRequest := topologyPb.DeleteLinkRequest{Id: getTopolgyResponse.Toplogy.Links[0].Id} -// _, err = topologyService.DeleteLink(ctx, &deleteLinkRequest) -// if err != nil { -// t.Errorf("Error while deleting link: %v", err) -// } -// getTopologyRequest := &topologyPb.GetTopologyRequest{} -// getTopologyResponse, err := topologyService.GetTopology(ctx, getTopologyRequest) -// if err != nil { -// t.Errorf("Error while getting topologies: %v", err) -// } -// -// assert.Equal(t, 0, len(getTopologyResponse.Toplogy.Links)) -//} -// +func TestCreateThenDeleteTopologyAndGetEmptyTopologies(t *testing.T) { + defer integration_test_utils.ApplySDNConfig(conn, ctx, defaultSDNConfig) + + addLinkRequest := topologyPb.AddLinkRequest{ + Link: &topologyPb.Link{ + Id: "8a01b8b0-6244-42bf-b72a-3821efc1a353", + Name: "Link1", + SourceNode: &topologyPb.Node{Name: "Node1"}, + TargetNode: &topologyPb.Node{Name: "Node2"}, + SourcePort: &topologyPb.Port{Name: "Port1", + Configuration: &topologyPb.Configuration{ + Ip: "10.0.0.1", + PrefixLength: 24}}, + TargetPort: &topologyPb.Port{Name: "Port2", + Configuration: &topologyPb.Configuration{ + Ip: "10.0.0.2", + PrefixLength: 24}}}, + } + + topologyService := topologyPb.NewTopologyServiceClient(conn) + _, err := topologyService.AddLink(ctx, &addLinkRequest) + if err != nil { + t.Errorf("Error while adding link: %v", err) + } + + getTopolgyResponse, err := topologyService.GetTopology(ctx, &topologyPb.GetTopologyRequest{}) + if err != nil { + t.Errorf("Error while getting topology: %v", err) + } + + assert.Equal(t, 1, len(getTopolgyResponse.Toplogy.Links)) + assert.Equal(t, "Link1", getTopolgyResponse.Toplogy.Links[0].Name) + assert.Equal(t, "Node1", getTopolgyResponse.Toplogy.Links[0].SourceNode.Name) + assert.Equal(t, "Node2", getTopolgyResponse.Toplogy.Links[0].TargetNode.Name) + assert.Equal(t, "Port1", getTopolgyResponse.Toplogy.Links[0].SourcePort.Name) + assert.Equal(t, "10.0.0.1", getTopolgyResponse.Toplogy.Links[0].SourcePort.Configuration.Ip) + assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].SourcePort.Configuration.PrefixLength) + assert.Equal(t, "Port2", getTopolgyResponse.Toplogy.Links[0].TargetPort.Name) + assert.Equal(t, "10.0.0.2", getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.Ip) + assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.PrefixLength) + + deleteLinkRequest := topologyPb.DeleteLinkRequest{Id: getTopolgyResponse.Toplogy.Links[0].Id} + _, err = topologyService.DeleteLink(ctx, &deleteLinkRequest) + if err != nil { + t.Errorf("Error while deleting link: %v", err) + } + getTopologyRequest := &topologyPb.GetTopologyRequest{} + getTopologyResponse, err := topologyService.GetTopology(ctx, getTopologyRequest) + if err != nil { + t.Errorf("Error while getting topologies: %v", err) + } + + assert.Equal(t, 0, len(getTopologyResponse.Toplogy.Links)) +}