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

Change go module paths

parent d567237b
No related branches found
No related tags found
9 merge requests!246Develop,!245Develop into Master,!244Master into develop2 into master,!219Draft: Testing,!214Test pipelines,!195DO NOT MERGE 2,!194DO NOT MERGE! just for testing,!184Change go module paths,!138Develop
...@@ -5,6 +5,7 @@ ARG BUILDARGS ...@@ -5,6 +5,7 @@ ARG BUILDARGS
RUN apt-get update && apt-get install -y git RUN apt-get update && apt-get install -y git
RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de" RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
RUN go env -w GOPRIVATE=code.fbi.h-da.de/*
WORKDIR /src/gosdn WORKDIR /src/gosdn
COPY go.* ./ COPY go.* ./
...@@ -15,7 +16,6 @@ FROM installer as builder ...@@ -15,7 +16,6 @@ FROM installer as builder
COPY *.go ./ COPY *.go ./
COPY ./api ./api COPY ./api ./api
COPY ./cmd ./cmd COPY ./cmd ./cmd
COPY ./database ./database
COPY ./forks ./forks COPY ./forks ./forks
COPY ./interfaces ./interfaces COPY ./interfaces ./interfaces
COPY ./northbound ./northbound COPY ./northbound ./northbound
......
# 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"
) )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment