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

WIP: test case commit

parent bb66e18a
No related branches found
No related tags found
1 merge request!401Change the current gosdn plugin implementation from Go's internal plugin system to hashicorp's go-plugins
Pipeline #129196 failed
...@@ -7,8 +7,9 @@ import ( ...@@ -7,8 +7,9 @@ import (
"testing" "testing"
"time" "time"
pipb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-internal"
rpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry"
apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService" eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus"
"code.fbi.h-da.de/danet/gosdn/controller/rbac" "code.fbi.h-da.de/danet/gosdn/controller/rbac"
...@@ -18,7 +19,7 @@ import ( ...@@ -18,7 +19,7 @@ import (
"google.golang.org/grpc/test/bufconn" "google.golang.org/grpc/test/bufconn"
) )
func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer, *RoleServer, *PluginServer) { func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer, *RoleServer, *PluginInternalServer) {
initUUIDs(t) initUUIDs(t)
jwtManager := rbac.NewJWTManager("test", time.Minute) jwtManager := rbac.NewJWTManager("test", time.Minute)
eventService := eventservice.NewMockEventService() eventService := eventservice.NewMockEventService()
...@@ -29,8 +30,15 @@ func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer, ...@@ -29,8 +30,15 @@ func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer,
roleStore := rbac.NewMemoryRoleStore() roleStore := rbac.NewMemoryRoleStore()
roleService := rbac.NewRoleService(roleStore, eventService) roleService := rbac.NewRoleService(roleStore, eventService)
mockPnd := getMockPnd(t) registryClient := rpb.NewPluginRegistryServiceClient(&grpc.ClientConn{})
mockPlugin := getMockPlugin(t)
pluginService := nucleus.NewPluginServiceMock()
if err := pluginService.Add(mockPlugin); err != nil {
t.Fatal(err)
}
mockPnd := getMockPnd(t)
pndStore := nucleus.NewMemoryPndStore() pndStore := nucleus.NewMemoryPndStore()
if err := pndStore.Add(mockPnd); err != nil { if err := pndStore.Add(mockPnd); err != nil {
t.Fatal(err) t.Fatal(err)
...@@ -39,23 +47,23 @@ func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer, ...@@ -39,23 +47,23 @@ func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer,
s := NewAuthInterceptor(jwtManager, userService, roleService) s := NewAuthInterceptor(jwtManager, userService, roleService)
u := NewUserServer(jwtManager, userService) u := NewUserServer(jwtManager, userService)
r := NewRoleServer(jwtManager, roleService) r := NewRoleServer(jwtManager, roleService)
sbiServer := NewPluginServer(pndStore) p := NewPluginInternalServer(registryClient, pluginService)
if err := clearAndCreateAuthTestSetup(userService, roleService); err != nil { if err := clearAndCreateAuthTestSetup(userService, roleService); err != nil {
t.Fatal(err) t.Fatal(err)
} }
return s, u, r, sbiServer return s, u, r, p
} }
func dialer(interceptorServer *AuthInterceptor, userServer *UserServer, roleServer *RoleServer, sbiServer *PluginServer) func(context.Context, string) (net.Conn, error) { func dialer(interceptorServer *AuthInterceptor, userServer *UserServer, roleServer *RoleServer, pluginServer *PluginInternalServer) func(context.Context, string) (net.Conn, error) {
listener := bufconn.Listen(1024 * 1024) listener := bufconn.Listen(1024 * 1024)
interceptor := interceptorServer interceptor := interceptorServer
server := grpc.NewServer(grpc.UnaryInterceptor(interceptor.Unary()), grpc.StreamInterceptor(interceptor.Stream())) server := grpc.NewServer(grpc.UnaryInterceptor(interceptor.Unary()), grpc.StreamInterceptor(interceptor.Stream()))
apb.RegisterUserServiceServer(server, userServer) apb.RegisterUserServiceServer(server, userServer)
spb.RegisterSbiServiceServer(server, sbiServer) pipb.RegisterPluginInternalServiceServer(server, pluginServer)
go func() { go func() {
if err := server.Serve(listener); err != nil { if err := server.Serve(listener); err != nil {
...@@ -69,7 +77,7 @@ func dialer(interceptorServer *AuthInterceptor, userServer *UserServer, roleServ ...@@ -69,7 +77,7 @@ func dialer(interceptorServer *AuthInterceptor, userServer *UserServer, roleServ
} }
func TestAuthInterceptor_Unary(t *testing.T) { func TestAuthInterceptor_Unary(t *testing.T) {
authServer, userServer, roleServer, sbiServer := getTestAuthInterceptorServer(t) authServer, userServer, roleServer, pluginServer := getTestAuthInterceptorServer(t)
validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager) validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
...@@ -85,7 +93,7 @@ func TestAuthInterceptor_Unary(t *testing.T) { ...@@ -85,7 +93,7 @@ func TestAuthInterceptor_Unary(t *testing.T) {
ctx, ctx,
"", "",
grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithContextDialer(dialer(authServer, userServer, roleServer, sbiServer)), grpc.WithContextDialer(dialer(authServer, userServer, roleServer, pluginServer)),
) )
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
...@@ -165,7 +173,7 @@ func TestAuthInterceptor_Unary(t *testing.T) { ...@@ -165,7 +173,7 @@ func TestAuthInterceptor_Unary(t *testing.T) {
} }
func TestAuthInterceptor_Stream(t *testing.T) { func TestAuthInterceptor_Stream(t *testing.T) {
authServer, userServer, roleServer, sbiServer := getTestAuthInterceptorServer(t) authServer, userServer, roleServer, pluginServer := getTestAuthInterceptorServer(t)
validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager) validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
...@@ -176,7 +184,7 @@ func TestAuthInterceptor_Stream(t *testing.T) { ...@@ -176,7 +184,7 @@ func TestAuthInterceptor_Stream(t *testing.T) {
ctx, ctx,
"", "",
grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithContextDialer(dialer(authServer, userServer, roleServer, sbiServer)), grpc.WithContextDialer(dialer(authServer, userServer, roleServer, pluginServer)),
) )
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
...@@ -187,11 +195,11 @@ func TestAuthInterceptor_Stream(t *testing.T) { ...@@ -187,11 +195,11 @@ func TestAuthInterceptor_Stream(t *testing.T) {
} }
}() }()
client := spb.NewSbiServiceClient(conn) client := pipb.NewPluginInternalServiceClient(conn)
type args struct { type args struct {
ctx context.Context ctx context.Context
request *spb.GetSchemaRequest request *pipb.PluginSchemaRequest
} }
tests := []struct { tests := []struct {
name string name string
...@@ -202,9 +210,8 @@ func TestAuthInterceptor_Stream(t *testing.T) { ...@@ -202,9 +210,8 @@ func TestAuthInterceptor_Stream(t *testing.T) {
name: "default stream interceptor", name: "default stream interceptor",
args: args{ args: args{
ctx: metadata.NewOutgoingContext(context.Background(), metadata.Pairs("authorize", validToken)), ctx: metadata.NewOutgoingContext(context.Background(), metadata.Pairs("authorize", validToken)),
request: &spb.GetSchemaRequest{ request: &pipb.PluginSchemaRequest{
Pid: pndID, Pid: pluginID,
Sid: sbiID,
}, },
}, },
want: true, want: true,
...@@ -213,9 +220,8 @@ func TestAuthInterceptor_Stream(t *testing.T) { ...@@ -213,9 +220,8 @@ func TestAuthInterceptor_Stream(t *testing.T) {
name: "error stream interceptor", name: "error stream interceptor",
args: args{ args: args{
ctx: metadata.NewOutgoingContext(context.Background(), metadata.Pairs("authorize", "foo")), ctx: metadata.NewOutgoingContext(context.Background(), metadata.Pairs("authorize", "foo")),
request: &spb.GetSchemaRequest{ request: &pipb.PluginSchemaRequest{
Pid: pndID, Pid: pluginID,
Sid: sbiID,
}, },
}, },
want: false, want: false,
...@@ -224,13 +230,13 @@ func TestAuthInterceptor_Stream(t *testing.T) { ...@@ -224,13 +230,13 @@ func TestAuthInterceptor_Stream(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) {
got, err := client.GetSchema(tt.args.ctx, tt.args.request) got, err := client.PluginSchema(tt.args.ctx, tt.args.request)
if err != nil { if err != nil {
t.Errorf("AuthInterceptor.Stream() = %v", err) t.Errorf("AuthInterceptor.Stream() = %v", err)
return return
} }
payload, _ := got.Recv() payload, err := got.Recv()
if (payload != nil) != tt.want { if (payload != nil) != tt.want {
t.Errorf("AuthInterceptor.Stream() = %v", tt.want) t.Errorf("AuthInterceptor.Stream() = %v", tt.want)
return return
......
...@@ -7,13 +7,16 @@ import ( ...@@ -7,13 +7,16 @@ import (
"time" "time"
pb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core" pb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core"
cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
rpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry"
ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
"code.fbi.h-da.de/danet/gosdn/controller/mocks" "code.fbi.h-da.de/danet/gosdn/controller/mocks"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus"
"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
"google.golang.org/grpc"
) )
func getTestCoreServer(t *testing.T) *CoreServer { func getTestCoreServer(t *testing.T) *CoreServer {
...@@ -23,11 +26,6 @@ func getTestCoreServer(t *testing.T) *CoreServer { ...@@ -23,11 +26,6 @@ func getTestCoreServer(t *testing.T) *CoreServer {
t.Fatal(err) t.Fatal(err)
} }
sbiUUID, err = uuid.Parse(sbiID)
if err != nil {
t.Fatal(err)
}
pendingChangeUUID, err = uuid.Parse(pendingChangeID) pendingChangeUUID, err = uuid.Parse(pendingChangeID)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
...@@ -44,28 +42,29 @@ func getTestCoreServer(t *testing.T) *CoreServer { ...@@ -44,28 +42,29 @@ func getTestCoreServer(t *testing.T) *CoreServer {
} }
mockNetworkElement = &nucleus.CommonNetworkElement{ mockNetworkElement = &nucleus.CommonNetworkElement{
Plugin: &openconfig.Device{ Plugin: &mocks.Plugin{},
System: &openconfig.OpenconfigSystem_System{ //Plugin: &openconfig.Device{
Config: &openconfig.OpenconfigSystem_System_Config{ // System: &openconfig.OpenconfigSystem_System{
Hostname: &hostname, // Config: &openconfig.OpenconfigSystem_System_Config{
DomainName: &domainname, // Hostname: &hostname,
}, // DomainName: &domainname,
}, // },
}, // },
//},
UUID: mneUUID, UUID: mneUUID,
} }
sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID) //sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID)
if err != nil { //if err != nil {
t.Fatal(err) // t.Fatal(err)
} //}
mockNetworkElement.(*nucleus.CommonNetworkElement).SetSBI(sbi) //mockNetworkElement.(*nucleus.CommonNetworkElement).SetSBI(sbi)
mockNetworkElement.(*nucleus.CommonNetworkElement).SetTransport(&mocks.Transport{}) mockNetworkElement.(*nucleus.CommonNetworkElement).SetTransport(&mocks.Transport{})
mockNetworkElement.(*nucleus.CommonNetworkElement).SetName(hostname) mockNetworkElement.(*nucleus.CommonNetworkElement).SetName(hostname)
sbiStore = nucleus.NewSbiStore(pndUUID) //sbiStore = nucleus.NewSbiStore(pndUUID)
if err := sbiStore.Add(mockNetworkElement.SBI()); err != nil { //if err := sbiStore.Add(mockNetworkElement.SBI()); err != nil {
t.Fatal(err) // t.Fatal(err)
} //}
mockChange := &mocks.Change{} mockChange := &mocks.Change{}
mockChange.On("Age").Return(time.Hour) mockChange.On("Age").Return(time.Hour)
...@@ -75,8 +74,6 @@ func getTestCoreServer(t *testing.T) *CoreServer { ...@@ -75,8 +74,6 @@ func getTestCoreServer(t *testing.T) *CoreServer {
mockPnd.On("ID").Return(pndUUID) mockPnd.On("ID").Return(pndUUID)
mockPnd.On("GetName").Return("test") mockPnd.On("GetName").Return("test")
mockPnd.On("GetDescription").Return("test") mockPnd.On("GetDescription").Return("test")
mockPnd.On("GetSBIs").Return(sbiStore)
mockPnd.On("GetSBI", mock.Anything).Return(mockNetworkElement.SBI(), nil)
mockPnd.On("Devices").Return([]uuid.UUID{mneUUID}) mockPnd.On("Devices").Return([]uuid.UUID{mneUUID})
mockPnd.On("PendingChanges").Return([]uuid.UUID{pendingChangeUUID}) mockPnd.On("PendingChanges").Return([]uuid.UUID{pendingChangeUUID})
mockPnd.On("CommittedChanges").Return([]uuid.UUID{committedChangeUUID}) mockPnd.On("CommittedChanges").Return([]uuid.UUID{committedChangeUUID})
...@@ -93,7 +90,10 @@ func getTestCoreServer(t *testing.T) *CoreServer { ...@@ -93,7 +90,10 @@ func getTestCoreServer(t *testing.T) *CoreServer {
t.Fatal(err) t.Fatal(err)
} }
c := NewCoreServer(pndStore) eventService := eventservice.NewMockEventService()
pluginStore := nucleus.NewMemoryPluginStore()
c := NewCoreServer(pndStore, nucleus.NewPluginService(pluginStore, eventService), rpb.NewPluginRegistryServiceClient(&grpc.ClientConn{}), cpb.NewCsbiServiceClient(&grpc.ClientConn{}), func(u uuid.UUID, c chan networkelement.Details) {})
return c return c
} }
...@@ -118,7 +118,6 @@ func Test_core_Set(t *testing.T) { ...@@ -118,7 +118,6 @@ func Test_core_Set(t *testing.T) {
{ {
Name: "test", Name: "test",
Description: "test", Description: "test",
Sbi: "test",
}, },
}, },
}, },
......
package server package server
import ( //import (
"context" // "context"
"testing" // "testing"
"time" // "time"
//
ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" // ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" // spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/mocks" // "code.fbi.h-da.de/danet/gosdn/controller/mocks"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus" // "code.fbi.h-da.de/danet/gosdn/controller/nucleus"
"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" // "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
"github.com/google/uuid" // "github.com/google/uuid"
"github.com/openconfig/gnmi/proto/gnmi" // "github.com/openconfig/gnmi/proto/gnmi"
"github.com/stretchr/testify/mock" // "github.com/stretchr/testify/mock"
) //)
//
func getTestPndServer(t *testing.T) *PndServer { //func getTestPndServer(t *testing.T) *PndServer {
var err error // var err error
pndUUID, err = uuid.Parse(pndID) // pndUUID, err = uuid.Parse(pndID)
if err != nil { // if err != nil {
t.Fatal(err) // t.Fatal(err)
} // }
//
sbiUUID, err = uuid.Parse(sbiID) // sbiUUID, err = uuid.Parse(sbiID)
if err != nil { // if err != nil {
t.Fatal(err) // t.Fatal(err)
} // }
//
pendingChangeUUID, err = uuid.Parse(pendingChangeID) // pendingChangeUUID, err = uuid.Parse(pendingChangeID)
if err != nil { // if err != nil {
t.Fatal(err) // t.Fatal(err)
} // }
//
committedChangeUUID, err = uuid.Parse(committedChangeID) // committedChangeUUID, err = uuid.Parse(committedChangeID)
if err != nil { // if err != nil {
t.Fatal(err) // t.Fatal(err)
} // }
//
mneUUID, err = uuid.Parse(mneID) // mneUUID, err = uuid.Parse(mneID)
if err != nil { // if err != nil {
t.Fatal(err) // t.Fatal(err)
} // }
//
mockNetworkElement = &nucleus.CommonNetworkElement{ // mockNetworkElement = &nucleus.CommonNetworkElement{
Plugin: &openconfig.Device{ // Plugin: &openconfig.Device{
System: &openconfig.OpenconfigSystem_System{ // System: &openconfig.OpenconfigSystem_System{
Config: &openconfig.OpenconfigSystem_System_Config{ // Config: &openconfig.OpenconfigSystem_System_Config{
Hostname: &hostname, // Hostname: &hostname,
DomainName: &domainname, // DomainName: &domainname,
}, // },
}, // },
}, // },
UUID: mneUUID, // UUID: mneUUID,
} // }
//
sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID) // sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID)
if err != nil { // if err != nil {
t.Fatal(err) // t.Fatal(err)
} // }
mockNetworkElement.(*nucleus.CommonNetworkElement).SetSBI(sbi) // mockNetworkElement.(*nucleus.CommonNetworkElement).SetTransport(&mocks.Transport{})
mockNetworkElement.(*nucleus.CommonNetworkElement).SetTransport(&mocks.Transport{}) // mockNetworkElement.(*nucleus.CommonNetworkElement).SetName(hostname)
mockNetworkElement.(*nucleus.CommonNetworkElement).SetName(hostname) // sbiStore = nucleus.NewPluginStore(pndUUID)
sbiStore = nucleus.NewSbiStore(pndUUID) // if err := sbiStore.Add(mockNetworkElement.SBI()); err != nil {
if err := sbiStore.Add(mockNetworkElement.SBI()); err != nil { // t.Fatal(err)
t.Fatal(err) // }
} //
// mockChange := &mocks.Change{}
mockChange := &mocks.Change{} // mockChange.On("Age").Return(time.Hour)
mockChange.On("Age").Return(time.Hour) // mockChange.On("State").Return(ppb.ChangeState_CHANGE_STATE_INCONSISTENT)
mockChange.On("State").Return(ppb.ChangeState_CHANGE_STATE_INCONSISTENT) //
// mockPnd = &mocks.NetworkDomain{}
mockPnd = &mocks.NetworkDomain{} // mockPnd.On("ID").Return(pndUUID)
mockPnd.On("ID").Return(pndUUID) // mockPnd.On("GetName").Return("test")
mockPnd.On("GetName").Return("test") // mockPnd.On("GetDescription").Return("test")
mockPnd.On("GetDescription").Return("test") // mockPnd.On("GetSBIs").Return(sbiStore)
mockPnd.On("GetSBIs").Return(sbiStore) // mockPnd.On("GetSBI", mock.Anything).Return(mockNetworkElement.SBI(), nil)
mockPnd.On("GetSBI", mock.Anything).Return(mockNetworkElement.SBI(), nil) // mockPnd.On("NetworkElements").Return([]uuid.UUID{mneUUID})
mockPnd.On("NetworkElements").Return([]uuid.UUID{mneUUID}) // mockPnd.On("PendingChanges").Return([]uuid.UUID{pendingChangeUUID})
mockPnd.On("PendingChanges").Return([]uuid.UUID{pendingChangeUUID}) // mockPnd.On("CommittedChanges").Return([]uuid.UUID{committedChangeUUID})
mockPnd.On("CommittedChanges").Return([]uuid.UUID{committedChangeUUID}) // mockPnd.On("GetChange", mock.Anything).Return(mockChange, nil)
mockPnd.On("GetChange", mock.Anything).Return(mockChange, nil) // mockPnd.On("AddNetworkElement", mock.Anything, mock.Anything, mock.Anything).Return(nil)
mockPnd.On("AddNetworkElement", mock.Anything, mock.Anything, mock.Anything).Return(nil) // mockPnd.On("GetNetworkElement", mock.Anything).Return(mockNetworkElement, nil)
mockPnd.On("GetNetworkElement", mock.Anything).Return(mockNetworkElement, nil) // mockPnd.On("Commit", mock.Anything).Return(nil)
mockPnd.On("Commit", mock.Anything).Return(nil) // mockPnd.On("Confirm", mock.Anything).Return(nil)
mockPnd.On("Confirm", mock.Anything).Return(nil) // mockPnd.On("ChangeMNE", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(uuid.Nil, nil)
mockPnd.On("ChangeMNE", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(uuid.Nil, nil) // mockPnd.On("Request", mock.Anything, mock.Anything).Return(&gnmi.GetResponse{}, nil)
mockPnd.On("Request", mock.Anything, mock.Anything).Return(&gnmi.GetResponse{}, nil) //
// pndStore := nucleus.NewMemoryPndStore()
pndStore := nucleus.NewMemoryPndStore() // if err := pndStore.Add(mockPnd); err != nil {
if err := pndStore.Add(mockPnd); err != nil { // t.Fatal(err)
t.Fatal(err) // }
} //
// c := NewPndServer(pndStore)
c := NewPndServer(pndStore) //
// return c
return c //}
} //
//// TODO: This test case does not make sense; needs to be adjusted.
// TODO: This test case does not make sense; needs to be adjusted. //func Test_pnd_GetPath(t *testing.T) {
func Test_pnd_GetPath(t *testing.T) { // initUUIDs(t)
initUUIDs(t) //
// //opts := cmp.Options{
//opts := cmp.Options{ // // cmpopts.SortSlices(
// cmpopts.SortSlices( // // func(x, y *gnmi.Update) bool {
// func(x, y *gnmi.Update) bool { // // return x.GetVal().String() < y.GetVal().String()
// return x.GetVal().String() < y.GetVal().String() // // },
// }, // // ),
// ), // // cmp.Comparer(proto.Equal),
// cmp.Comparer(proto.Equal), // //}
//} //
// type args struct {
type args struct { // ctx context.Context
ctx context.Context // request *ppb.GetPathRequest
request *ppb.GetPathRequest // }
} // tests := []struct {
tests := []struct { // name string
name string // args args
args args // want []*gnmi.Notification
want []*gnmi.Notification // wantErr bool
wantErr bool // }{
}{ // {
{ // name: "get path: system/config/hostname",
name: "get path: system/config/hostname", // args: args{
args: args{ // ctx: context.Background(),
ctx: context.Background(), // request: &ppb.GetPathRequest{
request: &ppb.GetPathRequest{ // Timestamp: time.Now().UnixNano(),
Timestamp: time.Now().UnixNano(), // Mneid: mneUUID.String(),
Mneid: mneUUID.String(), // Path: "system/config/hostname",
Path: "system/config/hostname", // Pid: pndUUID.String(),
Pid: pndUUID.String(), // },
}, // },
}, // want: []*gnmi.Notification{
want: []*gnmi.Notification{ // {
{ // Update: []*gnmi.Update{
Update: []*gnmi.Update{ // {
{ // Path: &gnmi.Path{
Path: &gnmi.Path{ // Elem: []*gnmi.PathElem{
Elem: []*gnmi.PathElem{ // {
{ // Name: "system",
Name: "system", // },
}, // {
{ // Name: "config",
Name: "config", // },
}, // {
{ // Name: "hostname",
Name: "hostname", // },
}, // },
}, // },
}, // Val: &gnmi.TypedValue{
Val: &gnmi.TypedValue{ // Value: &gnmi.TypedValue_StringVal{
Value: &gnmi.TypedValue_StringVal{ // StringVal: "manfred",
StringVal: "manfred", // },
}, // },
}, // },
}, // }},
}}, // },
}, // wantErr: false,
wantErr: false, // },
}, // {
{ // name: "get path: system",
name: "get path: system", // args: args{
args: args{ // ctx: context.Background(),
ctx: context.Background(), // request: &ppb.GetPathRequest{
request: &ppb.GetPathRequest{ // Timestamp: time.Now().UnixNano(),
Timestamp: time.Now().UnixNano(), // Mneid: mneUUID.String(),
Mneid: mneUUID.String(), // Path: "system",
Path: "system", // Pid: pndUUID.String(),
Pid: pndUUID.String(), // },
}, // },
}, // want: []*gnmi.Notification{
want: []*gnmi.Notification{ // {
{ // Update: []*gnmi.Update{
Update: []*gnmi.Update{ // {
{ // Path: &gnmi.Path{
Path: &gnmi.Path{ // Elem: []*gnmi.PathElem{
Elem: []*gnmi.PathElem{ // {
{ // Name: "system",
Name: "system", // },
}, // },
}, // },
}, // Val: &gnmi.TypedValue{
Val: &gnmi.TypedValue{ // Value: &gnmi.TypedValue_JsonIetfVal{
Value: &gnmi.TypedValue_JsonIetfVal{ // JsonIetfVal: []byte("{\n \"openconfig-system:config\": {\n \"domain-name\": \"uwe\",\n \"hostname\": \"manfred\"\n }\n}"),
JsonIetfVal: []byte("{\n \"openconfig-system:config\": {\n \"domain-name\": \"uwe\",\n \"hostname\": \"manfred\"\n }\n}"), // },
}, // },
}, // },
}, // }},
}}, // },
}, // wantErr: false,
wantErr: false, // },
}, // //{
//{ // // name: "get path: this/path/is/not/valid",
// name: "get path: this/path/is/not/valid", // // args: args{
// args: args{ // // ctx: context.Background(),
// ctx: context.Background(), // // request: &ppb.GetPathRequest{
// request: &ppb.GetPathRequest{ // // Timestamp: time.Now().UnixNano(),
// Timestamp: time.Now().UnixNano(), // // Mneid: mneUUID.String(),
// Mneid: mneUUID.String(), // // Path: "this/path/is/not/valid",
// Path: "this/path/is/not/valid", // // Pid: pndUUID.String(),
// Pid: pndUUID.String(), // // },
// }, // // },
// }, // // want: []*gnmi.Notification{},
// want: []*gnmi.Notification{}, // // wantErr: true,
// wantErr: true, // //},
//}, // }
} // for _, tt := range tests {
for _, tt := range tests { // t.Run(tt.name, func(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { // s := getTestPndServer(t)
s := getTestPndServer(t) // _, err := s.GetPath(tt.args.ctx, tt.args.request)
_, err := s.GetPath(tt.args.ctx, tt.args.request) // if (err != nil) != tt.wantErr {
if (err != nil) != tt.wantErr { // t.Errorf("GetPath() error = %v, wantErr %v", err, tt.wantErr)
t.Errorf("GetPath() error = %v, wantErr %v", err, tt.wantErr) // return
return // }
} //
// //got := resp.GetMneNotification()
//got := resp.GetMneNotification() //
// //for i, n := range got {
//for i, n := range got { // // if diff := cmp.Diff(n.GetUpdate(), tt.want[i].GetUpdate(), opts...); diff != "" {
// if diff := cmp.Diff(n.GetUpdate(), tt.want[i].GetUpdate(), opts...); diff != "" { // // t.Errorf("GetPath() diff in the received notification %d: \n%s", i+1, diff)
// t.Errorf("GetPath() diff in the received notification %d: \n%s", i+1, diff) // // }
// } // //}
//} // })
}) // }
} //}
} //
//func Test_pnd_Set(t *testing.T) {
func Test_pnd_Set(t *testing.T) { // // type args struct {
// type args struct { // // ctx context.Context
// ctx context.Context // // request *ppb.SetRequest
// request *ppb.SetRequest // // }
// } // // tests := []struct {
// tests := []struct { // // name string
// name string // // args args
// args args // // want ppb.SetResponseStatus
// want ppb.SetResponseStatus // // wantErr bool
// wantErr bool // // }{
// }{ // // {
// { // // name: "set mne",
// name: "set mne", // // args: args{
// args: args{ // // ctx: context.Background(),
// ctx: context.Background(), // // request: &ppb.SetRequest{
// request: &ppb.SetRequest{ // // Mne: []*ppb.SetMne{
// Mne: []*ppb.SetMne{ // // {
// { // // Sbi: &spb.SouthboundInterface{
// Sbi: &spb.SouthboundInterface{ // // Id: sbiID,
// Id: sbiID, // // Type: spb.Type_TYPE_OPENCONFIG,
// Type: spb.Type_TYPE_OPENCONFIG, // // },
// }, // // DeviceName: hostname,
// DeviceName: hostname, // // TransportOption: &transport.TransportOption{
// TransportOption: &transport.TransportOption{ // // Address: "test",
// Address: "test", // // Username: "test",
// Username: "test", // // Password: "test",
// Password: "test", // // TransportOption: &transport.TransportOption_GnmiTransportOption{
// TransportOption: &transport.TransportOption_GnmiTransportOption{ // // GnmiTransportOption: &transport.GnmiTransportOption{},
// GnmiTransportOption: &transport.GnmiTransportOption{}, // // },
// }, // // },
// }, // // },
// }, // // },
// }, // // Pid: pndID,
// Pid: pndID, // // },
// }, // // },
// }, // // want: ppb.SetResponse_OK,
// want: ppb.SetResponse_OK, // // },
// }, // // // {
// // { // // // name: "set change",
// // name: "set change", // // // args: args{
// // args: args{ // // // ctx: context.Background(),
// // ctx: context.Background(), // // // request: &ppb.SetRequest{
// // request: &ppb.SetRequest{ // // // Pid: pndID,
// // Pid: pndID, // // // Change: []*ppb.SetChange{
// // Change: []*ppb.SetChange{ // // // {
// // { // // // Cuid: pendingChangeID,
// // Cuid: pendingChangeID, // // // Op: ppb.SetChange_COMMIT,
// // Op: ppb.SetChange_COMMIT, // // // },
// // }, // // // {
// // { // // // Cuid: committedChangeID,
// // Cuid: committedChangeID, // // // Op: ppb.SetChange_CONFIRM,
// // Op: ppb.SetChange_CONFIRM, // // // },
// // }, // // // },
// // }, // // // },
// // }, // // // },
// // }, // // // want: ppb.SetResponse_OK,
// // want: ppb.SetResponse_OK, // // // },
// // }, // // // {
// // { // // // name: "change request",
// // name: "change request", // // // args: args{
// // args: args{ // // // ctx: context.Background(),
// // ctx: context.Background(), // // // request: &ppb.SetRequest{
// // request: &ppb.SetRequest{ // // // Pid: pndID,
// // Pid: pndID, // // // ChangeRequest: []*ppb.ChangeRequest{
// // ChangeRequest: []*ppb.ChangeRequest{ // // // {
// // { // // // Id: mneID,
// // Id: mneID, // // // Path: "/system/config/hostname",
// // Path: "/system/config/hostname", // // // Value: "herbert",
// // Value: "herbert", // // // ApiOp: ppb.ApiOperation_UPDATE,
// // ApiOp: ppb.ApiOperation_UPDATE, // // // },
// // }, // // // {
// // { // // // Id: mneID,
// // Id: mneID, // // // Path: "/system/config/hostname",
// // Path: "/system/config/hostname", // // // Value: "fridolin",
// // Value: "fridolin", // // // ApiOp: ppb.ApiOperation_REPLACE,
// // ApiOp: ppb.ApiOperation_REPLACE, // // // },
// // }, // // // {
// // { // // // Id: mneID,
// // Id: mneID, // // // Path: "/system/config/hostname",
// // Path: "/system/config/hostname", // // // ApiOp: ppb.ApiOperation_DELETE,
// // ApiOp: ppb.ApiOperation_DELETE, // // // },
// // }, // // // },
// // }, // // // },
// // }, // // // },
// // }, // // // want: ppb.SetResponse_OK,
// // want: ppb.SetResponse_OK, // // // },
// // }, // // }
// } // // for _, tt := range tests {
// for _, tt := range tests { // // t.Run(tt.name, func(t *testing.T) {
// t.Run(tt.name, func(t *testing.T) { // // p := pndServer{
// p := pndServer{ // // UnimplementedPndServiceServer: ppb.UnimplementedPndServiceServer{},
// UnimplementedPndServiceServer: ppb.UnimplementedPndServiceServer{}, // // }
// } // // resp, err := p.Set(tt.args.ctx, tt.args.request)
// resp, err := p.Set(tt.args.ctx, tt.args.request) // // if (err != nil) != tt.wantErr {
// if (err != nil) != tt.wantErr { // // t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr)
// t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr) // // return
// return // // }
// } // // got := resp.Status
// got := resp.Status // // if !reflect.DeepEqual(got, tt.want) {
// if !reflect.DeepEqual(got, tt.want) { // // t.Errorf("Set() got = %v, want %v", got, tt.want)
// t.Errorf("Set() got = %v, want %v", got, tt.want) // // }
// } // // for _, r := range resp.Responses {
// for _, r := range resp.Responses { // // got = r.Status
// got = r.Status // // if !reflect.DeepEqual(got, tt.want) {
// if !reflect.DeepEqual(got, tt.want) { // // t.Errorf("Set() got = %v, want %v", got, tt.want)
// t.Errorf("Set() got = %v, want %v", got, tt.want) // // }
// } // // }
// } // // })
// }) // // }
// } //}
}
...@@ -6,15 +6,13 @@ import ( ...@@ -6,15 +6,13 @@ import (
"log" "log"
"testing" "testing"
spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/conflict" "code.fbi.h-da.de/danet/gosdn/controller/conflict"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/mocks" "code.fbi.h-da.de/danet/gosdn/controller/mocks"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus"
"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
"code.fbi.h-da.de/danet/gosdn/controller/rbac" "code.fbi.h-da.de/danet/gosdn/controller/rbac"
"code.fbi.h-da.de/danet/gosdn/controller/store" "code.fbi.h-da.de/danet/gosdn/controller/store"
...@@ -25,21 +23,21 @@ import ( ...@@ -25,21 +23,21 @@ import (
) )
const pndID = "2043519e-46d1-4963-9a8e-d99007e104b8" const pndID = "2043519e-46d1-4963-9a8e-d99007e104b8"
const pluginID = "22ecbd5e-37de-43e3-be56-358f9716fd7d"
const pendingChangeID = "0992d600-f7d4-4906-9559-409b04d59a5f" const pendingChangeID = "0992d600-f7d4-4906-9559-409b04d59a5f"
const committedChangeID = "804787d6-e5a8-4dba-a1e6-e73f96b0119e" const committedChangeID = "804787d6-e5a8-4dba-a1e6-e73f96b0119e"
const sbiID = "f6fd4b35-f039-4111-9156-5e4501bb8a5a"
const mneID = "7e0ed8cc-ebf5-46fa-9794-741494914883" const mneID = "7e0ed8cc-ebf5-46fa-9794-741494914883"
var hostname = "manfred" var hostname = "manfred"
var domainname = "uwe" var domainname = "uwe"
var pndUUID uuid.UUID var pndUUID uuid.UUID
var sbiUUID uuid.UUID var pluginUUID uuid.UUID
var pendingChangeUUID uuid.UUID var pendingChangeUUID uuid.UUID
var committedChangeUUID uuid.UUID var committedChangeUUID uuid.UUID
var mneUUID uuid.UUID var mneUUID uuid.UUID
var mockPnd *mocks.NetworkDomain var mockPnd *mocks.NetworkDomain
var mockNetworkElement networkelement.NetworkElement var mockNetworkElement networkelement.NetworkElement
var sbiStore southbound.Store var pluginStore plugin.Store
// Name of this file requires _test at the end, because of how the availability of varibales is handled in test files of go packages. // Name of this file requires _test at the end, because of how the availability of varibales is handled in test files of go packages.
// Does not include actual file tests! // Does not include actual file tests!
...@@ -130,7 +128,7 @@ func createTestRoles(roleService rbacInterfaces.RoleService) error { ...@@ -130,7 +128,7 @@ func createTestRoles(roleService rbacInterfaces.RoleService) error {
"/gosdn.core.CoreService/GetPnd", "/gosdn.core.CoreService/GetPnd",
"/gosdn.core.CoreService/GetPndList", "/gosdn.core.CoreService/GetPndList",
"/gosdn.rbac.UserService/GetUsers", "/gosdn.rbac.UserService/GetUsers",
"/gosdn.southbound.SbiService/GetSchema", "/gosdn.plugin_internal.PluginInternalService/PluginSchema",
}, },
}, },
{ {
...@@ -208,35 +206,36 @@ func createHashedAndSaltedPassword(plainPWD, salt string) string { ...@@ -208,35 +206,36 @@ func createHashedAndSaltedPassword(plainPWD, salt string) string {
func getMockPnd(t *testing.T) networkdomain.NetworkDomain { func getMockPnd(t *testing.T) networkdomain.NetworkDomain {
mockNetworkElement = &nucleus.CommonNetworkElement{ mockNetworkElement = &nucleus.CommonNetworkElement{
Plugin: &openconfig.Device{ Plugin: &mocks.Plugin{},
System: &openconfig.OpenconfigSystem_System{ //Plugin: &openconfig.Device{
Config: &openconfig.OpenconfigSystem_System_Config{ // System: &openconfig.OpenconfigSystem_System{
Hostname: &hostname, // Config: &openconfig.OpenconfigSystem_System_Config{
DomainName: &domainname, // Hostname: &hostname,
}, // DomainName: &domainname,
}, // },
}, // },
//},
UUID: mneUUID, UUID: mneUUID,
} }
sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID) //sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, sbiUUID)
if err != nil { //if err != nil {
t.Fatal(err) // t.Fatal(err)
} //}
mockNetworkElement.(*nucleus.CommonNetworkElement).SetSBI(sbi) //mockNetworkElement.(*nucleus.CommonNetworkElement).SetSBI(sbi)
mockNetworkElement.(*nucleus.CommonNetworkElement).SetTransport(&mocks.Transport{}) mockNetworkElement.(*nucleus.CommonNetworkElement).SetTransport(&mocks.Transport{})
mockNetworkElement.(*nucleus.CommonNetworkElement).SetName(hostname) mockNetworkElement.(*nucleus.CommonNetworkElement).SetName(hostname)
sbiStore = nucleus.NewSbiStore(pndUUID) //sbiStore = nucleus.NewSbiStore(pluginUUID)
if err := sbiStore.Add(mockNetworkElement.SBI()); err != nil { //if err := sbiStore.Add(mockNetworkElement.SBI()); err != nil {
t.Fatal(err) // t.Fatal(err)
} //}
mockPnd = &mocks.NetworkDomain{} mockPnd = &mocks.NetworkDomain{}
mockPnd.On("ID").Return(pndUUID) mockPnd.On("ID").Return(pndUUID)
mockPnd.On("GetName").Return("test") mockPnd.On("GetName").Return("test")
mockPnd.On("GetDescription").Return("test") mockPnd.On("GetDescription").Return("test")
mockPnd.On("GetSBIs").Return(sbiStore) //mockPnd.On("GetSBIs").Return(sbiStore)
mockPnd.On("GetSBI", mock.Anything).Return(mockNetworkElement.SBI(), nil) //mockPnd.On("GetSBI", mock.Anything).Return(mockNetworkElement.SBI(), nil)
mockPnd.On("NetworkElements").Return([]uuid.UUID{mneUUID}) mockPnd.On("NetworkElements").Return([]uuid.UUID{mneUUID})
mockPnd.On("PendingChanges").Return([]uuid.UUID{pendingChangeUUID}) mockPnd.On("PendingChanges").Return([]uuid.UUID{pendingChangeUUID})
mockPnd.On("CommittedChanges").Return([]uuid.UUID{committedChangeUUID}) mockPnd.On("CommittedChanges").Return([]uuid.UUID{committedChangeUUID})
...@@ -250,6 +249,14 @@ func getMockPnd(t *testing.T) networkdomain.NetworkDomain { ...@@ -250,6 +249,14 @@ func getMockPnd(t *testing.T) networkdomain.NetworkDomain {
return mockPnd return mockPnd
} }
func getMockPlugin(t *testing.T) plugin.Plugin {
mockPlugin := &mocks.Plugin{}
mockPlugin.On("ID").Return(pluginUUID)
mockPlugin.On("SchemaTreeGzip").Return([]byte("schema_test"))
return mockPlugin
}
func initUUIDs(t *testing.T) { func initUUIDs(t *testing.T) {
var err error var err error
pndUUID, err = uuid.Parse(pndID) pndUUID, err = uuid.Parse(pndID)
...@@ -257,7 +264,7 @@ func initUUIDs(t *testing.T) { ...@@ -257,7 +264,7 @@ func initUUIDs(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
sbiUUID, err = uuid.Parse(sbiID) pluginUUID, err = uuid.Parse(pluginID)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
......
...@@ -13,6 +13,7 @@ import ( ...@@ -13,6 +13,7 @@ import (
tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
"code.fbi.h-da.de/danet/gosdn/controller/mocks" "code.fbi.h-da.de/danet/gosdn/controller/mocks"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto"
...@@ -85,9 +86,9 @@ func targetRunner() { ...@@ -85,9 +86,9 @@ func targetRunner() {
} }
} }
func mockTransport() Gnmi { func mockTransport(t testing.TB) Gnmi {
return Gnmi{ return Gnmi{
SetNode: getMockSbi(defaultSbiID).SetNode, SetNode: mockPlugin(t).SetNode,
RespChan: make(chan *gpb.SubscribeResponse), RespChan: make(chan *gpb.SubscribeResponse),
Options: newGnmiTransportOptions(), Options: newGnmiTransportOptions(),
client: &mocks.GNMIClient{}, client: &mocks.GNMIClient{},
...@@ -95,6 +96,11 @@ func mockTransport() Gnmi { ...@@ -95,6 +96,11 @@ func mockTransport() Gnmi {
} }
} }
func mockPlugin(t testing.TB) plugin.Plugin {
mockPlugin := mocks.NewPlugin(t)
return mockPlugin
}
func newGnmiTransportOptions() *tpb.TransportOption { func newGnmiTransportOptions() *tpb.TransportOption {
return &tpb.TransportOption{ return &tpb.TransportOption{
Address: "localhost:13371", Address: "localhost:13371",
...@@ -142,20 +148,19 @@ func readTestUUIDs() { ...@@ -142,20 +148,19 @@ func readTestUUIDs() {
} }
} }
func mockNetworkElement() networkelement.NetworkElement { func mockNetworkElement(t testing.TB) networkelement.NetworkElement {
sbi := &OpenConfig{}
return &CommonNetworkElement{ return &CommonNetworkElement{
UUID: mdid, UUID: mdid,
Plugin: sbi.Schema().Root, Plugin: mockPlugin(t),
sbi: sbi,
transport: &mocks.Transport{}, transport: &mocks.Transport{},
name: "mockNetworkElement",
} }
} }
func newPnd() pndImplementation { func newPnd() pndImplementation {
eventService := eventservice.NewMockEventService() eventService := eventservice.NewMockEventService()
sbiStore := NewMemorySbiStore() sbiStore := NewMemoryPluginStore()
deviceStore := NewMemoryNetworkElementStore() deviceStore := NewMemoryNetworkElementStore()
sbiService := NewPluginService(sbiStore, eventService) sbiService := NewPluginService(sbiStore, eventService)
deviceService := NewNetworkElementService( deviceService := NewNetworkElementService(
......
package nucleus
import (
"encoding/json"
"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
"code.fbi.h-da.de/danet/gosdn/controller/store"
)
// MemorySbiStore provides a in-memory implementation for sbis.
type MemorySbiStore struct {
Store map[string]southbound.LoadedSbi
nameLookupTable map[string]string
}
// NewMemorySbiStore returns a specific in-memory store for a type T.
func NewMemorySbiStore() southbound.Store {
return &MemorySbiStore{
Store: make(map[string]southbound.LoadedSbi),
nameLookupTable: make(map[string]string),
}
}
// Add adds a item to the store.
func (t *MemorySbiStore) Add(item southbound.SouthboundInterface) error {
var sbi southbound.LoadedSbi
b, err := json.Marshal(item)
if err != nil {
return err
}
err = json.Unmarshal(b, &sbi)
if err != nil {
return err
}
_, ok := t.Store[sbi.ID]
if ok {
return nil
}
t.Store[sbi.ID] = sbi
t.nameLookupTable[item.Name()] = sbi.ID
return nil
}
// Update updates a existing sbi.
func (t *MemorySbiStore) Update(item southbound.SouthboundInterface) error {
_, ok := t.Store[item.ID().String()]
if ok {
return nil
}
var sbi southbound.LoadedSbi
b, err := json.Marshal(item)
if err != nil {
return err
}
err = json.Unmarshal(b, &sbi)
if err != nil {
return err
}
t.Store[item.ID().String()] = sbi
t.nameLookupTable[item.Name()] = item.ID().String()
return nil
}
// Delete deletes a sbi from the store.
func (t *MemorySbiStore) Delete(item southbound.SouthboundInterface) error {
delete(t.Store, item.ID().String())
return nil
}
// Get takes a sbi's UUID or name and returns the sbi.
func (t *MemorySbiStore) Get(query store.Query) (southbound.LoadedSbi, error) {
// First search for direct hit on UUID.
item, ok := t.Store[query.ID.String()]
if !ok {
// Second search for name
id, ok := t.nameLookupTable[query.Name]
if !ok {
return item, customerrs.CouldNotFindError{ID: query.ID, Name: query.Name}
}
item, ok := t.Store[id]
if !ok {
return item, customerrs.CouldNotFindError{ID: query.ID, Name: query.Name}
}
return item, nil
}
return item, nil
}
// GetAll returns all stored sbis.
func (t *MemorySbiStore) GetAll() ([]southbound.LoadedSbi, error) {
var allItems []southbound.LoadedSbi
for _, item := range t.Store {
allItems = append(allItems, item)
}
return allItems, nil
}
package nucleus
import (
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"github.com/google/uuid"
)
// PluginServiceMock provides a in-memory implementation for multiple stores.
type PluginServiceMock struct {
Store map[uuid.UUID]plugin.Plugin
}
// NewPluginSerivceMock returns a specific in-memory store for plugin service.
func NewPluginServiceMock() plugin.Service {
return &PluginServiceMock{
Store: make(map[uuid.UUID]plugin.Plugin),
}
}
// Add adds a item plugin.
func (t *PluginServiceMock) Add(item plugin.Plugin) error {
_, ok := t.Store[item.ID()]
if ok {
return nil
}
t.Store[item.ID()] = item
return nil
}
// Delete deletes a item plugin.
func (t *PluginServiceMock) Delete(item plugin.Plugin) error {
delete(t.Store, item.ID())
return nil
}
// Get gets a plugin.
func (t *PluginServiceMock) Get(query store.Query) (plugin.Plugin, error) {
// search for direct hit on UUID.
item, ok := t.Store[query.ID]
if !ok {
return item, nil
}
return item, nil
}
// GetAll gets all plugins.
func (t *PluginServiceMock) GetAll() ([]plugin.Plugin, error) {
var allItems []plugin.Plugin
for _, item := range t.Store {
allItems = append(allItems, item)
}
return allItems, nil
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment