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

Process response overhaul

parent 4bff8c0e
Branches
Tags
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,!173Process response overhaul,!138Develop
Showing with 263 additions and 324 deletions
.vscode/
.vscode/launch.json
.DS_Store .DS_Store
documentation/design-documentation/ documentation/design-documentation/
documentation/design/*.pdf documentation/design/*.pdf
...@@ -14,4 +15,5 @@ documentation/design/*.pdf ...@@ -14,4 +15,5 @@ documentation/design/*.pdf
.idea/workspace.xml .idea/workspace.xml
restconf/bin/bin restconf/bin/bin
test/.terraform.local/ test/.terraform.local/
configs/gosdn.toml configs/gosdn.toml
\ No newline at end of file debug.test
\ No newline at end of file
# syntax = docker/dockerfile:1.2
FROM golang:1.16-alpine AS builder
ARG GITLAB_USER
ARG GITLAB_TOKEN
ARG BUILDARGS
WORKDIR /src/gosdn
RUN apk add --no-cache git
RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
COPY go.* .
RUN go mod download
COPY . .
RUN --mount=type=cache,target=/root/.cache/go-build \
GOOS=linux go build -o gosdn ./cmd/gosdn
FROM alpine
EXPOSE 8080
EXPOSE 55055
COPY --from=builder /src/gosdn/gosdn .
COPY --from=builder /src/gosdn/configs ./configs
ENTRYPOINT [ "./gosdn" ]
CMD [""]
...@@ -39,8 +39,14 @@ func TestApiIntegration(t *testing.T) { ...@@ -39,8 +39,14 @@ func TestApiIntegration(t *testing.T) {
cliPnd := viper.GetString("CLI_PND") cliPnd := viper.GetString("CLI_PND")
cliSbi := viper.GetString("CLI_SBI") cliSbi := viper.GetString("CLI_SBI")
cliPndUUID, err := uuid.Parse(cliPnd) suid, err := uuid.Parse(cliSbi)
clisbiUUID, err := uuid.Parse(cliSbi) if err != nil {
t.Error(err)
}
puid, err := uuid.Parse(cliPnd)
if err != nil {
t.Error(err)
}
opt := &tpb.TransportOption{ opt := &tpb.TransportOption{
Address: testAddress, Address: testAddress,
...@@ -50,13 +56,12 @@ func TestApiIntegration(t *testing.T) { ...@@ -50,13 +56,12 @@ func TestApiIntegration(t *testing.T) {
GnmiTransportOption: &tpb.GnmiTransportOption{}, GnmiTransportOption: &tpb.GnmiTransportOption{},
}, },
} }
if _, err := addDevice( if _, err := addDevice(
testAPIEndpoint, testAPIEndpoint,
"test-device", "test-device",
opt, opt,
clisbiUUID, suid,
cliPndUUID, puid,
); (err != nil) != tt.wantErr { ); (err != nil) != tt.wantErr {
t.Errorf("gosdn cli add-device error = %v, wantErr %v", err, tt.wantErr) t.Errorf("gosdn cli add-device error = %v, wantErr %v", err, tt.wantErr)
return return
...@@ -66,7 +71,6 @@ func TestApiIntegration(t *testing.T) { ...@@ -66,7 +71,6 @@ func TestApiIntegration(t *testing.T) {
_, err = getDevice( _, err = getDevice(
testAPIEndpoint, testAPIEndpoint,
cliPnd, cliPnd,
testPath,
did, did,
) )
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
......
File moved
...@@ -4,8 +4,8 @@ go 1.16 ...@@ -4,8 +4,8 @@ go 1.16
require ( require (
code.fbi.h-da.de/cocsn/api v0.2.2 code.fbi.h-da.de/cocsn/api v0.2.2
code.fbi.h-da.de/cocsn/gosdn v0.0.3-0.20210621171149-af262ac22994 code.fbi.h-da.de/cocsn/gosdn v0.0.3-0.20210622165328-71801e150967
code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210621171149-af262ac22994 code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210622165328-71801e150967
code.fbi.h-da.de/cocsn/yang-models v0.0.7 code.fbi.h-da.de/cocsn/yang-models v0.0.7
github.com/google/uuid v1.2.0 github.com/google/uuid v1.2.0
github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da
......
This diff is collapsed.
...@@ -12,6 +12,7 @@ variables: ...@@ -12,6 +12,7 @@ variables:
tags: tags:
- dind - dind
script: script:
- docker info
- > - >
docker build \ docker build \
--build-arg GITLAB_USER=$GO_MODULES_USER \ --build-arg GITLAB_USER=$GO_MODULES_USER \
......
...@@ -44,13 +44,9 @@ import ( ...@@ -44,13 +44,9 @@ import (
) )
var cfgFile string var cfgFile string
var username string
var password string
var address string
var loglevel string var loglevel string
var grpcPort string var grpcPort string
var cliPnd string var csbiOrchestrstor string
var cliSbi string
// rootCmd represents the base command when called without any subcommands // rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{ var rootCmd = &cobra.Command{
...@@ -78,12 +74,10 @@ func init() { ...@@ -78,12 +74,10 @@ func init() {
cobra.OnInitialize(initConfig) cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is ./configs/gosdn.toml)") rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is ./configs/gosdn.toml)")
rootCmd.PersistentFlags().StringVarP(&username, "username", "u", "admin", "username for a gnmi resource")
rootCmd.PersistentFlags().StringVarP(&password, "password", "p", "arista", "password for a gnmi resource")
rootCmd.PersistentFlags().StringVarP(&address, "address", "a", "ceos-cocsn.apps.ocp.fbi.h-da.de:6030", "address of a gnmi target")
rootCmd.PersistentFlags().StringVarP(&loglevel, "log-level", "l", "", "log level 'debug' or 'trace'") rootCmd.PersistentFlags().StringVarP(&loglevel, "log-level", "l", "", "log level 'debug' or 'trace'")
rootCmd.Flags().StringVar(&grpcPort, "grpc-port", "55055", "port for gRPC NBI") rootCmd.Flags().StringVar(&grpcPort, "grpc-port", "55055", "port for gRPC NBI")
rootCmd.Flags().StringVar(&csbiOrchestrstor, "csbi-orchestrator", "localhost:55056", "csbi orchestrator address")
} }
// initConfig reads in config file and ENV variables if set. // initConfig reads in config file and ENV variables if set.
...@@ -105,9 +99,8 @@ func initConfig() { ...@@ -105,9 +99,8 @@ func initConfig() {
log.Debug("Using config file:", viper.ConfigFileUsed()) log.Debug("Using config file:", viper.ConfigFileUsed())
} }
viper.SetDefault("socket", ":"+grpcPort) viper.SetDefault("socket", ":55055")
cliPnd = viper.GetString("CLI_PND") viper.SetDefault("csbi-orchestrator", "localhost:55056")
cliSbi = viper.GetString("CLI_SBI")
ll := viper.GetString("GOSDN_LOG") ll := viper.GetString("GOSDN_LOG")
if ll != "" { if ll != "" {
......
...@@ -7,9 +7,7 @@ import ( ...@@ -7,9 +7,7 @@ import (
"os" "os"
"os/signal" "os/signal"
"sync" "sync"
"time" "syscall"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound"
"github.com/google/uuid" "github.com/google/uuid"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
...@@ -17,8 +15,10 @@ import ( ...@@ -17,8 +15,10 @@ import (
"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/cocsn/api/go/gosdn/core"
cpb "code.fbi.h-da.de/cocsn/api/go/gosdn/csbi"
ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound" spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound"
nbi "code.fbi.h-da.de/cocsn/gosdn/northbound/server" nbi "code.fbi.h-da.de/cocsn/gosdn/northbound/server"
"code.fbi.h-da.de/cocsn/gosdn/database" "code.fbi.h-da.de/cocsn/gosdn/database"
...@@ -38,6 +38,8 @@ type Core struct { ...@@ -38,6 +38,8 @@ type Core struct {
grpcServer *grpc.Server grpcServer *grpc.Server
nbi *nbi.NorthboundInterface nbi *nbi.NorthboundInterface
stopChan chan os.Signal stopChan chan os.Signal
csbiClient cpb.CsbiClient
} }
var c *Core var c *Core
...@@ -50,12 +52,12 @@ func init() { ...@@ -50,12 +52,12 @@ func init() {
} }
// Setting up signal capturing // Setting up signal capturing
signal.Notify(c.stopChan, os.Interrupt) signal.Notify(c.stopChan, os.Interrupt, syscall.SIGTERM)
} }
// initialize does start-up housekeeping like reading controller config files // initialize does start-up housekeeping like reading controller config files
func initialize() error { func initialize() error {
if err := startGrpcServer(); err != nil { if err := startGrpc(); err != nil {
return err return err
} }
...@@ -65,7 +67,7 @@ func initialize() error { ...@@ -65,7 +67,7 @@ func initialize() error {
return createSouthboundInterfaces() return createSouthboundInterfaces()
} }
func startGrpcServer() error { func startGrpc() error {
sock := viper.GetString("socket") sock := viper.GetString("socket")
lis, err := net.Listen("tcp", sock) lis, err := net.Listen("tcp", sock)
if err != nil { if err != nil {
...@@ -76,11 +78,16 @@ func startGrpcServer() error { ...@@ -76,11 +78,16 @@ func startGrpcServer() error {
c.nbi = nbi.NewNBI(c.pndc) c.nbi = nbi.NewNBI(c.pndc)
pb.RegisterCoreServer(c.grpcServer, c.nbi.Core) pb.RegisterCoreServer(c.grpcServer, c.nbi.Core)
ppb.RegisterPndServer(c.grpcServer, c.nbi.Pnd) ppb.RegisterPndServer(c.grpcServer, c.nbi.Pnd)
cpb.RegisterCsbiServer(c.grpcServer, c.nbi.Csbi)
go func() { go func() {
if err := c.grpcServer.Serve(lis); err != nil { if err := c.grpcServer.Serve(lis); err != nil {
log.Fatal(err) log.Fatal(err)
} }
}() }()
orchestrator := viper.GetString("csbi-orchestrator")
conn, err := grpc.Dial(orchestrator, grpc.WithInsecure())
c.csbiClient = cpb.NewCsbiClient(conn)
return nil return nil
} }
...@@ -92,7 +99,7 @@ func createSouthboundInterfaces() error { ...@@ -92,7 +99,7 @@ func createSouthboundInterfaces() error {
// createPrincipalNetworkDomain initializes the controller with an initial PND // createPrincipalNetworkDomain initializes the controller with an initial PND
func createPrincipalNetworkDomain(s southbound.SouthboundInterface) error { func createPrincipalNetworkDomain(s southbound.SouthboundInterface) error {
pnd, err := nucleus.NewPND("base", "gosdn base pnd", uuid.New(), s) pnd, err := nucleus.NewPND("base", "gosdn base pnd", uuid.New(), s, c.csbiClient, callback)
if err != nil { if err != nil {
return err return err
} }
...@@ -120,8 +127,6 @@ func Run(ctx context.Context) error { ...@@ -120,8 +127,6 @@ func Run(ctx context.Context) error {
return shutdown() return shutdown()
case <-ctx.Done(): case <-ctx.Done():
return shutdown() return shutdown()
case <-time.Tick(time.Minute):
log.Debug("up and running")
} }
} }
} }
...@@ -133,3 +138,13 @@ func shutdown() error { ...@@ -133,3 +138,13 @@ func shutdown() error {
c.grpcServer.GracefulStop() c.grpcServer.GracefulStop()
return stopHttpServer() return stopHttpServer()
} }
func callback(id uuid.UUID, ch chan nucleus.DeviceDetails) {
if ch != nil {
c.pndc.AddPendingChannel(id, ch)
log.Infof("pending channel %v added", id)
} else {
c.pndc.RemovePendingChannel(id)
log.Infof("pending channel %v removed", id)
}
}
...@@ -18,13 +18,9 @@ package gnmi ...@@ -18,13 +18,9 @@ package gnmi
import ( import (
"errors" "errors"
"fmt" "fmt"
"net"
"reflect" "reflect"
"sort" "sort"
oc "code.fbi.h-da.de/cocsn/yang-models/generated/arista"
log "github.com/sirupsen/logrus"
"github.com/openconfig/goyang/pkg/yang" "github.com/openconfig/goyang/pkg/yang"
"github.com/openconfig/ygot/ygot" "github.com/openconfig/ygot/ygot"
"github.com/openconfig/ygot/ytypes" "github.com/openconfig/ygot/ytypes"
...@@ -68,16 +64,8 @@ func (m *Model) NewConfigStruct(jsonConfig []byte) (ygot.ValidatedGoStruct, erro ...@@ -68,16 +64,8 @@ func (m *Model) NewConfigStruct(jsonConfig []byte) (ygot.ValidatedGoStruct, erro
if !ok { if !ok {
return nil, errors.New("root node is not a ygot.ValidatedGoStruct") return nil, errors.New("root node is not a ygot.ValidatedGoStruct")
} }
ifaces, err := getInterfaces()
if err != nil { return rootStruct, nil
return nil, err
}
device, ok := rootStruct.(*oc.Device)
if !ok {
return nil, errors.New("root node is not a oc.Device")
}
device.Interfaces = ifaces
return device, nil
} }
// SupportedModels returns a list of supported models. // SupportedModels returns a list of supported models.
...@@ -89,41 +77,3 @@ func (m *Model) SupportedModels() []string { ...@@ -89,41 +77,3 @@ func (m *Model) SupportedModels() []string {
sort.Strings(mDesc) sort.Strings(mDesc)
return mDesc return mDesc
} }
func getInterfaces() (*oc.OpenconfigInterfaces_Interfaces, error) {
ifaces, err := net.Interfaces()
if err != nil {
log.Fatal()
}
interfaces := &oc.OpenconfigInterfaces_Interfaces{
Interface: make(map[string]*oc.OpenconfigInterfaces_Interfaces_Interface),
}
for _, tInterface := range ifaces {
var mtu *uint16
var name *string
var index *uint32
rmtu := uint16(tInterface.MTU)
rname := tInterface.Name
rindex := uint32(tInterface.Index)
mtu = &rmtu
name = &rname
index = &rindex
iface, err := interfaces.NewInterface(tInterface.Name)
if err != nil {
return nil, err
}
iface.State = &oc.OpenconfigInterfaces_Interfaces_Interface_State{
Ifindex: &rindex,
Mtu: &rmtu,
Name: &rname,
}
iface.State.Name = name
iface.State.Mtu = mtu
iface.State.Ifindex = index
}
return interfaces, nil
}
...@@ -4,17 +4,19 @@ go 1.16 ...@@ -4,17 +4,19 @@ go 1.16
require ( require (
code.fbi.h-da.de/cocsn/api v0.2.2 code.fbi.h-da.de/cocsn/api v0.2.2
code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210621171149-af262ac22994 code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210622165328-71801e150967
code.fbi.h-da.de/cocsn/yang-models v0.0.7 code.fbi.h-da.de/cocsn/yang-models v0.0.7
github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a
github.com/docker/docker v20.10.6+incompatible github.com/docker/docker v20.10.6+incompatible
github.com/golang/protobuf v1.5.2 github.com/golang/protobuf v1.5.2
github.com/google/gnxi v0.0.0-20210423111716-4b504ef806a7 github.com/google/gnxi v0.0.0-20210423111716-4b504ef806a7
github.com/google/uuid v1.2.0 github.com/google/uuid v1.2.0
github.com/imdario/mergo v0.3.11 // indirect
github.com/neo4j/neo4j-go-driver v1.8.3 github.com/neo4j/neo4j-go-driver v1.8.3
github.com/onsi/gomega v1.10.3 // indirect
github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da
github.com/openconfig/goyang v0.2.4 github.com/openconfig/goyang v0.2.4
github.com/openconfig/ygot v0.10.11 github.com/openconfig/ygot v0.10.13
github.com/sirupsen/logrus v1.8.1 github.com/sirupsen/logrus v1.8.1
github.com/spf13/cobra v1.1.3 github.com/spf13/cobra v1.1.3
github.com/spf13/viper v1.7.1 github.com/spf13/viper v1.7.1
......
...@@ -23,8 +23,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo ...@@ -23,8 +23,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
code.fbi.h-da.de/cocsn/api v0.2.2 h1:pJ1P3+l8Fl+JWEkoLTSBOvB6LrxUYYqRbfdt+eSWQSk= code.fbi.h-da.de/cocsn/api v0.2.2 h1:pJ1P3+l8Fl+JWEkoLTSBOvB6LrxUYYqRbfdt+eSWQSk=
code.fbi.h-da.de/cocsn/api v0.2.2/go.mod h1:s+P4Lrxl5rHyo/Q0UTABZrDfH4zuAoRKdzktlL0UsRI= code.fbi.h-da.de/cocsn/api v0.2.2/go.mod h1:s+P4Lrxl5rHyo/Q0UTABZrDfH4zuAoRKdzktlL0UsRI=
code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210621171149-af262ac22994 h1:jk4fxZU1nqhnrkGKUo6a67jBv6CJPxra61LbeiN+D1w= code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210622165328-71801e150967 h1:0ikDD6x3nZU8HZHTpSbXxYn8nuNr/YwEIuw9EehCz7U=
code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210621171149-af262ac22994/go.mod h1:lSkrE5ukbNKhqjAYr3v37dT1iMqZmeBdTWNVj3Wfa4o= code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210622165328-71801e150967/go.mod h1:lSkrE5ukbNKhqjAYr3v37dT1iMqZmeBdTWNVj3Wfa4o=
code.fbi.h-da.de/cocsn/yang-models v0.0.7 h1:3TOo8J+EdAJKeq4o3aaNWZRhjSwguIS8wciW1U9PkSk= code.fbi.h-da.de/cocsn/yang-models v0.0.7 h1:3TOo8J+EdAJKeq4o3aaNWZRhjSwguIS8wciW1U9PkSk=
code.fbi.h-da.de/cocsn/yang-models v0.0.7/go.mod h1:M+2HinfhTT8nA8qvn2cpWNlOtuiizTNDWA3yfy72K/g= code.fbi.h-da.de/cocsn/yang-models v0.0.7/go.mod h1:M+2HinfhTT8nA8qvn2cpWNlOtuiizTNDWA3yfy72K/g=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
...@@ -235,11 +235,11 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO ...@@ -235,11 +235,11 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q=
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA=
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
...@@ -315,18 +315,22 @@ github.com/neo4j/neo4j-go-driver v1.8.3/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcL ...@@ -315,18 +315,22 @@ github.com/neo4j/neo4j-go-driver v1.8.3/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcL
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg=
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA=
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc=
github.com/openconfig/gnmi v0.0.0-20200414194230-1597cc0f2600/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A= github.com/openconfig/gnmi v0.0.0-20200414194230-1597cc0f2600/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A= github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
...@@ -338,12 +342,14 @@ github.com/openconfig/goyang v0.2.2/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+R ...@@ -338,12 +342,14 @@ github.com/openconfig/goyang v0.2.2/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+R
github.com/openconfig/goyang v0.2.3/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8= github.com/openconfig/goyang v0.2.3/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
github.com/openconfig/goyang v0.2.4 h1:xGmGr3zuhq9ASCu5jRdtMFdRnixhbg8TJEQ0nylyvxA= github.com/openconfig/goyang v0.2.4 h1:xGmGr3zuhq9ASCu5jRdtMFdRnixhbg8TJEQ0nylyvxA=
github.com/openconfig/goyang v0.2.4/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8= github.com/openconfig/goyang v0.2.4/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
github.com/openconfig/gribi v0.1.1-0.20210423184541-ce37eb4ba92f/go.mod h1:OoH46A2kV42cIXGyviYmAlGmn6cHjGduyC2+I9d/iVs=
github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw=
github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs= github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs=
github.com/openconfig/ygot v0.9.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ= github.com/openconfig/ygot v0.9.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
github.com/openconfig/ygot v0.10.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ= github.com/openconfig/ygot v0.10.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
github.com/openconfig/ygot v0.10.11 h1:qxdyjBV8hl82vNjW+AqvC+wzUV0b3sKmgs9npS5s+0c= github.com/openconfig/ygot v0.10.4/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
github.com/openconfig/ygot v0.10.11/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ= github.com/openconfig/ygot v0.10.13 h1:gxbLGbD0zzh/4yOpGt81hBbhQes2GiQeINrrzh65nTE=
github.com/openconfig/ygot v0.10.13/go.mod h1:NDGFcX73PnipISpF8yuDpwrsOAl6vqqK4mNPvscWzXA=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
...@@ -526,10 +532,12 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL ...@@ -526,10 +532,12 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
...@@ -562,6 +570,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w ...@@ -562,6 +570,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
...@@ -582,6 +591,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w ...@@ -582,6 +591,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
...@@ -691,6 +701,7 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 ...@@ -691,6 +701,7 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
...@@ -716,7 +727,6 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 ...@@ -716,7 +727,6 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
......
...@@ -2,6 +2,7 @@ package southbound ...@@ -2,6 +2,7 @@ package southbound
import ( import (
spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound" spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound"
"github.com/openconfig/ygot/ygot"
"github.com/google/uuid" "github.com/google/uuid"
gpb "github.com/openconfig/gnmi/proto/gnmi" gpb "github.com/openconfig/gnmi/proto/gnmi"
...@@ -18,8 +19,9 @@ type SouthboundInterface interface { // nolint ...@@ -18,8 +19,9 @@ type SouthboundInterface interface { // nolint
// SetNode injects SBI specific model // SetNode injects SBI specific model
// representation to the transport. // representation to the transport.
// Needed for type assertion. // Needed for type assertion.
SetNode() func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error SetNode(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
Schema() *ytypes.Schema Schema() *ytypes.Schema
ID() uuid.UUID ID() uuid.UUID
Type() spb.Type Type() spb.Type
Unmarshal([]byte, []string, ygot.ValidatedGoStruct, ...ytypes.UnmarshalOpt) error
} }
...@@ -65,7 +65,7 @@ func (s core) Set(ctx context.Context, request *pb.SetRequest) (*pb.SetResponse, ...@@ -65,7 +65,7 @@ func (s core) Set(ctx context.Context, request *pb.SetRequest) (*pb.SetResponse,
for _, r := range request.Pnd { for _, r := range request.Pnd {
sbi := nucleus.NewSBI(spb.Type_OPENCONFIG) sbi := nucleus.NewSBI(spb.Type_OPENCONFIG)
pnd, err := nucleus.NewPND(r.Name, r.Description, uuid.New(), sbi) pnd, err := nucleus.NewPND(r.Name, r.Description, uuid.New(), sbi, nil, nil)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Aborted, "%v", err) return nil, status.Errorf(codes.Aborted, "%v", err)
} }
......
package server
import (
"context"
"time"
log "github.com/sirupsen/logrus"
cpb "code.fbi.h-da.de/cocsn/api/go/gosdn/csbi"
"code.fbi.h-da.de/cocsn/gosdn/nucleus"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
type csbi struct {
cpb.UnimplementedCsbiServer
}
func (s csbi) Hello(ctx context.Context, syn *cpb.Syn) (*cpb.Ack, error) {
ch, err := pndc.PendingChannels(nucleus.FromString(syn.Id))
if err != nil {
log.Error(err)
return nil, status.Errorf(codes.Aborted, "pending channel %v", err)
}
ch <- nucleus.DeviceDetails{
ID: syn.Id,
Address: syn.Address,
}
details := <-ch
log.Infof("ack to csbi %v", syn.Id)
return &cpb.Ack{
Timestamp: time.Now().UnixNano(),
TransportOption: details.TransportOption,
}, nil
}
...@@ -11,6 +11,7 @@ var pndc *nucleus.PndStore ...@@ -11,6 +11,7 @@ var pndc *nucleus.PndStore
type NorthboundInterface struct { type NorthboundInterface struct {
Pnd *pndServer Pnd *pndServer
Core *core Core *core
Csbi *csbi
} }
// NewNBI receives a PndStore and returns a new gRPC *NorthboundInterface // NewNBI receives a PndStore and returns a new gRPC *NorthboundInterface
...@@ -19,5 +20,6 @@ func NewNBI(pnds *nucleus.PndStore) *NorthboundInterface { ...@@ -19,5 +20,6 @@ func NewNBI(pnds *nucleus.PndStore) *NorthboundInterface {
return &NorthboundInterface{ return &NorthboundInterface{
Pnd: &pndServer{}, Pnd: &pndServer{},
Core: &core{}, Core: &core{},
Csbi: &csbi{},
} }
} }
...@@ -39,8 +39,11 @@ func (p pndServer) Get(ctx context.Context, request *ppb.GetRequest) (*ppb.GetRe ...@@ -39,8 +39,11 @@ func (p pndServer) Get(ctx context.Context, request *ppb.GetRequest) (*ppb.GetRe
return handleGetSbi(pid, req) return handleGetSbi(pid, req)
case *ppb.GetRequest_Change: case *ppb.GetRequest_Change:
return handleGetChange(pid, req) return handleGetChange(pid, req)
case *ppb.GetRequest_Path:
return handleGetPath(pid, req)
default: default:
return nil, errors.ErrOperationNotSupported{Op: reflect.TypeOf(request.Request)} log.Error(err)
return nil, status.Errorf(codes.Aborted, "%v", errors.ErrOperationNotSupported{Op: reflect.TypeOf(request.Request)})
} }
} }
...@@ -143,6 +146,32 @@ func handleGetChange(pid uuid.UUID, req *ppb.GetRequest_Change) (*ppb.GetRespons ...@@ -143,6 +146,32 @@ func handleGetChange(pid uuid.UUID, req *ppb.GetRequest_Change) (*ppb.GetRespons
}, nil }, nil
} }
func handleGetPath(pid uuid.UUID, req *ppb.GetRequest_Path) (*ppb.GetResponse, error) {
pnd, err := pndc.GetPND(pid)
if err != nil {
log.Error(err)
return nil, status.Errorf(codes.Aborted, "%v", err)
}
duid, err := uuid.Parse(req.Path.Did)
if err != nil {
log.Error(err)
return nil, status.Errorf(codes.Aborted, "%v", err)
}
if err := pnd.Request(duid, req.Path.Path); err != nil {
log.Error(err)
return nil, status.Errorf(codes.Aborted, "%v", err)
}
ond, err := fillOnds(pnd, false, req.Path.Did)
if err != nil {
log.Error(err)
return nil, status.Errorf(codes.Aborted, "%v", err)
}
return &ppb.GetResponse{
Timestamp: time.Now().UnixNano(),
Ond: ond,
}, nil
}
func fillSbis(pnd networkdomain.NetworkDomain, all bool, sid ...string) ([]*spb.SouthboundInterface, error) { func fillSbis(pnd networkdomain.NetworkDomain, all bool, sid ...string) ([]*spb.SouthboundInterface, error) {
var sbiList []uuid.UUID var sbiList []uuid.UUID
......
...@@ -22,9 +22,25 @@ func NewDevice(name string, opt *tpb.TransportOption, sbi southbound.SouthboundI ...@@ -22,9 +22,25 @@ func NewDevice(name string, opt *tpb.TransportOption, sbi southbound.SouthboundI
name = namesgenerator.GetRandomName(0) name = namesgenerator.GetRandomName(0)
} }
root, err := ygot.DeepCopy(sbi.Schema().Root)
if err != nil {
return nil, err
}
if opt.Csbi {
return &CsbiDevice{
CommonDevice: CommonDevice{
UUID: uuid.New(),
GoStruct: root,
sbi: sbi,
transport: t,
name: name,
},
}, nil
}
return &CommonDevice{ return &CommonDevice{
UUID: uuid.New(), UUID: uuid.New(),
GoStruct: sbi.Schema().Root, GoStruct: root,
sbi: sbi, sbi: sbi,
transport: t, transport: t,
name: name, name: name,
...@@ -94,31 +110,38 @@ func (d *CommonDevice) ProcessResponse(resp proto.Message) error { ...@@ -94,31 +110,38 @@ func (d *CommonDevice) ProcessResponse(resp proto.Message) error {
return d.transport.ProcessResponse(resp, d.GoStruct, d.sbi.Schema()) return d.transport.ProcessResponse(resp, d.GoStruct, d.sbi.Schema())
} }
type csbiDevice struct { // CsbiDevice is used for the cSBI functionality.
type CsbiDevice struct {
CommonDevice CommonDevice
} }
// ID returns the UUID of the Device // ID returns the UUID of the Device
func (d *csbiDevice) ID() uuid.UUID { func (d *CsbiDevice) ID() uuid.UUID {
return d.UUID return d.UUID
} }
func (d *csbiDevice) Model() ygot.GoStruct { // Model returns the ygot representation of the Device
func (d *CsbiDevice) Model() ygot.GoStruct {
return d.GoStruct return d.GoStruct
} }
func (d *csbiDevice) Transport() transport.Transport { // Transport returns the Transport of the device
func (d *CsbiDevice) Transport() transport.Transport {
return d.transport return d.transport
} }
func (d *csbiDevice) Name() string { // Name returns the name of the device
func (d *CsbiDevice) Name() string {
return d.name return d.name
} }
func (d *csbiDevice) SBI() southbound.SouthboundInterface { // SBI returns the sbi of the Device
func (d *CsbiDevice) SBI() southbound.SouthboundInterface {
return d.sbi return d.sbi
} }
func (d *csbiDevice) ProcessResponse(resp proto.Message) error { // ProcessResponse processes a response for the Device
func (d *CsbiDevice) ProcessResponse(resp proto.Message) error {
// TODO: callback to send response to caller
return d.transport.ProcessResponse(resp, d.GoStruct, d.sbi.Schema()) return d.transport.ProcessResponse(resp, d.GoStruct, d.sbi.Schema())
} }
...@@ -2,6 +2,7 @@ package nucleus ...@@ -2,6 +2,7 @@ package nucleus
import ( import (
"context" "context"
"fmt"
"reflect" "reflect"
"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound" "code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound"
...@@ -35,7 +36,7 @@ var opmap = map[ppb.ApiOperation]string{ ...@@ -35,7 +36,7 @@ var opmap = map[ppb.ApiOperation]string{
type Gnmi struct { type Gnmi struct {
SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
RespChan chan *gpb.SubscribeResponse RespChan chan *gpb.SubscribeResponse
Unmarshal func([]byte, []string, interface{}, ...ytypes.UnmarshalOpt) error Unmarshal func([]byte, []string, ygot.ValidatedGoStruct, ...ytypes.UnmarshalOpt) error
Options *tpb.TransportOption Options *tpb.TransportOption
client gpb.GNMIClient client gpb.GNMIClient
config *gnmi.Config config *gnmi.Config
...@@ -66,11 +67,12 @@ func newGnmiTransport(opts *tpb.TransportOption, sbi southbound.SouthboundInterf ...@@ -66,11 +67,12 @@ func newGnmiTransport(opts *tpb.TransportOption, sbi southbound.SouthboundInterf
"tls": opts.Tls, "tls": opts.Tls,
}).Info("building new gNMI transport") }).Info("building new gNMI transport")
return &Gnmi{ return &Gnmi{
SetNode: sbi.SetNode(), SetNode: sbi.SetNode,
RespChan: make(chan *gpb.SubscribeResponse), RespChan: make(chan *gpb.SubscribeResponse),
Options: opts, Unmarshal: sbi.Unmarshal,
client: c, Options: opts,
config: gnmiConfig, client: c,
config: gnmiConfig,
}, nil }, nil
} }
...@@ -117,7 +119,7 @@ func (g *Gnmi) Set(ctx context.Context, args ...interface{}) error { ...@@ -117,7 +119,7 @@ func (g *Gnmi) Set(ctx context.Context, args ...interface{}) error {
Value: o, Value: o,
Type: reflect.TypeOf("placeholder"), Type: reflect.TypeOf("placeholder"),
} }
} else if attrs == nil || len(attrs) == 0 { } else if len(attrs) == 0 {
return &errors.ErrInvalidParameters{ return &errors.ErrInvalidParameters{
Func: "nucleus.Set()", Func: "nucleus.Set()",
Param: "no parameters provided", Param: "no parameters provided",
...@@ -138,15 +140,15 @@ func (g *Gnmi) Set(ctx context.Context, args ...interface{}) error { ...@@ -138,15 +140,15 @@ func (g *Gnmi) Set(ctx context.Context, args ...interface{}) error {
ops := make([]*gnmi.Operation, 0) ops := make([]*gnmi.Operation, 0)
exts := make([]*gnmi_ext.Extension, 0) exts := make([]*gnmi_ext.Extension, 0)
for _, p := range opts { for _, p := range opts {
switch p.(type) { switch p := p.(type) {
case *gnmi.Operation: case *gnmi.Operation:
op := p.(*gnmi.Operation) op := p
if op.Target == "" { if op.Target == "" {
op.Target = g.Options.Address op.Target = g.Options.Address
} }
ops = append(ops, op) ops = append(ops, op)
case *gnmi_ext.Extension: case *gnmi_ext.Extension:
exts = append(exts, p.(*gnmi_ext.Extension)) exts = append(exts, p)
default: default:
return &errors.ErrInvalidParameters{ return &errors.ErrInvalidParameters{
Func: "nucleus.Set()", Func: "nucleus.Set()",
...@@ -223,28 +225,50 @@ func (g *Gnmi) Type() string { ...@@ -223,28 +225,50 @@ func (g *Gnmi) Type() string {
return "gnmi" return "gnmi"
} }
// ProcessResponse takes a gNMI response and serializes the contents to the root struct. // ProcessResponse takes a gNMI response and serializes the contents to the
// root struct. It logs all errors and returns an error containing the number
// off errors encountered during the process.
func (g *Gnmi) ProcessResponse(resp interface{}, root interface{}, s *ytypes.Schema) error { func (g *Gnmi) ProcessResponse(resp interface{}, root interface{}, s *ytypes.Schema) error {
models := s.SchemaTree models := s.SchemaTree
r := resp.(*gpb.GetResponse) d, ok := root.(ygot.ValidatedGoStruct)
if !ok {
return &errors.ErrInvalidTypeAssertion{}
}
r, ok := resp.(*gpb.GetResponse)
if !ok {
return &errors.ErrInvalidTypeAssertion{}
}
rn := r.Notification rn := r.Notification
errs := make([]error, 0)
for _, msg := range rn { for _, msg := range rn {
for _, update := range msg.Update { for _, update := range msg.Update {
path := update.Path path := update.Path
fullPath := path switch val := update.Val.Value.(type) {
val, ok := update.Val.Value.(*gpb.TypedValue_JsonIetfVal) case *gpb.TypedValue_JsonVal:
if ok {
opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}} opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}}
return g.Unmarshal(val.JsonIetfVal, pathutils.ToStrings(fullPath), root, opts...) if err := g.Unmarshal(val.JsonVal, pathutils.ToStrings(path), d, opts...); err != nil {
} errs = append(errs, err)
// TODO(mk): Evaluate hardcoded model key }
schema := models["Device"] case *gpb.TypedValue_JsonIetfVal:
opts := []ytypes.SetNodeOpt{&ytypes.InitMissingElements{}, &ytypes.TolerateJSONInconsistencies{}} opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}}
if err := g.SetNode(schema, root, update.Path, update.Val, opts...); err != nil { if err := g.Unmarshal(val.JsonIetfVal, pathutils.ToStrings(path), d, opts...); err != nil {
return err errs = append(errs, err)
}
default:
schema := models["Device"]
opts := []ytypes.SetNodeOpt{&ytypes.InitMissingElements{}, &ytypes.TolerateJSONInconsistencies{}}
if err := g.SetNode(schema, root, update.Path, update.Val, opts...); err != nil {
errs = append(errs, err)
}
} }
} }
} }
for _, e := range errs {
log.Error(e)
}
if len(errs) != 0 {
return fmt.Errorf("encountered %v errors during response processing", len(errs))
}
return nil return nil
} }
......
...@@ -257,8 +257,8 @@ func TestGnmi_ProcessResponse(t *testing.T) { ...@@ -257,8 +257,8 @@ func TestGnmi_ProcessResponse(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
g := &Gnmi{ g := &Gnmi{
SetNode: tt.fields.Sbi.SetNode(), SetNode: tt.fields.Sbi.SetNode,
Unmarshal: tt.fields.Sbi.(*OpenConfig).Unmarshal(), Unmarshal: tt.fields.Sbi.(*OpenConfig).Unmarshal,
} }
s := tt.fields.Sbi.Schema() s := tt.fields.Sbi.Schema()
resp := gnmiMessages[tt.args.path] resp := gnmiMessages[tt.args.path]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment