diff --git a/database/database.go b/database/database.go index 11e3a543d813f86c8e02ac61cfbee42b8838e56b..2ac409b3eec9f681995be93d71bdcee7f7df5290 100644 --- a/database/database.go +++ b/database/database.go @@ -7,8 +7,7 @@ import ( //Database is a database type Database struct { - driver neo4j.Driver - session neo4j.Session + driver neo4j.Driver } //PND is a principle network domain @@ -21,11 +20,9 @@ type PND struct { //NewDatabaseClient creates a database client func NewDatabaseClient(uri, username, password string, encrypted bool) Database { driver := createDriver(uri, username, password, encrypted) - session := createSession(driver) return Database{ - driver: driver, - session: session, + driver: driver, } } @@ -41,15 +38,22 @@ func createDriver(uri, username, password string, encrypted bool) neo4j.Driver { ) if err != nil { - log.Info("failed creating database Driver:", err) + log.Info("failed creating database driver:", err) } return driver } //createSession creates a neo4j.Session -func createSession(driver neo4j.Driver) neo4j.Session { - sessionConfig := neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite} +func createSession(driver neo4j.Driver, write bool) neo4j.Session { + var sessionConfig neo4j.SessionConfig + + if write { + sessionConfig = neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite} + } else { + sessionConfig = neo4j.SessionConfig{AccessMode: neo4j.AccessModeRead} + } + session, err := driver.NewSession(sessionConfig) if err != nil { @@ -61,6 +65,9 @@ func createSession(driver neo4j.Driver) neo4j.Session { //StorePND stores the given principle network domain func (d Database) StorePND(pnd *PND) { + session := createSession(d.driver, true) + defer session.Close() + query := ` MERGE (pnd:PND {name: $name}) @@ -68,7 +75,7 @@ func (d Database) StorePND(pnd *PND) { pnd.southboundInterfaces = $southboundInterfaces ` //refactor map[string]interface... in own function - _, err := d.session.Run( + _, err := session.Run( query, map[string]interface{}{ "name": pnd.name, "description": pnd.description, @@ -85,6 +92,12 @@ func (d Database) StorePND(pnd *PND) { //RemovePND removes the given principle network domain by id. func (d Database) RemovePND(id string) {} +func (d Database) GetPNDByID(id string) {} + +func (d Database) GetNodesByLabel(label string) {} + +func (d Database) GetDeviceByID(id string) {} + //StoreNodes stores the given nodes to the database and adds them to a //principle networt domain (PND). It is required for a node to belong to a PND. func (d Database) StoreNodes(json string) { @@ -92,6 +105,9 @@ func (d Database) StoreNodes(json string) { testPND := PND{name: "test_PND", description: "very, interesting", southboundInterfaces: []string{"TAPI", "RESTCONF"}} d.StorePND(&testPND) + session := createSession(d.driver, true) + defer session.Close() + query := ` WITH apoc.convert.fromJsonMap($stringToAdd) @@ -109,7 +125,7 @@ func (d Database) StoreNodes(json string) { MERGE (device)-[:BELONGS_TO]->(pnd) ` - _, err := d.session.Run( + _, err := session.Run( query, map[string]interface{}{ "stringToAdd": json, "pnd": testPND.name, @@ -130,9 +146,11 @@ func (d Database) RemoveSingleNode(id string) {} //StoreLinks stores the links between nodes func (d Database) StoreLinks(json string) { + session := createSession(d.driver, true) + defer session.Close() + query := - ` - WITH apoc.convert.fromJsonMap($stringToAdd) + ` WITH apoc.convert.fromJsonMap($stringToAdd) AS value UNWIND value.data as l MATCH (d:Device), (d2:Device) @@ -143,7 +161,7 @@ func (d Database) StoreLinks(json string) { RETURN rel ` - _, err := d.session.Run( + _, err := session.Run( query, map[string]interface{}{ "stringToAdd": json, }) @@ -157,6 +175,9 @@ func (d Database) StoreLinks(json string) { //StoreNodeEdgePoints stores the given node edge points (interfaces) func (d Database) StoreNodeEdgePoints(json string) { + session := createSession(d.driver, true) + defer session.Close() + query := ` WITH apoc.convert.fromJsonMap($stringToAdd) @@ -168,7 +189,7 @@ func (d Database) StoreNodeEdgePoints(json string) { interface.location = i.object_data.` + "`tapi-object-data`.name[1].value," + ` interface.` + "`containing-node` = i.object_data.`tapi-object-data`.`containing-node`" - _, err := d.session.Run( + _, err := session.Run( query, map[string]interface{}{ "stringToAdd": json, }) @@ -177,7 +198,7 @@ func (d Database) StoreNodeEdgePoints(json string) { log.Info("failed storing NodeEdgePoints into database:", err) } - setNodeNodeEdgePointsRelation(d.session) + setNodeNodeEdgePointsRelation(session) log.Info("successfully added NodeEdgePoints into database") @@ -205,12 +226,25 @@ func setNodeNodeEdgePointsRelation(session neo4j.Session) { log.Info("successfully stored NodeNodeEdgePointsRelation into database") } +//StoreTopology creates a new network topology node. Can also create a relation +//the new node and a existing one if desired +func StoreTopology() {} + +//RemoveTopology removes the given network topology. This includes the node itself +//aswell as the containing links and relations +func RemoveTopology() {} + +//CreateTopologyRelation creates a relation between two given topologies +func CreateTopologyRelation() {} + +//CreateLink creates a link between two network elements +func CreateLink() {} + +//RemoveLink removes a link between two network elements +func RemoveLink() {} + //Shutdown closes the connection to the database func (d Database) Shutdown() { - //TODO: add logger - if err := d.session.Close(); err != nil { - } - if err := d.driver.Close(); err != nil { } }