diff --git a/Makefile b/Makefile index 515245e72d7247813096e8cc9c046047361dfdf6..e3a95d3d5bf80f3a7e6857b9a77c68cac05ff17d 100644 --- a/Makefile +++ b/Makefile @@ -17,9 +17,9 @@ BUILD_ARTIFACTS_PATH=artifacts PLUGIN_NAME= bundled_plugin.zip # Tool Versions -GOTESTSUM_VERSION=v1.8.1 -GOLANGCI_LINT_VERSION=v1.54.0 -MOCKERY_VERSION=v2.20.0 +GOTESTSUM_VERSION=v1.11.0 +GOLANGCI_LINT_VERSION=v1.54.2 +MOCKERY_VERSION=v2.34.1 YGOT_GENERATOR_VERSION=v0.27.0 YGOT_GENERATOR_GENERATOR_VERSION=v0.0.4 diff --git a/controller/app/Store.go b/controller/app/Store.go index 0852c57fc2b72071c22b44911600ab8c489d92d1..510fe56ea7c47911632ec95bd0d16b2ea2f1c3e2 100644 --- a/controller/app/Store.go +++ b/controller/app/Store.go @@ -5,7 +5,7 @@ import ( "log" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" @@ -57,7 +57,7 @@ func (s *Store) Get(query store.Query) (App, error) { } func (s *Store) getByID(appID uuid.UUID) (loadedApp App, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -66,7 +66,7 @@ func (s *Store) getByID(appID uuid.UUID) (loadedApp App, err error) { } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: appID.String()}}) if result == nil { @@ -83,7 +83,7 @@ func (s *Store) getByID(appID uuid.UUID) (loadedApp App, err error) { } func (s *Store) getByName(appName string) (loadedApp App, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -92,7 +92,7 @@ func (s *Store) getByName(appName string) (loadedApp App, err error) { } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: appName}}) if result == nil { @@ -110,7 +110,7 @@ func (s *Store) getByName(appName string) (loadedApp App, err error) { // GetAll returns all stored apps. func (s *Store) GetAll() (loadedApps []App, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -119,7 +119,7 @@ func (s *Store) GetAll() (loadedApps []App, err error) { } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) cursor, err := collection.Find(ctx, bson.D{}) @@ -139,7 +139,7 @@ func (s *Store) GetAll() (loadedApps []App, err error) { // Add adds a app to the app store. func (s *Store) Add(app App) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -148,7 +148,7 @@ func (s *Store) Add(app App) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.storeName). InsertOne(ctx, app) if err != nil { @@ -163,7 +163,7 @@ func (s *Store) Add(app App) (err error) { func (s *Store) Update(app App) (err error) { var updatedApp App - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -181,7 +181,7 @@ func (s *Store) Update(app App) (err error) { ReturnDocument: &after, } - err = client.Database(database.DatabaseName). + err = client.Database(mongodb.DatabaseName). Collection(s.storeName). FindOneAndUpdate( ctx, bson.M{"_id": app.GetID().String()}, update, &opt). @@ -197,7 +197,7 @@ func (s *Store) Update(app App) (err error) { // Delete deletes a app from the app store. func (s *Store) Delete(app App) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -206,7 +206,7 @@ func (s *Store) Delete(app App) (err error) { } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) _, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: app.GetID().String()}}) if err != nil { diff --git a/controller/controller.go b/controller/controller.go index 6f4b12ac01aa613f2bc14888a8e3205ae22f9b67..a7db812da4a085fd918902e2afdcc9882554a193 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -30,14 +30,15 @@ import ( tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology" "code.fbi.h-da.de/danet/gosdn/controller/app" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/application/service" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence" "code.fbi.h-da.de/danet/gosdn/controller/config" "code.fbi.h-da.de/danet/gosdn/controller/conflict" eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService" - "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/plugin" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" "code.fbi.h-da.de/danet/gosdn/controller/northbound/server" nbi "code.fbi.h-da.de/danet/gosdn/controller/northbound/server" @@ -45,7 +46,7 @@ import ( "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" + topoPorts "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" routingtables "code.fbi.h-da.de/danet/gosdn/controller/topology/routing-tables" eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event" @@ -58,22 +59,26 @@ 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 - changeStore store.ChangeStore - userService rbac.UserService - roleService rbac.RoleService - topologyService topology.Service - nodeService nodes.Service - portService ports.Service - routeService routingtables.Service - pluginService plugin.Service - httpServer *http.Server - grpcServer *grpc.Server - nbi *nbi.NorthboundInterface - eventService eventInterfaces.Service - appService app.ManagementService + pndStore ports.PndStore + changeStore store.ChangeStore + + pndService ports.PndService + mneService ports.NetworkElementService + userService rbac.UserService + roleService rbac.RoleService + topologyService topology.Service + nodeService nodes.Service + portService topoPorts.Service + routeService routingtables.Service + pluginService ports.PluginService + eventService eventInterfaces.Service + appService app.ManagementService + + httpServer *http.Server + grpcServer *grpc.Server + + nbi *nbi.NorthboundInterface + networkElementWatcher *nucleus.NetworkElementWatcher stopChan chan os.Signal @@ -99,7 +104,7 @@ func initialize() error { } nodeService := nodes.NewNodeService(nodes.NewDatabaseNodeStore(), eventService) - portService := ports.NewPortService(ports.NewDatabasePortStore(), eventService) + portService := topoPorts.NewPortService(topoPorts.NewDatabasePortStore(), eventService) routeService := routingtables.NewRoutingTableService( routingtables.NewDatabaseRoutingTableStore(), nodeService, @@ -108,16 +113,21 @@ func initialize() error { ) pluginRegistryClient := setupPluginRegistryClient() - pluginService := nucleus.NewPluginService(nucleus.NewPluginStore(), eventService, model.NewPluginThroughReattachConfig, pluginRegistryClient) + pluginService := service.NewPluginService( + persistence.NewPluginStore(), + eventService, + model.NewPluginThroughReattachConfig, + pluginRegistryClient, + ) - pndStore := nucleus.NewPndStore(pluginService) + pndStore := persistence.NewPndStore(pluginService) changeStore := store.NewChangeStore() c = &Core{ pndStore: pndStore, - pndService: nucleus.NewPndService(pndStore), - mneService: nucleus.NewNetworkElementService(nucleus.NewNetworkElementStore(), pluginService, eventService), + pndService: service.NewPndService(pndStore), + mneService: service.NewNetworkElementService(persistence.NewNetworkElementStore(), pluginService, eventService), changeStore: *changeStore, userService: rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService), roleService: rbacImpl.NewRoleService(rbacImpl.NewRoleStore(), eventService), @@ -197,24 +207,24 @@ func startGrpc() error { jwtManager := rbacImpl.NewJWTManager(config.JWTSecret, config.JWTDuration) setupGRPCServerWithCorrectSecurityLevel(jwtManager, c.userService, c.roleService) - c.nbi = nbi.NewNBI( - c.pndStore, - c.pndService, - c.mneService, - c.changeStore, - c.userService, - c.roleService, - *jwtManager, - c.topologyService, - c.nodeService, - c.portService, - c.routeService, - c.appService, - c.pluginService, - c.pluginRegistryClient, - c.csbiClient, - callback, - ) + // c.nbi = nbi.NewNBI( + // c.pndStore, + // c.pndService, + // c.mneService, + // c.changeStore, + // c.userService, + // c.roleService, + // *jwtManager, + // c.topologyService, + // c.nodeService, + // c.portService, + // c.routeService, + // c.appService, + // c.pluginService, + // c.pluginRegistryClient, + // c.csbiClient, + // callback, + // ) ppb.RegisterPndServiceServer(c.grpcServer, c.nbi.Pnd) cpb.RegisterCsbiServiceServer(c.grpcServer, c.nbi.Csbi) diff --git a/controller/interfaces/networkdomain/pndStore.go b/controller/interfaces/networkdomain/pndStore.go index c031c1fec113246f02aa613cc402cc6d31b48fbe..b88d61a213ced30e1fa55ef004408c126d089f6a 100644 --- a/controller/interfaces/networkdomain/pndStore.go +++ b/controller/interfaces/networkdomain/pndStore.go @@ -1,9 +1,10 @@ package networkdomain import ( - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" + + tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" ) // PndStore describes an interface for pnd store implementations. @@ -12,7 +13,13 @@ type PndStore interface { Delete(NetworkDomain) error Get(store.Query) (LoadedPnd, error) GetAll() ([]LoadedPnd, error) - PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error) - AddPendingChannel(id uuid.UUID, ch chan networkelement.Details) + PendingChannels(id uuid.UUID, parseErrors ...error) (chan Details, error) + AddPendingChannel(id uuid.UUID, ch chan Details) RemovePendingChannel(id uuid.UUID) } + +type Details struct { + ID string + Address string + TransportOption *tpb.TransportOption +} diff --git a/controller/interfaces/networkelement/networkElement.go b/controller/interfaces/networkelement/networkElement.go index eb74ba36798bb40561805f35c14ef252503a06bc..3d32fca88fcb129cd6e23df01a5e4847d3644255 100644 --- a/controller/interfaces/networkelement/networkElement.go +++ b/controller/interfaces/networkelement/networkElement.go @@ -6,6 +6,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/conflict" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" "github.com/google/uuid" gpb "github.com/openconfig/gnmi/proto/gnmi" "github.com/openconfig/ygot/ygot" @@ -71,7 +72,7 @@ type LoadedNetworkElement struct { // EnsureIntendedConfigurationIsAppliedOnNetworkElement pushes the stored // configuration to a network element. // TODO: find a better place for this function. -func EnsureIntendedConfigurationIsAppliedOnNetworkElement(mne NetworkElement) error { +func EnsureIntendedConfigurationIsAppliedOnNetworkElement(mne model.NetworkElement) error { model, err := mne.GetModelAsFilteredCopy() if err != nil { return err diff --git a/controller/interfaces/networkelement/networkElementStore.go b/controller/interfaces/networkelement/networkElementStore.go deleted file mode 100644 index e2a136105e3d817db19ff8eb6a21ff1f462b92c9..0000000000000000000000000000000000000000 --- a/controller/interfaces/networkelement/networkElementStore.go +++ /dev/null @@ -1,14 +0,0 @@ -package networkelement - -import ( - "code.fbi.h-da.de/danet/gosdn/controller/store" -) - -// Store describes an interface for network element store implementations. -type Store interface { - Add(NetworkElement) error - Update(NetworkElement) error - Delete(NetworkElement) error - Get(store.Query) (LoadedNetworkElement, error) - GetAll() ([]LoadedNetworkElement, error) -} diff --git a/controller/northbound/server/auth_interceptor_test.go b/controller/northbound/server/auth_interceptor_test.go index 33b7d9d86ebd7ebd0b83a2401596e87edb2b9584..fd61f956bb6d1c2afd8d8cd160803567775201eb 100644 --- a/controller/northbound/server/auth_interceptor_test.go +++ b/controller/northbound/server/auth_interceptor_test.go @@ -12,7 +12,7 @@ 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/nucleus" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" "code.fbi.h-da.de/danet/gosdn/controller/rbac" "github.com/bufbuild/protovalidate-go" "google.golang.org/grpc" diff --git a/controller/northbound/server/configurationmanagement.go b/controller/northbound/server/configurationmanagement.go index 40db2590ee756cecebc10e285ea30acbaaba9965..cef101a4c68b90312905251ad5de280881493a1a 100644 --- a/controller/northbound/server/configurationmanagement.go +++ b/controller/northbound/server/configurationmanagement.go @@ -9,15 +9,14 @@ import ( spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" "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/networkelement" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "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/links" "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" - "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" + topoPorts "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -28,23 +27,23 @@ import ( // ConfigurationManagementServer represents ConfigurationManagementServer... type ConfigurationManagementServer struct { cmpb.UnimplementedConfigurationManagementServiceServer - pndService networkdomain.Service - mneService networkelement.Service + pndService ports.PndService + mneService ports.NetworkElementService topologyService topology.Service nodeService nodes.Service - portService ports.Service - pluginService plugin.Service + portService topoPorts.Service + pluginService ports.PluginService protoValidator *protovalidate.Validator } // NewConfigurationManagementServer creates the ConfigurationManagementServer.. func NewConfigurationManagementServer( - pndService networkdomain.Service, - mneService networkelement.Service, + pndService ports.PndService, + mneService ports.NetworkElementService, topologyService topology.Service, nodeService nodes.Service, - portService ports.Service, - pluginService plugin.Service, + portService topoPorts.Service, + pluginService ports.PluginService, protoValidator *protovalidate.Validator, ) *ConfigurationManagementServer { return &ConfigurationManagementServer{ @@ -60,22 +59,22 @@ func NewConfigurationManagementServer( // sdnConfig is used to parse the sdnConfig into JSON. type sdnConfig struct { - PndID string `json:"pndID"` - Nodes []nodes.Node `json:"nodes"` - Ports []ports.Port `json:"ports"` - Links []links.Link `json:"links"` - Plugins []plugin.LoadedPlugin `json:"plugins"` - NetworkElements []networkelement.NetworkElement `json:"networkelements"` + PndID string `json:"pndID"` + Nodes []nodes.Node `json:"nodes"` + Ports []topoPorts.Port `json:"ports"` + Links []links.Link `json:"links"` + Plugins []plugin.LoadedPlugin `json:"plugins"` + NetworkElements []model.NetworkElement `json:"networkelements"` } // loadedSDNConfig is used to parse the stringified JSON sdnConfig into objects. type loadedSDNConfig struct { - PndID string `json:"pndID"` - Nodes []nodes.Node `json:"nodes"` - Ports []ports.Port `json:"ports"` - Links []links.Link `json:"links"` - Plugins []plugin.LoadedPlugin `json:"plugins"` - NetworkElements []networkelement.LoadedNetworkElement `json:"networkelements"` + PndID string `json:"pndID"` + Nodes []nodes.Node `json:"nodes"` + Ports []topoPorts.Port `json:"ports"` + Links []links.Link `json:"links"` + Plugins []plugin.LoadedPlugin `json:"plugins"` + NetworkElements []model.LoadedNetworkElement `json:"networkelements"` } // ExportSDNConfig returns the SDN configuration. @@ -257,7 +256,7 @@ func (c ConfigurationManagementServer) createTopology(sdnConfig *loadedSDNConfig } for _, inputPort := range sdnConfig.Ports { - port := ports.Port{ + port := topoPorts.Port{ ID: inputPort.ID, Name: inputPort.Name, Configuration: inputPort.Configuration, @@ -347,7 +346,7 @@ func (c ConfigurationManagementServer) createNetworkElements(sdnConfig *loadedSD return err } - if err := networkelement.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement); err != nil { + if err := model.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement); err != nil { return err } } diff --git a/controller/northbound/server/csbi.go b/controller/northbound/server/csbi.go index 14ba9a371df51418501bcd57dbd10c98b8197127..8fe870d9519d3d44ea6b5e6c0f9c521688a5bc77 100644 --- a/controller/northbound/server/csbi.go +++ b/controller/northbound/server/csbi.go @@ -11,9 +11,9 @@ import ( log "github.com/sirupsen/logrus" cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi" - "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/metrics" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" "google.golang.org/grpc/codes" "google.golang.org/grpc/peer" @@ -23,12 +23,12 @@ import ( // CsbiServer represents a csbi server. type CsbiServer struct { cpb.UnimplementedCsbiServiceServer - pndStore networkdomain.PndStore + pndStore ports.PndStore protoValidator *protovalidate.Validator } // NewCsbiServer receives a pndStore and returns a new csbiServer. -func NewCsbiServer(pndStore networkdomain.PndStore, protoValidator *protovalidate.Validator) *CsbiServer { +func NewCsbiServer(pndStore ports.PndStore, protoValidator *protovalidate.Validator) *CsbiServer { return &CsbiServer{ pndStore: pndStore, protoValidator: protoValidator, diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go index 2120c9287b2d590ed3991bedb2c92ee418a31509..f0e09bd7beba7dd5d6eeb2cb899aa12dee1468d0 100644 --- a/controller/northbound/server/nbi.go +++ b/controller/northbound/server/nbi.go @@ -4,15 +4,14 @@ import ( 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" "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/plugin" rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "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/topology" "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" - "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" + topoPorts "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" routingtables "code.fbi.h-da.de/danet/gosdn/controller/topology/routing-tables" "code.fbi.h-da.de/danet/gosdn/controller/metrics" @@ -42,19 +41,19 @@ type NorthboundInterface struct { // NewNBI receives a PndStore and returns a new gRPC *NorthboundInterface. func NewNBI( - pnds networkdomain.PndStore, - pndService networkdomain.Service, - mneService networkelement.Service, + pnds ports.PndStore, + pndService ports.PndService, + mneService ports.NetworkElementService, changeStore store.ChangeStore, users rbacInterfaces.UserService, roles rbacInterfaces.RoleService, jwt rbac.JWTManager, topologyService topology.Service, nodeService nodes.Service, - portService ports.Service, + portService topoPorts.Service, routeService routingtables.Service, apps app.ManagementService, - pluginService plugin.Service, + pluginService ports.PluginService, pluginRegistryClient rpb.PluginRegistryServiceClient, csbiClient cpb.CsbiServiceClient, pndCallbackFn func(uuid.UUID, chan networkelement.Details), diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go index f9263239bc64990f0dee3c49c56bf2dcb607b176..ce6b9ba38d01bf00d82731b5559b6e972914e925 100644 --- a/controller/northbound/server/networkElement.go +++ b/controller/northbound/server/networkElement.go @@ -12,11 +12,9 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/conflict" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/change" - "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/plugin" "code.fbi.h-da.de/danet/gosdn/controller/metrics" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/types" util "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/gnmi" "code.fbi.h-da.de/danet/gosdn/controller/store" @@ -36,18 +34,18 @@ import ( // NetworkElementServer represents a NetworkElementServer. type NetworkElementServer struct { mnepb.UnimplementedNetworkElementServiceServer - mneService networkelement.Service - pndService networkdomain.Service - pluginService plugin.Service + mneService ports.NetworkElementService + pndService ports.PndService + pluginService ports.PluginService changeStore store.ChangeStore protoValidator *protovalidate.Validator } // NewNetworkElementServer returns a new NetWorkElementServer. func NewNetworkElementServer( - mneService networkelement.Service, - pndService networkdomain.Service, - pluginService plugin.Service, + mneService ports.NetworkElementService, + pndService ports.PndService, + pluginService ports.PluginService, changeStore store.ChangeStore, protoValidator *protovalidate.Validator, ) *NetworkElementServer { @@ -219,7 +217,7 @@ func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.Update return nil, err } - err = networkelement.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement) + err = model.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement) if err != nil { return &mnepb.UpdateNetworkElementResponse{ Timestamp: time.Now().UnixNano(), @@ -301,7 +299,7 @@ func (n *NetworkElementServer) GetFlattenedMne(ctx context.Context, request *mne }, nil } -func (n *NetworkElementServer) getMne(identifier string) (networkelement.NetworkElement, error) { +func (n *NetworkElementServer) getMne(identifier string) (model.NetworkElement, error) { id, err := uuid.Parse(identifier) if err != nil { id = uuid.Nil @@ -320,7 +318,7 @@ func (n *NetworkElementServer) getMne(identifier string) (networkelement.Network return mne, nil } -func (n *NetworkElementServer) getPnd(identifier string) (networkdomain.NetworkDomain, error) { +func (n *NetworkElementServer) getPnd(identifier string) (model.NetworkDomain, error) { pid, err := uuid.Parse(identifier) if err != nil { return nil, err @@ -420,7 +418,7 @@ func (n *NetworkElementServer) GetFlattenedMneList(ctx context.Context, request }, nil } -func fillMneBySpecificPath(nme networkelement.NetworkElement, path string, requestForIntendedState bool) (*mnepb.ManagedNetworkElement, error) { +func fillMneBySpecificPath(nme model.NetworkElement, path string, requestForIntendedState bool) (*mnepb.ManagedNetworkElement, error) { gnmiPath, err := ygot.StringToStructuredPath(path) if err != nil { log.Error(err) @@ -483,7 +481,7 @@ func (n *NetworkElementServer) GetPath(ctx context.Context, request *mnepb.GetPa }, nil } -func (n *NetworkElementServer) getPath(ctx context.Context, mne networkelement.NetworkElement, path string) (*gnmi.GetResponse, error) { +func (n *NetworkElementServer) getPath(ctx context.Context, mne model.NetworkElement, path string) (*gnmi.GetResponse, error) { res, err := mne.Transport().Get(ctx, path) if err != nil { return nil, err @@ -707,7 +705,14 @@ func (n *NetworkElementServer) SetMneList(ctx context.Context, request *mnepb.Se }, nil } -func (n *NetworkElementServer) addMne(ctx context.Context, name string, opt *tpb.TransportOption, requestPluginFunc func(uuid.UUID) (plugin.Plugin, error), pluginID uuid.UUID, pndID uuid.UUID, optionalNetworkElementID ...uuid.UUID) (uuid.UUID, error) { +func (n *NetworkElementServer) addMne( + ctx context.Context, + name string, + opt *tpb.TransportOption, + requestPluginFunc func(uuid.UUID) (*model.Plugin, error), + pluginID uuid.UUID, pndID uuid.UUID, + optionalNetworkElementID ...uuid.UUID, +) (uuid.UUID, error) { var err error // Note: cSBI not supported currently, so this is commented fow now. @@ -1014,7 +1019,7 @@ func (n *NetworkElementServer) SubscribePath(request *mnepb.SubscribePathRequest return nil } -func (n *NetworkElementServer) subscribePath(networkElement networkelement.NetworkElement, subList *mnepb.SubscriptionList) error { +func (n *NetworkElementServer) subscribePath(networkElement model.NetworkElement, subList *mnepb.SubscriptionList) error { mode, err := n.mapModeToAristaFork(subList.GetMode()) if err != nil { return err diff --git a/controller/northbound/server/plugin.go b/controller/northbound/server/plugin.go index 3338520da281bf8817f39f7134ac4c6c141b6368..0a77cdfa038237516118a097ee9b6b93c4d09693 100644 --- a/controller/northbound/server/plugin.go +++ b/controller/northbound/server/plugin.go @@ -9,8 +9,8 @@ import ( 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" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" "code.fbi.h-da.de/danet/gosdn/controller/metrics" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/plugin/shared" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/bufbuild/protovalidate-go" @@ -24,13 +24,13 @@ import ( type PluginInternalServer struct { pipb.UnimplementedPluginInternalServiceServer pluginRegistryClient rpb.PluginRegistryServiceClient - pluginService plugin.Service + pluginService ports.PluginService protoValidator *protovalidate.Validator } func NewPluginInternalServer( pluginRegistryClient rpb.PluginRegistryServiceClient, - pluginService plugin.Service, + pluginService ports.PluginService, protoValidator *protovalidate.Validator, ) *PluginInternalServer { return &PluginInternalServer{ diff --git a/controller/northbound/server/pnd.go b/controller/northbound/server/pnd.go index 239c7335554175f65225a4223f928e9fbbc1b8f6..c6a9744b20d8cb15888b09b4af8b1c5a10a4f478 100644 --- a/controller/northbound/server/pnd.go +++ b/controller/northbound/server/pnd.go @@ -6,11 +6,10 @@ import ( cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi" 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/interfaces/networkelement" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" "code.fbi.h-da.de/danet/gosdn/controller/metrics" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/bufbuild/protovalidate-go" "github.com/google/uuid" @@ -22,8 +21,8 @@ import ( // PndServer represents a core server. type PndServer struct { ppb.UnimplementedPndServiceServer - pndService networkdomain.Service - pluginService plugin.Service + pndService ports.PndService + pluginService ports.PluginService csbiClient cpb.CsbiServiceClient pndCallbackFn func(uuid.UUID, chan networkelement.Details) protoValidator *protovalidate.Validator @@ -31,8 +30,8 @@ type PndServer struct { // NewPndServer receives a pndStore and returns a new PndServer. func NewPndServer( - pndService networkdomain.Service, - pluginService plugin.Service, + pndService ports.PndService, + pluginService ports.PluginService, pndCallbackFn func(uuid.UUID, chan networkelement.Details), csbiClient cpb.CsbiServiceClient, diff --git a/controller/northbound/server/pnd_test.go b/controller/northbound/server/pnd_test.go index cc97284f059f08bf1b34969e4c136045a0490e33..dda4256fff3fa68806605957245c7f07f80070b6 100644 --- a/controller/northbound/server/pnd_test.go +++ b/controller/northbound/server/pnd_test.go @@ -17,7 +17,7 @@ import ( "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/nucleus" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" "github.com/bufbuild/protovalidate-go" "github.com/google/uuid" "github.com/stretchr/testify/mock" diff --git a/controller/nucleus/genericService.go b/controller/nucleus/domain/application/service/genericService.go similarity index 99% rename from controller/nucleus/genericService.go rename to controller/nucleus/domain/application/service/genericService.go index af0193d532fc826f2258c09ccacfa4c73b342c75..47d5fcad329427de37541c55e1e77749d444b89d 100644 --- a/controller/nucleus/genericService.go +++ b/controller/nucleus/domain/application/service/genericService.go @@ -1,4 +1,4 @@ -package nucleus +package service import ( "code.fbi.h-da.de/danet/gosdn/controller/store" diff --git a/controller/nucleus/networkElementService.go b/controller/nucleus/domain/application/service/networkElementService.go similarity index 84% rename from controller/nucleus/networkElementService.go rename to controller/nucleus/domain/application/service/networkElementService.go index 6974d70b466d62a89b8a0547431b0eafadf59efe..c4796771fec3d6deaaa732ce6bd1fef974af5476 100644 --- a/controller/nucleus/networkElementService.go +++ b/controller/nucleus/domain/application/service/networkElementService.go @@ -1,4 +1,4 @@ -package nucleus +package service import ( "fmt" @@ -6,9 +6,8 @@ import ( spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" "code.fbi.h-da.de/danet/gosdn/controller/event" eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event" - "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/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/openconfig/gnmi/proto/gnmi" @@ -26,17 +25,17 @@ const ( // NetworkElementService provides a network element service implementation. // This services provides abstraction between the user (e.g a PND) and the matching store (e.g. networkElementStore). type NetworkElementService struct { - networkElementStore networkelement.Store - pluginService plugin.Service + networkElementStore ports.NetworkElementStore + pluginService ports.PluginService eventService eventInterfaces.Service } // NewNetworkElementService creates a network element service. func NewNetworkElementService( - networkElementStore networkelement.Store, - pluginService plugin.Service, + networkElementStore ports.NetworkElementStore, + pluginService ports.PluginService, eventService eventInterfaces.Service, -) networkelement.Service { +) ports.NetworkElementService { return &NetworkElementService{ networkElementStore: networkElementStore, pluginService: pluginService, @@ -45,7 +44,7 @@ func NewNetworkElementService( } // Get takes a network element's UUID or name and returns the network element. -func (s *NetworkElementService) Get(query store.Query) (networkelement.NetworkElement, error) { +func (s *NetworkElementService) Get(query store.Query) (model.NetworkElement, error) { loadedNetworkElement, err := s.networkElementStore.Get(query) if err != nil { return nil, err @@ -60,8 +59,8 @@ func (s *NetworkElementService) Get(query store.Query) (networkelement.NetworkEl } // GetAll returns all stored network elements. -func (s *NetworkElementService) GetAll() ([]networkelement.NetworkElement, error) { - var mnes []networkelement.NetworkElement +func (s *NetworkElementService) GetAll() ([]model.NetworkElement, error) { + var mnes []model.NetworkElement loadedNetworkElements, err := s.networkElementStore.GetAll() if err != nil { @@ -81,10 +80,10 @@ func (s *NetworkElementService) GetAll() ([]networkelement.NetworkElement, error } // GetAllAsLoaded returns all stored network elements as LoadedNetworkElement. -// This method should be used if there is no need for a networkelement.NetworkElement, since +// This method should be used if there is no need for a model.NetworkElement, since // requesting network element information through this method is a lot faster than the // usual `GetAll` method. -func (s *NetworkElementService) GetAllAsLoaded() ([]networkelement.LoadedNetworkElement, error) { +func (s *NetworkElementService) GetAllAsLoaded() ([]model.LoadedNetworkElement, error) { loadedNetworkElements, err := s.networkElementStore.GetAll() if err != nil { return nil, err @@ -94,7 +93,7 @@ func (s *NetworkElementService) GetAllAsLoaded() ([]networkelement.LoadedNetwork } // Add adds a network element to the network element store. -func (s *NetworkElementService) Add(networkElementToAdd networkelement.NetworkElement) error { +func (s *NetworkElementService) Add(networkElementToAdd model.NetworkElement) error { err := s.networkElementStore.Add(networkElementToAdd) if err != nil { return err @@ -163,7 +162,7 @@ func (s *NetworkElementService) UpdateModel(networkElementID uuid.UUID, modelAsS } // Update updates a existing network element. -func (s *NetworkElementService) Update(networkElementToUpdate networkelement.NetworkElement) error { +func (s *NetworkElementService) Update(networkElementToUpdate model.NetworkElement) error { err := s.networkElementStore.Update(networkElementToUpdate) if err != nil { return err @@ -186,7 +185,7 @@ func (s *NetworkElementService) Update(networkElementToUpdate networkelement.Net } // Delete deletes a network element from the network element store. -func (s *NetworkElementService) Delete(networkElementToDelete networkelement.NetworkElement) error { +func (s *NetworkElementService) Delete(networkElementToDelete model.NetworkElement) error { err := s.networkElementStore.Delete(networkElementToDelete) if err != nil { return err @@ -207,7 +206,7 @@ func (s *NetworkElementService) Delete(networkElementToDelete networkelement.Net return nil } -func (s *NetworkElementService) createNetworkElementFromStore(loadedNetworkElement networkelement.LoadedNetworkElement) (networkelement.NetworkElement, error) { +func (s *NetworkElementService) createNetworkElementFromStore(loadedNetworkElement model.LoadedNetworkElement) (model.NetworkElement, error) { if loadedNetworkElement.Plugin == "" { return nil, fmt.Errorf("can not get device, no running plugin found for network element") } @@ -240,7 +239,7 @@ func (s *NetworkElementService) createNetworkElementFromStore(loadedNetworkEleme // if the plugin is not initialized, we need to initialize it with the // model data from the associated network element. - if mne.GetPlugin().State() != plugin.INITIALIZED { + if mne.GetPlugin().State() != model.INITIALIZED { // Create 'root' path to be able to load the whole model from the store. path, err := ygot.StringToPath("/", ygot.StructuredPath) if err != nil { diff --git a/controller/nucleus/networkElementServiceMock.go b/controller/nucleus/domain/application/service/networkElementServiceMock.go similarity index 99% rename from controller/nucleus/networkElementServiceMock.go rename to controller/nucleus/domain/application/service/networkElementServiceMock.go index 4735109b86c53ab5e841aa4478af9d3042b5cffc..aec91d05237d279484ca957442edefbdde0c5a78 100644 --- a/controller/nucleus/networkElementServiceMock.go +++ b/controller/nucleus/domain/application/service/networkElementServiceMock.go @@ -1,4 +1,4 @@ -package nucleus +package service import ( "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" diff --git a/controller/nucleus/networkElementService_test.go b/controller/nucleus/domain/application/service/networkElementService_test.go similarity index 97% rename from controller/nucleus/networkElementService_test.go rename to controller/nucleus/domain/application/service/networkElementService_test.go index 0b084969364635f16f2044fbb819a44b145dbab1..0306b6a6e4285bcce26d0be00bfa41e8cc4571d8 100644 --- a/controller/nucleus/networkElementService_test.go +++ b/controller/nucleus/domain/application/service/networkElementService_test.go @@ -1,4 +1,4 @@ -package nucleus +package service import ( "testing" @@ -8,7 +8,7 @@ import ( "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/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/stretchr/testify/mock" diff --git a/controller/nucleus/pluginService.go b/controller/nucleus/domain/application/service/pluginService.go similarity index 82% rename from controller/nucleus/pluginService.go rename to controller/nucleus/domain/application/service/pluginService.go index 565d32a6acd0624ac635ac0d6236ce127dcdcb02..d1e2f082c7e154612115ad900e4648bbdbfe1d65 100644 --- a/controller/nucleus/pluginService.go +++ b/controller/nucleus/domain/application/service/pluginService.go @@ -1,4 +1,4 @@ -package nucleus +package service import ( "context" @@ -15,8 +15,8 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/event" eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" @@ -33,14 +33,19 @@ const ( // PluginService provides a plugin service implementation. type PluginService struct { - pluginStore plugin.Store + pluginStore ports.PluginStore eventService eventInterfaces.Service - createPluginFromStoreFn func(plugin.LoadedPlugin) (plugin.Plugin, error) + createPluginFromStoreFn func(model.LoadedPlugin) (*model.Plugin, error) pluginRegistryClient rpb.PluginRegistryServiceClient } // NewPluginService creates a plugin service. -func NewPluginService(pluginStore plugin.Store, eventService eventInterfaces.Service, createPluginFromStoreFn func(plugin.LoadedPlugin) (plugin.Plugin, error), pluginRegistryClient rpb.PluginRegistryServiceClient) plugin.Service { +func NewPluginService( + pluginStore ports.PluginStore, + eventService eventInterfaces.Service, + createPluginFromStoreFn func(model.LoadedPlugin) (*model.Plugin, error), + pluginRegistryClient rpb.PluginRegistryServiceClient, +) ports.PluginService { return &PluginService{ pluginStore: pluginStore, eventService: eventService, @@ -50,7 +55,7 @@ func NewPluginService(pluginStore plugin.Store, eventService eventInterfaces.Ser } // Get takes a Plugin's UUID or name and returns the Plugin. -func (s *PluginService) Get(query store.Query) (plugin.Plugin, error) { +func (s *PluginService) Get(query store.Query) (*model.Plugin, error) { loadedPlugin, err := s.pluginStore.Get(query) if err != nil { return nil, err @@ -58,15 +63,15 @@ func (s *PluginService) Get(query store.Query) (plugin.Plugin, error) { plugin, err := s.createPluginFromStore(loadedPlugin) if err != nil { - return nil, err + return plugin, err } return plugin, nil } // GetAll returns all stored plugins. -func (s *PluginService) GetAll() ([]plugin.Plugin, error) { - var plugins []plugin.Plugin +func (s *PluginService) GetAll() ([]*model.Plugin, error) { + var plugins []*model.Plugin loadedPlugins, err := s.pluginStore.GetAll() if err != nil { @@ -86,7 +91,7 @@ func (s *PluginService) GetAll() ([]plugin.Plugin, error) { } // Add adds a plugin to the plugin store. -func (s *PluginService) Add(pluginToAdd plugin.Plugin) error { +func (s *PluginService) Add(pluginToAdd *model.Plugin) error { err := s.pluginStore.Add(pluginToAdd) if err != nil { return err @@ -100,7 +105,7 @@ func (s *PluginService) Add(pluginToAdd plugin.Plugin) error { } // Delete deletes a plugin from the plugin store. -func (s *PluginService) Delete(pluginToDelete plugin.Plugin) error { +func (s *PluginService) Delete(pluginToDelete *model.Plugin) error { err := s.pluginStore.Delete(pluginToDelete) if err != nil { return err @@ -116,15 +121,15 @@ func (s *PluginService) Delete(pluginToDelete plugin.Plugin) error { return nil } -func (s *PluginService) createPluginFromStore(loadedPlugin plugin.LoadedPlugin) (plugin.Plugin, error) { +func (s *PluginService) createPluginFromStore(loadedPlugin model.LoadedPlugin) (*model.Plugin, error) { plugin, err := s.createPluginFromStoreFn(loadedPlugin) if err != nil { if errors.Is(err, hcplugin.ErrProcessNotFound) { - plugin, err = model.NewPlugin(uuid.MustParse(loadedPlugin.ID), loadedPlugin.ExecPath) + plugin, err := model.NewPlugin(uuid.MustParse(loadedPlugin.ID), loadedPlugin.ExecPath) if err != nil { return nil, err } - err := s.pluginStore.Update(plugin) + err = s.pluginStore.Update(plugin) if err != nil { return nil, err } @@ -137,7 +142,7 @@ func (s *PluginService) createPluginFromStore(loadedPlugin plugin.LoadedPlugin) } // RequestPlugin request a plugin from the plugin-registry. -func (s *PluginService) RequestPlugin(requestID uuid.UUID) (plugin.Plugin, error) { +func (s *PluginService) RequestPlugin(requestID uuid.UUID) (*model.Plugin, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute*1) defer cancel() diff --git a/controller/nucleus/pluginServiceMock.go b/controller/nucleus/domain/application/service/pluginServiceMock.go similarity index 98% rename from controller/nucleus/pluginServiceMock.go rename to controller/nucleus/domain/application/service/pluginServiceMock.go index a580657fcd7c203ea0bcbb51260c021f3f71d124..6873e65075aa1bd7a11e3b759a71d786af185c51 100644 --- a/controller/nucleus/pluginServiceMock.go +++ b/controller/nucleus/domain/application/service/pluginServiceMock.go @@ -1,4 +1,4 @@ -package nucleus +package service import ( "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" diff --git a/controller/nucleus/pndService.go b/controller/nucleus/domain/application/service/pndService.go similarity index 59% rename from controller/nucleus/pndService.go rename to controller/nucleus/domain/application/service/pndService.go index a35a6eff4f64d5fce46ce84617537f3cca58056b..da3251f299a51b488760caa340d1957f39c9bdcb 100644 --- a/controller/nucleus/pndService.go +++ b/controller/nucleus/domain/application/service/pndService.go @@ -1,19 +1,19 @@ -package nucleus +package service import ( - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" ) // PndService provides a PND service implementation. type PndService struct { - pndStore networkdomain.PndStore + pndStore ports.PndStore } // NewPndService creates a PND service. -func NewPndService(pndStore networkdomain.PndStore) networkdomain.Service { +func NewPndService(pndStore ports.PndStore) ports.PndService { pndService := &PndService{ pndStore: pndStore, } @@ -22,7 +22,7 @@ func NewPndService(pndStore networkdomain.PndStore) networkdomain.Service { } // Add adds a PND to the PND store. -func (p *PndService) Add(pndToAdd networkdomain.NetworkDomain) error { +func (p *PndService) Add(pndToAdd model.NetworkDomain) error { err := p.pndStore.Add(pndToAdd) if err != nil { return err @@ -32,7 +32,7 @@ func (p *PndService) Add(pndToAdd networkdomain.NetworkDomain) error { } // Delete deletes a PND from the PND store. -func (p *PndService) Delete(pndToDelete networkdomain.NetworkDomain) error { +func (p *PndService) Delete(pndToDelete model.NetworkDomain) error { err := p.pndStore.Delete(pndToDelete) if err != nil { return err @@ -42,7 +42,7 @@ func (p *PndService) Delete(pndToDelete networkdomain.NetworkDomain) error { } // Get takes a PND's UUID or name and returns the PND. -func (p *PndService) Get(query store.Query) (networkdomain.NetworkDomain, error) { +func (p *PndService) Get(query store.Query) (model.NetworkDomain, error) { loadedPnd, err := p.pndStore.Get(query) if err != nil { return nil, err @@ -52,8 +52,8 @@ func (p *PndService) Get(query store.Query) (networkdomain.NetworkDomain, error) } // GetAll returns all stores PNDs. -func (p *PndService) GetAll() ([]networkdomain.NetworkDomain, error) { - var pnds []networkdomain.NetworkDomain +func (p *PndService) GetAll() ([]model.NetworkDomain, error) { + var pnds []model.NetworkDomain loadedPnds, err := p.pndStore.GetAll() if err != nil { @@ -67,6 +67,6 @@ func (p *PndService) GetAll() ([]networkdomain.NetworkDomain, error) { return pnds, nil } -func (p *PndService) createPndFromStore(loadedPnd networkdomain.LoadedPnd) networkdomain.NetworkDomain { +func (p *PndService) createPndFromStore(loadedPnd model.LoadedPnd) model.NetworkDomain { return model.NewPND(uuid.MustParse(loadedPnd.ID), loadedPnd.Name, loadedPnd.Description) } diff --git a/controller/nucleus/model/change.go b/controller/nucleus/domain/model/change.go similarity index 100% rename from controller/nucleus/model/change.go rename to controller/nucleus/domain/model/change.go diff --git a/controller/nucleus/model/change_test.go b/controller/nucleus/domain/model/change_test.go similarity index 100% rename from controller/nucleus/model/change_test.go rename to controller/nucleus/domain/model/change_test.go diff --git a/controller/nucleus/domain/model/events.go b/controller/nucleus/domain/model/events.go new file mode 100644 index 0000000000000000000000000000000000000000..e3f10f15777132a2475a459a4d911c75c6fae942 --- /dev/null +++ b/controller/nucleus/domain/model/events.go @@ -0,0 +1,6 @@ +package model + +const ( + // NetworkElementEventTopic is the used topic for network element related entity changes. + NetworkElementEventTopic = "managedNetworkElement" +) diff --git a/controller/nucleus/model/gnmi_transport.go b/controller/nucleus/domain/model/gnmi_transport.go similarity index 100% rename from controller/nucleus/model/gnmi_transport.go rename to controller/nucleus/domain/model/gnmi_transport.go diff --git a/controller/nucleus/model/gnmi_transport_test.go b/controller/nucleus/domain/model/gnmi_transport_test.go similarity index 100% rename from controller/nucleus/model/gnmi_transport_test.go rename to controller/nucleus/domain/model/gnmi_transport_test.go diff --git a/controller/nucleus/model/networkElement.go b/controller/nucleus/domain/model/networkElement.go similarity index 73% rename from controller/nucleus/model/networkElement.go rename to controller/nucleus/domain/model/networkElement.go index 5ad9b6054c85b0d7451c2575a487eb02591a858c..40552cc46f5656420ac8b99e64aa46adc0bbe934 100644 --- a/controller/nucleus/model/networkElement.go +++ b/controller/nucleus/domain/model/networkElement.go @@ -1,28 +1,74 @@ package model import ( + "context" "encoding/json" - spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" "code.fbi.h-da.de/danet/gosdn/controller/conflict" - "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/interfaces/transport" "github.com/docker/docker/pkg/namesgenerator" "github.com/google/uuid" + "github.com/openconfig/ygot/ygot" + log "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson" "google.golang.org/protobuf/proto" + + gpb "github.com/openconfig/gnmi/proto/gnmi" ) +// NetworkElement represents an Managed Network Element (MNE) which is managed by +// nucleus. +type NetworkElement interface { + ID() uuid.UUID + GetModel() ([]byte, error) + GetPlugin() PluginIface + GetModelAsFilteredCopy() ([]byte, error) + Transport() transport.Transport + Name() string + ProcessResponse(proto.Message) error + IsTransportValid() bool + GetModelAsString() (string, error) + TransportAddress() string + GetMetadata() conflict.Metadata + PndID() uuid.UUID +} + +type LoadedNetworkElement struct { + // ID represents the UUID of the LoadedNetworkElement. + ID string `json:"id" bson:"_id"` + // Name represents the name of the LoadedNetworkElement. + Name string `json:"name,omitempty"` + // TransportType represent the type of the transport in use of the LoadedNetworkElement. + TransportType string `json:"transport_type,omitempty" bson:"transport_type,omitempty"` + // TransportAddress represents the address from which the network element can be reached via the transport method. + TransportAddress string `json:"transport_address,omitempty" bson:"transport_address,omitempty"` + // TransportUsername is used for authentication via the transport method in use. + TransportUsername string `json:"transport_username,omitempty" bson:"transport_username,omitempty"` + // TransportPassword is used for authentication via the transport method in use. + TransportPassword string `json:"transport_password,omitempty" bson:"transport_password,omitempty"` + // Note: deprecated, should be removed. + TransportOptionCsbi bool `json:"transport_option_csbi,omitempty" bson:"transport_option_csbi,omitempty"` + // TransportTLS uses TLS from the client side when if true. + TransportTLS bool `json:"transport_tls,omitempty" bson:"transport_tls,omitempty"` + + // SBI indicates the southbound interface, which is used by this network element as UUID. + Plugin string `json:"plugin"` + Model string `json:"model,omitempty" bson:"model,omitempty"` + + Metadata conflict.Metadata `json:"metadata" bson:"metadata"` + + PndID string `json:"pnd_id" bson:"pnd_id"` +} + // NewNetworkElement creates a network element. func NewNetworkElement( name string, uuidInput uuid.UUID, opt *tpb.TransportOption, pndID uuid.UUID, - plugin plugin.Plugin, - metadata conflict.Metadata) (networkelement.NetworkElement, error) { + plugin PluginIface, + metadata conflict.Metadata) (NetworkElement, error) { t, err := NewTransport(opt, plugin) if err != nil { return nil, err @@ -38,19 +84,19 @@ func NewNetworkElement( name = namesgenerator.GetRandomName(0) } - if opt.Type == spb.Type_TYPE_CONTAINERISED { - return &CsbiNetworkElement{ - CommonNetworkElement: CommonNetworkElement{ - UUID: uuidInput, - Plugin: plugin, - transport: t, - name: name, - transportOptions: opt, - Metadata: metadata, - pndID: pndID, - }, - }, nil - } + // if opt.Type == spb.Type_TYPE_CONTAINERISED { + // return &CsbiNetworkElement{ + // CommonNetworkElement: CommonNetworkElement{ + // UUID: uuidInput, + // Plugin: plugin, + // transport: t, + // name: name, + // transportOptions: opt, + // Metadata: metadata, + // pndID: pndID, + // }, + // }, nil + // } return &CommonNetworkElement{ UUID: uuidInput, @@ -71,7 +117,7 @@ type CommonNetworkElement struct { // Plugin embeds a gosdn ygot plugin. Allows to work on a devices config // based its supported YANG models. The code for this is generated through // ygot. - Plugin plugin.Plugin + Plugin PluginIface // Transport is the network element's Transport implementation transport transport.Transport @@ -109,7 +155,7 @@ func (n *CommonNetworkElement) Transport() transport.Transport { } // Transport returns the Transport of the network element. -func (d *CommonNetworkElement) GetPlugin() plugin.Plugin { +func (d *CommonNetworkElement) GetPlugin() PluginIface { return d.Plugin } @@ -189,7 +235,7 @@ func (n *CsbiNetworkElement) Transport() transport.Transport { } // Transport returns the Transport of the device. -func (d *CsbiNetworkElement) GetPlugin() plugin.Plugin { +func (d *CsbiNetworkElement) GetPlugin() PluginIface { return d.Plugin } @@ -350,3 +396,34 @@ func (d *CommonNetworkElement) GetModelAsString() (string, error) { byteModel, err := d.Plugin.Model(false) return string(byteModel), err } + +// EnsureIntendedConfigurationIsAppliedOnNetworkElement pushes the stored +// configuration to a network element. +// TODO: find a better place for this function. +func EnsureIntendedConfigurationIsAppliedOnNetworkElement(mne NetworkElement) error { + model, err := mne.GetModelAsFilteredCopy() + if err != nil { + return err + } + + req := &gpb.SetRequest{} + path, err := ygot.StringToStructuredPath("/") + if err != nil { + return err + } + + req.Update = []*gpb.Update{{ + Path: path, + Val: &gpb.TypedValue{ + Value: &gpb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(model)}, + }, + }} + + response, err := mne.Transport().CustomSet(context.Background(), req) + if err != nil { + log.Errorf("Failed to apply model of network element err=%+v, response=%+v", err, response) + return err + } + + return nil +} diff --git a/controller/nucleus/model/networkElement_test.go b/controller/nucleus/domain/model/networkElement_test.go similarity index 100% rename from controller/nucleus/model/networkElement_test.go rename to controller/nucleus/domain/model/networkElement_test.go diff --git a/controller/nucleus/domain/model/plugin.go b/controller/nucleus/domain/model/plugin.go new file mode 100644 index 0000000000000000000000000000000000000000..f2a2c72fba4fbc68296eab3e8a77e8cf7384860f --- /dev/null +++ b/controller/nucleus/domain/model/plugin.go @@ -0,0 +1,403 @@ +package model + +import ( + "encoding/json" + "fmt" + "net" + "os" + "os/exec" + "path/filepath" + "regexp" + + "code.fbi.h-da.de/danet/gosdn/controller/customerrs" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util" + "code.fbi.h-da.de/danet/gosdn/controller/plugin/shared" + "github.com/google/uuid" + hcplugin "github.com/hashicorp/go-plugin" + "go.mongodb.org/mongo-driver/bson" + "gopkg.in/yaml.v3" +) + +// State represents the current state of a plugin within the controller. Since +// the plugins used within the controller are basic go plugins, they can be +// CREATED, BUILT, LOADED or FAULTY. A plugin can not be unloaded (this is a +// limitation of go plugins in general). +type State int64 + +const ( + //CREATED state describes a plugin which has been created but is not yet + //built. + CREATED State = iota + // INITIALIZED state describes a plugin which is running and has been + // initialized with the model data of the associated network element. + INITIALIZED + // FAULTY state describes a plugin which couldn't be built or loaded. + FAULTY +) + +// Plugin describes an interface for a plugin within the controller. A plugin +// is based on hashicorp's `go plugin`. +type PluginIface interface { + ID() uuid.UUID + GetClient() *hcplugin.Client + State() State + Manifest() *Manifest + ExecPath() string + Update() error + Ping() error + Restart() error + Close() + shared.DeviceModel +} + +// Manifest represents the manifest of a plugin. +type Manifest struct { + // Name of the plugin + Name string `yaml:"name" json:"name" bson:"name"` + // Name of the plugin + Firmware string `yaml:"firmware" json:"firmware" bson:"firmware"` + // Author of the plugin + Author string `yaml:"author" json:"author" bson:"author"` + // Version of the plugin + Version string `yaml:"version" json:"version" bson:"version"` +} + +// Validate is a method to check if the manifest is valid and is compliant with +// the requirements. +func (m *Manifest) Validate() error { + errs := []error{} + if m.Name == "" { + errs = append(errs, fmt.Errorf("Name is required")) + } + if m.Firmware == "" { + errs = append(errs, fmt.Errorf("Firmware is required")) + } + if m.Author == "" { + errs = append(errs, fmt.Errorf("Author is required")) + } + if m.Version == "" { + errs = append(errs, fmt.Errorf("Version is required")) + } + // regex from: https://stackoverflow.com/a/68921827 + validVersion, err := regexp.MatchString(`^([1-9]\d*|0)(\.(([1-9]\d*)|0)){2}$`, + m.Version) + if err != nil { + errs = append(errs, err) + } + if !validVersion { + errs = append(errs, fmt.Errorf("Version has to be of form: X.X.X")) + } + if len(errs) != 0 { + return customerrs.CombinedErrListError{Errors: errs} + } + return nil +} + +// ReadManifestFromFile reads a manifest file and returns a pointer to a newly +// created Manifest. +func ReadManifestFromFile(path string) (*Manifest, error) { + manifest := &Manifest{} + + manifestFile, err := os.ReadFile(filepath.Join(path, util.ManifestFileName)) + if err != nil { + return nil, err + } + + err = yaml.Unmarshal(manifestFile, manifest) + if err != nil { + return nil, err + } + + // validate the loaded manifest + if err := manifest.Validate(); err != nil { + return nil, err + } + + return manifest, nil +} + +type LoadedPlugin struct { + // ID represents the UUID of the LoadedPlugin. + ID string `json:"id" bson:"_id"` + // Manifest represents the manifest of the LoadedPlugin. + Manifest Manifest `json:"manifest" bson:"manifest"` + // State represents the state of the LoadedPlugin. + State State `json:"state,omitempty" bson:"state"` + // ExecPath represents the path to the executable of the plugin. + ExecPath string `json:"exec_path,omitempty" bson:"exec_path"` + // ReattachConfig represents the configuration to reattach to a already + // running plugin. + ReattachConfig hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"` +} + +func (lp *LoadedPlugin) UnmarshalBSON(data []byte) error { + loadedPluginHelper := new(LoadedPluginHelper) + if err := bson.Unmarshal(data, loadedPluginHelper); err != nil { + return err + } + + lp.ID = loadedPluginHelper.ID + lp.Manifest = loadedPluginHelper.Manifest + lp.State = loadedPluginHelper.State + lp.ExecPath = loadedPluginHelper.ExecPath + lp.ReattachConfig = hcplugin.ReattachConfig{ + Protocol: hcplugin.Protocol(loadedPluginHelper.ReattachConfig.Protocol), + ProtocolVersion: loadedPluginHelper.ReattachConfig.ProtocolVersion, + Addr: &net.UnixAddr{ + Name: loadedPluginHelper.ReattachConfig.Addr.Name, + Net: loadedPluginHelper.ReattachConfig.Addr.Net, + }, + Pid: loadedPluginHelper.ReattachConfig.Pid, + Test: loadedPluginHelper.ReattachConfig.Test, + } + + return nil +} + +func (lp *LoadedPlugin) UnmarshalJSON(data []byte) error { + loadedPluginHelper := new(LoadedPluginHelper) + if err := json.Unmarshal(data, loadedPluginHelper); err != nil { + return err + } + + lp.ID = loadedPluginHelper.ID + lp.Manifest = loadedPluginHelper.Manifest + lp.State = loadedPluginHelper.State + lp.ExecPath = loadedPluginHelper.ExecPath + lp.ReattachConfig = hcplugin.ReattachConfig{ + Protocol: hcplugin.Protocol(loadedPluginHelper.ReattachConfig.Protocol), + ProtocolVersion: loadedPluginHelper.ReattachConfig.ProtocolVersion, + Addr: &net.UnixAddr{ + Name: loadedPluginHelper.ReattachConfig.Addr.Name, + Net: loadedPluginHelper.ReattachConfig.Addr.Net, + }, + Pid: loadedPluginHelper.ReattachConfig.Pid, + Test: loadedPluginHelper.ReattachConfig.Test, + } + + return nil +} + +type LoadedPluginHelper struct { + ID string `json:"id" bson:"_id"` + Manifest Manifest `json:"manifest" bson:"manifest"` + State State `json:"state,omitempty" bson:"state"` + ExecPath string `json:"exec_path,omitempty" bson:"exec_path"` + ReattachConfig LoadedReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"` +} + +type LoadedReattachConfig struct { + Protocol string + ProtocolVersion int + Addr LoadedAddress + Pid int + Test bool +} + +type LoadedAddress struct { + Name string + Net string +} + +// Plugin is the controllers internal representation of a plugin. +type Plugin struct { + UUID uuid.UUID + state State + execPath string + manifest *Manifest + client *hcplugin.Client + shared.DeviceModel +} + +// NewPlugin creates a new Plugin. +func NewPlugin(id uuid.UUID, execPath string) (*Plugin, error) { + client := hcplugin.NewClient(&hcplugin.ClientConfig{ + HandshakeConfig: shared.Handshake, + Plugins: shared.PluginMap, + Cmd: exec.Command("sh", "-c", filepath.Join(execPath, util.PluginExecutableName)), + AllowedProtocols: []hcplugin.Protocol{hcplugin.ProtocolGRPC}, + }) + + manifest, err := ReadManifestFromFile(execPath) + if err != nil { + return nil, err + } + + // create a client that is within the AllowedProtocols. In this case this + // returns a gRPCClient. Allows to connect through gRPC. + gRPCClient, err := client.Client() + if err != nil { + return nil, err + } + + // Request the plugin. This returns the gRPC client from the + // DeviceModelPlugin. This can then be casted to the interface that we are + // exposing through the plugin (in this case "DeviceModel"). + raw, err := gRPCClient.Dispense("deviceModel") + if err != nil { + return nil, err + } + + // cast the raw plugin to the DeviceModel interface. This allows to call + // methods on the plugin as if it were a normal DeviceModel instance but + // actually they are executed on the plugin sent through gRPC. + model, ok := raw.(shared.DeviceModel) + if !ok { + return nil, customerrs.InvalidTypeAssertionError{ + Value: raw, + Type: (*shared.DeviceModel)(nil), + } + } + + return &Plugin{ + UUID: id, + client: client, + execPath: execPath, + DeviceModel: model, + manifest: manifest, + state: CREATED, + }, nil +} + +// NewPluginThroughReattachConfig creates a new Plugin through a reattach config. +func NewPluginThroughReattachConfig(loadedPlugin LoadedPlugin) (*Plugin, error) { + client := hcplugin.NewClient(&hcplugin.ClientConfig{ + HandshakeConfig: shared.Handshake, + Plugins: shared.PluginMap, + Reattach: &loadedPlugin.ReattachConfig, + AllowedProtocols: []hcplugin.Protocol{hcplugin.ProtocolGRPC}, + }) + + // create a client that is within the AllowedProtocols. In this case this + // returns a gRPCClient. Allows to connect through gRPC. + gRPCClient, err := client.Client() + if err != nil { + return nil, err + } + + // Request the plugin. This returns the gRPC client from the + // DeviceModelPlugin. This can then be casted to the interface that we are + // exposing through the plugin (in this case "DeviceModel"). + raw, err := gRPCClient.Dispense("deviceModel") + if err != nil { + return nil, err + } + + // cast the raw plugin to the DeviceModel interface. This allows to call + // methods on the plugin as if it were a normal DeviceModel instance but + // actually they are executed on the plugin sent through gRPC. + model, ok := raw.(shared.DeviceModel) + if !ok { + return nil, customerrs.InvalidTypeAssertionError{ + Value: model, + Type: (*shared.DeviceModel)(nil), + } + } + + return &Plugin{ + UUID: uuid.MustParse(loadedPlugin.ID), + client: client, + DeviceModel: model, + manifest: &loadedPlugin.Manifest, + state: INITIALIZED, + }, nil +} + +// ID returns the ID of the plugin. +func (p *Plugin) ID() uuid.UUID { + return p.UUID +} + +// ID returns the ID of the plugin. +func (p *Plugin) ReattachConfig() *hcplugin.ReattachConfig { + return p.client.ReattachConfig() +} + +// State returns the current state of the plugin. +// Different states of the plugin can be: +// - created +// - initialized +// - faulty +func (p *Plugin) State() State { + return p.state +} + +// ExecPath returns the path to the executable of the plugin. +func (p *Plugin) ExecPath() string { + return p.execPath +} + +// GetClient returns the client of the plugin. +func (p *Plugin) GetClient() *hcplugin.Client { + return p.client +} + +// Manifest returns the manifest of the plugin. +func (p *Plugin) Manifest() *Manifest { + return p.manifest +} + +// Update updates the plugin to the latest available version. +func (p *Plugin) Update() error { + return fmt.Errorf("not implemented yet") +} + +// Restart restarts the plugin. +func (p *Plugin) Restart() error { + return fmt.Errorf("not implemented yet") +} + +// Close ends the execution of the plugin. +func (p *Plugin) Close() { + p.client.Kill() +} + +// Ping checks if the client connection is healthy. +func (p *Plugin) Ping() error { + protocolClient, err := p.client.Client() + if err != nil { + return err + } + return protocolClient.Ping() +} + +// TODO: update for the new way of handling plugins +// UpdatePlugin updates a given Plugin. Therefore the version of the +// `plugin.yml` manifest file is compared to the version in use. If a new +// version is within the plugin folder, the new version of the plugin is built. +func UpdatePlugin(p plugin.Plugin) (updated bool, err error) { + return false, fmt.Errorf("not implemented yet") +} + +func (p *Plugin) MarshalJSON() ([]byte, error) { + return json.Marshal(&struct { + ID uuid.UUID `json:"id,omitempty"` + Manifest *Manifest `json:"manifest" bson:"manifest"` + State State `json:"state,omitempty" bson:"state"` + ExecPath string `json:"exec_path,omitempty" bson:"exec_path"` + ReattachConfig *hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"` + }{ + ID: p.ID(), + Manifest: p.Manifest(), + State: p.State(), + ExecPath: p.ExecPath(), + ReattachConfig: p.ReattachConfig(), + }) +} + +func (p *Plugin) MarshalBSON() ([]byte, error) { + return bson.Marshal(&struct { + ID string `bson:"_id,omitempty"` + Manifest *Manifest `json:"manifest" bson:"manifest"` + State State `json:"state,omitempty" bson:"state"` + ExecPath string `json:"exec_path,omitempty" bson:"exec_path"` + ReattachConfig *hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"` + }{ + ID: p.ID().String(), + Manifest: p.Manifest(), + State: p.State(), + ExecPath: p.ExecPath(), + ReattachConfig: p.ReattachConfig(), + }) +} diff --git a/controller/nucleus/model/plugin_test.go b/controller/nucleus/domain/model/plugin_test.go similarity index 100% rename from controller/nucleus/model/plugin_test.go rename to controller/nucleus/domain/model/plugin_test.go diff --git a/controller/nucleus/model/principalNetworkDomain.go b/controller/nucleus/domain/model/principalNetworkDomain.go similarity index 93% rename from controller/nucleus/model/principalNetworkDomain.go rename to controller/nucleus/domain/model/principalNetworkDomain.go index dbb3291079e3c342b2e4dd30094d7e2a1f4501c5..27c501f3c42efe3f49330c5a9bd99734e6ad090b 100644 --- a/controller/nucleus/model/principalNetworkDomain.go +++ b/controller/nucleus/domain/model/principalNetworkDomain.go @@ -9,6 +9,21 @@ import ( log "github.com/sirupsen/logrus" ) +// NetworkDomain provides an interface for network domain implementations +// like principal network domain or logical network domain. +type NetworkDomain interface { + GetName() string + GetDescription() string + ID() uuid.UUID +} + +// LoadedPnd represents a PND that was loaded. +type LoadedPnd struct { + ID string `json:"id" bson:"_id,omitempty"` + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` +} + // NewPNDEntity creates a PND object as it is stored in the storage. func NewPND(pndID uuid.UUID, name string, description string) networkdomain.NetworkDomain { pnd := &pndImplementation{ diff --git a/controller/nucleus/model/principalNetworkDomain_test.go b/controller/nucleus/domain/model/principalNetworkDomain_test.go similarity index 100% rename from controller/nucleus/model/principalNetworkDomain_test.go rename to controller/nucleus/domain/model/principalNetworkDomain_test.go diff --git a/controller/nucleus/model/restconf_transport.go b/controller/nucleus/domain/model/restconf_transport.go similarity index 100% rename from controller/nucleus/model/restconf_transport.go rename to controller/nucleus/domain/model/restconf_transport.go diff --git a/controller/nucleus/model/restconf_transport_test.go b/controller/nucleus/domain/model/restconf_transport_test.go similarity index 100% rename from controller/nucleus/model/restconf_transport_test.go rename to controller/nucleus/domain/model/restconf_transport_test.go diff --git a/controller/nucleus/model/transport.go b/controller/nucleus/domain/model/transport.go similarity index 100% rename from controller/nucleus/model/transport.go rename to controller/nucleus/domain/model/transport.go diff --git a/controller/nucleus/model/transport_test.go b/controller/nucleus/domain/model/transport_test.go similarity index 100% rename from controller/nucleus/model/transport_test.go rename to controller/nucleus/domain/model/transport_test.go diff --git a/controller/nucleus/domain/ports/ports.go b/controller/nucleus/domain/ports/ports.go new file mode 100644 index 0000000000000000000000000000000000000000..a64a8bb3382cb76f59594807557e43d1808cd12e --- /dev/null +++ b/controller/nucleus/domain/ports/ports.go @@ -0,0 +1,69 @@ +package ports + +import ( + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/store" + "github.com/google/uuid" +) + +// Store describes an interface for network element store implementations. +type NetworkElementStore interface { + Add(model.NetworkElement) error + Update(model.NetworkElement) error + Delete(model.NetworkElement) error + Get(store.Query) (model.LoadedNetworkElement, error) + GetAll() ([]model.LoadedNetworkElement, error) +} + +// Store describes an interface for plugin store implementations. +type PluginStore interface { + Add(*model.Plugin) error + Update(*model.Plugin) error + Delete(*model.Plugin) error + Get(store.Query) (model.LoadedPlugin, error) + GetAll() ([]model.LoadedPlugin, error) +} + +// PndStore describes an interface for pnd store implementations. +type PndStore interface { + Add(model.NetworkDomain) error + Delete(model.NetworkDomain) error + Get(store.Query) (model.LoadedPnd, error) + GetAll() ([]model.LoadedPnd, error) + PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error) + AddPendingChannel(id uuid.UUID, ch chan networkelement.Details) + RemovePendingChannel(id uuid.UUID) +} + +// Service describes an interface for network element service implementations. +type NetworkElementService interface { + Add(model.NetworkElement) error + Update(model.NetworkElement) error + UpdateModel(uuid.UUID, string) error + Delete(model.NetworkElement) error + Get(store.Query) (model.NetworkElement, error) + GetAll() ([]model.NetworkElement, error) + GetAllAsLoaded() ([]model.LoadedNetworkElement, error) +} + +// Service describes an interface for plugin service implementations. +type PluginService interface { + Add(*model.Plugin) error + Delete(*model.Plugin) error + Get(store.Query) (*model.Plugin, error) + GetAll() ([]*model.Plugin, error) + RequestPlugin(uuid.UUID) (*model.Plugin, error) +} + +// Service describes an interface for PND service implementation. +type PndService interface { + Add(model.NetworkDomain) error + Delete(model.NetworkDomain) error + Get(store.Query) (model.NetworkDomain, error) + GetAll() ([]model.NetworkDomain, error) + // Note: Implement these in case we want to use cSBI again. + // PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error) + // AddPendingChannel(id uuid.UUID, ch chan networkelement.Details) + // RemovePendingChannel(id uuid.UUID) +} diff --git a/controller/nucleus/initialise_test.go b/controller/nucleus/initialise_test.go index 7b98e690a2c1d65a48ad349ea03d87fcc92d209e..7255423eb200f717bbc26b0e9b7c0fdd9adaae5c 100644 --- a/controller/nucleus/initialise_test.go +++ b/controller/nucleus/initialise_test.go @@ -12,7 +12,7 @@ import ( "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/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto" "code.fbi.h-da.de/danet/gosdn/controller/test" "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" diff --git a/controller/nucleus/model/plugin.go b/controller/nucleus/model/plugin.go deleted file mode 100644 index 2fe4e0eaf121c017dd25549550b2315928fa5293..0000000000000000000000000000000000000000 --- a/controller/nucleus/model/plugin.go +++ /dev/null @@ -1,218 +0,0 @@ -package model - -import ( - "encoding/json" - "fmt" - "os/exec" - "path/filepath" - - "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util" - "code.fbi.h-da.de/danet/gosdn/controller/plugin/shared" - "github.com/google/uuid" - hcplugin "github.com/hashicorp/go-plugin" - "go.mongodb.org/mongo-driver/bson" -) - -// Plugin is the controllers internal representation of a plugin. -type Plugin struct { - UUID uuid.UUID - state plugin.State - execPath string - manifest *plugin.Manifest - client *hcplugin.Client - shared.DeviceModel -} - -// NewPlugin creates a new Plugin. -func NewPlugin(id uuid.UUID, execPath string) (*Plugin, error) { - client := hcplugin.NewClient(&hcplugin.ClientConfig{ - HandshakeConfig: shared.Handshake, - Plugins: shared.PluginMap, - Cmd: exec.Command("sh", "-c", filepath.Join(execPath, util.PluginExecutableName)), - AllowedProtocols: []hcplugin.Protocol{hcplugin.ProtocolGRPC}, - }) - - manifest, err := plugin.ReadManifestFromFile(execPath) - if err != nil { - return nil, err - } - - // create a client that is within the AllowedProtocols. In this case this - // returns a gRPCClient. Allows to connect through gRPC. - gRPCClient, err := client.Client() - if err != nil { - return nil, err - } - - // Request the plugin. This returns the gRPC client from the - // DeviceModelPlugin. This can then be casted to the interface that we are - // exposing through the plugin (in this case "DeviceModel"). - raw, err := gRPCClient.Dispense("deviceModel") - if err != nil { - return nil, err - } - - // cast the raw plugin to the DeviceModel interface. This allows to call - // methods on the plugin as if it were a normal DeviceModel instance but - // actually they are executed on the plugin sent through gRPC. - model, ok := raw.(shared.DeviceModel) - if !ok { - return nil, customerrs.InvalidTypeAssertionError{ - Value: raw, - Type: (*shared.DeviceModel)(nil), - } - } - - return &Plugin{ - UUID: id, - client: client, - execPath: execPath, - DeviceModel: model, - manifest: manifest, - state: plugin.CREATED, - }, nil -} - -// NewPluginThroughReattachConfig creates a new Plugin through a reattach config. -func NewPluginThroughReattachConfig(loadedPlugin plugin.LoadedPlugin) (plugin.Plugin, error) { - client := hcplugin.NewClient(&hcplugin.ClientConfig{ - HandshakeConfig: shared.Handshake, - Plugins: shared.PluginMap, - Reattach: &loadedPlugin.ReattachConfig, - AllowedProtocols: []hcplugin.Protocol{hcplugin.ProtocolGRPC}, - }) - - // create a client that is within the AllowedProtocols. In this case this - // returns a gRPCClient. Allows to connect through gRPC. - gRPCClient, err := client.Client() - if err != nil { - return nil, err - } - - // Request the plugin. This returns the gRPC client from the - // DeviceModelPlugin. This can then be casted to the interface that we are - // exposing through the plugin (in this case "DeviceModel"). - raw, err := gRPCClient.Dispense("deviceModel") - if err != nil { - return nil, err - } - - // cast the raw plugin to the DeviceModel interface. This allows to call - // methods on the plugin as if it were a normal DeviceModel instance but - // actually they are executed on the plugin sent through gRPC. - model, ok := raw.(shared.DeviceModel) - if !ok { - return nil, customerrs.InvalidTypeAssertionError{ - Value: model, - Type: (*shared.DeviceModel)(nil), - } - } - - return &Plugin{ - UUID: uuid.MustParse(loadedPlugin.ID), - client: client, - DeviceModel: model, - manifest: &loadedPlugin.Manifest, - state: plugin.INITIALIZED, - }, nil -} - -// ID returns the ID of the plugin. -func (p *Plugin) ID() uuid.UUID { - return p.UUID -} - -// ID returns the ID of the plugin. -func (p *Plugin) ReattachConfig() *hcplugin.ReattachConfig { - return p.client.ReattachConfig() -} - -// State returns the current state of the plugin. -// Different states of the plugin can be: -// - created -// - initialized -// - faulty -func (p *Plugin) State() plugin.State { - return p.state -} - -// ExecPath returns the path to the executable of the plugin. -func (p *Plugin) ExecPath() string { - return p.execPath -} - -// GetClient returns the client of the plugin. -func (p *Plugin) GetClient() *hcplugin.Client { - return p.client -} - -// Manifest returns the manifest of the plugin. -func (p *Plugin) Manifest() *plugin.Manifest { - return p.manifest -} - -// Update updates the plugin to the latest available version. -func (p *Plugin) Update() error { - return fmt.Errorf("not implemented yet") -} - -// Restart restarts the plugin. -func (p *Plugin) Restart() error { - return fmt.Errorf("not implemented yet") -} - -// Close ends the execution of the plugin. -func (p *Plugin) Close() { - p.client.Kill() -} - -// Ping checks if the client connection is healthy. -func (p *Plugin) Ping() error { - protocolClient, err := p.client.Client() - if err != nil { - return err - } - return protocolClient.Ping() -} - -// TODO: update for the new way of handling plugins -// UpdatePlugin updates a given Plugin. Therefore the version of the -// `plugin.yml` manifest file is compared to the version in use. If a new -// version is within the plugin folder, the new version of the plugin is built. -func UpdatePlugin(p plugin.Plugin) (updated bool, err error) { - return false, fmt.Errorf("not implemented yet") -} - -func (p *Plugin) MarshalJSON() ([]byte, error) { - return json.Marshal(&struct { - ID uuid.UUID `json:"id,omitempty"` - Manifest *plugin.Manifest `json:"manifest" bson:"manifest"` - State plugin.State `json:"state,omitempty" bson:"state"` - ExecPath string `json:"exec_path,omitempty" bson:"exec_path"` - ReattachConfig *hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"` - }{ - ID: p.ID(), - Manifest: p.Manifest(), - State: p.State(), - ExecPath: p.ExecPath(), - ReattachConfig: p.ReattachConfig(), - }) -} - -func (p *Plugin) MarshalBSON() ([]byte, error) { - return bson.Marshal(&struct { - ID string `bson:"_id,omitempty"` - Manifest *plugin.Manifest `json:"manifest" bson:"manifest"` - State plugin.State `json:"state,omitempty" bson:"state"` - ExecPath string `json:"exec_path,omitempty" bson:"exec_path"` - ReattachConfig *hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"` - }{ - ID: p.ID().String(), - Manifest: p.Manifest(), - State: p.State(), - ExecPath: p.ExecPath(), - ReattachConfig: p.ReattachConfig(), - }) -} diff --git a/controller/nucleus/networkElementStore.go b/controller/nucleus/networkElementStore.go deleted file mode 100644 index 3d1449c204a5cee0f3706444681d6e8ce41fbac9..0000000000000000000000000000000000000000 --- a/controller/nucleus/networkElementStore.go +++ /dev/null @@ -1,25 +0,0 @@ -package nucleus - -import ( - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" - "code.fbi.h-da.de/danet/gosdn/controller/store" - - log "github.com/sirupsen/logrus" -) - -// NewNetworkElementStore returns a NetworkElementStore. -func NewNetworkElementStore() networkelement.Store { - storeMode := store.GetStoreMode() - log.Debugf("StoreMode: %s", storeMode) - - switch storeMode { - case store.Database: - return &DatabaseNetworkElementStore{ - storeName: "networkElement-store.json", - } - - default: - store := NewFilesystemNetworkElementStore() - return store - } -} diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go index 3c88f4f1bb64ccb2fa4e07f5a1fa2fc03d24cb46..f2822883e0d2c0c9e8459c3e366f3489850c2ab3 100644 --- a/controller/nucleus/networkElementWatcher.go +++ b/controller/nucleus/networkElementWatcher.go @@ -9,8 +9,9 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/event" eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event" - "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/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/types" "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" "github.com/google/uuid" @@ -30,7 +31,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 { - mneService networkelement.Service + mneService ports.NetworkElementService networkelementSubcriptions map[uuid.UUID]*networkelementSubscriptionHelper eventService eventInterfaces.Service } @@ -42,7 +43,7 @@ type networkelementSubscriptionHelper struct { } // NewNetworkElementWatcher allows to subscribe to network element paths. -func NewNetworkElementWatcher(mneService networkelement.Service, eventService eventInterfaces.Service) *NetworkElementWatcher { +func NewNetworkElementWatcher(mneService ports.NetworkElementService, eventService eventInterfaces.Service) *NetworkElementWatcher { return &NetworkElementWatcher{ mneService: mneService, networkelementSubcriptions: make(map[uuid.UUID]*networkelementSubscriptionHelper), @@ -74,7 +75,7 @@ func (n *NetworkElementWatcher) SubscribeToNetworkElements(paths [][]string, opt } } -func (n *NetworkElementWatcher) subscribeToNetworkElement(mne networkelement.NetworkElement, opts *gnmi.SubscribeOptions) { +func (n *NetworkElementWatcher) subscribeToNetworkElement(mne model.NetworkElement, opts *gnmi.SubscribeOptions) { subID := uuid.New() stopContext, cancel := context.WithCancel(context.Background()) @@ -88,7 +89,7 @@ func (n *NetworkElementWatcher) subscribeToNetworkElement(mne networkelement.Net // callSubscribe spawns a worker pool to handle gNMI subscription updates for each individual subscription // and then sets up the gNMI subscription listener. -func (n *NetworkElementWatcher) callSubscribe(stopContext context.Context, mne networkelement.NetworkElement, opts *gnmi.SubscribeOptions) { +func (n *NetworkElementWatcher) callSubscribe(stopContext context.Context, mne model.NetworkElement, opts *gnmi.SubscribeOptions) { gNMIOptionsCtx := context.Background() gNMIOptionsCtx = context.WithValue(gNMIOptionsCtx, types.CtxKeyOpts, opts) @@ -187,11 +188,11 @@ func (n *NetworkElementWatcher) handleSubscribeResponseUpdate(resp *gpb.Subscrib } pubEvent := event.NewMneUpdateEvent(mneID, pathsAndValues) - if err := n.eventService.PublishEvent(NetworkElementEventTopic, pubEvent); err != nil { + if err := n.eventService.PublishEvent(model.NetworkElementEventTopic, pubEvent); err != nil { go func() { n.eventService.Reconnect() - retryErr := n.eventService.RetryPublish(NetworkElementEventTopic, pubEvent) + retryErr := n.eventService.RetryPublish(model.NetworkElementEventTopic, pubEvent) if retryErr != nil { log.Error(retryErr) } diff --git a/controller/nucleus/networkElementFilesystemStore.go b/controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore.go similarity index 80% rename from controller/nucleus/networkElementFilesystemStore.go rename to controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore.go index d4b5850cd0e33126db0708855ac63554c9fe12f7..c15b40aef4e504fe1b7e79b4547effa0bbb069d0 100644 --- a/controller/nucleus/networkElementFilesystemStore.go +++ b/controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore.go @@ -1,4 +1,4 @@ -package nucleus +package filesystem import ( "encoding/json" @@ -6,7 +6,8 @@ import ( "sync" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" log "github.com/sirupsen/logrus" ) @@ -18,7 +19,7 @@ type FilesystemNetworkElementStore struct { } // NewFilesystemNetworkElementStore returns a filesystem implementation for a pnd store. -func NewFilesystemNetworkElementStore() networkelement.Store { +func NewFilesystemNetworkElementStore() ports.NetworkElementStore { if err := store.EnsureFilesystemStorePathExists(store.NetworkElementFilenameSuffix); err != nil { log.Error(err) } @@ -28,8 +29,8 @@ func NewFilesystemNetworkElementStore() networkelement.Store { } } -func (s *FilesystemNetworkElementStore) readAllNetworkElementsFromFile() ([]networkelement.LoadedNetworkElement, error) { - var loadedNetworkElements []networkelement.LoadedNetworkElement +func (s *FilesystemNetworkElementStore) readAllNetworkElementsFromFile() ([]model.LoadedNetworkElement, error) { + var loadedNetworkElements []model.LoadedNetworkElement content, err := os.ReadFile(s.pathToNetworkElementFile) if err != nil { @@ -44,7 +45,7 @@ func (s *FilesystemNetworkElementStore) readAllNetworkElementsFromFile() ([]netw return loadedNetworkElements, nil } -func (s *FilesystemNetworkElementStore) writeAllNetworkElementsToFile(mnes []networkelement.LoadedNetworkElement) error { +func (s *FilesystemNetworkElementStore) writeAllNetworkElementsToFile(mnes []model.LoadedNetworkElement) error { serializedData, err := json.Marshal(mnes) if err != nil { return err @@ -59,11 +60,11 @@ func (s *FilesystemNetworkElementStore) writeAllNetworkElementsToFile(mnes []net } // Get takes a network element's UUID or name and returns the network element. -func (s *FilesystemNetworkElementStore) Get(query store.Query) (networkelement.LoadedNetworkElement, error) { +func (s *FilesystemNetworkElementStore) Get(query store.Query) (model.LoadedNetworkElement, error) { s.fileMutex.Lock() defer s.fileMutex.Unlock() - var lMNE networkelement.LoadedNetworkElement + var lMNE model.LoadedNetworkElement mnes, err := s.readAllNetworkElementsFromFile() if err != nil { @@ -80,7 +81,7 @@ func (s *FilesystemNetworkElementStore) Get(query store.Query) (networkelement.L } // GetAll returns all stored network elements. -func (s *FilesystemNetworkElementStore) GetAll() ([]networkelement.LoadedNetworkElement, error) { +func (s *FilesystemNetworkElementStore) GetAll() ([]model.LoadedNetworkElement, error) { s.fileMutex.Lock() defer s.fileMutex.Unlock() @@ -90,7 +91,7 @@ func (s *FilesystemNetworkElementStore) GetAll() ([]networkelement.LoadedNetwork } // Add adds a network element to the network element store. -func (s *FilesystemNetworkElementStore) Add(networkElementToAdd networkelement.NetworkElement) error { +func (s *FilesystemNetworkElementStore) Add(networkElementToAdd model.NetworkElement) error { s.fileMutex.Lock() defer s.fileMutex.Unlock() @@ -99,8 +100,8 @@ func (s *FilesystemNetworkElementStore) Add(networkElementToAdd networkelement.N return err } - var loadedNetworkElement networkelement.LoadedNetworkElement - loadedNetworkElement, err = store.TransformObjectToLoadedObject[networkelement.NetworkElement, networkelement.LoadedNetworkElement](networkElementToAdd) + var loadedNetworkElement model.LoadedNetworkElement + loadedNetworkElement, err = store.TransformObjectToLoadedObject[model.NetworkElement, model.LoadedNetworkElement](networkElementToAdd) if err != nil { return err } @@ -116,11 +117,11 @@ func (s *FilesystemNetworkElementStore) Add(networkElementToAdd networkelement.N } // Update updates a existing network element. -func (s *FilesystemNetworkElementStore) Update(networkElementToUpdate networkelement.NetworkElement) error { +func (s *FilesystemNetworkElementStore) Update(networkElementToUpdate model.NetworkElement) error { s.fileMutex.Lock() defer s.fileMutex.Unlock() - loadedNetworkElementToUpdate, err := store.TransformObjectToLoadedObject[networkelement.NetworkElement, networkelement.LoadedNetworkElement](networkElementToUpdate) + loadedNetworkElementToUpdate, err := store.TransformObjectToLoadedObject[model.NetworkElement, model.LoadedNetworkElement](networkElementToUpdate) if err != nil { return err } @@ -145,7 +146,7 @@ func (s *FilesystemNetworkElementStore) Update(networkElementToUpdate networkele } // Delete deletes a network element from the network element store. -func (s *FilesystemNetworkElementStore) Delete(networkElementToDelete networkelement.NetworkElement) error { +func (s *FilesystemNetworkElementStore) Delete(networkElementToDelete model.NetworkElement) error { s.fileMutex.Lock() defer s.fileMutex.Unlock() diff --git a/controller/nucleus/networkElementFilesystemStore_test.go b/controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore_test.go similarity index 98% rename from controller/nucleus/networkElementFilesystemStore_test.go rename to controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore_test.go index eb83bd32d818a090504f243fac65d07c1269640c..b4c630a41567727ace3849f72d7e4dd054026e9a 100644 --- a/controller/nucleus/networkElementFilesystemStore_test.go +++ b/controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore_test.go @@ -1,4 +1,4 @@ -package nucleus +package filesystem import ( "testing" @@ -7,7 +7,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/conflict" "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/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/stretchr/testify/mock" diff --git a/controller/nucleus/pluginFilesystemStore.go b/controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore.go similarity index 70% rename from controller/nucleus/pluginFilesystemStore.go rename to controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore.go index cc48af4a242bbac3001ae6e668ec58fb6a82f658..c1e74b4fe5b726d0d648d450d1b400f974cd9799 100644 --- a/controller/nucleus/pluginFilesystemStore.go +++ b/controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore.go @@ -1,4 +1,4 @@ -package nucleus +package filesystem import ( "encoding/json" @@ -6,7 +6,8 @@ import ( "sync" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" log "github.com/sirupsen/logrus" @@ -19,7 +20,7 @@ type FilesystemPluginStore struct { } // NewFilesystemPluginStore returns a filesystem implementation for a plugin store. -func NewFilesystemPluginStore() plugin.Store { +func NewFilesystemPluginStore() ports.PluginStore { if err := store.EnsureFilesystemStorePathExists(store.PluginFilenameSuffix); err != nil { log.Error(err) } @@ -30,8 +31,8 @@ func NewFilesystemPluginStore() plugin.Store { } } -func (s *FilesystemPluginStore) readAllPluginsFromFile() ([]plugin.LoadedPlugin, error) { - var loadedPlugins []plugin.LoadedPlugin +func (s *FilesystemPluginStore) readAllPluginsFromFile() ([]model.LoadedPlugin, error) { + var loadedPlugins []model.LoadedPlugin content, err := os.ReadFile(s.pathToPluginFile) if err != nil { @@ -45,7 +46,7 @@ func (s *FilesystemPluginStore) readAllPluginsFromFile() ([]plugin.LoadedPlugin, return loadedPlugins, nil } -func (s *FilesystemPluginStore) writeAllPluginsToFile(plugins []plugin.LoadedPlugin) error { +func (s *FilesystemPluginStore) writeAllPluginsToFile(plugins []model.LoadedPlugin) error { serializedData, err := json.Marshal(plugins) if err != nil { return err @@ -59,7 +60,7 @@ func (s *FilesystemPluginStore) writeAllPluginsToFile(plugins []plugin.LoadedPlu } // Add adds a Plugin. -func (s *FilesystemPluginStore) Add(pluginToAdd plugin.Plugin) error { +func (s *FilesystemPluginStore) Add(pluginToAdd *model.Plugin) error { s.fileMutex.Lock() defer s.fileMutex.Unlock() @@ -68,8 +69,8 @@ func (s *FilesystemPluginStore) Add(pluginToAdd plugin.Plugin) error { return err } - var loadedPlugin plugin.LoadedPlugin - loadedPlugin, err = store.TransformObjectToLoadedObject[plugin.Plugin, plugin.LoadedPlugin](pluginToAdd) + var loadedPlugin model.LoadedPlugin + loadedPlugin, err = s.transformObjectToLoadedObject(pluginToAdd) if err != nil { return err } @@ -85,11 +86,11 @@ func (s *FilesystemPluginStore) Add(pluginToAdd plugin.Plugin) error { } // Update updates an existing plugin. -func (s *FilesystemPluginStore) Update(pluginToUpdate plugin.Plugin) error { +func (s *FilesystemPluginStore) Update(pluginToUpdate *model.Plugin) error { s.fileMutex.Lock() defer s.fileMutex.Unlock() - loadedPluginToUpdate, err := store.TransformObjectToLoadedObject[plugin.Plugin, plugin.LoadedPlugin](pluginToUpdate) + loadedPluginToUpdate, err := s.transformObjectToLoadedObject(pluginToUpdate) if err != nil { return err } @@ -114,7 +115,7 @@ func (s *FilesystemPluginStore) Update(pluginToUpdate plugin.Plugin) error { } // Delete deletes an Plugin. -func (s *FilesystemPluginStore) Delete(pluginToDelete plugin.Plugin) error { +func (s *FilesystemPluginStore) Delete(pluginToDelete *model.Plugin) error { s.fileMutex.Lock() defer s.fileMutex.Unlock() @@ -142,11 +143,11 @@ func (s *FilesystemPluginStore) Delete(pluginToDelete plugin.Plugin) error { // Get takes a Plugin's UUID or name and returns the Plugin. If the requested // Plugin does not exist an error is returned. -func (s *FilesystemPluginStore) Get(query store.Query) (plugin.LoadedPlugin, error) { +func (s *FilesystemPluginStore) Get(query store.Query) (model.LoadedPlugin, error) { s.fileMutex.Lock() defer s.fileMutex.Unlock() - var plugin plugin.LoadedPlugin + var plugin model.LoadedPlugin plugins, err := s.readAllPluginsFromFile() if err != nil { @@ -163,7 +164,7 @@ func (s *FilesystemPluginStore) Get(query store.Query) (plugin.LoadedPlugin, err } // GetAll returns all Plugins. -func (s *FilesystemPluginStore) GetAll() ([]plugin.LoadedPlugin, error) { +func (s *FilesystemPluginStore) GetAll() ([]model.LoadedPlugin, error) { s.fileMutex.Lock() defer s.fileMutex.Unlock() @@ -171,3 +172,19 @@ func (s *FilesystemPluginStore) GetAll() ([]plugin.LoadedPlugin, error) { return plugins, err } + +func (s *FilesystemPluginStore) transformObjectToLoadedObject(plugin *model.Plugin) (model.LoadedPlugin, error) { + var loadedObject model.LoadedPlugin + + serializedData, err := json.Marshal(plugin) + if err != nil { + return loadedObject, err + } + + err = json.Unmarshal(serializedData, &loadedObject) + if err != nil { + return loadedObject, err + } + + return loadedObject, err +} diff --git a/controller/nucleus/pluginFilesystemStore_test.go b/controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore_test.go similarity index 99% rename from controller/nucleus/pluginFilesystemStore_test.go rename to controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore_test.go index 195feba8afdb584b5b6f8aa38d10109499628131..ac2881c804720a224fb35514c882b38612e089a9 100644 --- a/controller/nucleus/pluginFilesystemStore_test.go +++ b/controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore_test.go @@ -1,4 +1,4 @@ -package nucleus +package filesystem import ( "testing" diff --git a/controller/nucleus/pndFilesystemStore.go b/controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore.go similarity index 79% rename from controller/nucleus/pndFilesystemStore.go rename to controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore.go index 31c49239d8123a7c500cbefee4c6a23f9d394aec..eca2a0a91ede2309a9ee20149839868da3e1ee82 100644 --- a/controller/nucleus/pndFilesystemStore.go +++ b/controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore.go @@ -1,4 +1,4 @@ -package nucleus +package filesystem import ( "encoding/json" @@ -6,10 +6,9 @@ import ( "sync" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "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/plugin" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -18,19 +17,19 @@ import ( // FilesystemPndStore provides a filesystem implementation for a pnd store. type FilesystemPndStore struct { pendingChannels map[uuid.UUID]chan networkelement.Details - pluginService plugin.Service + pluginService ports.PluginService // csbiClient cpb.CsbiServiceClient pathToPndFile string fileMutex sync.Mutex } // NewFilesystemPndStore returns a filesystem implementation for a pnd store. -func NewFilesystemPndStore(pluginService plugin.Service) FilesystemPndStore { +func NewFilesystemPndStore(pluginService ports.PluginService) ports.PndStore { if err := store.EnsureFilesystemStorePathExists(store.PndFilename); err != nil { log.Error(err) } - return FilesystemPndStore{ + return &FilesystemPndStore{ pendingChannels: make(map[uuid.UUID]chan networkelement.Details), pathToPndFile: store.GetCompletePathToFileStore(store.PndFilename), fileMutex: sync.Mutex{}, @@ -38,8 +37,8 @@ func NewFilesystemPndStore(pluginService plugin.Service) FilesystemPndStore { } } -func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.LoadedPnd, error) { - var loadedPnds []networkdomain.LoadedPnd +func (t *FilesystemPndStore) readAllPndsFromFile() ([]model.LoadedPnd, error) { + var loadedPnds []model.LoadedPnd content, err := os.ReadFile(t.pathToPndFile) if err != nil { @@ -51,7 +50,7 @@ func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.LoadedPnd, e return nil, err } - pnds := make([]networkdomain.NetworkDomain, len(loadedPnds)) + pnds := make([]model.NetworkDomain, len(loadedPnds)) // csbiClient, err := t.getCsbiClient() // if err != nil { @@ -73,7 +72,7 @@ func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.LoadedPnd, e return loadedPnds, nil } -func (t *FilesystemPndStore) writeAllPndsToFile(pnds []networkdomain.LoadedPnd) error { +func (t *FilesystemPndStore) writeAllPndsToFile(pnds []model.LoadedPnd) error { serializedData, err := json.Marshal(pnds) if err != nil { return err @@ -88,7 +87,7 @@ func (t *FilesystemPndStore) writeAllPndsToFile(pnds []networkdomain.LoadedPnd) } // Add a pnd to the store. -func (t *FilesystemPndStore) Add(pndToAdd networkdomain.NetworkDomain) error { +func (t *FilesystemPndStore) Add(pndToAdd model.NetworkDomain) error { t.fileMutex.Lock() defer t.fileMutex.Unlock() @@ -97,8 +96,8 @@ func (t *FilesystemPndStore) Add(pndToAdd networkdomain.NetworkDomain) error { return err } - var loadedPnd networkdomain.LoadedPnd - loadedPnd, err = store.TransformObjectToLoadedObject[networkdomain.NetworkDomain, networkdomain.LoadedPnd](pndToAdd) + var loadedPnd model.LoadedPnd + loadedPnd, err = store.TransformObjectToLoadedObject[model.NetworkDomain, model.LoadedPnd](pndToAdd) if err != nil { return err } @@ -114,7 +113,7 @@ func (t *FilesystemPndStore) Add(pndToAdd networkdomain.NetworkDomain) error { } // Delete deletes a pnd from the store. -func (t *FilesystemPndStore) Delete(pndToDelete networkdomain.NetworkDomain) error { +func (t *FilesystemPndStore) Delete(pndToDelete model.NetworkDomain) error { t.fileMutex.Lock() defer t.fileMutex.Unlock() @@ -142,11 +141,11 @@ func (t *FilesystemPndStore) Delete(pndToDelete networkdomain.NetworkDomain) err } // Get provides a the query interface to find a stored pnd. -func (t *FilesystemPndStore) Get(query store.Query) (networkdomain.LoadedPnd, error) { +func (t *FilesystemPndStore) Get(query store.Query) (model.LoadedPnd, error) { t.fileMutex.Lock() defer t.fileMutex.Unlock() - var loadedPND networkdomain.LoadedPnd + var loadedPND model.LoadedPnd pnds, err := t.readAllPndsFromFile() if err != nil { @@ -163,7 +162,7 @@ func (t *FilesystemPndStore) Get(query store.Query) (networkdomain.LoadedPnd, er } // GetAll returns all pnds currently on the store. -func (t *FilesystemPndStore) GetAll() ([]networkdomain.LoadedPnd, error) { +func (t *FilesystemPndStore) GetAll() ([]model.LoadedPnd, error) { t.fileMutex.Lock() defer t.fileMutex.Unlock() diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore_test.go similarity index 97% rename from controller/nucleus/pndFilesystemStore_test.go rename to controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore_test.go index 0ced4bf3e4d3efb350e0a490e883a5c58dab0b13..01e6aff9b40c546773d8e13779e6d82b237a5262 100644 --- a/controller/nucleus/pndFilesystemStore_test.go +++ b/controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore_test.go @@ -1,10 +1,10 @@ -package nucleus +package filesystem import ( "testing" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" ) diff --git a/controller/nucleus/memoryNetworkElementStore.go b/controller/nucleus/pkg/persistence/memory/memoryNetworkElementStore.go similarity index 68% rename from controller/nucleus/memoryNetworkElementStore.go rename to controller/nucleus/pkg/persistence/memory/memoryNetworkElementStore.go index 100410af71bffe51c7e8f46404194d2e780f4a73..1144dc9baa9df9883397edad024fa4dd65851fc7 100644 --- a/controller/nucleus/memoryNetworkElementStore.go +++ b/controller/nucleus/pkg/persistence/memory/memoryNetworkElementStore.go @@ -1,30 +1,31 @@ -package nucleus +package memory import ( "encoding/json" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" ) // MemoryNetworkElementStore provides a in-memory implementation for network elements. type MemoryNetworkElementStore struct { - Store map[string]networkelement.LoadedNetworkElement + Store map[string]model.LoadedNetworkElement nameLookupTable map[string]string } // NewMemoryNetworkElementStore returns a specific in-memory store for network elements. -func NewMemoryNetworkElementStore() networkelement.Store { +func NewMemoryNetworkElementStore() ports.NetworkElementStore { return &MemoryNetworkElementStore{ - Store: make(map[string]networkelement.LoadedNetworkElement), + Store: make(map[string]model.LoadedNetworkElement), nameLookupTable: make(map[string]string), } } // Add adds a item to the store. -func (t *MemoryNetworkElementStore) Add(item networkelement.NetworkElement) error { - var mne networkelement.LoadedNetworkElement +func (t *MemoryNetworkElementStore) Add(item model.NetworkElement) error { + var mne model.LoadedNetworkElement b, err := json.Marshal(item) if err != nil { @@ -47,13 +48,13 @@ func (t *MemoryNetworkElementStore) Add(item networkelement.NetworkElement) erro } // Update updates a existing network element. -func (t *MemoryNetworkElementStore) Update(item networkelement.NetworkElement) error { +func (t *MemoryNetworkElementStore) Update(item model.NetworkElement) error { _, ok := t.Store[item.ID().String()] if !ok { return customerrs.CouldNotFindError{ID: item.ID(), Name: item.Name()} } - var mne networkelement.LoadedNetworkElement + var mne model.LoadedNetworkElement b, err := json.Marshal(item) if err != nil { @@ -71,14 +72,14 @@ func (t *MemoryNetworkElementStore) Update(item networkelement.NetworkElement) e } // Delete deletes a network element from the network element store. -func (t *MemoryNetworkElementStore) Delete(item networkelement.NetworkElement) error { +func (t *MemoryNetworkElementStore) Delete(item model.NetworkElement) error { delete(t.Store, item.ID().String()) return nil } // Get takes a network element's UUID or name and returns the network element. -func (t *MemoryNetworkElementStore) Get(query store.Query) (networkelement.LoadedNetworkElement, error) { +func (t *MemoryNetworkElementStore) Get(query store.Query) (model.LoadedNetworkElement, error) { // First search for direct hit on UUID. item, ok := t.Store[query.ID.String()] if !ok { @@ -100,8 +101,8 @@ func (t *MemoryNetworkElementStore) Get(query store.Query) (networkelement.Loade } // GetAll returns all stored network elements. -func (t *MemoryNetworkElementStore) GetAll() ([]networkelement.LoadedNetworkElement, error) { - var allItems []networkelement.LoadedNetworkElement +func (t *MemoryNetworkElementStore) GetAll() ([]model.LoadedNetworkElement, error) { + var allItems []model.LoadedNetworkElement for _, item := range t.Store { allItems = append(allItems, item) diff --git a/controller/nucleus/memoryPluginStore.go b/controller/nucleus/pkg/persistence/memory/memoryPluginStore.go similarity index 99% rename from controller/nucleus/memoryPluginStore.go rename to controller/nucleus/pkg/persistence/memory/memoryPluginStore.go index 8c32b009ab5c4bdebb231d463fa34257909aca9b..1a346aec0752d41fa54299e78a5224037ead29c8 100644 --- a/controller/nucleus/memoryPluginStore.go +++ b/controller/nucleus/pkg/persistence/memory/memoryPluginStore.go @@ -1,4 +1,4 @@ -package nucleus +package memory import ( "encoding/json" diff --git a/controller/nucleus/memoryPndStore.go b/controller/nucleus/pkg/persistence/memory/memoryPndStore.go similarity index 75% rename from controller/nucleus/memoryPndStore.go rename to controller/nucleus/pkg/persistence/memory/memoryPndStore.go index 8fe4286e95ba819ccf099b38ae8f819364a6817b..f63abc7a3d11c69e945e8f650ab1ada28295aaef 100644 --- a/controller/nucleus/memoryPndStore.go +++ b/controller/nucleus/pkg/persistence/memory/memoryPndStore.go @@ -1,32 +1,33 @@ -package nucleus +package memory import ( "encoding/json" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "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/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" ) // MemoryPndStore provides a in-memory implementation for a pnd store. type MemoryPndStore struct { - Store map[uuid.UUID]networkdomain.LoadedPnd + Store map[uuid.UUID]model.LoadedPnd pendingChannels map[uuid.UUID]chan networkelement.Details } // NewMemoryPndStore returns a in-memory implementation for a pnd store. -func NewMemoryPndStore() networkdomain.PndStore { +func NewMemoryPndStore() ports.PndStore { return &MemoryPndStore{ - Store: make(map[uuid.UUID]networkdomain.LoadedPnd), + Store: make(map[uuid.UUID]model.LoadedPnd), pendingChannels: make(map[uuid.UUID]chan networkelement.Details), } } // Add adds a pnd to the store. -func (t *MemoryPndStore) Add(item networkdomain.NetworkDomain) error { - var pnd networkdomain.LoadedPnd +func (t *MemoryPndStore) Add(item model.NetworkDomain) error { + var pnd model.LoadedPnd b, err := json.Marshal(item) if err != nil { @@ -49,14 +50,14 @@ func (t *MemoryPndStore) Add(item networkdomain.NetworkDomain) error { } // Delete deletes a pnd from the store. -func (t *MemoryPndStore) Delete(item networkdomain.NetworkDomain) error { +func (t *MemoryPndStore) Delete(item model.NetworkDomain) error { delete(t.Store, item.ID()) return nil } // Get provides a the query interface to find a stored pnd. -func (t *MemoryPndStore) Get(query store.Query) (networkdomain.LoadedPnd, error) { +func (t *MemoryPndStore) Get(query store.Query) (model.LoadedPnd, error) { // First search for direct hit on UUID. item, ok := t.Store[query.ID] if !ok { @@ -67,8 +68,8 @@ func (t *MemoryPndStore) Get(query store.Query) (networkdomain.LoadedPnd, error) } // GetAll returns all pnds currently on the store. -func (t *MemoryPndStore) GetAll() ([]networkdomain.LoadedPnd, error) { - var allItems []networkdomain.LoadedPnd +func (t *MemoryPndStore) GetAll() ([]model.LoadedPnd, error) { + var allItems []model.LoadedPnd for _, item := range t.Store { allItems = append(allItems, item) diff --git a/controller/nucleus/databaseNetworkElementStore.go b/controller/nucleus/pkg/persistence/mongodb/databaseNetworkElementStore.go similarity index 80% rename from controller/nucleus/databaseNetworkElementStore.go rename to controller/nucleus/pkg/persistence/mongodb/databaseNetworkElementStore.go index ac23cbad7d37ffe739d73f5053831d8856c0762c..dd62e53e8b861d5421bc24b72c17a7015dbe4013 100644 --- a/controller/nucleus/databaseNetworkElementStore.go +++ b/controller/nucleus/pkg/persistence/mongodb/databaseNetworkElementStore.go @@ -1,13 +1,13 @@ -package nucleus +package mongodb import ( "fmt" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" @@ -24,15 +24,15 @@ type DatabaseNetworkElementStore struct { } // NewDatabaseNetworkElementStore returns a NetworkElementStore. -func NewDatabaseNetworkElementStore(pndUUID uuid.UUID) networkelement.Store { +func NewDatabaseNetworkElementStore() ports.NetworkElementStore { return &DatabaseNetworkElementStore{ - storeName: fmt.Sprintf("networkElement-store-%s.json", pndUUID.String()), + storeName: fmt.Sprintf("networkElement-store.json"), } } // Get takes a NetworkElement's UUID or name and returns the NetworkElement. -func (s *DatabaseNetworkElementStore) Get(query store.Query) (networkelement.LoadedNetworkElement, error) { - var loadedNetworkElement networkelement.LoadedNetworkElement +func (s *DatabaseNetworkElementStore) Get(query store.Query) (model.LoadedNetworkElement, error) { + var loadedNetworkElement model.LoadedNetworkElement if query.ID.String() != "" { loadedNetworkElement, err := s.getByID(query.ID) @@ -51,8 +51,8 @@ func (s *DatabaseNetworkElementStore) Get(query store.Query) (networkelement.Loa return loadedNetworkElement, nil } -func (s *DatabaseNetworkElementStore) getByID(idOfNetworkElement uuid.UUID) (loadedNetworkElement networkelement.LoadedNetworkElement, err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabaseNetworkElementStore) getByID(idOfNetworkElement uuid.UUID) (loadedNetworkElement model.LoadedNetworkElement, err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -60,7 +60,7 @@ func (s *DatabaseNetworkElementStore) getByID(idOfNetworkElement uuid.UUID) (loa err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString) } }() - db := client.Database(database.DatabaseName) + db := client.Database(DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfNetworkElement.String()}}) if result == nil { @@ -76,8 +76,8 @@ func (s *DatabaseNetworkElementStore) getByID(idOfNetworkElement uuid.UUID) (loa return loadedNetworkElement, nil } -func (s *DatabaseNetworkElementStore) getByName(nameOfNetworkElement string) (loadedNetworkElement networkelement.LoadedNetworkElement, err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabaseNetworkElementStore) getByName(nameOfNetworkElement string) (loadedNetworkElement model.LoadedNetworkElement, err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -85,7 +85,7 @@ func (s *DatabaseNetworkElementStore) getByName(nameOfNetworkElement string) (lo err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString) } }() - db := client.Database(database.DatabaseName) + db := client.Database(DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfNetworkElement}}) if result == nil { @@ -102,8 +102,8 @@ func (s *DatabaseNetworkElementStore) getByName(nameOfNetworkElement string) (lo } // GetAll returns all stored network elements. -func (s *DatabaseNetworkElementStore) GetAll() (loadedNetworkElements []networkelement.LoadedNetworkElement, err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabaseNetworkElementStore) GetAll() (loadedNetworkElements []model.LoadedNetworkElement, err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -112,7 +112,7 @@ func (s *DatabaseNetworkElementStore) GetAll() (loadedNetworkElements []networke } }() - db := client.Database(database.DatabaseName) + db := client.Database(DatabaseName) collection := db.Collection(s.storeName) cursor, err := collection.Find(ctx, bson.D{}) @@ -137,8 +137,8 @@ func (s *DatabaseNetworkElementStore) GetAll() (loadedNetworkElements []networke } // Add adds a network element to the network element store. -func (s *DatabaseNetworkElementStore) Add(networkElementToAdd networkelement.NetworkElement) (err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabaseNetworkElementStore) Add(networkElementToAdd model.NetworkElement) (err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -147,7 +147,7 @@ func (s *DatabaseNetworkElementStore) Add(networkElementToAdd networkelement.Net } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(DatabaseName). Collection(s.storeName). InsertOne(ctx, networkElementToAdd) if err != nil { @@ -159,10 +159,10 @@ func (s *DatabaseNetworkElementStore) Add(networkElementToAdd networkelement.Net } // Update updates a existing network element. -func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate networkelement.NetworkElement) (err error) { - var updatedLoadedNetworkElement networkelement.LoadedNetworkElement +func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate model.NetworkElement) (err error) { + var updatedLoadedNetworkElement model.LoadedNetworkElement - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -175,7 +175,7 @@ func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate networkeleme wcMajority := writeconcern.Majority() wcMajorityCollectionOpts := options.Collection().SetWriteConcern(wcMajority) - userCollection := client.Database(database.DatabaseName).Collection(s.storeName, wcMajorityCollectionOpts) + userCollection := client.Database(DatabaseName).Collection(s.storeName, wcMajorityCollectionOpts) session, err := client.StartSession() if err != nil { @@ -241,8 +241,8 @@ func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate networkeleme } // Delete deletes a network element from the network element store. -func (s *DatabaseNetworkElementStore) Delete(networkElementToDelete networkelement.NetworkElement) (err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabaseNetworkElementStore) Delete(networkElementToDelete model.NetworkElement) (err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -251,7 +251,7 @@ func (s *DatabaseNetworkElementStore) Delete(networkElementToDelete networkeleme } }() - db := client.Database(database.DatabaseName) + db := client.Database(DatabaseName) collection := db.Collection(s.storeName) _, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: networkElementToDelete.ID().String()}}) diff --git a/controller/nucleus/databasePluginStore.go b/controller/nucleus/pkg/persistence/mongodb/databasePluginStore.go similarity index 78% rename from controller/nucleus/databasePluginStore.go rename to controller/nucleus/pkg/persistence/mongodb/databasePluginStore.go index 8c98e5a15e2750852815b2f0ae4d3527d0ebfeda..19f9cd5fa876d409467cbf2ca3265e32fa459e36 100644 --- a/controller/nucleus/databasePluginStore.go +++ b/controller/nucleus/pkg/persistence/mongodb/databasePluginStore.go @@ -1,11 +1,11 @@ -package nucleus +package mongodb import ( "fmt" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/store" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" @@ -20,9 +20,15 @@ type DatabasePluginStore struct { pluginStoreName string } +func NewDatabasePluginStore() ports.PluginStore { + return &DatabasePluginStore{ + pluginStoreName: store.PluginFilenameSuffix, + } +} + // Add adds a plugin. -func (s *DatabasePluginStore) Add(pluginToAdd plugin.Plugin) (err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabasePluginStore) Add(pluginToAdd *model.Plugin) (err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -31,7 +37,7 @@ func (s *DatabasePluginStore) Add(pluginToAdd plugin.Plugin) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(DatabaseName). Collection(s.pluginStoreName). InsertOne(ctx, pluginToAdd) if err != nil { @@ -46,10 +52,10 @@ func (s *DatabasePluginStore) Add(pluginToAdd plugin.Plugin) (err error) { } // Update updates an existing plugin. -func (s *DatabasePluginStore) Update(pluginToUpdate plugin.Plugin) (err error) { - var updatedLoadedPlugin plugin.LoadedPlugin +func (s *DatabasePluginStore) Update(pluginToUpdate *model.Plugin) (err error) { + var updatedLoadedPlugin model.LoadedPlugin - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -67,7 +73,7 @@ func (s *DatabasePluginStore) Update(pluginToUpdate plugin.Plugin) (err error) { ReturnDocument: &after, } - err = client.Database(database.DatabaseName). + err = client.Database(DatabaseName). Collection(s.pluginStoreName). FindOneAndUpdate( ctx, bson.M{"_id": pluginToUpdate.ID().String()}, update, &opt). @@ -82,8 +88,8 @@ func (s *DatabasePluginStore) Update(pluginToUpdate plugin.Plugin) (err error) { } // Delete deletes an plugin. -func (s *DatabasePluginStore) Delete(pluginToDelete plugin.Plugin) (err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabasePluginStore) Delete(pluginToDelete *model.Plugin) (err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -92,7 +98,7 @@ func (s *DatabasePluginStore) Delete(pluginToDelete plugin.Plugin) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(DatabaseName). Collection(s.pluginStoreName). DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: pluginToDelete.ID().String()}}) if err != nil { @@ -104,8 +110,8 @@ func (s *DatabasePluginStore) Delete(pluginToDelete plugin.Plugin) (err error) { // Get takes a SouthboundInterface's UUID or name and returns the SouthboundInterface. If the requested // SouthboundInterface does not exist an error is returned. -func (s *DatabasePluginStore) Get(query store.Query) (loadedPlugin plugin.LoadedPlugin, err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabasePluginStore) Get(query store.Query) (loadedPlugin model.LoadedPlugin, err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -116,7 +122,7 @@ func (s *DatabasePluginStore) Get(query store.Query) (loadedPlugin plugin.Loaded log.Debugf("Plugin-Search-ID: %+v\n", query.ID.String()) - db := client.Database(database.DatabaseName) + db := client.Database(DatabaseName) collection := db.Collection(s.pluginStoreName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: query.ID.String()}}) if result == nil { @@ -134,8 +140,8 @@ func (s *DatabasePluginStore) Get(query store.Query) (loadedPlugin plugin.Loaded } // GetAll returns all plugin. -func (s *DatabasePluginStore) GetAll() (loadedPlugins []plugin.LoadedPlugin, err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabasePluginStore) GetAll() (loadedPlugins []model.LoadedPlugin, err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -143,7 +149,7 @@ func (s *DatabasePluginStore) GetAll() (loadedPlugins []plugin.LoadedPlugin, err err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString) } }() - db := client.Database(database.DatabaseName) + db := client.Database(DatabaseName) collection := db.Collection(s.pluginStoreName) cursor, err := collection.Find(ctx, bson.D{}) diff --git a/controller/nucleus/databasePndStore.go b/controller/nucleus/pkg/persistence/mongodb/databasePndStore.go similarity index 77% rename from controller/nucleus/databasePndStore.go rename to controller/nucleus/pkg/persistence/mongodb/databasePndStore.go index c5497a000e130713c4b1cc20ce7103ed5d259081..5b82e904935b9dbe3505e7268f0d4021a8946fb3 100644 --- a/controller/nucleus/databasePndStore.go +++ b/controller/nucleus/pkg/persistence/mongodb/databasePndStore.go @@ -1,14 +1,13 @@ -package nucleus +package mongodb import ( "fmt" - "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/plugin" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -18,15 +17,15 @@ import ( // DatabasePndStore is used to store PrincipalNetworkDomains. type DatabasePndStore struct { - pndStoreName string - pendingChannels map[uuid.UUID]chan networkelement.Details - pluginService plugin.Service + PndStoreName string + InternalPendingChannels map[uuid.UUID]chan networkelement.Details + PluginService ports.PluginService } // Get takes a PrincipalNetworkDomain's UUID or name and returns the PrincipalNetworkDomain. If the requested // PrincipalNetworkDomain does not exist an error is returned. -func (s *DatabasePndStore) Get(query store.Query) (newPnd networkdomain.LoadedPnd, err error) { - var loadedPND networkdomain.LoadedPnd +func (s *DatabasePndStore) Get(query store.Query) (newPnd model.LoadedPnd, err error) { + var loadedPND model.LoadedPnd if query.ID != uuid.Nil { loadedPND, err := s.getByID(query.ID) @@ -57,8 +56,8 @@ func (s *DatabasePndStore) Get(query store.Query) (newPnd networkdomain.LoadedPn return loadedPND, nil } -func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd networkdomain.LoadedPnd, err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd model.LoadedPnd, err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -67,8 +66,8 @@ func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd networkdomain.L } }() - db := client.Database(database.DatabaseName) - collection := db.Collection(s.pndStoreName) + db := client.Database(DatabaseName) + collection := db.Collection(s.PndStoreName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfPnd.String()}}) if result == nil { return loadedPnd, customerrs.CouldNotFindError{ID: idOfPnd} @@ -83,8 +82,8 @@ func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd networkdomain.L return loadedPnd, nil } -func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd networkdomain.LoadedPnd, err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd model.LoadedPnd, err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -93,8 +92,8 @@ func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd networkdomain. } }() - db := client.Database(database.DatabaseName) - collection := db.Collection(s.pndStoreName) + db := client.Database(DatabaseName) + collection := db.Collection(s.PndStoreName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfPnd}}) if result == nil { return loadedPnd, customerrs.CouldNotFindError{ID: nameOfPnd} @@ -110,10 +109,10 @@ func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd networkdomain. } // GetAll returns all stored pnds. -func (s *DatabasePndStore) GetAll() (pnds []networkdomain.LoadedPnd, err error) { - var loadedPnds []networkdomain.LoadedPnd +func (s *DatabasePndStore) GetAll() (pnds []model.LoadedPnd, err error) { + var loadedPnds []model.LoadedPnd - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -122,8 +121,8 @@ func (s *DatabasePndStore) GetAll() (pnds []networkdomain.LoadedPnd, err error) } }() - db := client.Database(database.DatabaseName) - collection := db.Collection(s.pndStoreName) + db := client.Database(DatabaseName) + collection := db.Collection(s.PndStoreName) cursor, err := collection.Find(ctx, bson.D{}) if err != nil { @@ -168,8 +167,8 @@ func (s *DatabasePndStore) GetAll() (pnds []networkdomain.LoadedPnd, err error) } // Add adds a pnd to the pnd store. -func (s *DatabasePndStore) Add(pndToAdd networkdomain.NetworkDomain) (err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabasePndStore) Add(pndToAdd model.NetworkDomain) (err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -178,8 +177,8 @@ func (s *DatabasePndStore) Add(pndToAdd networkdomain.NetworkDomain) (err error) } }() - _, err = client.Database(database.DatabaseName). - Collection(s.pndStoreName). + _, err = client.Database(DatabaseName). + Collection(s.PndStoreName). InsertOne(ctx, pndToAdd) if err != nil { return customerrs.CouldNotCreateError{Identifier: pndToAdd.ID(), Type: pndToAdd, Err: err} @@ -190,8 +189,8 @@ func (s *DatabasePndStore) Add(pndToAdd networkdomain.NetworkDomain) (err error) // Delete deletes a pnd. // It also deletes all assosicated devices and sbis. -func (s *DatabasePndStore) Delete(pndToDelete networkdomain.NetworkDomain) (err error) { - client, ctx, cancel := database.GetMongoConnection() +func (s *DatabasePndStore) Delete(pndToDelete model.NetworkDomain) (err error) { + client, ctx, cancel := GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -199,8 +198,8 @@ func (s *DatabasePndStore) Delete(pndToDelete networkdomain.NetworkDomain) (err err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString) } }() - db := client.Database(database.DatabaseName) - collection := db.Collection(s.pndStoreName) + db := client.Database(DatabaseName) + collection := db.Collection(s.PndStoreName) _, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: pndToDelete.ID().String()}}) if err != nil { return customerrs.CouldNotDeleteError{Identifier: pndToDelete.ID(), Type: pndToDelete, Err: err} @@ -214,7 +213,7 @@ func (s *DatabasePndStore) Delete(pndToDelete networkdomain.NetworkDomain) (err // PendingChannels holds channels used communicate with pending // cSBI deployments. func (s *DatabasePndStore) PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error) { - ch, ok := s.pendingChannels[id] + ch, ok := s.InternalPendingChannels[id] if !ok { return nil, &customerrs.CouldNotFindError{ID: id} } @@ -223,12 +222,12 @@ func (s *DatabasePndStore) PendingChannels(id uuid.UUID, parseErrors ...error) ( // AddPendingChannel adds a pending channel to the map. func (s *DatabasePndStore) AddPendingChannel(id uuid.UUID, ch chan networkelement.Details) { - s.pendingChannels[id] = ch + s.InternalPendingChannels[id] = ch } // RemovePendingChannel removes a pending channel from the map. func (s *DatabasePndStore) RemovePendingChannel(id uuid.UUID) { - delete(s.pendingChannels, id) + delete(s.InternalPendingChannels, id) } // func (s *DatabasePndStore) callback(id uuid.UUID, ch chan networkelement.Details) { diff --git a/controller/nucleus/database/mongo-connection.go b/controller/nucleus/pkg/persistence/mongodb/mongo-connection.go similarity index 98% rename from controller/nucleus/database/mongo-connection.go rename to controller/nucleus/pkg/persistence/mongodb/mongo-connection.go index 8e4bde62074e5f8e6217982fa49abdcdba487d35..2d89e3e46ddc4a22dd3a948d22cd95ac89451d1b 100644 --- a/controller/nucleus/database/mongo-connection.go +++ b/controller/nucleus/pkg/persistence/mongodb/mongo-connection.go @@ -1,4 +1,4 @@ -package database +package mongodb import ( "context" diff --git a/controller/nucleus/pkg/persistence/networkElementStore.go b/controller/nucleus/pkg/persistence/networkElementStore.go new file mode 100644 index 0000000000000000000000000000000000000000..0c6a51450e93c6203b0b549abd7f13eae0fab58c --- /dev/null +++ b/controller/nucleus/pkg/persistence/networkElementStore.go @@ -0,0 +1,25 @@ +package persistence + +import ( + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/filesystem" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" + "code.fbi.h-da.de/danet/gosdn/controller/store" + + log "github.com/sirupsen/logrus" +) + +// NewNetworkElementStore returns a NetworkElementStore. +func NewNetworkElementStore() ports.NetworkElementStore { + storeMode := store.GetStoreMode() + log.Debugf("StoreMode: %s", storeMode) + + switch storeMode { + case store.Database: + return mongodb.NewDatabaseNetworkElementStore() + + default: + store := filesystem.NewFilesystemNetworkElementStore() + return store + } +} diff --git a/controller/nucleus/pkg/persistence/pluginStore.go b/controller/nucleus/pkg/persistence/pluginStore.go new file mode 100644 index 0000000000000000000000000000000000000000..1d0385114c5e9f129761764b8a3a12e7b6fab6a4 --- /dev/null +++ b/controller/nucleus/pkg/persistence/pluginStore.go @@ -0,0 +1,22 @@ +package persistence + +import ( + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/filesystem" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" + "code.fbi.h-da.de/danet/gosdn/controller/store" +) + +// NewPluginStore returns a pluginStore. +func NewPluginStore() ports.PluginStore { + storeMode := store.GetStoreMode() + + switch storeMode { + case store.Database: + return mongodb.NewDatabasePluginStore() + + default: + store := filesystem.NewFilesystemPluginStore() + return store + } +} diff --git a/controller/nucleus/pndStore.go b/controller/nucleus/pkg/persistence/pndStore.go similarity index 56% rename from controller/nucleus/pndStore.go rename to controller/nucleus/pkg/persistence/pndStore.go index c865a26e20e241782ec5fbe26c7afd82a623db39..e690c626aa9ba04f0f2b682501b830cb19eadd34 100644 --- a/controller/nucleus/pndStore.go +++ b/controller/nucleus/pkg/persistence/pndStore.go @@ -1,9 +1,10 @@ -package nucleus +package persistence 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/plugin" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/filesystem" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -22,20 +23,19 @@ type PndStore struct { } // NewPndStore returns a PndStore. -func NewPndStore(pluginService plugin.Service) networkdomain.PndStore { +func NewPndStore(pluginService ports.PluginService) ports.PndStore { storeMode := store.GetStoreMode() log.Debugf("StoreMode: %s", storeMode) switch storeMode { case store.Database: - return &DatabasePndStore{ - pendingChannels: make(map[uuid.UUID]chan networkelement.Details), - pndStoreName: "pnd-store.json", - pluginService: pluginService, + return &mongodb.DatabasePndStore{ + InternalPendingChannels: make(map[uuid.UUID]chan networkelement.Details), + PndStoreName: "pnd-store.json", + PluginService: pluginService, } default: - store := NewFilesystemPndStore(pluginService) - return &store + return filesystem.NewFilesystemPndStore(pluginService) } } diff --git a/controller/nucleus/pluginStore.go b/controller/nucleus/pluginStore.go deleted file mode 100644 index cc68ab041fe7c22541a5f3a42cacd556b326310a..0000000000000000000000000000000000000000 --- a/controller/nucleus/pluginStore.go +++ /dev/null @@ -1,22 +0,0 @@ -package nucleus - -import ( - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin" - "code.fbi.h-da.de/danet/gosdn/controller/store" -) - -// NewPluginStore returns a pluginStore. -func NewPluginStore() plugin.Store { - storeMode := store.GetStoreMode() - - switch storeMode { - case store.Database: - return &DatabasePluginStore{ - pluginStoreName: store.PluginFilenameSuffix, - } - - default: - store := NewFilesystemPluginStore() - return store - } -} diff --git a/controller/rbac/databaseRoleStore.go b/controller/rbac/databaseRoleStore.go index a28fd8251968a2f9aeff6c90d943b15ccc13a5a5..e263690f8855a90176b25141a342ecadf1915bef 100644 --- a/controller/rbac/databaseRoleStore.go +++ b/controller/rbac/databaseRoleStore.go @@ -5,7 +5,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -22,7 +22,7 @@ type DatabaseRoleStore struct { // Add adds a Role. func (s *DatabaseRoleStore) Add(roleToAdd rbac.Role) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -31,7 +31,7 @@ func (s *DatabaseRoleStore) Add(roleToAdd rbac.Role) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.roleStoreName). InsertOne(ctx, roleToAdd) if err != nil { @@ -47,7 +47,7 @@ func (s *DatabaseRoleStore) Add(roleToAdd rbac.Role) (err error) { // Delete deletes a Role. func (s *DatabaseRoleStore) Delete(roleToDelete rbac.Role) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -56,7 +56,7 @@ func (s *DatabaseRoleStore) Delete(roleToDelete rbac.Role) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.roleStoreName). DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: roleToDelete.ID().String()}}) if err != nil { @@ -89,7 +89,7 @@ func (s *DatabaseRoleStore) Get(query store.Query) (rbac.LoadedRole, error) { } func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (loadedRole rbac.LoadedRole, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -98,7 +98,7 @@ func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (loadedRole rbac.LoadedR } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.roleStoreName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfRole.String()}}) if result == nil { @@ -115,7 +115,7 @@ func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (loadedRole rbac.LoadedR } func (s *DatabaseRoleStore) getByName(nameOfRole string) (loadedRole rbac.LoadedRole, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -124,7 +124,7 @@ func (s *DatabaseRoleStore) getByName(nameOfRole string) (loadedRole rbac.Loaded } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.roleStoreName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "rolename", Value: nameOfRole}}) if result == nil { @@ -142,7 +142,7 @@ func (s *DatabaseRoleStore) getByName(nameOfRole string) (loadedRole rbac.Loaded // GetAll returns all Roles. func (s *DatabaseRoleStore) GetAll() (loadedRoles []rbac.LoadedRole, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -151,7 +151,7 @@ func (s *DatabaseRoleStore) GetAll() (loadedRoles []rbac.LoadedRole, err error) } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.roleStoreName) cursor, err := collection.Find(ctx, bson.D{}) @@ -178,7 +178,7 @@ func (s *DatabaseRoleStore) GetAll() (loadedRoles []rbac.LoadedRole, err error) func (s *DatabaseRoleStore) Update(roleToUpdate rbac.Role) (err error) { var updatedLoadedRole rbac.LoadedRole - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -195,7 +195,7 @@ func (s *DatabaseRoleStore) Update(roleToUpdate rbac.Role) (err error) { ReturnDocument: &after, } - err = client.Database(database.DatabaseName). + err = client.Database(mongodb.DatabaseName). Collection(s.roleStoreName). FindOneAndUpdate( ctx, bson.M{"_id": roleToUpdate.ID().String()}, update, &opt). diff --git a/controller/rbac/databaseUserStore.go b/controller/rbac/databaseUserStore.go index 42451c64674a3def7a936513b33a6169a4bd5f5a..0788697f67a0553d571af3780e8a06c1429db880 100644 --- a/controller/rbac/databaseUserStore.go +++ b/controller/rbac/databaseUserStore.go @@ -5,7 +5,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -23,7 +23,7 @@ type DatabaseUserStore struct { // Add adds an User. func (s *DatabaseUserStore) Add(userToAdd rbac.User) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -32,7 +32,7 @@ func (s *DatabaseUserStore) Add(userToAdd rbac.User) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.userStoreName). InsertOne(ctx, userToAdd) if err != nil { @@ -48,7 +48,7 @@ func (s *DatabaseUserStore) Add(userToAdd rbac.User) (err error) { // Delete deletes an User. func (s *DatabaseUserStore) Delete(userToDelete rbac.User) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -57,7 +57,7 @@ func (s *DatabaseUserStore) Delete(userToDelete rbac.User) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.userStoreName). DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: userToDelete.ID().String()}}) if err != nil { @@ -90,7 +90,7 @@ func (s *DatabaseUserStore) Get(query store.Query) (rbac.LoadedUser, error) { } func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (loadedUser rbac.LoadedUser, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -99,7 +99,7 @@ func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (loadedUser rbac.LoadedU } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.userStoreName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfUser.String()}}) if result == nil { @@ -116,7 +116,7 @@ func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (loadedUser rbac.LoadedU } func (s *DatabaseUserStore) getByName(nameOfUser string) (loadedUser rbac.LoadedUser, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -125,7 +125,7 @@ func (s *DatabaseUserStore) getByName(nameOfUser string) (loadedUser rbac.Loaded } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.userStoreName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "username", Value: nameOfUser}}) if result == nil { @@ -143,7 +143,7 @@ func (s *DatabaseUserStore) getByName(nameOfUser string) (loadedUser rbac.Loaded // GetAll returns all Users. func (s *DatabaseUserStore) GetAll() (loadedUsers []rbac.LoadedUser, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -152,7 +152,7 @@ func (s *DatabaseUserStore) GetAll() (loadedUsers []rbac.LoadedUser, err error) } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.userStoreName) cursor, err := collection.Find(ctx, bson.D{}) @@ -179,7 +179,7 @@ func (s *DatabaseUserStore) GetAll() (loadedUsers []rbac.LoadedUser, err error) func (s *DatabaseUserStore) Update(userToUpdate rbac.User) (err error) { var updatedLoadedUser rbac.LoadedUser - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -191,7 +191,7 @@ func (s *DatabaseUserStore) Update(userToUpdate rbac.User) (err error) { // 1. Start Transaction wcMajority := writeconcern.Majority() wcMajorityCollectionOpts := options.Collection().SetWriteConcern(wcMajority) - userCollection := client.Database(database.DatabaseName).Collection(s.userStoreName, wcMajorityCollectionOpts) + userCollection := client.Database(mongodb.DatabaseName).Collection(s.userStoreName, wcMajorityCollectionOpts) session, err := client.StartSession() if err != nil { diff --git a/controller/topology/nodes/nodeStore.go b/controller/topology/nodes/nodeStore.go index f6f637e940bf257b7504886f068f0d7c297d94ab..7f53f179282b0969a5025e56e8faff0e1820cf52 100644 --- a/controller/topology/nodes/nodeStore.go +++ b/controller/topology/nodes/nodeStore.go @@ -5,7 +5,7 @@ import ( "time" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" query "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" @@ -59,7 +59,7 @@ func (s *DatabaseNodeStore) Get(query query.Query) (Node, error) { } func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (loadedNode Node, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -70,7 +70,7 @@ func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (loadedNode Node, err er idAsByteArray, _ := idOfNode.MarshalBinary() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idAsByteArray}}) if result == nil { @@ -86,7 +86,7 @@ func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (loadedNode Node, err er } func (s *DatabaseNodeStore) getByName(nameOfNode string) (loadedNode Node, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -95,7 +95,7 @@ func (s *DatabaseNodeStore) getByName(nameOfNode string) (loadedNode Node, err e } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfNode}}) if result == nil { @@ -112,7 +112,7 @@ func (s *DatabaseNodeStore) getByName(nameOfNode string) (loadedNode Node, err e // GetAll returns all stored nodes. func (s *DatabaseNodeStore) GetAll() (loadedNode []Node, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -120,7 +120,7 @@ func (s *DatabaseNodeStore) GetAll() (loadedNode []Node, err error) { err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString) } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) cursor, err := collection.Find(ctx, bson.D{}) @@ -144,7 +144,7 @@ func (s *DatabaseNodeStore) GetAll() (loadedNode []Node, err error) { // Add adds a node to the node store. func (s *DatabaseNodeStore) Add(node Node) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -157,7 +157,7 @@ func (s *DatabaseNodeStore) Add(node Node) (err error) { node.Metadata.CreatedAt = time.Now() node.Metadata.LastUpdated = time.Now() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.storeName). InsertOne(ctx, node) if err != nil { @@ -171,7 +171,7 @@ func (s *DatabaseNodeStore) Add(node Node) (err error) { func (s *DatabaseNodeStore) Update(node Node) (err error) { var updatedLoadedNodes Node - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -183,7 +183,7 @@ func (s *DatabaseNodeStore) Update(node Node) (err error) { // 1. Start Transaction wcMajority := writeconcern.Majority() wcMajorityCollectionOpts := options.Collection().SetWriteConcern(wcMajority) - nodeCollection := client.Database(database.DatabaseName).Collection(s.storeName, wcMajorityCollectionOpts) + nodeCollection := client.Database(mongodb.DatabaseName).Collection(s.storeName, wcMajorityCollectionOpts) session, err := client.StartSession() if err != nil { @@ -244,7 +244,7 @@ func (s *DatabaseNodeStore) Update(node Node) (err error) { // Delete deletes a node from the node store. func (s *DatabaseNodeStore) Delete(node Node) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -253,7 +253,7 @@ func (s *DatabaseNodeStore) Delete(node Node) (err error) { } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) _, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: node.ID.String()}}) if err != nil { diff --git a/controller/topology/ports/portStore.go b/controller/topology/ports/portStore.go index 024c0f9114f2d2c297a433df163f8b00d97b22e6..cadda73fce3f2e4127db7e983803ae2583831ca6 100644 --- a/controller/topology/ports/portStore.go +++ b/controller/topology/ports/portStore.go @@ -5,7 +5,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" query "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" @@ -57,7 +57,7 @@ func (s *DatabasePortStore) Get(query query.Query) (Port, error) { } func (s *DatabasePortStore) getByID(idOfPort uuid.UUID) (loadedPort Port, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -68,7 +68,7 @@ func (s *DatabasePortStore) getByID(idOfPort uuid.UUID) (loadedPort Port, err er idAsByteArray, _ := idOfPort.MarshalBinary() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idAsByteArray}}) if result == nil { @@ -84,7 +84,7 @@ func (s *DatabasePortStore) getByID(idOfPort uuid.UUID) (loadedPort Port, err er } func (s *DatabasePortStore) getByName(nameOfPort string) (loadedPort Port, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -93,7 +93,7 @@ func (s *DatabasePortStore) getByName(nameOfPort string) (loadedPort Port, err e } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfPort}}) if result == nil { @@ -110,7 +110,7 @@ func (s *DatabasePortStore) getByName(nameOfPort string) (loadedPort Port, err e // GetAll returns all stored ports. func (s *DatabasePortStore) GetAll() (loadedPorts []Port, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -119,7 +119,7 @@ func (s *DatabasePortStore) GetAll() (loadedPorts []Port, err error) { } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) cursor, err := collection.Find(ctx, bson.D{}) @@ -143,7 +143,7 @@ func (s *DatabasePortStore) GetAll() (loadedPorts []Port, err error) { // Add adds a port to the port store. func (s *DatabasePortStore) Add(port Port) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -152,7 +152,7 @@ func (s *DatabasePortStore) Add(port Port) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.storeName). InsertOne(ctx, port) if err != nil { @@ -166,7 +166,7 @@ func (s *DatabasePortStore) Add(port Port) (err error) { func (s *DatabasePortStore) Update(port Port) (err error) { var updatedLoadedNetworkElement networkelement.LoadedNetworkElement - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -184,7 +184,7 @@ func (s *DatabasePortStore) Update(port Port) (err error) { ReturnDocument: &after, } - err = client.Database(database.DatabaseName). + err = client.Database(mongodb.DatabaseName). Collection(s.storeName). FindOneAndUpdate( ctx, bson.M{"_id": port.ID.String()}, update, &opt). @@ -198,7 +198,7 @@ func (s *DatabasePortStore) Update(port Port) (err error) { // Delete deletes a port from the port store. func (s *DatabasePortStore) Delete(port Port) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -207,7 +207,7 @@ func (s *DatabasePortStore) Delete(port Port) (err error) { } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) _, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: port.ID.String()}}) if err != nil { diff --git a/controller/topology/routing-tables/routingTableStore.go b/controller/topology/routing-tables/routingTableStore.go index 1c70c68a1d2965f5daa6877cf7056854fbfecc93..ca80c52d0d181c7b662cf5f6ecc1684b304e91d5 100644 --- a/controller/topology/routing-tables/routingTableStore.go +++ b/controller/topology/routing-tables/routingTableStore.go @@ -4,7 +4,7 @@ import ( "fmt" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" query "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" @@ -56,7 +56,7 @@ func (s *DatabaseRoutingTableStore) Get(query query.Query) (RoutingTable, error) } func (s *DatabaseRoutingTableStore) getByID(idOfRoutingTable uuid.UUID) (routingTable RoutingTable, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -65,7 +65,7 @@ func (s *DatabaseRoutingTableStore) getByID(idOfRoutingTable uuid.UUID) (routing } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfRoutingTable.String()}}) if result == nil { @@ -81,7 +81,7 @@ func (s *DatabaseRoutingTableStore) getByID(idOfRoutingTable uuid.UUID) (routing } func (s *DatabaseRoutingTableStore) getByName(nameOfRoutingTable string) (loadedRoutingTable RoutingTable, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -90,7 +90,7 @@ func (s *DatabaseRoutingTableStore) getByName(nameOfRoutingTable string) (loaded } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfRoutingTable}}) if result == nil { @@ -107,7 +107,7 @@ func (s *DatabaseRoutingTableStore) getByName(nameOfRoutingTable string) (loaded // GetAll returns all stored routingTables. func (s *DatabaseRoutingTableStore) GetAll() (loadedRoutingTable []RoutingTable, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -116,7 +116,7 @@ func (s *DatabaseRoutingTableStore) GetAll() (loadedRoutingTable []RoutingTable, } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) cursor, err := collection.Find(ctx, bson.D{}) @@ -140,7 +140,7 @@ func (s *DatabaseRoutingTableStore) GetAll() (loadedRoutingTable []RoutingTable, // Add adds a RoutingTable to the store. func (s *DatabaseRoutingTableStore) Add(routingTable RoutingTable) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -149,7 +149,7 @@ func (s *DatabaseRoutingTableStore) Add(routingTable RoutingTable) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.storeName). InsertOne(ctx, routingTable) if err != nil { @@ -163,7 +163,7 @@ func (s *DatabaseRoutingTableStore) Add(routingTable RoutingTable) (err error) { func (s *DatabaseRoutingTableStore) Update(routingTable RoutingTable) (err error) { var updatedLoadedRoutingTable RoutingTable - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -181,7 +181,7 @@ func (s *DatabaseRoutingTableStore) Update(routingTable RoutingTable) (err error ReturnDocument: &after, } - err = client.Database(database.DatabaseName). + err = client.Database(mongodb.DatabaseName). Collection(s.storeName). FindOneAndUpdate( ctx, bson.M{"_id": routingTable.ID.String()}, update, &opt). @@ -195,7 +195,7 @@ func (s *DatabaseRoutingTableStore) Update(routingTable RoutingTable) (err error // Delete deletes a node from the node store. func (s *DatabaseRoutingTableStore) Delete(routingTable RoutingTable) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -204,7 +204,7 @@ func (s *DatabaseRoutingTableStore) Delete(routingTable RoutingTable) (err error } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) _, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: routingTable.ID.String()}}) if err != nil { diff --git a/controller/topology/topologyStore.go b/controller/topology/topologyStore.go index e8118388eb96b6ce504e29b3cb942c9a18d861b1..375f85226b8956a7b7bb0aaf7bfd5a7e755489be 100644 --- a/controller/topology/topologyStore.go +++ b/controller/topology/topologyStore.go @@ -4,7 +4,7 @@ import ( "fmt" "code.fbi.h-da.de/danet/gosdn/controller/customerrs" - "code.fbi.h-da.de/danet/gosdn/controller/nucleus/database" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb" query "code.fbi.h-da.de/danet/gosdn/controller/store" "code.fbi.h-da.de/danet/gosdn/controller/topology/links" @@ -57,7 +57,7 @@ func (s *DatabaseTopologyStore) Get(query query.Query) (links.Link, error) { } func (s *DatabaseTopologyStore) getByID(idOfTopology uuid.UUID) (loadedTopology links.Link, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -66,7 +66,7 @@ func (s *DatabaseTopologyStore) getByID(idOfTopology uuid.UUID) (loadedTopology } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfTopology.String()}}) if result == nil { @@ -82,7 +82,7 @@ func (s *DatabaseTopologyStore) getByID(idOfTopology uuid.UUID) (loadedTopology } func (s *DatabaseTopologyStore) getByName(nameOfTopology string) (loadedTopology links.Link, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -91,7 +91,7 @@ func (s *DatabaseTopologyStore) getByName(nameOfTopology string) (loadedTopology } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfTopology}}) if result == nil { @@ -108,7 +108,7 @@ func (s *DatabaseTopologyStore) getByName(nameOfTopology string) (loadedTopology // GetAll returns all stored links. func (s *DatabaseTopologyStore) GetAll() (loadedTopology []links.Link, err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -117,7 +117,7 @@ func (s *DatabaseTopologyStore) GetAll() (loadedTopology []links.Link, err error } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) cursor, err := collection.Find(ctx, bson.D{}) @@ -141,7 +141,7 @@ func (s *DatabaseTopologyStore) GetAll() (loadedTopology []links.Link, err error // Add adds a link to the link store. func (s *DatabaseTopologyStore) Add(link links.Link) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -150,7 +150,7 @@ func (s *DatabaseTopologyStore) Add(link links.Link) (err error) { } }() - _, err = client.Database(database.DatabaseName). + _, err = client.Database(mongodb.DatabaseName). Collection(s.storeName). InsertOne(ctx, link) if err != nil { @@ -164,7 +164,7 @@ func (s *DatabaseTopologyStore) Add(link links.Link) (err error) { func (s *DatabaseTopologyStore) Update(linkToUpdate links.Link) (err error) { var updatedLink links.Link - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -182,7 +182,7 @@ func (s *DatabaseTopologyStore) Update(linkToUpdate links.Link) (err error) { ReturnDocument: &after, } - err = client.Database(database.DatabaseName). + err = client.Database(mongodb.DatabaseName). Collection(s.storeName). FindOneAndUpdate( ctx, bson.M{"_id": linkToUpdate.ID.String()}, update, &opt). @@ -196,7 +196,7 @@ func (s *DatabaseTopologyStore) Update(linkToUpdate links.Link) (err error) { // Delete deletes a link from the link store. func (s *DatabaseTopologyStore) Delete(linkToDelete links.Link) (err error) { - client, ctx, cancel := database.GetMongoConnection() + client, ctx, cancel := mongodb.GetMongoConnection() defer cancel() defer func() { if ferr := client.Disconnect(ctx); ferr != nil { @@ -205,7 +205,7 @@ func (s *DatabaseTopologyStore) Delete(linkToDelete links.Link) (err error) { } }() - db := client.Database(database.DatabaseName) + db := client.Database(mongodb.DatabaseName) collection := db.Collection(s.storeName) _, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: linkToDelete.ID.String()}}) if err != nil { diff --git a/go.mod b/go.mod index b475b85312810ea1929543cdce529afa19172b9b..9ebfce26f96b34d51efd0b09fe11b16a0cf04b91 100644 --- a/go.mod +++ b/go.mod @@ -89,12 +89,12 @@ require ( ) require ( - buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230824200731-b9b8148056b9.1 - github.com/bufbuild/protovalidate-go v0.3.1 + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1 + github.com/bufbuild/protovalidate-go v0.3.2 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-plugin v1.4.10 github.com/lesismal/nbio v1.3.17 - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d + google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb ) require ( @@ -104,7 +104,7 @@ require ( github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect github.com/containerd/console v1.0.3 // indirect github.com/fatih/color v1.15.0 // indirect - github.com/google/cel-go v0.17.4 // indirect + github.com/google/cel-go v0.18.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect @@ -115,6 +115,6 @@ require ( github.com/moby/sys/sequential v0.5.0 // indirect github.com/oklog/run v1.1.0 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect - golang.org/x/exp v0.0.0-20230809094429-853ea248256d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect ) diff --git a/go.sum b/go.sum index f6e3b67641a92a8ee1bb6acc2641c9a472c3a600..4107f8fb753ac847dc750e12c5e70d86737ad7ca 100644 --- a/go.sum +++ b/go.sum @@ -8,10 +8,8 @@ atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1 h1:tdpHgTbmbvEIARu+bixzmleMi14+3imnpoFXz+Qzjp4= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230824200731-b9b8148056b9.1 h1:9Ea7lsYYvoyqmq79GbCy6POXHrZbC+pHs+6lGNx9IBQ= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230824200731-b9b8148056b9.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1 h1:2gmp+PRca1fqQHf/WMKOgu9inVb0R0N07TucgY3QZCQ= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -150,10 +148,8 @@ github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s= -github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= -github.com/bufbuild/protovalidate-go v0.3.1 h1:+jbgQXo+7SzttLbGwVClpHowXKEgwK1QG/bK4xrmUy8= -github.com/bufbuild/protovalidate-go v0.3.1/go.mod h1:oD/fAR3ojBAunOmY3SGFJ4jhILpUtnuIalI4Id9rluY= +github.com/bufbuild/protovalidate-go v0.3.2 h1:7sG1R83PkCzOZb3P187gAchWFLHY6LQ8aVoUw6Wp9es= +github.com/bufbuild/protovalidate-go v0.3.2/go.mod h1:ywZqKUjMhQA8fmhsc+0DUlMfan8/umJ+5mKvjdxAD3M= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= @@ -338,8 +334,6 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= @@ -485,10 +479,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.17.1 h1:s2151PDGy/eqpCI80/8dl4VL3xTkqI/YubXLXCFw0mw= -github.com/google/cel-go v0.17.1/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= -github.com/google/cel-go v0.17.4 h1:9556LOjSyIZlgnT0oaCYGq2uk9BM6fzuTXhzYHskonk= -github.com/google/cel-go v0.17.4/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/google/cel-go v0.18.0 h1:u74MPiEC8mejBrkXqrTWT102g5IFEUjxOngzQIijMzU= +github.com/google/cel-go v0.18.0/go.mod h1:PVAybmSnWkNMUZR/tEWFUiJ1Np4Hz0MHsZJcgC4zln4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -555,8 +547,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -1115,8 +1105,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1129,8 +1117,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230809094429-853ea248256d h1:wu5bD43Ana/nF1ZmaLr3lW/FQeJU8CcI+Ln7yWHViXE= -golang.org/x/exp v0.0.0-20230809094429-853ea248256d/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1218,8 +1206,6 @@ golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1363,8 +1349,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1373,8 +1357,6 @@ golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1389,8 +1371,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1557,10 +1537,10 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20230807174057-1744710a1577 h1:Tyk/35yqszRCvaragTn5NnkY6IiKk/XvHzEWepo71N0= google.golang.org/genproto v0.0.0-20230807174057-1744710a1577/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1589,8 +1569,6 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.58.0-dev h1:BggFp6joqwbgXlqFIogQr6r35o+BnzYw54An5wzoSLA= -google.golang.org/grpc v1.58.0-dev/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=