diff --git a/cmd/gnmi-telemetry/telemetry.go b/cmd/gnmi-telemetry/telemetry.go index c21bb1301a98ded1c61feec588d438b74d17f02e..fbeb07fdc9c7a5d740c50d72862b887a8d00fe96 100644 --- a/cmd/gnmi-telemetry/telemetry.go +++ b/cmd/gnmi-telemetry/telemetry.go @@ -29,7 +29,10 @@ func main() { if err != nil { log.Debug(err) } - pnd := nucleus.NewPND("openconfig", "a simple openconfig PND", sbi) + pnd, err := nucleus.NewPND("openconfig", "a simple openconfig PND", sbi) + if err != nil { + log.Fatal(err) + } if err := pnd.AddDevice(device); err != nil { log.Fatal(err) } @@ -46,7 +49,7 @@ func main() { HeartbeatInterval: uint64(time.Second.Nanoseconds()), Paths: gnmi.SplitPaths(paths), Origin: "", - Target: device.Transport.GetOptions().GetAddress(), + Target: "portainer.danet.fbi.h-da.de:6030", } done := make(chan os.Signal, 1) signal.Notify(done, syscall.SIGILL, syscall.SIGTERM) diff --git a/mocks/Transport.go b/mocks/Transport.go index 3d284039a1a313e4b661634dd96d71a6185ecbff..a2df2b287b0974640857cef15e895121be5e513c 100644 --- a/mocks/Transport.go +++ b/mocks/Transport.go @@ -45,6 +45,22 @@ func (_m *Transport) Get(ctx context.Context, params ...string) (interface{}, er return r0, r1 } +// GetOptions provides a mock function with given fields: +func (_m *Transport) GetOptions() interface{} { + ret := _m.Called() + + var r0 interface{} + if rf, ok := ret.Get(0).(func() interface{}); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + return r0 +} + // ProcessResponse provides a mock function with given fields: resp, root, models func (_m *Transport) ProcessResponse(resp interface{}, root interface{}, models *ytypes.Schema) error { ret := _m.Called(resp, root, models) diff --git a/mocks/TransportOptions.go b/mocks/TransportOptions.go new file mode 100644 index 0000000000000000000000000000000000000000..4893655f8a5bc0fef06e4898e116fc3df7171421 --- /dev/null +++ b/mocks/TransportOptions.go @@ -0,0 +1,57 @@ +// Code generated by mockery v2.6.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// TransportOptions is an autogenerated mock type for the TransportOptions type +type TransportOptions struct { + mock.Mock +} + +// GetAddress provides a mock function with given fields: +func (_m *TransportOptions) GetAddress() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// GetPassword provides a mock function with given fields: +func (_m *TransportOptions) GetPassword() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// GetUsername provides a mock function with given fields: +func (_m *TransportOptions) GetUsername() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// IsTransportOption provides a mock function with given fields: +func (_m *TransportOptions) IsTransportOption() { + _m.Called() +} diff --git a/nucleus/cli-handling.go b/nucleus/cli-handling.go index 1e7ece71e74ec17dd371d241f48893ce72b7a95a..a8d3a77c5a360f5aa1c0dd393f76f2528d5d1ea3 100644 --- a/nucleus/cli-handling.go +++ b/nucleus/cli-handling.go @@ -181,9 +181,10 @@ func (s *server) GetAllPNDs(ctx context.Context, in *emptypb.Empty) (*pb.AllPNDs } tmpDevice := pb.Device{ Uuid: uuidDevice.String(), - Address: device.Transport.GetOptions().GetAddress(), - Username: device.Transport.GetOptions().GetUsername(), - Password: device.Transport.GetOptions().GetPassword()} + Address: device.Transport.GetOptions().(TransportOptions).GetAddress(), + Username: device.Transport.GetOptions().(TransportOptions).GetUsername(), + Password: device.Transport.GetOptions().(TransportOptions).GetPassword(), + } devices = append(devices, &tmpDevice) } sbi, err := s.core.sbic.get(pnd.GetSBIs().(*sbiStore).UUIDs()[0]) diff --git a/nucleus/device.go b/nucleus/device.go index ca734983f7f69c3138015d6c61738adacd14d6cc..913bdc9d7839d70634713afd2a4bfa6228a44c2d 100644 --- a/nucleus/device.go +++ b/nucleus/device.go @@ -24,9 +24,13 @@ type Device struct { //NewDevice creates a Device func NewDevice(ttype string, sbi SouthboundInterface, opts TransportOptions) (*Device, error) { var transport Transport + var err error switch ttype { case "gnmi": - transport = NewGnmiTransport(opts.(*GnmiTransportOptions)) + transport, err = NewGnmiTransport(opts.(*GnmiTransportOptions)) + if err != nil { + return nil, err + } case "restconf": //TODO: implement restconf -> NewRestConfTransport(opts) default: @@ -42,5 +46,5 @@ func NewDevice(ttype string, sbi SouthboundInterface, opts TransportOptions) (*D } func (d *Device) Id() uuid.UUID { - return d.Config.Uuid + return d.Uuid } diff --git a/nucleus/gnmi_transport.go b/nucleus/gnmi_transport.go index 9ad44cd48c8b00fa7bd5b808ac446a6c6f54e907..baee06334c303c24b20bcaa804be3c03ecb4fd03 100644 --- a/nucleus/gnmi_transport.go +++ b/nucleus/gnmi_transport.go @@ -23,19 +23,6 @@ func init() { tapProto = false } -func NewGnmiTransport(config *gnmi.Config) (*Gnmi, error) { - c, err := gnmi.Dial(config) - if err != nil { - return nil, err - } - return &Gnmi{ - SetNode: nil, - RespChan: nil, - config: config, - client: c, - }, nil -} - type Gnmi struct { SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error RespChan chan *gpb.SubscribeResponse @@ -44,15 +31,19 @@ type Gnmi struct { client gpb.GNMIClient } -func NewGnmiTransport(opts *GnmiTransportOptions) *Gnmi { - ngt := &Gnmi{ +func NewGnmiTransport(opts *GnmiTransportOptions) (*Gnmi, error) { + config := createConfig(opts) + c, err := gnmi.Dial(config) + if err != nil { + return nil, err + } + return &Gnmi{ SetNode: opts.SetNode, RespChan: opts.RespChan, Options: opts, - } - config := ngt.CreateConfig(opts) - ngt.SetConfig(config) - return ngt + config: config, + client: c, + }, nil } //SetConfig sets the config of gnmi @@ -71,12 +62,12 @@ func (g *Gnmi) SetOptions(to TransportOptions) { } //GetConfig returns the gnmi config -func (g *Gnmi) GetOptions() TransportOptions { +func (g *Gnmi) GetOptions() interface{} { return g.Options } //CreateConfig creates a new gnmi config based on the given parameters -func (g *Gnmi) CreateConfig(opts *GnmiTransportOptions) *gnmi.Config { +func createConfig(opts *GnmiTransportOptions) *gnmi.Config { return &gnmi.Config{ Addr: opts.Addr, Username: opts.Username, diff --git a/nucleus/principalNetworkDomain_test.go b/nucleus/principalNetworkDomain_test.go index 5d77a64dd956a94b2ebcd7e92bb5598aca52428c..db95582e17e9e65dab90e56c26709d97b374629b 100644 --- a/nucleus/principalNetworkDomain_test.go +++ b/nucleus/principalNetworkDomain_test.go @@ -36,14 +36,8 @@ func testSetupPnd() { func mockDevice() Device { return Device{ - GoStruct: nil, - SBI: &OpenConfig{}, - Config: DeviceConfig{ - Uuid: mdid, - Address: "mock://localhost", - Username: "mock", - Password: "mock", - }, + GoStruct: nil, + SBI: &OpenConfig{}, Transport: &mocks.Transport{}, } } @@ -184,9 +178,7 @@ func Test_pndImplementation_AddDevice(t *testing.T) { { name: "default", args: args{device: &Device{ - Config: DeviceConfig{ - Uuid: did, - }, + Uuid: did, }}, wantErr: false, }, @@ -258,15 +250,15 @@ func Test_pndImplementation_ContainsDevice(t *testing.T) { }{ {name: "default", args: args{ uuid: did, - device: &Device{Config: DeviceConfig{Uuid: did}}, + device: &Device{Uuid: did}, }, want: true}, {name: "fails", args: args{ uuid: uuid.New(), - device: &Device{Config: DeviceConfig{Uuid: did}}, + device: &Device{Uuid: did}, }, want: false}, {name: "fails empty", args: args{ uuid: uuid.New(), - device: &Device{Config: DeviceConfig{Uuid: did}}, + device: &Device{Uuid: did}, }, want: false}, } for _, tt := range tests { @@ -383,14 +375,8 @@ func Test_pndImplementation_MarshalDevice(t *testing.T) { t.Run(tt.name, func(t *testing.T) { pnd := newPnd() d := &Device{ - GoStruct: &openconfig.Device{}, - SBI: nil, - Config: DeviceConfig{ - Uuid: tt.args.uuid, - Address: "localhost", - Username: "test", - Password: "test", - }, + GoStruct: &openconfig.Device{}, + SBI: nil, Transport: nil, } if err := pnd.addDevice(d); err != nil { @@ -428,7 +414,7 @@ func Test_pndImplementation_RemoveDevice(t *testing.T) { t.Run(tt.name, func(t *testing.T) { pnd := newPnd() if tt.name != "fails empty" { - d := &Device{Config: DeviceConfig{Uuid: did}} + d := &Device{Uuid: did} if err := pnd.addDevice(d); err != nil { t.Error(err) } diff --git a/nucleus/store_test.go b/nucleus/store_test.go index 8a393efd6b93204de7a993affc5ca1bd0b3ca42a..d8fc58121f653375e41e580941c158b01b0f6aea 100644 --- a/nucleus/store_test.go +++ b/nucleus/store_test.go @@ -276,9 +276,7 @@ func Test_sbiStore_get(t *testing.T) { fields: fields{ store: store{ did: &Device{ - Config: DeviceConfig{ - Uuid: did, - }, + Uuid: did, }, }, }, @@ -351,9 +349,7 @@ func Test_pndStore_get(t *testing.T) { fields: fields{ store: store{ did: &Device{ - Config: DeviceConfig{ - Uuid: did, - }, + Uuid: did, }, }, }, @@ -396,12 +392,10 @@ func Test_deviceStore_get(t *testing.T) { name: "exists", fields: fields{ store: store{ - defaultPndId: &Device{Config: DeviceConfig{Uuid: did}}}}, + defaultPndId: &Device{Uuid: did}}}, args: args{id: defaultPndId}, want: &Device{ - Config: DeviceConfig{ - Uuid: did, - }, + Uuid: did, }, wantErr: false, }, @@ -409,7 +403,7 @@ func Test_deviceStore_get(t *testing.T) { name: "fails", fields: fields{ store: store{ - defaultPndId: &Device{Config: DeviceConfig{Uuid: did}}}}, + defaultPndId: &Device{Uuid: did}}}, args: args{id: iid}, wantErr: true, }, diff --git a/nucleus/transport.go b/nucleus/transport.go index ae5d676d44bb56310d75fb48d2696b6c7a3a1929..757ba085f51dbe50f00644ca7a7672bd917f6c5e 100644 --- a/nucleus/transport.go +++ b/nucleus/transport.go @@ -15,7 +15,7 @@ type Transport interface { Set(ctx context.Context, params ...string) (interface{}, error) Subscribe(ctx context.Context, params ...string) error Type() string - GetOptions() TransportOptions + GetOptions() interface{} ProcessResponse(resp interface{}, root interface{}, models *ytypes.Schema) error }