diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go index c3c4ff76a60f1ff82a08e65972579abbfaa34c46..e6ad9a1e76ae660bd9c2696391dfa378f7142877 100644 --- a/controller/api/initialise_test.go +++ b/controller/api/initialise_test.go @@ -26,7 +26,6 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto" rbacImpl "code.fbi.h-da.de/danet/gosdn/controller/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/topology" "code.fbi.h-da.de/danet/gosdn/controller/topology/links" "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" @@ -191,10 +190,13 @@ func bootstrapUnitTest() { }, sbi, conflict.Metadata{ResourceVersion: 0}) _ = networkElementService.Add(mne) - serviceManager := servmgmt.ServiceManager{MneService: networkElementService, SbiService: sbiService, PNDStore: pndStore} + pndService := &mocks.PndService{} northbound := nbi.NewNBI( pndStore, + pndService, + networkElementService, + sbiService, userService, roleService, *jwtManager, @@ -204,7 +206,6 @@ func bootstrapUnitTest() { routeService, appService, &mockPnd, - serviceManager, ) cpb.RegisterCoreServiceServer(s, northbound.Core) diff --git a/controller/controller.go b/controller/controller.go index 1e6242f69704163f10fb5822c6221287e6c01c95..83431a7526849018ad5e2fb060e0e2ddb9facbed 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -31,7 +31,6 @@ import ( //TODO: check if both of 'app' are necessary? "code.fbi.h-da.de/danet/gosdn/controller/app" apps "code.fbi.h-da.de/danet/gosdn/controller/app" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/config" "code.fbi.h-da.de/danet/gosdn/controller/conflict" @@ -39,6 +38,7 @@ import ( "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/rbac" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/controller/northbound/server" nbi "code.fbi.h-da.de/danet/gosdn/controller/northbound/server" rbacImpl "code.fbi.h-da.de/danet/gosdn/controller/rbac" @@ -59,6 +59,9 @@ var coreOnce sync.Once // Core is the representation of the controller's core. type Core struct { pndStore networkdomain.PndStore + pndService networkdomain.Service + mneService networkelement.Service + sbiService southbound.Service userService rbac.UserService roleService rbac.RoleService topologyService topology.Service @@ -74,8 +77,6 @@ type Core struct { stopChan chan os.Signal csbiClient cpb.CsbiServiceClient - - serviceManager servmgmt.ServiceManager } var c *Core @@ -106,10 +107,15 @@ func initialize() error { eventService, ) - serviveManager := initServiceManager(eventService) + pndStore := nucleus.NewPndStore() + + sbiService := nucleus.NewSbiService(nucleus.NewSbiStore(config.BasePndUUID), eventService) c = &Core{ - pndStore: nucleus.NewPndStore(), + pndStore: pndStore, + pndService: nucleus.NewPndService(pndStore), + mneService: nucleus.NewNetworkElementService(nucleus.NewNetworkElementStore(config.BasePndUUID), sbiService, eventService), + sbiService: sbiService, userService: rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService), roleService: rbacImpl.NewRoleService(rbacImpl.NewRoleStore(), eventService), topologyService: topology.NewTopologyService( @@ -118,13 +124,12 @@ func initialize() error { portService, eventService, ), - nodeService: nodeService, - portService: portService, - routeService: routeService, - eventService: eventService, - appService: apps.NewAppService(apps.NewAppStore()), - stopChan: make(chan os.Signal, 1), - serviceManager: serviveManager, + nodeService: nodeService, + portService: portService, + routeService: routeService, + eventService: eventService, + appService: apps.NewAppService(apps.NewAppStore()), + stopChan: make(chan os.Signal, 1), } // Setting up signal capturing @@ -135,7 +140,7 @@ func initialize() error { return err } - c.networkElementWatcher = nucleus.NewNetworkElementWatcher(c.serviceManager, c.eventService) + c.networkElementWatcher = nucleus.NewNetworkElementWatcher(c.mneService, c.eventService) c.networkElementWatcher.SubToNetworkElements(config.GetGnmiSubscriptionPaths(), nil) err = ensureDefaultRoleExists() @@ -168,15 +173,18 @@ func startGrpc() error { log.Infof("listening to %v", lislisten.Addr()) jwtManager := rbacImpl.NewJWTManager(config.JWTSecret, config.JWTDuration) - setupGRPCServerWithCorrectSecurityLevel(jwtManager, c.serviceManager) + setupGRPCServerWithCorrectSecurityLevel(jwtManager, c.userService, c.roleService) - basePnd, err := c.serviceManager.PndService.Get(store.Query{ID: config.BasePndUUID}) + basePnd, err := c.pndService.Get(store.Query{ID: config.BasePndUUID}) if err != nil { panic(err) } c.nbi = nbi.NewNBI( c.pndStore, + c.pndService, + c.mneService, + c.sbiService, c.userService, c.roleService, *jwtManager, @@ -186,7 +194,6 @@ func startGrpc() error { c.routeService, c.appService, basePnd, - c.serviceManager, ) pb.RegisterCoreServiceServer(c.grpcServer, c.nbi.Core) @@ -218,7 +225,7 @@ func startGrpc() error { // createPrincipalNetworkDomain initializes the controller with an initial PND. func createPrincipalNetworkDomain() error { - basePnd, err := c.serviceManager.PndService.Get(store.Query{ID: config.BasePndUUID}) + basePnd, err := c.pndService.Get(store.Query{ID: config.BasePndUUID}) if err != nil { log.Info(err) } @@ -372,67 +379,14 @@ func callback(id uuid.UUID, ch chan networkelement.Details) { // This allows users to operate on the controller without any authentication/authorization, // but they could still login if they want to. // Use insecure only for testing purposes and with caution. -func setupGRPCServerWithCorrectSecurityLevel(jwt *rbacImpl.JWTManager, serviceManager servmgmt.ServiceManager) { +func setupGRPCServerWithCorrectSecurityLevel(jwt *rbacImpl.JWTManager, userService rbac.UserService, roleService rbac.RoleService) { securityLevel := viper.GetString("security") if securityLevel == "insecure" { c.grpcServer = grpc.NewServer() log.Info("set up grpc server in insecure mode") } else { - interceptor := server.NewAuthInterceptor(jwt, serviceManager) + interceptor := server.NewAuthInterceptor(jwt, userService, roleService) c.grpcServer = grpc.NewServer(grpc.UnaryInterceptor(interceptor.Unary()), grpc.StreamInterceptor(interceptor.Stream())) log.Info("set up grpc server in secure mode") } } - -// TODO(PND): add changeStore here?! -func initServiceManager(eventService eventInterfaces.Service) servmgmt.ServiceManager { - - pndStore := nucleus.NewPndStore() - pndService := nucleus.NewPndService(pndStore) - - sbiStore := nucleus.NewSbiStore(uuid.New()) - sbiService := nucleus.NewSbiService(sbiStore, eventService) - - networkElementStore := nucleus.NewNetworkElementStore(uuid.New()) - networkElementService := nucleus.NewNetworkElementService( - networkElementStore, - sbiService, - eventService, - ) - - userService := rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService) - roleService := rbacImpl.NewRoleService(rbacImpl.NewRoleStore(), eventService) - - nodeService := nodes.NewNodeService(nodes.NewDatabaseNodeStore(), eventService) - portService := ports.NewPortService(ports.NewDatabasePortStore(), eventService) - - //TODO(PND): find way to add servicemanager here instead of having al the extra services in constructor?! - routeService := routingtables.NewRoutingTableService( - routingtables.NewDatabaseRoutingTableStore(), - nodeService, - portService, - eventService, - ) - topologyService := topology.NewTopologyService( - topology.NewDatabaseTopologyStore(), - nodeService, - portService, - eventService, - ) - - appService := app.NewAppService(app.NewAppStore()) - - //TODO(PND): add real change store!? - return *servmgmt.NewServiceManager(pndService, pndStore, - store.ChangeStore{}, - sbiService, - networkElementService, - userService, - roleService, - nodeService, - portService, - topologyService, - routeService, - appService, - ) -} diff --git a/controller/interfaces/networkdomain/pndService.go b/controller/interfaces/networkdomain/pndService.go index a6894bc731fab2bb9c99eca1ad429b2a77113685..ecc0c715b878df9801640e01b023d3bac1454910 100644 --- a/controller/interfaces/networkdomain/pndService.go +++ b/controller/interfaces/networkdomain/pndService.go @@ -4,8 +4,8 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/store" ) -// PndService describes an interface for PND service implementation. -type PndService interface { +// Service describes an interface for PND service implementation. +type Service interface { Add(NetworkDomain) error Delete(NetworkDomain) error Get(store.Query) (NetworkDomain, error) diff --git a/controller/northbound/server/auth.go b/controller/northbound/server/auth.go index 41beefe78223b36e30a4e338a025e9539758505d..e7459f7b5ddee7e9b051ff613938f32e4e8b0d50 100644 --- a/controller/northbound/server/auth.go +++ b/controller/northbound/server/auth.go @@ -6,9 +6,9 @@ import ( "time" apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" + rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/prometheus/client_golang/prometheus" "golang.org/x/crypto/argon2" @@ -20,15 +20,15 @@ import ( // AuthServer holds a JWTManager and represents a AuthServiceServer. type AuthServer struct { apb.UnimplementedAuthServiceServer - jwtManager *rbac.JWTManager - serviceManager servmgmt.ServiceManager + jwtManager *rbac.JWTManager + userService rbacInterfaces.UserService } // NewAuthServer receives a JWTManager and a userService and returns a new Auth interface. -func NewAuthServer(jwtManager *rbac.JWTManager, serviceManager servmgmt.ServiceManager) *AuthServer { +func NewAuthServer(jwtManager *rbac.JWTManager, userService rbacInterfaces.UserService) *AuthServer { return &AuthServer{ - jwtManager: jwtManager, - serviceManager: serviceManager, + jwtManager: jwtManager, + userService: userService, } } @@ -55,14 +55,14 @@ func (s AuthServer) Login(ctx context.Context, request *apb.LoginRequest) (*apb. return nil, err } - userToUpdate, err := s.serviceManager.UserService.Get(store.Query{Name: user.UserName}) + userToUpdate, err := s.userService.Get(store.Query{Name: user.UserName}) if err != nil { return nil, err } userToUpdate.SetToken(token) - err = s.serviceManager.UserService.Update(userToUpdate) + err = s.userService.Update(userToUpdate) if err != nil { return nil, err } @@ -93,7 +93,7 @@ func (s AuthServer) Logout(ctx context.Context, request *apb.LogoutRequest) (*ap // isValidUser checks if the provided user name fits to a stored one and then checks if the provided password is correct. func (s AuthServer) isValidUser(user rbac.User) error { - storedUser, err := s.serviceManager.UserService.Get(store.Query{Name: user.Name()}) + storedUser, err := s.userService.Get(store.Query{Name: user.Name()}) if err != nil { return err } @@ -139,7 +139,7 @@ func (s AuthServer) handleLogout(ctx context.Context, userName string) error { return status.Errorf(codes.Aborted, "missing match of user associated to token and provided user name") } - storedUser, err := s.serviceManager.UserService.Get(store.Query{Name: userName}) + storedUser, err := s.userService.Get(store.Query{Name: userName}) if err != nil { return err } @@ -148,7 +148,7 @@ func (s AuthServer) handleLogout(ctx context.Context, userName string) error { return status.Errorf(codes.Aborted, "missing match of token provied for user") } - err = s.serviceManager.UserService.Update(&rbac.User{UserID: storedUser.ID(), + err = s.userService.Update(&rbac.User{UserID: storedUser.ID(), UserName: storedUser.Name(), Roles: storedUser.GetRoles(), Password: storedUser.GetPassword(), diff --git a/controller/northbound/server/auth_interceptor.go b/controller/northbound/server/auth_interceptor.go index 03cc895c97bfa1c43015cee44fc73f49b0f499f0..30ffa2ea982be33282ab3db1c86cfe2f6e22d06e 100644 --- a/controller/northbound/server/auth_interceptor.go +++ b/controller/northbound/server/auth_interceptor.go @@ -4,7 +4,7 @@ import ( "context" "time" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" + rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" csbipb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi" apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" @@ -18,18 +18,21 @@ import ( // AuthInterceptor provides an AuthInterceptor. type AuthInterceptor struct { - jwtManager *rbac.JWTManager - serviceManager servmgmt.ServiceManager + jwtManager *rbac.JWTManager + userService rbacInterfaces.UserService + roleService rbacInterfaces.RoleService } // NewAuthInterceptor receives a JWTManager and a rbacMand returns a new AuthInterceptor provding gRPC Interceptor functionality. func NewAuthInterceptor( jwtManager *rbac.JWTManager, - serviceManager servmgmt.ServiceManager, + userService rbacInterfaces.UserService, + roleService rbacInterfaces.RoleService, ) *AuthInterceptor { return &AuthInterceptor{ - jwtManager: jwtManager, - serviceManager: serviceManager, + jwtManager: jwtManager, + userService: userService, + roleService: roleService, } } @@ -89,7 +92,7 @@ func (auth *AuthInterceptor) authorize(ctx context.Context, method string) error return status.Errorf(codes.PermissionDenied, "token expired at %v, please login", time.Unix(claims.ExpiresAt, 0)) } - user, err := auth.serviceManager.UserService.Get(store.Query{Name: claims.Username}) + user, err := auth.userService.Get(store.Query{Name: claims.Username}) if err != nil { return err } @@ -121,7 +124,7 @@ func (auth *AuthInterceptor) verifyPermisisonForRequestedCall(userRoles map[stri } func (auth *AuthInterceptor) verifyUserRoleAndRequestedCall(userRole, requestedMethod string) error { - storedRoles, err := auth.serviceManager.RoleService.GetAll() + storedRoles, err := auth.roleService.GetAll() if err != nil { return err } diff --git a/controller/northbound/server/auth_interceptor_test.go b/controller/northbound/server/auth_interceptor_test.go index a47349bbf92ed515e7b850465be464a6994853f1..bc374a98d08c76111ef8dd38cacb49477849e968 100644 --- a/controller/northbound/server/auth_interceptor_test.go +++ b/controller/northbound/server/auth_interceptor_test.go @@ -12,7 +12,6 @@ import ( 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/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" @@ -39,14 +38,12 @@ func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer, t.Fatal(err) } - serviceManager := servmgmt.ServiceManager{PndService: pndService, UserService: userService, RoleService: roleService} + s := NewAuthInterceptor(jwtManager, userService, roleService) + u := NewUserServer(jwtManager, userService) + r := NewRoleServer(jwtManager, roleService) + sbiServer := NewSbiServer(pndService) - s := NewAuthInterceptor(jwtManager, serviceManager) - u := NewUserServer(jwtManager, serviceManager) - r := NewRoleServer(jwtManager, serviceManager) - sbiServer := NewSbiServer(serviceManager) - - if err := clearAndCreateAuthTestSetup(serviceManager); err != nil { + if err := clearAndCreateAuthTestSetup(userService, roleService); err != nil { t.Fatal(err) } @@ -75,12 +72,12 @@ func dialer(interceptorServer *AuthInterceptor, userServer *UserServer, roleServ func TestAuthInterceptor_Unary(t *testing.T) { authServer, userServer, roleServer, sbiServer := getTestAuthInterceptorServer(t) - validToken, err := createTestUserToken("testAdmin", true, authServer.serviceManager, authServer.jwtManager) + validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager) if err != nil { t.Fatal(err) } - wrongUserToken, err := createTestUserToken("foo", false, authServer.serviceManager, authServer.jwtManager) + wrongUserToken, err := createTestUserToken("foo", false, authServer.userService, authServer.jwtManager) if err != nil { t.Fatal(err) } @@ -171,7 +168,7 @@ func TestAuthInterceptor_Unary(t *testing.T) { func TestAuthInterceptor_Stream(t *testing.T) { authServer, userServer, roleServer, sbiServer := getTestAuthInterceptorServer(t) - validToken, err := createTestUserToken("testAdmin", true, authServer.serviceManager, authServer.jwtManager) + validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager) if err != nil { t.Fatal(err) } @@ -246,12 +243,12 @@ func TestAuthInterceptor_Stream(t *testing.T) { func TestAuthInterceptor_authorize(t *testing.T) { authServer, _, _, _ := getTestAuthInterceptorServer(t) - validToken, err := createTestUserToken("testAdmin", true, authServer.serviceManager, authServer.jwtManager) + validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager) if err != nil { t.Fatal(err) } - wrongUserToken, err := createTestUserToken("foo", false, authServer.serviceManager, authServer.jwtManager) + wrongUserToken, err := createTestUserToken("foo", false, authServer.userService, authServer.jwtManager) if err != nil { t.Fatal(err) } diff --git a/controller/northbound/server/auth_test.go b/controller/northbound/server/auth_test.go index bc3d7fba5035101ad33e883b2f88bbd0a7f67eda..c6d362a0bd6f8540cbd79bc0a1581bdad453bab0 100644 --- a/controller/northbound/server/auth_test.go +++ b/controller/northbound/server/auth_test.go @@ -9,7 +9,6 @@ import ( apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService" "code.fbi.h-da.de/danet/gosdn/controller/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "google.golang.org/grpc/metadata" ) @@ -23,10 +22,9 @@ func getTestAuthServer(t *testing.T) *AuthServer { roleStore := rbac.NewMemoryRoleStore() roleService := rbac.NewRoleService(roleStore, eventService) - serviceManager := servmgmt.ServiceManager{UserService: userService, RoleService: roleService} + s := NewAuthServer(jwtManager, userService) + err := clearAndCreateAuthTestSetup(s.userService, roleService) - s := NewAuthServer(jwtManager, serviceManager) - err := clearAndCreateAuthTestSetup(serviceManager) if err != nil { t.Fatalf("%v", err) } @@ -90,7 +88,7 @@ func TestAuth_Login(t *testing.T) { func TestAuth_Logout(t *testing.T) { s := getTestAuthServer(t) - validToken, err := createTestUserToken("testAdmin", true, s.serviceManager, s.jwtManager) + validToken, err := createTestUserToken("testAdmin", true, s.userService, s.jwtManager) if err != nil { log.Fatal(err) } @@ -188,12 +186,12 @@ func TestAuth_isValidUser(t *testing.T) { func TestAuth_handleLogout(t *testing.T) { s := getTestAuthServer(t) - validToken, err := createTestUserToken("testAdmin", true, s.serviceManager, s.jwtManager) + validToken, err := createTestUserToken("testAdmin", true, s.userService, s.jwtManager) if err != nil { log.Fatal(err) } - invalidToken, err := createTestUserToken("testAdmin", false, s.serviceManager, s.jwtManager) + invalidToken, err := createTestUserToken("testAdmin", false, s.userService, s.jwtManager) if err != nil { log.Fatal(err) } diff --git a/controller/northbound/server/core.go b/controller/northbound/server/core.go index c20c8c7b168476e5ab7344c3e591f6b679a48a95..dc6919c091efd076c013b630b5f7f767b7d12dbc 100644 --- a/controller/northbound/server/core.go +++ b/controller/northbound/server/core.go @@ -6,9 +6,9 @@ import ( pb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core" ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -17,13 +17,13 @@ import ( // CoreServer represents a core server. type CoreServer struct { pb.UnimplementedCoreServiceServer - serviceManager servmgmt.ServiceManager + pndService networkdomain.Service } // NewCoreServer receives a pndStore and returns a new coreServer. -func NewCoreServer(serviceManager servmgmt.ServiceManager) *CoreServer { +func NewCoreServer(pndService networkdomain.Service) *CoreServer { return &CoreServer{ - serviceManager: serviceManager, + pndService: pndService, } } @@ -38,7 +38,7 @@ func (s CoreServer) GetPnd(ctx context.Context, request *pb.GetPndRequest) (*pb. return nil, handleRPCError(labels, err) } - storedPnd, err := s.serviceManager.PndService.Get(store.Query{ID: pndID}) + storedPnd, err := s.pndService.Get(store.Query{ID: pndID}) if err != nil { return nil, err } @@ -61,7 +61,7 @@ func (s CoreServer) GetPndList(ctx context.Context, request *pb.GetPndListReques start := metrics.StartHook(labels, grpcRequestsTotal) defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pndList, err := s.serviceManager.PndService.GetAll() + pndList, err := s.pndService.GetAll() if err != nil { return nil, err } @@ -90,7 +90,7 @@ func (s CoreServer) CreatePndList(ctx context.Context, request *pb.CreatePndList if err != nil { return nil, handleRPCError(labels, err) } - if err := s.serviceManager.PndService.Add(pnd); err != nil { + if err := s.pndService.Add(pnd); err != nil { return nil, handleRPCError(labels, err) } } @@ -111,11 +111,11 @@ func (s CoreServer) DeletePnd(ctx context.Context, request *pb.DeletePndRequest) return nil, handleRPCError(labels, err) } - pnd, err := s.serviceManager.PndService.Get(store.Query{ID: pndID}) + pnd, err := s.pndService.Get(store.Query{ID: pndID}) if err != nil { return nil, handleRPCError(labels, err) } - err = s.serviceManager.PndService.Delete(pnd) + err = s.pndService.Delete(pnd) if err != nil { return &pb.DeletePndResponse{ Timestamp: time.Now().UnixNano(), diff --git a/controller/northbound/server/core_test.go b/controller/northbound/server/core_test.go index 05a30452c56a995b5f713c8b1055a807c044948b..a470b54a27dadb2da79852c2b4c8ede390b09836 100644 --- a/controller/northbound/server/core_test.go +++ b/controller/northbound/server/core_test.go @@ -11,7 +11,6 @@ import ( 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/nucleus" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "github.com/google/uuid" "github.com/stretchr/testify/mock" @@ -96,11 +95,7 @@ func getTestCoreServer(t *testing.T) *CoreServer { pndService := nucleus.NewPndService(pndStore) - serviceManager := servmgmt.ServiceManager{ - PndService: pndService, - } - - c := NewCoreServer(serviceManager) + c := NewCoreServer(pndService) return c } diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go index 0db12578c3e218faf54bd9b0201a53a3ab0accb8..1d7274120aae01cd13bfaa6c5276b42cb810e0f3 100644 --- a/controller/northbound/server/nbi.go +++ b/controller/northbound/server/nbi.go @@ -3,9 +3,10 @@ package server import ( "code.fbi.h-da.de/danet/gosdn/controller/app" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" 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/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/topology" "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" @@ -37,6 +38,9 @@ type NorthboundInterface struct { // NewNBI receives a PndStore and returns a new gRPC *NorthboundInterface. func NewNBI( pnds networkdomain.PndStore, + pndService networkdomain.Service, + mneService networkelement.Service, + sbiService southbound.Service, users rbacInterfaces.UserService, roles rbacInterfaces.RoleService, jwt rbac.JWTManager, @@ -46,19 +50,18 @@ func NewNBI( routeService routingtables.Service, apps app.ManagementService, networkDomain networkdomain.NetworkDomain, - serviceManager servmgmt.ServiceManager, ) *NorthboundInterface { return &NorthboundInterface{ - Pnd: NewPndServer(serviceManager), - Core: NewCoreServer(serviceManager), + Pnd: NewPndServer(pndService), + Core: NewCoreServer(pndService), Csbi: NewCsbiServer(pnds), - Sbi: NewSbiServer(serviceManager), - Auth: NewAuthServer(&jwt, serviceManager), - User: NewUserServer(&jwt, serviceManager), - Role: NewRoleServer(&jwt, serviceManager), + Sbi: NewSbiServer(pndService), + Auth: NewAuthServer(&jwt, users), + User: NewUserServer(&jwt, users), + Role: NewRoleServer(&jwt, roles), Topology: NewTopologyServer(topologyService, nodeService, portService), App: NewAppServer(apps), - NetworkElement: NewNetworkElementServer(networkDomain, serviceManager), + NetworkElement: NewNetworkElementServer(mneService, pndService, sbiService), Routes: NewRoutingTableServiceServer(routeService, nodeService, portService), } } diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go index 0fd870faadedeaf59639ba306b5faeeeb90c0b02..25b2f7dad85e2f142a3a03d5e38057697e4b062c 100644 --- a/controller/northbound/server/networkElement.go +++ b/controller/northbound/server/networkElement.go @@ -17,7 +17,6 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/types" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" aGNMI "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" "github.com/google/uuid" @@ -34,117 +33,124 @@ import ( // NetworkElementServer represents a NetworkElementServer. type NetworkElementServer struct { mnepb.UnimplementedNetworkElementServiceServer - networkDomain networkdomain.NetworkDomain - serviceManager servmgmt.ServiceManager + mneService networkelement.Service + pndService networkdomain.Service + sbiService southbound.Service } // NewNetworkElementServer returns a new NetWorkElementServer. -func NewNetworkElementServer(networkDomain networkdomain.NetworkDomain, serviceManager servmgmt.ServiceManager) *NetworkElementServer { +func NewNetworkElementServer(mneService networkelement.Service, pndService networkdomain.Service, sbiService southbound.Service) *NetworkElementServer { return &NetworkElementServer{ - networkDomain: networkDomain, - serviceManager: serviceManager, + mneService: mneService, + pndService: pndService, + sbiService: sbiService, } } -// Add adds a new network element. -func (n *NetworkElementServer) Add(ctx context.Context, request *mnepb.AddNetworkElementRequest) (*mnepb.AddNetworkElementResponse, error) { - sbiID, err := uuid.Parse(request.NetworkElement.Sbi.Id) - if err != nil { - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - id, err := n.networkDomain.AddNetworkElement( - request.NetworkElement.NetworkElementName, - request.NetworkElement.TransportOption, - sbiID, - ) - if err != nil { - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - return &mnepb.AddNetworkElementResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - NetworkElementId: id.String(), - }, nil -} - -// GetAll returns all stored network elements. -func (n *NetworkElementServer) GetAll(ctx context.Context, request *mnepb.GetAllNetworkElementRequest) (*mnepb.GetAllNetworkElementResponse, error) { - networkElements := n.networkDomain.NetworkElements() - - mnes := []*mnepb.NetworkElement{} - for _, mne := range networkElements { - ygotStructAsJSON, err := mne.GetModelAsString() - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - mnes = append(mnes, &mnepb.NetworkElement{ - Id: mne.ID().String(), - Name: mne.Name(), - Model: ygotStructAsJSON, - }) - } - - return &mnepb.GetAllNetworkElementResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - NetworkElement: mnes, - }, nil -} - -// Get returns a network element. -func (n *NetworkElementServer) Get(ctx context.Context, request *mnepb.GetNetworkElementRequest) (*mnepb.GetNetworkElementResponse, error) { - mne, err := n.networkDomain.GetNetworkElement(request.NetworkElementId) - if err != nil { - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - ygotStructAsJSON, err := mne.GetModelAsString() - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - networkElement := &mnepb.NetworkElement{ - Id: mne.ID().String(), - Name: mne.Name(), - Model: ygotStructAsJSON, - TransportAddress: mne.TransportAddress(), - } - - return &mnepb.GetNetworkElementResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - NetworkElement: networkElement, - }, nil -} - -// Update updates a network element. -func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.UpdateNetworkElementRequest) (*mnepb.UpdateNetworkElementResponse, error) { - mneID, err := uuid.Parse(request.NetworkElement.Id) - if err != nil { - return &mnepb.UpdateNetworkElementResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - }, err - } - - err = n.networkDomain.UpdateNetworkElement(mneID, request.NetworkElement.Model) - if err != nil { - return &mnepb.UpdateNetworkElementResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - }, err - } - - return &mnepb.UpdateNetworkElementResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - }, nil -} +// // Add adds a new network element. +// func (n *NetworkElementServer) Add(ctx context.Context, request *mnepb.AddNetworkElementRequest) (*mnepb.AddNetworkElementResponse, error) { +// sbiID, err := uuid.Parse(request.NetworkElement.Sbi.Id) +// if err != nil { +// return nil, status.Errorf(codes.Aborted, "%v", err) +// } + +// id, err := n.networkDomain.AddNetworkElement( +// request.NetworkElement.NetworkElementName, +// request.NetworkElement.TransportOption, +// sbiID, +// ) + +// if err != nil { +// return nil, status.Errorf(codes.Aborted, "%v", err) +// } + +// return &mnepb.AddNetworkElementResponse{ +// Timestamp: time.Now().UnixNano(), +// Status: mnepb.Status_STATUS_OK, +// NetworkElementId: id.String(), +// }, nil +// } + +// func (n *NetworkElementServer) addNetworkElement(name string, transportOpt *tpb.TransportOption, sbiID uuid.UUID) (uuid.UUID, error) { + +// } + +// // GetAll returns all stored network elements. +// func (n *NetworkElementServer) GetAll(ctx context.Context, request *mnepb.GetAllNetworkElementRequest) (*mnepb.GetAllNetworkElementResponse, error) { +// networkElements := n.networkDomain.NetworkElements() + +// mnes := []*mnepb.NetworkElement{} +// for _, mne := range networkElements { +// ygotStructAsJSON, err := mne.GetModelAsString() +// if err != nil { +// log.Error(err) +// return nil, status.Errorf(codes.Aborted, "%v", err) +// } + +// mnes = append(mnes, &mnepb.NetworkElement{ +// Id: mne.ID().String(), +// Name: mne.Name(), +// Model: ygotStructAsJSON, +// }) +// } + +// return &mnepb.GetAllNetworkElementResponse{ +// Timestamp: time.Now().UnixNano(), +// Status: mnepb.Status_STATUS_OK, +// NetworkElement: mnes, +// }, nil +// } + +// // Get returns a network element. +// func (n *NetworkElementServer) Get(ctx context.Context, request *mnepb.GetNetworkElementRequest) (*mnepb.GetNetworkElementResponse, error) { +// mne, err := n.networkDomain.GetNetworkElement(request.NetworkElementId) +// if err != nil { +// return nil, status.Errorf(codes.Aborted, "%v", err) +// } + +// ygotStructAsJSON, err := mne.GetModelAsString() +// if err != nil { +// log.Error(err) +// return nil, status.Errorf(codes.Aborted, "%v", err) +// } + +// networkElement := &mnepb.NetworkElement{ +// Id: mne.ID().String(), +// Name: mne.Name(), +// Model: ygotStructAsJSON, +// TransportAddress: mne.TransportAddress(), +// } + +// return &mnepb.GetNetworkElementResponse{ +// Timestamp: time.Now().UnixNano(), +// Status: mnepb.Status_STATUS_OK, +// NetworkElement: networkElement, +// }, nil +// } + +// // Update updates a network element. +// func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.UpdateNetworkElementRequest) (*mnepb.UpdateNetworkElementResponse, error) { +// mneID, err := uuid.Parse(request.NetworkElement.Id) +// if err != nil { +// return &mnepb.UpdateNetworkElementResponse{ +// Timestamp: time.Now().UnixNano(), +// Status: mnepb.Status_STATUS_OK, +// }, err +// } + +// err = n.networkDomain.UpdateNetworkElement(mneID, request.NetworkElement.Model) +// if err != nil { +// return &mnepb.UpdateNetworkElementResponse{ +// Timestamp: time.Now().UnixNano(), +// Status: mnepb.Status_STATUS_OK, +// }, err +// } + +// return &mnepb.UpdateNetworkElementResponse{ +// Timestamp: time.Now().UnixNano(), +// Status: mnepb.Status_STATUS_OK, +// }, nil +// } // GetMne gets a specific mne. func (n *NetworkElementServer) GetMne(ctx context.Context, request *mnepb.GetMneRequest) (*mnepb.GetMneResponse, error) { @@ -157,7 +163,7 @@ func (n *NetworkElementServer) GetMne(ctx context.Context, request *mnepb.GetMne return nil, handleRPCError(labels, err) } - pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := n.pndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -194,7 +200,7 @@ func (n *NetworkElementServer) getMne(identifier string) (networkelement.Network id = uuid.Nil } - mne, err := n.serviceManager.MneService.Get(store.Query{ + mne, err := n.mneService.Get(store.Query{ ID: id, }) if mne == nil { @@ -218,13 +224,13 @@ func (n *NetworkElementServer) GetMneList(ctx context.Context, request *mnepb.Ge return nil, handleRPCError(labels, err) } - pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := n.pndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) } - storedMNE, err := n.serviceManager.MneService.GetAll() + storedMNE, err := n.mneService.GetAll() if err != nil { return nil, err } @@ -261,13 +267,13 @@ func (n *NetworkElementServer) GetFlattenedMneList(ctx context.Context, request return nil, handleRPCError(labels, err) } - pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := n.pndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) } - mnes, err := n.serviceManager.MneService.GetAllAsLoaded() + mnes, err := n.mneService.GetAllAsLoaded() if err != nil { return nil, err } @@ -366,7 +372,7 @@ func (n *NetworkElementServer) GetPath(ctx context.Context, request *mnepb.GetPa return nil, handleRPCError(labels, err) } - pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := n.pndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -399,7 +405,7 @@ func (n *NetworkElementServer) GetPath(ctx context.Context, request *mnepb.GetPa } func (n *NetworkElementServer) getPath(ctx context.Context, uuid uuid.UUID, path string) (proto.Message, error) { - mne, err := n.serviceManager.MneService.Get(store.Query{ + mne, err := n.mneService.Get(store.Query{ ID: uuid, Name: uuid.String(), }) @@ -433,7 +439,7 @@ func (n *NetworkElementServer) getPath(ctx context.Context, uuid uuid.UUID, path } // TODO(path): We probably have to remove this when we address path request handling. - err = n.serviceManager.MneService.UpdateModel(uuid, modelAsString) + err = n.mneService.UpdateModel(uuid, modelAsString) if err != nil { return nil, err } @@ -452,7 +458,7 @@ func (n *NetworkElementServer) GetChange(ctx context.Context, request *mnepb.Get return nil, handleRPCError(labels, err) } - pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := n.pndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -486,7 +492,7 @@ func (n *NetworkElementServer) GetChangeList(ctx context.Context, request *mnepb return nil, handleRPCError(labels, err) } - pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := n.pndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -623,7 +629,7 @@ func (n *NetworkElementServer) addMne(ctx context.Context, name string, opt *tpb // } // } - sbi, err = n.serviceManager.SbiService.Get(store.Query{ID: sid}) + sbi, err = n.sbiService.Get(store.Query{ID: sid}) if err != nil { return uuid.Nil, err } @@ -633,7 +639,7 @@ func (n *NetworkElementServer) addMne(ctx context.Context, name string, opt *tpb return uuid.Nil, err } - err = n.serviceManager.MneService.Add(mne) + err = n.mneService.Add(mne) if err != nil { return uuid.Nil, err } @@ -658,7 +664,7 @@ func (n *NetworkElementServer) SetChangeList(ctx context.Context, request *mnepb return nil, handleRPCError(labels, err) } - pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := n.pndService.Get(store.Query{ID: pid}) if err != nil { return nil, handleRPCError(labels, err) } @@ -711,7 +717,7 @@ func (n *NetworkElementServer) SetPathList(ctx context.Context, request *mnepb.S return nil, handleRPCError(labels, err) } - pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := n.pndService.Get(store.Query{ID: pid}) if err != nil { return nil, handleRPCError(labels, err) } @@ -766,7 +772,7 @@ func (n *NetworkElementServer) DeleteMne(ctx context.Context, request *mnepb.Del } func (n *NetworkElementServer) deleteMne(id uuid.UUID) error { - mne, err := n.serviceManager.MneService.Get(store.Query{ + mne, err := n.mneService.Get(store.Query{ ID: id, Name: id.String(), }) @@ -788,7 +794,7 @@ func (n *NetworkElementServer) deleteMne(id uuid.UUID) error { // return pnd.networkElementService.Delete(mne) // } - return n.serviceManager.MneService.Delete(mne) + return n.mneService.Delete(mne) } // SubscribePath subscribes to specifc paths of an mne. @@ -806,7 +812,7 @@ func (n *NetworkElementServer) SubscribePath(request *mnepb.SubscribePathRequest } func (n *NetworkElementServer) subscribePath(uuid uuid.UUID, subList *mnepb.SubscriptionList) error { - mne, err := n.serviceManager.MneService.Get(store.Query{ + mne, err := n.mneService.Get(store.Query{ ID: uuid, }) if err != nil { diff --git a/controller/northbound/server/pnd.go b/controller/northbound/server/pnd.go index 908c31fe8115f41b953d08737b41d42132edb5cf..dc2854939974220f95c477e6092cc166158d3112 100644 --- a/controller/northbound/server/pnd.go +++ b/controller/northbound/server/pnd.go @@ -7,9 +7,9 @@ import ( ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -21,13 +21,14 @@ import ( // PndServer implements a pnd server. type PndServer struct { ppb.UnimplementedPndServiceServer - serviceManager servmgmt.ServiceManager + pndService networkdomain.Service + sbiService southbound.Service } // NewPndServer receives a pndStore and returns a new pndServer. -func NewPndServer(serviceManager servmgmt.ServiceManager) *PndServer { +func NewPndServer(pndService networkdomain.Service) *PndServer { return &PndServer{ - serviceManager: serviceManager, + pndService: pndService, } } @@ -41,7 +42,7 @@ func (p PndServer) GetSbi(ctx context.Context, request *ppb.GetSbiRequest) (*ppb return nil, handleRPCError(labels, err) } - pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := p.pndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -81,7 +82,7 @@ func (p PndServer) GetSbiList(ctx context.Context, request *ppb.GetSbiListReques return nil, handleRPCError(labels, err) } - pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := p.pndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -129,7 +130,7 @@ func (p PndServer) SetSbiList(ctx context.Context, request *ppb.SetSbiListReques return nil, handleRPCError(labels, err) } - pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := p.pndService.Get(store.Query{ID: pid}) if err != nil { return nil, handleRPCError(labels, err) } diff --git a/controller/northbound/server/pnd_test.go b/controller/northbound/server/pnd_test.go index 6608cd19ad99d4375f89dbef7a5d7e44b62a4a7f..1e4166b21c43f5c83e12105497e786d5dc4da700 100644 --- a/controller/northbound/server/pnd_test.go +++ b/controller/northbound/server/pnd_test.go @@ -9,7 +9,6 @@ import ( 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/nucleus" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "github.com/google/uuid" "github.com/openconfig/gnmi/proto/gnmi" @@ -96,9 +95,7 @@ func getTestPndServer(t *testing.T) *PndServer { pndService := nucleus.NewPndService(pndStore) - serviceManager := &servmgmt.ServiceManager{PndService: pndService} - - c := NewPndServer(*serviceManager) + c := NewPndServer(pndService) return c } diff --git a/controller/northbound/server/role.go b/controller/northbound/server/role.go index 2a873bb33fbabdbf98316006be7b0ba314cfb1b5..58d42d01b7893a1c7448c766cfd3092624d2730a 100644 --- a/controller/northbound/server/role.go +++ b/controller/northbound/server/role.go @@ -6,9 +6,9 @@ import ( "time" apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" + rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -20,15 +20,15 @@ import ( // RoleServer holds a JWTManager and represents a RoleServiceServer. type RoleServer struct { apb.UnimplementedRoleServiceServer - jwtManager *rbac.JWTManager - serviceManager servmgmt.ServiceManager + jwtManager *rbac.JWTManager + roleService rbacInterfaces.RoleService } // NewRoleServer receives a JWTManager and a RoleService and returns a new RoleServer. -func NewRoleServer(jwtManager *rbac.JWTManager, serviceManager servmgmt.ServiceManager) *RoleServer { +func NewRoleServer(jwtManager *rbac.JWTManager, roleService rbacInterfaces.RoleService) *RoleServer { return &RoleServer{ - jwtManager: jwtManager, - serviceManager: serviceManager, + jwtManager: jwtManager, + roleService: roleService, } } @@ -41,7 +41,7 @@ func (r RoleServer) CreateRoles(ctx context.Context, request *apb.CreateRolesReq for _, rrole := range request.Roles { role := rbac.NewRole(uuid.New(), rrole.Name, rrole.Description, rrole.Permissions) - err := r.serviceManager.RoleService.Add(role) + err := r.roleService.Add(role) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -65,7 +65,7 @@ func (r RoleServer) GetRole(ctx context.Context, request *apb.GetRoleRequest) (* return nil, fmt.Errorf("could not parse role uuid") } - roleData, err := r.serviceManager.RoleService.Get(store.Query{Name: request.RoleName, ID: roleID}) + roleData, err := r.roleService.Get(store.Query{Name: request.RoleName, ID: roleID}) if err != nil { return nil, err } @@ -90,7 +90,7 @@ func (r RoleServer) GetRoles(ctx context.Context, request *apb.GetRolesRequest) start := metrics.StartHook(labels, grpcRequestsTotal) defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - roleList, err := r.serviceManager.RoleService.GetAll() + roleList, err := r.roleService.GetAll() if err != nil { return nil, err } @@ -123,13 +123,13 @@ func (r RoleServer) UpdateRoles(ctx context.Context, request *apb.UpdateRolesReq if err != nil { return nil, handleRPCError(labels, err) } - _, err = r.serviceManager.RoleService.Get(store.Query{ID: rid}) + _, err = r.roleService.Get(store.Query{ID: rid}) if err != nil { return nil, status.Errorf(codes.Canceled, "role not found %v", err) } roleToUpdate := rbac.NewRole(rid, role.Name, role.Description, role.Permissions) - err = r.serviceManager.RoleService.Update(roleToUpdate) + err = r.roleService.Update(roleToUpdate) if err != nil { return nil, status.Errorf(codes.Aborted, "could not update role %v", err) } @@ -147,7 +147,7 @@ func (r RoleServer) DeletePermissionsForRole(ctx context.Context, request *apb.D start := metrics.StartHook(labels, grpcRequestsTotal) defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - roleToUpdate, err := r.serviceManager.RoleService.Get(store.Query{Name: request.RoleName}) + roleToUpdate, err := r.roleService.Get(store.Query{Name: request.RoleName}) if err != nil { return nil, status.Errorf(codes.Canceled, "role not found %v", err) } @@ -172,7 +172,7 @@ func (r RoleServer) DeletePermissionsForRole(ctx context.Context, request *apb.D // updates the existing role with the trimmed set of permissions roleToUpdate.RemovePermissionsFromRole(request.PermissionsToDelete) - err = r.serviceManager.RoleService.Update(roleToUpdate) + err = r.roleService.Update(roleToUpdate) if err != nil { return nil, status.Errorf(codes.Aborted, "could not update role %v", err) } @@ -190,12 +190,12 @@ func (r RoleServer) DeleteRoles(ctx context.Context, request *apb.DeleteRolesReq defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) for _, role := range request.RoleName { - roleToDelete, err := r.serviceManager.RoleService.Get(store.Query{Name: role}) + roleToDelete, err := r.roleService.Get(store.Query{Name: role}) if err != nil { return nil, status.Errorf(codes.Canceled, "role not found") } - err = r.serviceManager.RoleService.Delete(roleToDelete) + err = r.roleService.Delete(roleToDelete) if err != nil { return nil, status.Errorf(codes.Aborted, "error deleting role %v", err) } diff --git a/controller/northbound/server/role_test.go b/controller/northbound/server/role_test.go index c4c88fe4fab78fff993d8818e0c7445f5d17a433..2ad31431d68eba2c9c4b528554024af541b3ebd9 100644 --- a/controller/northbound/server/role_test.go +++ b/controller/northbound/server/role_test.go @@ -8,7 +8,6 @@ import ( apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" "code.fbi.h-da.de/danet/gosdn/controller/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "github.com/google/uuid" eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService" @@ -24,10 +23,8 @@ func getTestRoleServer(t *testing.T) *RoleServer { roleStore := rbac.NewMemoryRoleStore() roleService := rbac.NewRoleService(roleStore, eventService) - serviceManager := servmgmt.ServiceManager{UserService: userService, RoleService: roleService} - - s := NewRoleServer(jwtManager, serviceManager) - err := clearAndCreateAuthTestSetup(serviceManager) + s := NewRoleServer(jwtManager, roleService) + err := clearAndCreateAuthTestSetup(userService, roleService) if err != nil { t.Fatalf("%v", err) } diff --git a/controller/northbound/server/sbi.go b/controller/northbound/server/sbi.go index 8edfaae2357ea68f3c564f8f4d81a3a04b1bff4a..3931be5904818ba8b8cd685ac9aca805835e8df4 100644 --- a/controller/northbound/server/sbi.go +++ b/controller/northbound/server/sbi.go @@ -6,8 +6,8 @@ import ( "io" spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/controller/metrics" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -27,13 +27,13 @@ const ( // SbiServer represents a sbi server. type SbiServer struct { spb.UnimplementedSbiServiceServer - serviceManager servmgmt.ServiceManager + pndService networkdomain.Service } // NewSbiServer receives a pndStore and returns a new sbiServer. -func NewSbiServer(serviceManager servmgmt.ServiceManager) *SbiServer { +func NewSbiServer(pndService networkdomain.Service) *SbiServer { return &SbiServer{ - serviceManager: serviceManager, + pndService: pndService, } } @@ -53,7 +53,7 @@ func (s SbiServer) GetSchema(request *spb.GetSchemaRequest, stream spb.SbiServic return handleRPCError(labels, err) } - pnd, err := s.serviceManager.PndService.Get(store.Query{ID: pid}) + pnd, err := s.pndService.Get(store.Query{ID: pid}) if err != nil { return handleRPCError(labels, err) } diff --git a/controller/northbound/server/test_util_test.go b/controller/northbound/server/test_util_test.go index 24fd718395685f41291da7b55e4f885fe2f27b87..e32c7d8011801a4bfdccc6200663e5df2a487572 100644 --- a/controller/northbound/server/test_util_test.go +++ b/controller/northbound/server/test_util_test.go @@ -14,7 +14,6 @@ import ( "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/nucleus" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "code.fbi.h-da.de/danet/gosdn/controller/rbac" @@ -53,37 +52,37 @@ const randomRoleName = "bertram" var adminRoleMap = map[string]string{pndID: "adminTestRole"} var userRoleMap = map[string]string{pndID: "userTestRole"} -func clearAndCreateAuthTestSetup(serviceManager servmgmt.ServiceManager) error { +func clearAndCreateAuthTestSetup(userService rbacInterfaces.UserService, roleService rbacInterfaces.RoleService) error { //clear setup if changed - storedUsers, err := serviceManager.UserService.GetAll() + storedUsers, err := userService.GetAll() if err != nil { return err } for _, u := range storedUsers { - err = serviceManager.UserService.Delete(u) + err = userService.Delete(u) if err != nil { return err } } - storedRoles, err := serviceManager.RoleService.GetAll() + storedRoles, err := roleService.GetAll() if err != nil { return err } for _, r := range storedRoles { - err = serviceManager.RoleService.Delete(r) + err = roleService.Delete(r) if err != nil { return err } } // create dataset - err = createTestUsers(serviceManager.UserService) + err = createTestUsers(userService) if err != nil { return err } - err = createTestRoles(serviceManager.RoleService) + err = createTestRoles(roleService) if err != nil { return err } @@ -181,20 +180,20 @@ func patchLogger(t *testing.T) { // Creates a token to be used in auth interceptor tests. If validTokenRequired is set as true, the generated token will also // be attached to the provided user. Else the user won't have the token and can not be authorized. -func createTestUserToken(userName string, validTokenRequired bool, serviceManager servmgmt.ServiceManager, jwt *rbac.JWTManager) (string, error) { +func createTestUserToken(userName string, validTokenRequired bool, userService rbacInterfaces.UserService, jwt *rbac.JWTManager) (string, error) { token, err := jwt.GenerateToken(rbac.User{UserName: userName}) if err != nil { return token, err } if validTokenRequired { - user, err := serviceManager.UserService.Get(store.Query{Name: userName}) + user, err := userService.Get(store.Query{Name: userName}) if err != nil { return token, err } user.SetToken(token) - err = serviceManager.UserService.Update(user) + err = userService.Update(user) if err != nil { return token, err } diff --git a/controller/northbound/server/user.go b/controller/northbound/server/user.go index d68c7805ba6cf35f6a874ab0c93bd3f5096459f1..a50baaaab0fc4faee85aca99d707091b14a398fc 100644 --- a/controller/northbound/server/user.go +++ b/controller/northbound/server/user.go @@ -9,9 +9,9 @@ import ( cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/conflict" apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" "code.fbi.h-da.de/danet/gosdn/controller/conflict" + rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -26,15 +26,15 @@ import ( // UserServer holds a JWTManager and represents a UserServiceServer. type UserServer struct { apb.UnimplementedUserServiceServer - jwtManager *rbac.JWTManager - serviceManager servmgmt.ServiceManager + jwtManager *rbac.JWTManager + userService rbacInterfaces.UserService } // NewUserServer receives a JWTManager and a UserService and returns a new UserServer. -func NewUserServer(jwtManager *rbac.JWTManager, serviceManager servmgmt.ServiceManager) *UserServer { +func NewUserServer(jwtManager *rbac.JWTManager, userService rbacInterfaces.UserService) *UserServer { return &UserServer{ - jwtManager: jwtManager, - serviceManager: serviceManager, + jwtManager: jwtManager, + userService: userService, } } @@ -65,7 +65,7 @@ func (u UserServer) CreateUsers(ctx context.Context, request *apb.CreateUsersReq hashedPassword := base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(user.Password), []byte(salt), 1, 64*1024, 4, 32)) user := rbac.NewUser(uuid.New(), user.Name, roles, string(hashedPassword), user.Token, salt, conflict.Metadata{ResourceVersion: 0}) - err = u.serviceManager.UserService.Add(user) + err = u.userService.Add(user) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -89,7 +89,7 @@ func (u UserServer) GetUser(ctx context.Context, request *apb.GetUserRequest) (* return nil, fmt.Errorf("could not parse user uuid") } - userData, err := u.serviceManager.UserService.Get(store.Query{Name: request.Name, ID: userID}) + userData, err := u.userService.Get(store.Query{Name: request.Name, ID: userID}) if err != nil { return nil, err } @@ -116,7 +116,7 @@ func (u UserServer) GetUsers(ctx context.Context, request *apb.GetUsersRequest) start := metrics.StartHook(labels, grpcRequestsTotal) defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - userList, err := u.serviceManager.UserService.GetAll() + userList, err := u.userService.GetAll() if err != nil { return nil, err } @@ -152,7 +152,7 @@ func (u UserServer) UpdateUsers(ctx context.Context, request *apb.UpdateUsersReq return nil, handleRPCError(labels, err) } - storedUser, err := u.serviceManager.UserService.Get(store.Query{ID: uid}) + storedUser, err := u.userService.Get(store.Query{ID: uid}) if err != nil { return nil, status.Errorf(codes.Canceled, "user not found %v", err) } @@ -165,7 +165,7 @@ func (u UserServer) UpdateUsers(ctx context.Context, request *apb.UpdateUsersReq usr, _ := userToUpdate.(*rbac.User) usr.Metadata.ResourceVersion = int(user.Metadata.ResourceVersion) - err = u.serviceManager.UserService.Update(usr) + err = u.userService.Update(usr) if err != nil { return nil, status.Errorf(codes.Aborted, "could not update user %v", err) } @@ -184,12 +184,12 @@ func (u UserServer) DeleteUsers(ctx context.Context, request *apb.DeleteUsersReq defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) for _, user := range request.Username { - userToDelete, err := u.serviceManager.UserService.Get(store.Query{Name: user}) + userToDelete, err := u.userService.Get(store.Query{Name: user}) if err != nil { return nil, status.Errorf(codes.Canceled, "user not found %v", err) } - err = u.serviceManager.UserService.Delete(userToDelete) + err = u.userService.Delete(userToDelete) if err != nil { return nil, status.Errorf(codes.Aborted, "error deleting user %v", err) } diff --git a/controller/northbound/server/user_test.go b/controller/northbound/server/user_test.go index 594dd4cea979b89176af6326a11e91a1c2642c42..6b693a39cbdadb56390ac896716894a91f9706db 100644 --- a/controller/northbound/server/user_test.go +++ b/controller/northbound/server/user_test.go @@ -10,7 +10,6 @@ import ( apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService" "code.fbi.h-da.de/danet/gosdn/controller/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "github.com/google/uuid" ) @@ -24,10 +23,8 @@ func getTestUserServer(t *testing.T) *UserServer { roleStore := rbac.NewMemoryRoleStore() roleService := rbac.NewRoleService(roleStore, eventService) - serviceManager := servmgmt.ServiceManager{UserService: userService, RoleService: roleService} - - s := NewUserServer(jwtManager, serviceManager) - err := clearAndCreateAuthTestSetup(serviceManager) + s := NewUserServer(jwtManager, userService) + err := clearAndCreateAuthTestSetup(userService, roleService) if err != nil { t.Fatalf("%v", err) } diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go index 7cba403d1f452e74a39223d814c3d393c6deeed3..19d12969acdef96b620b7a7b69d6f0ddcfe76c20 100644 --- a/controller/nucleus/networkElementWatcher.go +++ b/controller/nucleus/networkElementWatcher.go @@ -11,7 +11,6 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/types" - "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" "github.com/google/uuid" @@ -29,7 +28,7 @@ const ( // NetworkElementWatcher is a component that subscribes to network elements via gNMI from within the controller and handles // responses by triggering the internal event process. type NetworkElementWatcher struct { - serviceManager servmgmt.ServiceManager + mneService networkelement.Service networkelementSubcriptions map[uuid.UUID]*networkelementSubscriptionHelper eventService eventInterfaces.Service } @@ -41,9 +40,9 @@ type networkelementSubscriptionHelper struct { } // NewNetworkElementWatcher takes a pndStore to subscribe to network element paths. -func NewNetworkElementWatcher(serviceManager servmgmt.ServiceManager, eventService eventInterfaces.Service) *NetworkElementWatcher { +func NewNetworkElementWatcher(mneService networkelement.Service, eventService eventInterfaces.Service) *NetworkElementWatcher { return &NetworkElementWatcher{ - serviceManager: serviceManager, + mneService: mneService, networkelementSubcriptions: make(map[uuid.UUID]*networkelementSubscriptionHelper), eventService: eventService, } @@ -62,7 +61,7 @@ func (n *NetworkElementWatcher) SubToNetworkElements(paths [][]string, opts *gnm } } - mnes, err := n.serviceManager.MneService.GetAll() + mnes, err := n.mneService.GetAll() if err != nil { log.Error(err) return @@ -148,7 +147,7 @@ func (n *NetworkElementWatcher) handleSubscribeResponse(resp *gpb.SubscribeRespo } func (n *NetworkElementWatcher) handleSubscribeResponseUpdate(resp *gpb.SubscribeResponse_Update, subscriptionInfo *transport.SubscriptionInformation) { - mne, err := n.serviceManager.MneService.Get(store.Query{ID: uuid.MustParse(subscriptionInfo.NetworkElementID)}) + mne, err := n.mneService.Get(store.Query{ID: uuid.MustParse(subscriptionInfo.NetworkElementID)}) if err != nil { log.Error(err) } diff --git a/controller/nucleus/pndService.go b/controller/nucleus/pndService.go index a8a6b1098c4683cd6fa45fdec075776fcc397391..c43612a1544233d1948e269950fc3c8ab4514dca 100644 --- a/controller/nucleus/pndService.go +++ b/controller/nucleus/pndService.go @@ -14,7 +14,7 @@ type PndService struct { } // NewPndService creates a PND service. -func NewPndService(pndStore networkdomain.PndStore) networkdomain.PndService { +func NewPndService(pndStore networkdomain.PndStore) networkdomain.Service { pndService := &PndService{ pndStore: pndStore, } diff --git a/controller/servmgmt/serviceManager.go b/controller/servmgmt/serviceManager.go deleted file mode 100644 index c114941453fa82959d068336e5d697b36f5fe4b8..0000000000000000000000000000000000000000 --- a/controller/servmgmt/serviceManager.go +++ /dev/null @@ -1,57 +0,0 @@ -package servmgmt - -import ( - "code.fbi.h-da.de/danet/gosdn/controller/app" - "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/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound" - "code.fbi.h-da.de/danet/gosdn/controller/store" - "code.fbi.h-da.de/danet/gosdn/controller/topology" - "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" - "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" - routingtables "code.fbi.h-da.de/danet/gosdn/controller/topology/routing-tables" - "github.com/google/uuid" -) - -// NOTE: Until we've added database support for changes, we will hold -// changeStores in memory for now. -var changeStoreMap = make(map[uuid.UUID]*store.ChangeStore) - -// ServiceManager is an aggregation of all services which handle storage access. -type ServiceManager struct { - //TODO(PND):change these to services! - PndService networkdomain.PndService - PNDStore networkdomain.PndStore - ChangeStore store.ChangeStore - SbiService southbound.Service - MneService networkelement.Service - UserService rbac.UserService - RoleService rbac.RoleService - NodeService nodes.Service - PortService ports.Service - TopologyService topology.Service - RouteService routingtables.Service - AppService app.ManagementService -} - -// NewServiceManager returns a ServiceManager. -func NewServiceManager(pndService networkdomain.PndService, pndStore networkdomain.PndStore, changeStore store.ChangeStore, sbiServ southbound.Service, - mneServ networkelement.Service, userServ rbac.UserService, roleServ rbac.RoleService, - nodeServ nodes.Service, portServ ports.Service, topoServ topology.Service, - routeServ routingtables.Service, appServ app.ManagementService) *ServiceManager { - return &ServiceManager{ - PndService: pndService, - PNDStore: pndStore, - ChangeStore: changeStore, - SbiService: sbiServ, - MneService: mneServ, - UserService: userServ, - RoleService: roleServ, - NodeService: nodeServ, - PortService: portServ, - TopologyService: topoServ, - RouteService: routeServ, - AppService: appServ, - } -}