Skip to content
Snippets Groups Projects
Commit d4953e76 authored by Manuel Kieweg's avatar Manuel Kieweg
Browse files

Merge branch 'change-go-module-paths' into 'develop'

Change go module paths

See merge request !184
parents d567237b 79fa7b50
No related branches found
No related tags found
No related merge requests found
Pipeline #80378 failed
# goSDN [![coverage report](https://code.fbi.h-da.de/cocsn/gosdn/badges/master/coverage.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/master) [![pipeline status](https://code.fbi.h-da.de/cocsn/gosdn/badges/master/pipeline.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/master) # goSDN [![coverage report](https://code.fbi.h-da.de/danet/gosdn/badges/master/coverage.svg)](https://code.fbi.h-da.de/danet/gosdn/-/commits/master) [![pipeline status](https://code.fbi.h-da.de/danet/gosdn/badges/master/pipeline.svg)](https://code.fbi.h-da.de/danet/gosdn/-/commits/master)
`goSDN` is a prototypical approach to build a model driven multi-vendor SDN controller. `goSDN` is a prototypical approach to build a model driven multi-vendor SDN controller.
...@@ -42,7 +42,7 @@ You can install the latest release of `goSDN` locally using the `go get` command ...@@ -42,7 +42,7 @@ You can install the latest release of `goSDN` locally using the `go get` command
```sh ```sh
> git config --global url."git@code.fbi.h-da.de:".insteadOf "https://code.fbi.h-da.de" > git config --global url."git@code.fbi.h-da.de:".insteadOf "https://code.fbi.h-da.de"
> go env -w GOPRIVATE=code.fbi.h-da.de/cocsn/* > go env -w GOPRIVATE=code.fbi.h-da.de/cocsn/*
> go get code.fbi.h-da.de/cocsn/gosdn/cmd/gosdn > go get code.fbi.h-da.de/danet/gosdn/cmd/gosdn
``` ```
To install the development version you need to clone the repo and use `go install` to build and install the binary: To install the development version you need to clone the repo and use `go install` to build and install the binary:
...@@ -54,7 +54,7 @@ To install the development version you need to clone the repo and use `go instal ...@@ -54,7 +54,7 @@ To install the development version you need to clone the repo and use `go instal
> git clone git@code.fbi.h-da.de:cocsn/gosdn.git > git clone git@code.fbi.h-da.de:cocsn/gosdn.git
# checkout the develop branch (or any other branch) # checkout the develop branch (or any other branch)
> cd $GOPATH/src/code.fbi.h-da.de/cocsn/gosdn > cd $GOPATH/src/code.fbi.h-da.de/danet/gosdn
> git checkout develop > git checkout develop
> go install ./cmd/gosdn > go install ./cmd/gosdn
``` ```
...@@ -64,7 +64,7 @@ Now you can start `goSDN` locally using the `gosdn` command or [use the CLI](#us ...@@ -64,7 +64,7 @@ Now you can start `goSDN` locally using the `gosdn` command or [use the CLI](#us
# Getting Started # Getting Started
## k8s ## k8s
We have an instance of `goSDN` for each the latest master and current develop branch running on the department's k8s cluster. These endpoints can be accessed using the `gosdn cli` command. If anything breaks please file an [issue](https://code.fbi.h-da.de/cocsn/gosdn/-/issues/new). We have an instance of `goSDN` for each the latest master and current develop branch running on the department's k8s cluster. These endpoints can be accessed using the `gosdn cli` command. If anything breaks please file an [issue](https://code.fbi.h-da.de/danet/gosdn/-/issues/new).
## Using the CLI ## Using the CLI
...@@ -78,5 +78,5 @@ The `gosdn cli` command allows you to interact with a running `goSDN` controller ...@@ -78,5 +78,5 @@ The `gosdn cli` command allows you to interact with a running `goSDN` controller
| Master | Develop | | Master | Develop |
| ------ | ------ | | ------ | ------ |
| [![coverage report](https://code.fbi.h-da.de/cocsn/gosdn/badges/master/coverage.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/master) | [![coverage report](https://code.fbi.h-da.de/cocsn/gosdn/badges/develop/coverage.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/develop) | | [![coverage report](https://code.fbi.h-da.de/danet/gosdn/badges/master/coverage.svg)](https://code.fbi.h-da.de/danet/gosdn/-/commits/master) | [![coverage report](https://code.fbi.h-da.de/danet/gosdn/badges/develop/coverage.svg)](https://code.fbi.h-da.de/danet/gosdn/-/commits/develop) |
| [![pipeline status](https://code.fbi.h-da.de/cocsn/gosdn/badges/master/pipeline.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/master) | [![pipeline status](https://code.fbi.h-da.de/cocsn/gosdn/badges/develop/pipeline.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/develop) | | [![pipeline status](https://code.fbi.h-da.de/danet/gosdn/badges/master/pipeline.svg)](https://code.fbi.h-da.de/danet/gosdn/-/commits/master) | [![pipeline status](https://code.fbi.h-da.de/danet/gosdn/badges/develop/pipeline.svg)](https://code.fbi.h-da.de/danet/gosdn/-/commits/develop) |
...@@ -3,8 +3,8 @@ package api ...@@ -3,8 +3,8 @@ package api
import ( import (
"testing" "testing"
"code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport" tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
"github.com/google/uuid" "github.com/google/uuid"
guuid "github.com/google/uuid" guuid "github.com/google/uuid"
"github.com/spf13/viper" "github.com/spf13/viper"
......
...@@ -3,10 +3,10 @@ package api ...@@ -3,10 +3,10 @@ package api
import ( import (
"testing" "testing"
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound" spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport" tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
"code.fbi.h-da.de/cocsn/gosdn/nucleus" "code.fbi.h-da.de/danet/gosdn/nucleus"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
......
...@@ -5,11 +5,11 @@ import ( ...@@ -5,11 +5,11 @@ import (
"errors" "errors"
"time" "time"
pb "code.fbi.h-da.de/cocsn/api/go/gosdn/core" pb "code.fbi.h-da.de/danet/api/go/gosdn/core"
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound" spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport" tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
nbi "code.fbi.h-da.de/cocsn/gosdn/northbound/client" nbi "code.fbi.h-da.de/danet/gosdn/northbound/client"
"github.com/google/uuid" "github.com/google/uuid"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/viper" "github.com/spf13/viper"
......
...@@ -7,14 +7,14 @@ import ( ...@@ -7,14 +7,14 @@ import (
"testing" "testing"
"time" "time"
cpb "code.fbi.h-da.de/cocsn/api/go/gosdn/core" cpb "code.fbi.h-da.de/danet/api/go/gosdn/core"
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport" tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
"code.fbi.h-da.de/cocsn/gosdn/mocks" "code.fbi.h-da.de/danet/gosdn/mocks"
nbi "code.fbi.h-da.de/cocsn/gosdn/northbound/server" nbi "code.fbi.h-da.de/danet/gosdn/northbound/server"
"code.fbi.h-da.de/cocsn/gosdn/nucleus" "code.fbi.h-da.de/danet/gosdn/nucleus"
"code.fbi.h-da.de/cocsn/gosdn/nucleus/util/proto" "code.fbi.h-da.de/danet/gosdn/nucleus/util/proto"
"code.fbi.h-da.de/cocsn/yang-models/generated/openconfig" "code.fbi.h-da.de/danet/yang-models/generated/openconfig"
"github.com/google/uuid" "github.com/google/uuid"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
......
package api package api
import ( import (
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport" tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/change" "code.fbi.h-da.de/danet/gosdn/interfaces/change"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/device" "code.fbi.h-da.de/danet/gosdn/interfaces/device"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/interfaces/networkdomain"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/interfaces/southbound"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/store" "code.fbi.h-da.de/danet/gosdn/interfaces/store"
"code.fbi.h-da.de/cocsn/gosdn/nucleus/errors" "code.fbi.h-da.de/danet/gosdn/nucleus/errors"
"github.com/google/uuid" "github.com/google/uuid"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
......
...@@ -4,13 +4,13 @@ import ( ...@@ -4,13 +4,13 @@ import (
"reflect" "reflect"
"testing" "testing"
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport" tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/change" "code.fbi.h-da.de/danet/gosdn/interfaces/change"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/device" "code.fbi.h-da.de/danet/gosdn/interfaces/device"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/interfaces/networkdomain"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/interfaces/southbound"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/store" "code.fbi.h-da.de/danet/gosdn/interfaces/store"
"github.com/google/uuid" "github.com/google/uuid"
) )
......
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
"os" "os"
"strconv" "strconv"
nucleus "code.fbi.h-da.de/cocsn/gosdn/nucleus/errors" nucleus "code.fbi.h-da.de/danet/gosdn/nucleus/errors"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/viper" "github.com/spf13/viper"
appv1 "k8s.io/api/apps/v1" appv1 "k8s.io/api/apps/v1"
...@@ -305,7 +305,7 @@ func createDeployment(environment, hash string) *appv1.Deployment { ...@@ -305,7 +305,7 @@ func createDeployment(environment, hash string) *appv1.Deployment {
Containers: []corev1.Container{ Containers: []corev1.Container{
{ {
Name: "gosdn", Name: "gosdn",
Image: "registry.code.fbi.h-da.de/cocsn/gosdn:" + hash, Image: "registry.code.fbi.h-da.de/danet/gosdn:" + hash,
Command: nil, Command: nil,
Args: nil, Args: nil,
WorkingDir: "", WorkingDir: "",
......
...@@ -39,5 +39,5 @@ build-docker: ...@@ -39,5 +39,5 @@ build-docker:
- docker push $DOCKER_IMAGE_SHA - docker push $DOCKER_IMAGE_SHA
- docker tag $DOCKER_IMAGE_SHA $TAG - docker tag $DOCKER_IMAGE_SHA $TAG
- docker push $TAG - docker push $TAG
- docker build --target installer --build-arg GITLAB_USER=$GO_MODULES_USER --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN --build-arg BUILDARGS=$BUILDARGS -t registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID} . - docker build --target installer --build-arg GITLAB_USER=$GO_MODULES_USER --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN --build-arg BUILDARGS=$BUILDARGS -t ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID} .
- docker push registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID} - docker push ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
.integration-test: &integration-test .integration-test: &integration-test
image: registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID} image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
stage: integration-test stage: integration-test
needs: needs:
- job: "containerlab:deploy" - job: "containerlab:deploy"
...@@ -34,7 +34,7 @@ integration-test:api: ...@@ -34,7 +34,7 @@ integration-test:api:
- go test -race -v -run TestApiIntegration - go test -race -v -run TestApiIntegration
.test: &test .test: &test
image: registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID} image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
stage: test stage: test
allow_failure: true allow_failure: true
variables: variables:
...@@ -49,7 +49,7 @@ integration-test:api: ...@@ -49,7 +49,7 @@ integration-test:api:
unit-test: unit-test:
script: script:
- go test -short -race $(go list ./... | grep -v /forks/ | grep -v /api/ | grep -v /mocks ) -v -coverprofile=coverage.out - go test -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out
after_script: after_script:
- go tool cover -func=coverage.out - go tool cover -func=coverage.out
<<: *test <<: *test
......
...@@ -30,7 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. ...@@ -30,7 +30,7 @@ POSSIBILITY OF SUCH DAMAGE.
*/ */
package main package main
import "code.fbi.h-da.de/cocsn/gosdn/cmd" import "code.fbi.h-da.de/danet/gosdn/cmd"
func main() { func main() {
cmd.Execute() cmd.Execute()
......
...@@ -35,7 +35,7 @@ import ( ...@@ -35,7 +35,7 @@ import (
"context" "context"
"os" "os"
"code.fbi.h-da.de/cocsn/gosdn" "code.fbi.h-da.de/danet/gosdn"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
......
...@@ -14,15 +14,14 @@ import ( ...@@ -14,15 +14,14 @@ import (
"github.com/spf13/viper" "github.com/spf13/viper"
"google.golang.org/grpc" "google.golang.org/grpc"
pb "code.fbi.h-da.de/cocsn/api/go/gosdn/core" pb "code.fbi.h-da.de/danet/api/go/gosdn/core"
cpb "code.fbi.h-da.de/cocsn/api/go/gosdn/csbi" cpb "code.fbi.h-da.de/danet/api/go/gosdn/csbi"
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound" spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/interfaces/southbound"
nbi "code.fbi.h-da.de/cocsn/gosdn/northbound/server" nbi "code.fbi.h-da.de/danet/gosdn/northbound/server"
"code.fbi.h-da.de/cocsn/gosdn/database" "code.fbi.h-da.de/danet/gosdn/nucleus"
"code.fbi.h-da.de/cocsn/gosdn/nucleus"
) )
var coreLock sync.RWMutex var coreLock sync.RWMutex
...@@ -30,9 +29,6 @@ var coreOnce sync.Once ...@@ -30,9 +29,6 @@ var coreOnce sync.Once
// Core is the representation of the controller's core // Core is the representation of the controller's core
type Core struct { type Core struct {
// deprecated
database database.Database
pndc *nucleus.PndStore pndc *nucleus.PndStore
httpServer *http.Server httpServer *http.Server
grpcServer *grpc.Server grpcServer *grpc.Server
...@@ -46,7 +42,6 @@ var c *Core ...@@ -46,7 +42,6 @@ var c *Core
func init() { func init() {
c = &Core{ c = &Core{
database: database.Database{},
pndc: nucleus.NewPndStore(), pndc: nucleus.NewPndStore(),
stopChan: make(chan os.Signal, 1), stopChan: make(chan os.Signal, 1),
} }
......
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()
}
This diff is collapsed.
...@@ -3,7 +3,7 @@ package change ...@@ -3,7 +3,7 @@ package change
import ( import (
"time" "time"
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/openconfig/ygot/ygot" "github.com/openconfig/ygot/ygot"
) )
......
package device package device
import ( import (
"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/interfaces/southbound"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/transport" "code.fbi.h-da.de/danet/gosdn/interfaces/transport"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/openconfig/ygot/ygot" "github.com/openconfig/ygot/ygot"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
......
package networkdomain package networkdomain
import ( import (
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport" tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/change" "code.fbi.h-da.de/danet/gosdn/interfaces/change"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/device" "code.fbi.h-da.de/danet/gosdn/interfaces/device"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/interfaces/southbound"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/store" "code.fbi.h-da.de/danet/gosdn/interfaces/store"
"github.com/google/uuid" "github.com/google/uuid"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )
......
package southbound package southbound
import ( import (
spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound" spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
"github.com/openconfig/ygot/ygot" "github.com/openconfig/ygot/ygot"
"github.com/google/uuid" "github.com/google/uuid"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment