diff --git a/controller.go b/controller.go index 62c82fec86a1b87bc7747d6333f069f0c2dfd6c7..a4c1b4f77ab098a7d1377a2233765dd03a4a2632 100644 --- a/controller.go +++ b/controller.go @@ -21,7 +21,6 @@ import ( "code.fbi.h-da.de/danet/gosdn/interfaces/southbound" nbi "code.fbi.h-da.de/danet/gosdn/northbound/server" - "code.fbi.h-da.de/danet/gosdn/database" "code.fbi.h-da.de/danet/gosdn/nucleus" ) @@ -30,9 +29,6 @@ var coreOnce sync.Once // Core is the representation of the controller's core type Core struct { - // deprecated - database database.Database - pndc *nucleus.PndStore httpServer *http.Server grpcServer *grpc.Server @@ -46,7 +42,6 @@ var c *Core func init() { c = &Core{ - database: database.Database{}, pndc: nucleus.NewPndStore(), stopChan: make(chan os.Signal, 1), } diff --git a/database/client.go b/database/client.go deleted file mode 100644 index 86dbdb186b2114a590d74cfa26d2e99ff19990e9..0000000000000000000000000000000000000000 --- a/database/client.go +++ /dev/null @@ -1,360 +0,0 @@ -package database - -import ( - "errors" - - "github.com/neo4j/neo4j-go-driver/neo4j" - log "github.com/sirupsen/logrus" - "github.com/spf13/viper" -) - -// Database is a database -// deprecated -type Database struct { - driver neo4j.Driver -} - -// PND is a principle network domain -type PND struct { - name string - description string - interfaces []string -} - -// NewDatabaseClient creates a database ciena -func NewDatabaseClient() Database { - uri := viper.GetString("db.socket") - username := viper.GetString("db.user") - password := viper.GetString("db.password") - encrypted := viper.GetBool("db.crypto") - driver := createDriver(uri, username, password, encrypted) - - return Database{ - driver: driver, - } -} - -// createDriver creates a neo4j.Driver instance -func createDriver(uri, username, password string, encrypted bool) neo4j.Driver { - driver, err := neo4j.NewDriver( - uri, - neo4j.BasicAuth(username, password, ""), - func(c *neo4j.Config) { - c.Encrypted = encrypted - }, - ) - - if err != nil { - log.Info("failed creating database driver:", err) - } - - return driver -} - -// createSession creates a neo4j.Session -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 { - log.Info(err) - } - - return session -} - -// storePndTxFunc transaction to store a pnd in the database -func storePndTxFunc(name, description string, interfaces []string) neo4j.TransactionWork { - return func(tx neo4j.Transaction) (interface{}, error) { - query := - ` - MERGE (pnd:PND {name: $name}) - ON CREATE SET pnd.description = $description, - pnd.interfaces = $interfaces - RETURN pnd - ` - - result, err := tx.Run(query, map[string]interface{}{ - "name": name, - "description": description, - "interfaces": interfaces, - }) - - if err != nil { - //TODO: handle neo4j.isServiceUnavailable() - return nil, err - } - - if result.Next() { - return result.Record().GetByIndex(0), nil - } - - return nil, errors.New("expected a record") - } -} - -// StorePND stores the given principle network domain -func (d Database) StorePND(pnd *PND) neo4j.Node { - session := createSession(d.driver, true) - defer session.Close() - - result, err := session.WriteTransaction(storePndTxFunc(pnd.name, pnd.description, pnd.interfaces)) - if err != nil { - log.Info(err) - } - - log.Info("created/updated PND with id: ", result.(neo4j.Node).Id()) - return result.(neo4j.Node) -} - -//RemovePND removes the given principle network domain by id. -func (d Database) RemovePND(id string) {} - -//GetPNDByID gets a specific PND by the given ID. -func (d Database) GetPNDByID(id string) {} - -//GetNodesByLabel gets all nodes that belong to a specific label. -func (d Database) GetNodesByLabel(label string) {} - -//GetNodeByID gets a specific node by ID. -func (d Database) GetNodeByID(id string) {} - -//storeNodesTxFunc transaction to store devices from a json. -//relates them to a specific pnd id. -//returns a slice of added devices -func storeNodesTxFunc(json string, id int64) neo4j.TransactionWork { - return func(tx neo4j.Transaction) (interface{}, error) { - var nodelist []neo4j.Node - query := - ` - WITH apoc.convert.fromJsonMap($stringToAdd) - AS value - UNWIND value.data as d - MERGE (device:Device {id: d.object_id}) - ON CREATE SET device.nativeName = d.object_data.` + "`tapi-object-data`.name[0].value," + ` - device.deviceType = d.object_data.` + "`tapi-object-data`.name[1].value," + ` - device.serialNumber = d.object_data.` + "`tapi-object-data`.name[2].value," + ` - device.softwareVersion = d.object_data.` + "`tapi-object-data`.name[3].value," + ` - device.` + "`operational-state` = d.object_data.`tapi-object-data`.`operational-state`" + ` - WITH device - MATCH (pnd:PND) - WHERE id(pnd) = $pnd - MERGE (device)-[:BELONGS_TO]->(pnd) - RETURN device - ` - - result, err := tx.Run(query, map[string]interface{}{ - "stringToAdd": json, - "pnd": id, - }) - - if err != nil { - //TODO: handle neo4j.isServiceUnavailable() - return nil, err - } - - for result.Next() { - nodelist = append(nodelist, result.Record().GetByIndex(0).(neo4j.Node)) - } - - if err = result.Err(); err != nil { - return nil, err - } - - return nodelist, nil - } -} - -// 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) []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() - - session := createSession(d.driver, true) - defer session.Close() - - result, err := session.WriteTransaction(storeNodesTxFunc(json, pnd)) - if err != nil { - log.Info(err) - } - - log.Info("added/updated devices (count): ", len(result.([]neo4j.Node))) - return result.([]neo4j.Node) -} - -// RemoveNodes removes the given nodes and their relationships -func (d Database) RemoveNodes(json string) {} - -// RemoveSingleNode removes the given node and their relationship by id. -func (d Database) RemoveSingleNode(id string) {} - -// storeLinksTxFunc transaction to store links from a json. -// creates relation between different devices. -// returns a slice of those created relations. -func storeLinksTxFunc(json string) neo4j.TransactionWork { - return func(tx neo4j.Transaction) (interface{}, error) { - var relationsList []neo4j.Relationship - query := - ` - WITH apoc.convert.fromJsonMap($stringToAdd) - AS value - UNWIND value.data as l - MATCH (d:Device), (d2:Device) - WHERE d.id = l.object_data.` + "`tapi-object-data`.`node-edge-point`[0].`node-uuid`" + ` - AND d2.id = l.object_data.` + "`tapi-object-data`.`node-edge-point`[1].`node-uuid`" + ` - CALL apoc.merge.relationship(d,l.object_data.` + "`tapi-object-data`.`layer-qualifier`,{},{}, d2,{})" + ` - YIELD rel - RETURN rel - ` - - result, err := tx.Run(query, map[string]interface{}{ - "stringToAdd": json, - }) - - if err != nil { - //TODO: handle neo4j.isServiceUnavailable() - return nil, err - } - - for result.Next() { - relationsList = append(relationsList, result.Record().GetByIndex(0).(neo4j.Relationship)) - } - - if err = result.Err(); err != nil { - return nil, err - } - - return relationsList, nil - } -} - -// StoreLinks stores the links between nodes -func (d Database) StoreLinks(json string) []neo4j.Relationship { - session := createSession(d.driver, true) - defer session.Close() - - result, err := session.WriteTransaction(storeLinksTxFunc(json)) - if err != nil { - log.Info(err) - } - - log.Info("added/updated links (count): ", len(result.([]neo4j.Relationship))) - - return result.([]neo4j.Relationship) -} - -// storeNodeEdgePointsTxFunc transaction to store interfaces from a json. -// returns count of added/updated interfaces -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) - ` - - result, err := tx.Run(query, map[string]interface{}{ - "stringToAdd": json, - }) - - if err != nil { - //TODO: handle neo4j.isServiceUnavailable() - 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/interface and adds -// a interface_of relation. -> do it only for the newly added interfaces - -// storeNodeEdgePointsRelationTxFunc transaction to create relations between interfaces and devices -// returns count of added/updated 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) - ` - - result, err := tx.Run(query, nil) - - if err != nil { - //TODO: handle neo4j.isServiceUnavailable() - return nil, err - } - - if result.Next() { - return result.Record().GetByIndex(0), nil - } - - return nil, errors.New("expected a record") - } -} - -// StoreNodeEdgePoints stores the given node edge points (interfaces) -func (d Database) StoreNodeEdgePoints(json string) { - session := createSession(d.driver, true) - defer session.Close() - - result, err := session.WriteTransaction(storeNodeEdgePointsTxFunc(json)) - if err != nil { - log.Info(err) - } - - _, err = session.WriteTransaction(storeNodeEdgePointsRelationTxFunc()) - if err != nil { - log.Info(err) - } - - 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() {} - -// 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() error { - return d.driver.Close() -}