Skip to content
Snippets Groups Projects
Commit 44f0504a authored by Malte Bauch's avatar Malte Bauch
Browse files

updated the database for devices and links

this is a simple approach. we probably need to reconsider how we want to
handle data in neo4j and especially with ygot.
parent ff338723
No related branches found
No related tags found
1 merge request!81Draft: Resolve "update database for ygot"
Pipeline #55427 passed with warnings
......@@ -119,33 +119,27 @@ 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.
//storeNodeTxFunc 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 {
func storeNodeTxFunc(id, name string, pndId 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`" + `
MERGE (device:Device {id: $id})
ON CREATE SET device.name = $name
WITH device
MATCH (pnd:PND)
WHERE id(pnd) = $pnd
WHERE id(pnd) = $pndId
MERGE (device)-[:BELONGS_TO]->(pnd)
RETURN device
`
result, err := tx.Run(query, map[string]interface{}{
"stringToAdd": json,
"pnd": id,
"id": id,
"name": name,
"pndId": pndId,
})
if err != nil {
......@@ -165,17 +159,17 @@ func storeNodesTxFunc(json string, id int64) neo4j.TransactionWork {
}
}
//StoreNodes stores the given nodes to the database and adds them to a
//StoreNode 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 {
func (d Database) StoreNode(id, name 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()
pndId := d.StorePND(&testPND).Id()
session := createSession(d.driver, true)
defer session.Close()
result, err := session.WriteTransaction(storeNodesTxFunc(json, pnd))
result, err := session.WriteTransaction(storeNodeTxFunc(id, name, pndId))
if err != nil {
log.Info(err)
}
......@@ -190,27 +184,31 @@ 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.
//storeLinkTxFunc 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 {
func storeLinkTxFunc(nep1Id, nep2Id string) neo4j.TransactionWork {
return func(tx neo4j.Transaction) (interface{}, error) {
var relationsList []neo4j.Relationship
query :=
// `
// MATCH (d:Device), (d2:Device)
// WHERE d.id = $nep1Id
// AND d2.id = $nep2Id
// CALL apoc.merge.relationship(d,$layerQualifier,{},{}, d2,{})
// YIELD rel
// RETURN rel
// `
`
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
WHERE d.id = $nep1Id
AND d2.id = $nep2Id
MERGE (d)-[r:connected]->(d2)
`
result, err := tx.Run(query, map[string]interface{}{
"stringToAdd": json,
"nep1Id": nep1Id,
"nep2Id": nep2Id,
})
if err != nil {
......@@ -230,12 +228,12 @@ func storeLinksTxFunc(json string) neo4j.TransactionWork {
}
}
//StoreLinks stores the links between nodes
func (d Database) StoreLinks(json string) []neo4j.Relationship {
//StoreLink stores the links between nodes
func (d Database) StoreLink(nep1Id, nep2Id string) []neo4j.Relationship {
session := createSession(d.driver, true)
defer session.Close()
result, err := session.WriteTransaction(storeLinksTxFunc(json))
result, err := session.WriteTransaction(storeLinkTxFunc(nep1Id, nep2Id))
if err != nil {
log.Info(err)
}
......
......@@ -89,6 +89,9 @@ func (c *MCPClient) GetConnections() error {
// GetLinks implements the TAPI Topology GetLinks call with a grain of
// Ciena salt. The response is written to the client's buffer and passed to the database
func (c *MCPClient) GetLinks() error {
var nep1 string
var nep2 string
defer c.buffer.Reset()
_, err := c.client.TapiTopologyCore.GetTapiCoreContextTopologyMcpBaseTopologyLink(nil)
if err != nil {
......@@ -106,10 +109,20 @@ func (c *MCPClient) GetLinks() error {
log.Info(err)
}
log.Info(*dest.Uuid)
count := 0
for _, nep := range dest.NodeEdgePoint {
if count == 0 {
nep1 = *nep.NodeUuid
} else {
nep2 = *nep.NodeUuid
}
count++
}
c.database.StoreLink(nep1, nep2)
}
// c.database.StoreLinks(c.buffer.String())
// log.Debug(c.buffer.Next(25))
log.Debug(c.buffer.Next(25))
return err
}
......@@ -122,7 +135,7 @@ func (c *MCPClient) GetNodes() error {
return err
}
json := preformatJSON(c.buffer.String(), c.config.GjsonDefaultPath)
json := gjson.Get(c.buffer.String(), c.config.GjsonDefaultPath)
for _, jsonEntry := range json.Array() {
dest := &tapi.TapiCommon_Context_TopologyContext_Topology_Node{}
......@@ -132,11 +145,10 @@ func (c *MCPClient) GetNodes() error {
//lot of them.
log.Info(err)
}
log.Info(*dest.Uuid)
c.database.StoreNode(*dest.Uuid, *dest.Name["nativeName"].Value)
}
// c.database.StoreNodes(c.buffer.String())
// log.Debug(c.buffer.Next(25))
log.Debug(c.buffer.Next(25))
return err
}
......@@ -200,7 +212,7 @@ func uppercaseJSONValues(jsonMap interface{}) interface{} {
for k, v := range jsonMap {
//TODO: maybe we can uppercase them too, but for now:
//DO NOT uppercase uuid's
if strings.Contains(k, "uuid") {
if strings.Contains(k, "uuid") || strings.Contains(k, "name") {
tmpInterfaceMap[k] = v
} else {
tmpInterfaceMap[k] = uppercaseJSONValues(v)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment