Skip to content
Snippets Groups Projects
Commit 1f4b309a authored by Malte Bauch's avatar Malte Bauch Committed by Fabian Seidl
Browse files

Store for links adjusted

Handling of links with the help of a store is handled quite differently
than how it is done in other cases (e.g., network element, user, roles).
Therefore the methods have been adjusted to deal with this fact.
parent 6aaa44d1
No related branches found
No related tags found
1 merge request!697Resolve "AddLink crashes goSDN when Link without correct port config is send."
Pipeline #178333 passed
This commit is part of merge request !697. Comments created here will be created in the context of that merge request.
......@@ -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,
......
......@@ -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)
......
......@@ -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
}
......
......@@ -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))
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment