diff --git a/database/database.go b/database/database.go index bd8dfd6dfed5ecfb1f1b5baff169380769711f1f..8874bdc542416e1807793fad8799646de31a39b9 100644 --- a/database/database.go +++ b/database/database.go @@ -25,7 +25,6 @@ func NewDatabaseClient(uri, username, password string, encrypted bool) Database return Database{ driver: driver, } - } //createDriver creates a neo4j.Driver instance @@ -86,7 +85,6 @@ func storePndTxFunc(name, description string, interfaces []string) neo4j.Transac } if result.Next() { - log.Info(result.Consume()) return result.Record().GetByIndex(0), nil } @@ -104,6 +102,7 @@ func (d Database) StorePND(pnd *PND) neo4j.Node { log.Info(err) } + log.Info("created/updated PND with id: ", result.(neo4j.Node).Id()) return result.(neo4j.Node) } @@ -164,7 +163,6 @@ func (d Database) StoreNodes(json string) []neo4j.Node { //TODO: remove this after testing and add own gRPC call for it testPND := PND{name: "test_PND", description: "very interesting", interfaces: []string{"TAPI", "RESTCONF"}} pnd := d.StorePND(&testPND).Id() - log.Info(pnd) session := createSession(d.driver, true) defer session.Close() @@ -174,6 +172,7 @@ func (d Database) StoreNodes(json string) []neo4j.Node { log.Info(err) } + log.Info("added/updated devices (count): ", len(result.([]neo4j.Node))) return result.([]neo4j.Node) } @@ -229,62 +228,90 @@ func (d Database) StoreLinks(json string) []neo4j.Relationship { log.Info(err) } + log.Info("added/updated links (count): ", len(result.([]neo4j.Relationship))) + return result.([]neo4j.Relationship) } -//StoreNodeEdgePoints stores the given node edge points (interfaces) -func (d Database) StoreNodeEdgePoints(json string) { - session := createSession(d.driver, true) - defer session.Close() +func storeNodeEdgePointsTxFunc(json string) neo4j.TransactionWork { + return func(tx neo4j.Transaction) (interface{}, error) { + query := + ` + WITH apoc.convert.fromJsonMap($stringToAdd) + AS value + UNWIND value.data as i + MERGE (interface:Interface {id: i.object_id}) + ON CREATE SET interface.object_type =i.object_type, + interface.localId = i.object_data.` + "`tapi-object-data`.name[0].value," + ` + interface.location = i.object_data.` + "`tapi-object-data`.name[1].value," + ` + interface.` + "`containing-node` = i.object_data.`tapi-object-data`.`containing-node`" + ` + RETURN count(interface) + ` - query := - ` - WITH apoc.convert.fromJsonMap($stringToAdd) - AS value - UNWIND value.data as i - MERGE (interface:Interface {id: i.object_id}) - ON CREATE SET interface.object_type =i.object_type, - interface.localId = i.object_data.` + "`tapi-object-data`.name[0].value," + ` - interface.location = i.object_data.` + "`tapi-object-data`.name[1].value," + ` - interface.` + "`containing-node` = i.object_data.`tapi-object-data`.`containing-node`" - - _, err := session.Run( - query, map[string]interface{}{ + result, err := tx.Run(query, map[string]interface{}{ "stringToAdd": json, }) - if err != nil { - log.Info("failed storing NodeEdgePoints into database:", err) + if err != nil { + return nil, err + } + + if result.Next() { + return result.Record().GetByIndex(0), nil + } + + return nil, errors.New("expected a record") } +} + +//TODO: currently this goes over each and every device and interface and adds +// a interface_of relation. -> do it only for the newly added interfaces +// returns count of created relations +func storeNodeEdgePointsRelationTxFunc() neo4j.TransactionWork { + return func(tx neo4j.Transaction) (interface{}, error) { + query := + ` + MATCH (d:Device), (i:Interface) + WHERE d.id = i.` + "`containing-node`" + ` + MERGE (i)-[r:INTERFACE_OF]->(d) + RETURN count(r) + ` - setNodeNodeEdgePointsRelation(session) + result, err := tx.Run(query, nil) - log.Info("successfully added NodeEdgePoints into database") + if err != nil { + return nil, err + } -} + if result.Next() { + return result.Record().GetByIndex(0), nil + } -//StoreConnections stores relations between nodes -func (d Database) StoreConnections(json string) {} + return nil, errors.New("expected a record") + } +} -//setNodeNodeEdgePointsRelation creates the database relations between "nodes" and "node edge points" -func setNodeNodeEdgePointsRelation(session neo4j.Session) { - query := - ` - MATCH (d:Device), (i:Interface) - WHERE d.id = i.` + "`containing-node`" + ` - MERGE (i)-[:INTERFACE_OF]->(d) - ` +//StoreNodeEdgePoints stores the given node edge points (interfaces) +func (d Database) StoreNodeEdgePoints(json string) { + session := createSession(d.driver, true) + defer session.Close() - _, err := session.Run( - query, map[string]interface{}{}) + result, err := session.WriteTransaction(storeNodeEdgePointsTxFunc(json)) + if err != nil { + log.Info(err) + } + _, err = session.WriteTransaction(storeNodeEdgePointsRelationTxFunc()) if err != nil { - log.Info("failed storing NodeNodeEdgePointsRelation into database:", err) + log.Info(err) } - log.Info("successfully stored NodeNodeEdgePointsRelation into database") + log.Info("added/updated nodeEdgePoints (count): ", result) } +//StoreConnections stores relations between nodes +func (d Database) StoreConnections(json string) {} + //StoreTopology creates a new network topology node. Can also create a relation //the new node and a existing one if desired func StoreTopology() {}