Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 111-cli-expansion-stateful-behaviour-more-command-feedback
  • 120-integration-tests-fail
  • 138-making-gnmi-response-processing-more-error-tolerable
  • 140-refactor-pipelines
  • 156-a-setrequest-to-change-a-specific-path-of-an-ond-only-works-for-paths-with-string-values
  • 186-creating-a-device-based-on-plugin-or-csbi-is-not-possible
  • 195-requesting-changes-does-not-work-in-storemode-database
  • 223-database-pnd-store-is-missing-option-to-search-by-name
  • 225-adding-support-and-visualization-for-the-test-coverage2
  • 233-structs-like-loadeddevice-loadedsbi-loadedrole-loadeduser-are-never-passed-as-pointer
  • 242-improve-security-by-enabling-and-enforcing-more-linting-rules
  • 242-improve-security-by-enabling-and-enforcing-more-linting-rules-govet
  • 246-implement-our-own-version-to-send-gnmi-requests
  • 258-deal-with-read-only-fields-in-yang
  • 282-refactoring-of-the-current-test-setup
  • 289-quantum-safe-communication-between-rabbitmq-and-sdn-controller
  • 291-lab-vm-for-arm64-apple
  • 296-related-existing-work-about-change-logic-for-yang-models
  • 320-deadline-and-cancellation-for-grpc-calls
  • 336-add-error-handling-for-mne-watching-if-the-provided-paths-do-not-exist
  • 349-integration-test-for-lab01
  • 350-applying-a-sdn-configuration-should-also-update-the-internal-configuration-of-managed-network
  • 351-link-shadowing-of-global-variables
  • 383-re-organize-comands-in-cli
  • 392-remove-renovate
  • PSD_VGU_Logging
  • add-backup-script
  • add-dockerignore
  • add-script-with-docker-stats
  • add-sr-linux-yang-models
  • add-support-for-mtls-in-plugins
  • allow-slashes-in-branch-names
  • arm-build
  • bump-ygot-generator-to-0-0-5
  • check-unit-tests
  • ci-refactor-1337
  • cli-docs
  • create-health-check-api
  • custom-marshal-for-grpc-gateway
  • deployment-docker-compose
  • develop
  • docker-build-cache-experiments
  • fbi1478-master-patch-42436
  • fix-docker-registry-error
  • fix-linting-in-makefile
  • fix-viper
  • go-plugin-playground
  • gosdn-storage-cleanup
  • heiss_bachelor_thesis
  • hotfix-unique-list-error-from-a-device-get-request
  • integration-test-pipeline-fix
  • inventory-manager-netbox
  • istaester/add-git-hooks
  • istaester/architecture-figures
  • istaester/basic-persistance-layer
  • istaester/bump-ygot-version
  • istaester/cli-tests
  • istaester/db
  • istaester/handle-makefile-in-editorconfig
  • istaester/init-monorepo
  • istaester/plugin-registry
  • istaester/provide-pnd-service
  • istaester/tooling
  • istaester/update-readme
  • master
  • mb/plugin-registry
  • mk/benchmark-stores
  • mpsd-at-vgu
  • neil/cobra-tests
  • new-integration-test-setup-v1
  • profile
  • proto-getters
  • recursive-read-only-try-1337
  • registry-used-by-app
  • remove-stuff
  • renovate/babel-runtime-7.x-lockfile
  • renovate/buf.build-gen-go-bufbuild-protovalidate-protocolbuffers-go-1.x
  • renovate/dompurify-3.x-lockfile
  • renovate/eslint-9.x-lockfile
  • renovate/eslint-plugin-prettier-5.x-lockfile
  • renovate/eslint-plugin-react-7.x-lockfile
  • renovate/eslint-plugin-react-hooks-5.x-lockfile
  • renovate/eslint-plugin-react-refresh-0.x-lockfile
  • renovate/fortawesome-fontawesome-svg-core-6.x-lockfile
  • renovate/fortawesome-free-regular-svg-icons-6.x-lockfile
  • renovate/fortawesome-free-solid-svg-icons-6.x-lockfile
  • renovate/github.com-aristanetworks-goarista-digest
  • renovate/github.com-bufbuild-protovalidate-go-0.x
  • renovate/github.com-docker-docker-27.x
  • renovate/github.com-docker-docker-28.x
  • renovate/github.com-grpc-ecosystem-grpc-gateway-v2-2.x
  • renovate/github.com-hashicorp-go-plugin-1.x
  • renovate/github.com-lesismal-nbio-1.x
  • renovate/github.com-openconfig-gnmi-0.x
  • renovate/github.com-prometheus-client_golang-1.x
  • renovate/go.mongodb.org-mongo-driver-2.x
  • renovate/golangci-golangci-lint-1.x
  • renovate/google.golang.org-genproto-googleapis-api-digest
  • renovate/react-18.x-lockfile
  • renovate/react-bootstrap-2.x-lockfile
  • 0.1.0
101 results

Target

Select target project
  • danet/gosdn
1 result
Select Git revision
  • 111-cli-expansion-stateful-behaviour-more-command-feedback
  • 120-integration-tests-fail
  • 138-making-gnmi-response-processing-more-error-tolerable
  • 140-refactor-pipelines
  • 156-a-setrequest-to-change-a-specific-path-of-an-ond-only-works-for-paths-with-string-values
  • 186-creating-a-device-based-on-plugin-or-csbi-is-not-possible
  • 195-requesting-changes-does-not-work-in-storemode-database
  • 223-database-pnd-store-is-missing-option-to-search-by-name
  • 225-adding-support-and-visualization-for-the-test-coverage2
  • 233-structs-like-loadeddevice-loadedsbi-loadedrole-loadeduser-are-never-passed-as-pointer
  • 242-improve-security-by-enabling-and-enforcing-more-linting-rules
  • 242-improve-security-by-enabling-and-enforcing-more-linting-rules-govet
  • 246-implement-our-own-version-to-send-gnmi-requests
  • 258-deal-with-read-only-fields-in-yang
  • 282-refactoring-of-the-current-test-setup
  • 289-quantum-safe-communication-between-rabbitmq-and-sdn-controller
  • 291-lab-vm-for-arm64-apple
  • 296-related-existing-work-about-change-logic-for-yang-models
  • 320-deadline-and-cancellation-for-grpc-calls
  • 336-add-error-handling-for-mne-watching-if-the-provided-paths-do-not-exist
  • 349-integration-test-for-lab01
  • 350-applying-a-sdn-configuration-should-also-update-the-internal-configuration-of-managed-network
  • 351-link-shadowing-of-global-variables
  • 383-re-organize-comands-in-cli
  • 392-remove-renovate
  • PSD_VGU_Logging
  • add-backup-script
  • add-dockerignore
  • add-script-with-docker-stats
  • add-sr-linux-yang-models
  • add-support-for-mtls-in-plugins
  • allow-slashes-in-branch-names
  • arm-build
  • bump-ygot-generator-to-0-0-5
  • check-unit-tests
  • ci-refactor-1337
  • cli-docs
  • create-health-check-api
  • custom-marshal-for-grpc-gateway
  • deployment-docker-compose
  • develop
  • docker-build-cache-experiments
  • fbi1478-master-patch-42436
  • fix-docker-registry-error
  • fix-linting-in-makefile
  • fix-viper
  • go-plugin-playground
  • gosdn-storage-cleanup
  • heiss_bachelor_thesis
  • hotfix-unique-list-error-from-a-device-get-request
  • integration-test-pipeline-fix
  • inventory-manager-netbox
  • istaester/add-git-hooks
  • istaester/architecture-figures
  • istaester/basic-persistance-layer
  • istaester/bump-ygot-version
  • istaester/cli-tests
  • istaester/db
  • istaester/handle-makefile-in-editorconfig
  • istaester/init-monorepo
  • istaester/plugin-registry
  • istaester/provide-pnd-service
  • istaester/tooling
  • istaester/update-readme
  • master
  • mb/plugin-registry
  • mk/benchmark-stores
  • mpsd-at-vgu
  • neil/cobra-tests
  • new-integration-test-setup-v1
  • profile
  • proto-getters
  • recursive-read-only-try-1337
  • registry-used-by-app
  • remove-stuff
  • renovate/babel-runtime-7.x-lockfile
  • renovate/buf.build-gen-go-bufbuild-protovalidate-protocolbuffers-go-1.x
  • renovate/dompurify-3.x-lockfile
  • renovate/eslint-9.x-lockfile
  • renovate/eslint-plugin-prettier-5.x-lockfile
  • renovate/eslint-plugin-react-7.x-lockfile
  • renovate/eslint-plugin-react-hooks-5.x-lockfile
  • renovate/eslint-plugin-react-refresh-0.x-lockfile
  • renovate/fortawesome-fontawesome-svg-core-6.x-lockfile
  • renovate/fortawesome-free-regular-svg-icons-6.x-lockfile
  • renovate/fortawesome-free-solid-svg-icons-6.x-lockfile
  • renovate/github.com-aristanetworks-goarista-digest
  • renovate/github.com-bufbuild-protovalidate-go-0.x
  • renovate/github.com-docker-docker-27.x
  • renovate/github.com-docker-docker-28.x
  • renovate/github.com-grpc-ecosystem-grpc-gateway-v2-2.x
  • renovate/github.com-hashicorp-go-plugin-1.x
  • renovate/github.com-lesismal-nbio-1.x
  • renovate/github.com-openconfig-gnmi-0.x
  • renovate/github.com-prometheus-client_golang-1.x
  • renovate/go.mongodb.org-mongo-driver-2.x
  • renovate/golangci-golangci-lint-1.x
  • renovate/google.golang.org-genproto-googleapis-api-digest
  • renovate/react-18.x-lockfile
  • renovate/react-bootstrap-2.x-lockfile
  • 0.1.0
101 results
Show changes
Showing
with 266 additions and 354 deletions
package nucleus
import (
"context"
"encoding/json"
"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
......@@ -25,7 +26,7 @@ func NewMemoryPndStore() networkdomain.PndStore {
}
// Add adds a pnd to the store.
func (t *MemoryPndStore) Add(item networkdomain.NetworkDomain) error {
func (t *MemoryPndStore) Add(ctx context.Context, item networkdomain.NetworkDomain) error {
var pnd networkdomain.LoadedPnd
b, err := json.Marshal(item)
......@@ -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(ctx context.Context, item networkdomain.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(ctx context.Context, query store.Query) (networkdomain.LoadedPnd, error) {
// First search for direct hit on UUID.
item, ok := t.Store[query.ID]
if !ok {
......@@ -67,7 +68,7 @@ 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) {
func (t *MemoryPndStore) GetAll(ctx context.Context) ([]networkdomain.LoadedPnd, error) {
var allItems []networkdomain.LoadedPnd
for _, item := range t.Store {
......
package nucleus
import (
"context"
"encoding/json"
"os"
"sync"
......@@ -59,7 +60,7 @@ 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(ctx context.Context, query store.Query) (networkelement.LoadedNetworkElement, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -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(ctx context.Context) ([]networkelement.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(ctx context.Context, networkElementToAdd networkelement.NetworkElement) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -116,7 +117,7 @@ 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(ctx context.Context, networkElementToUpdate networkelement.NetworkElement) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -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(ctx context.Context, networkElementToDelete networkelement.NetworkElement) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......
package nucleus
import (
"context"
"testing"
tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
......@@ -10,6 +11,7 @@ import (
"code.fbi.h-da.de/danet/gosdn/controller/store"
"github.com/google/uuid"
"github.com/stretchr/testify/mock"
"go.mongodb.org/mongo-driver/mongo"
)
func returnBasicTransportOption() tpb.TransportOption {
......@@ -39,10 +41,10 @@ func TestAddNetworkElement(t *testing.T) {
plugin1.On("ID").Return(pluginID1)
plugin1.On("Model", mock.Anything).Return([]byte{}, nil)
networkElementStore := NewNetworkElementStore()
networkElementStore := NewNetworkElementStore(&mongo.Database{}, defaultPndID)
mne, _ := NewNetworkElement("testNetworkElement", mneID, &trop, defaultPndID, plugin1, [][]string{}, conflict.Metadata{})
err := networkElementStore.Add(mne)
err := networkElementStore.Add(context.TODO(), mne)
if err != nil {
t.Error(err)
}
......@@ -51,7 +53,7 @@ func TestAddNetworkElement(t *testing.T) {
func TestGetAllNetworkElements(t *testing.T) {
defer ensureStoreFileForTestsIsRemoved(store.NetworkElementFilenameSuffix)
networkElementStore := NewNetworkElementStore()
networkElementStore := NewNetworkElementStore(&mongo.Database{}, defaultPndID)
pluginID, _ := uuid.Parse("ssssssss-ssss-ssss-ssss-ssssssssssss")
plugin := &mocks.Plugin{}
......@@ -76,13 +78,13 @@ func TestGetAllNetworkElements(t *testing.T) {
inputNetworkElements := [2]networkelement.NetworkElement{mne1, mne2}
for _, mne := range inputNetworkElements {
err := networkElementStore.Add(mne)
err := networkElementStore.Add(context.TODO(), mne)
if err != nil {
t.Error(err)
}
}
returnedNetworkElements, err := networkElementStore.GetAll()
returnedNetworkElements, err := networkElementStore.GetAll(context.TODO())
if err != nil {
t.Error(err)
}
......@@ -105,7 +107,7 @@ func TestGetAllNetworkElements(t *testing.T) {
func TestGetNetworkElement(t *testing.T) {
defer ensureStoreFileForTestsIsRemoved(store.NetworkElementFilenameSuffix)
networkElementStore := NewNetworkElementStore()
networkElementStore := NewNetworkElementStore(&mongo.Database{}, defaultPndID)
pluginID, _ := uuid.Parse("ssssssss-ssss-ssss-ssss-ssssssssssss")
plugin := &mocks.Plugin{}
......@@ -130,13 +132,13 @@ func TestGetNetworkElement(t *testing.T) {
inputNetworkElements := [2]networkelement.NetworkElement{mne1, mne2}
for _, mne := range inputNetworkElements {
err := networkElementStore.Add(mne)
err := networkElementStore.Add(context.TODO(), mne)
if err != nil {
t.Error(err)
}
}
returnNetworkElement, err := networkElementStore.Get(store.Query{ID: mneID2, Name: "testname2"})
returnNetworkElement, err := networkElementStore.Get(context.TODO(), store.Query{ID: mneID2, Name: "testname2"})
if err != nil {
t.Error(err)
}
......@@ -163,22 +165,22 @@ func TestUpdateNetworkElement(t *testing.T) {
plugin1.On("ID").Return(pluginID1)
plugin1.On("Model", mock.Anything).Return([]byte{}, nil)
networkElementStore := NewNetworkElementStore()
networkElementStore := NewNetworkElementStore(&mongo.Database{}, defaultPndID)
mne, _ := NewNetworkElement("testNetworkElement", mneID, &trop, defaultPndID, plugin1, [][]string{}, conflict.Metadata{})
err := networkElementStore.Add(mne)
err := networkElementStore.Add(context.TODO(), mne)
if err != nil {
t.Error(err)
}
mne, _ = NewNetworkElement(updatedNetworkElementName, mneID, &trop, defaultPndID, plugin1, [][]string{}, conflict.Metadata{})
err = networkElementStore.Update(mne)
err = networkElementStore.Update(context.TODO(), mne)
if err != nil {
t.Error(err)
}
returnNetworkElement, err := networkElementStore.Get(store.Query{ID: mneID, Name: updatedNetworkElementName})
returnNetworkElement, err := networkElementStore.Get(context.TODO(), store.Query{ID: mneID, Name: updatedNetworkElementName})
if err != nil {
t.Error(err)
}
......@@ -194,7 +196,7 @@ func TestUpdateNetworkElement(t *testing.T) {
func TestDeleteNetworkElement(t *testing.T) {
defer ensureStoreFileForTestsIsRemoved(store.NetworkElementFilenameSuffix)
networkElementStore := NewNetworkElementStore()
networkElementStore := NewNetworkElementStore(&mongo.Database{}, defaultPndID)
pluginID, _ := uuid.Parse("ssssssss-ssss-ssss-ssss-ssssssssssss")
plugin := &mocks.Plugin{}
......@@ -219,18 +221,18 @@ func TestDeleteNetworkElement(t *testing.T) {
inputNetworkElements := [2]networkelement.NetworkElement{mne1, mne2}
for _, mne := range inputNetworkElements {
err := networkElementStore.Add(mne)
err := networkElementStore.Add(context.TODO(), mne)
if err != nil {
t.Error(err)
}
}
err = networkElementStore.Delete(mne1)
err = networkElementStore.Delete(context.TODO(), mne1)
if err != nil {
t.Error(err)
}
returnNetworkElements, err := networkElementStore.GetAll()
returnNetworkElements, err := networkElementStore.GetAll(context.TODO())
if err != nil {
t.Error(err)
}
......
package nucleus
import (
"context"
"fmt"
spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
......@@ -45,7 +46,8 @@ 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) {
loadedNetworkElement, err := s.networkElementStore.Get(query)
ctx := context.Background()
loadedNetworkElement, err := s.networkElementStore.Get(ctx, query)
if err != nil {
return nil, err
}
......@@ -62,7 +64,8 @@ func (s *NetworkElementService) Get(query store.Query) (networkelement.NetworkEl
func (s *NetworkElementService) GetAll() ([]networkelement.NetworkElement, error) {
var mnes []networkelement.NetworkElement
loadedNetworkElements, err := s.networkElementStore.GetAll()
ctx := context.Background()
loadedNetworkElements, err := s.networkElementStore.GetAll(ctx)
if err != nil {
return nil, err
}
......@@ -84,7 +87,8 @@ func (s *NetworkElementService) GetAll() ([]networkelement.NetworkElement, error
// requesting network element information through this method is a lot faster than the
// usual `GetAll` method.
func (s *NetworkElementService) GetAllAsLoaded() ([]networkelement.LoadedNetworkElement, error) {
loadedNetworkElements, err := s.networkElementStore.GetAll()
ctx := context.Background()
loadedNetworkElements, err := s.networkElementStore.GetAll(ctx)
if err != nil {
return nil, err
}
......@@ -94,7 +98,8 @@ func (s *NetworkElementService) GetAllAsLoaded() ([]networkelement.LoadedNetwork
// Add adds a network element to the network element store.
func (s *NetworkElementService) Add(networkElementToAdd networkelement.NetworkElement) error {
err := s.networkElementStore.Add(networkElementToAdd)
ctx := context.Background()
err := s.networkElementStore.Add(ctx, networkElementToAdd)
if err != nil {
return err
}
......@@ -116,6 +121,8 @@ func (s *NetworkElementService) Add(networkElementToAdd networkelement.NetworkEl
// UpdateModel updates a existing network element with a new model provided as string.
func (s *NetworkElementService) UpdateModel(networkElementID uuid.UUID, modelAsString string) error {
ctx := context.Background()
exisitingNetworkElement, err := s.Get(store.Query{ID: networkElementID})
if err != nil {
return err
......@@ -140,7 +147,7 @@ func (s *NetworkElementService) UpdateModel(networkElementID uuid.UUID, modelAsS
return err
}
err = s.networkElementStore.Update(exisitingNetworkElement)
err = s.networkElementStore.Update(ctx, exisitingNetworkElement)
if err != nil {
return err
}
......@@ -162,7 +169,8 @@ func (s *NetworkElementService) UpdateModel(networkElementID uuid.UUID, modelAsS
// Update updates a existing network element.
func (s *NetworkElementService) Update(networkElementToUpdate networkelement.NetworkElement) error {
err := s.networkElementStore.Update(networkElementToUpdate)
ctx := context.Background()
err := s.networkElementStore.Update(ctx, networkElementToUpdate)
if err != nil {
return err
}
......@@ -184,7 +192,8 @@ 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 {
err := s.networkElementStore.Delete(networkElementToDelete)
ctx := context.Background()
err := s.networkElementStore.Delete(ctx, networkElementToDelete)
if err != nil {
return err
}
......
......@@ -3,20 +3,20 @@ package nucleus
import (
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"go.mongodb.org/mongo-driver/mongo"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
)
// NewNetworkElementStore returns a NetworkElementStore.
func NewNetworkElementStore() networkelement.Store {
func NewNetworkElementStore(db *mongo.Database, pndUUID uuid.UUID) networkelement.Store {
storeMode := store.GetStoreMode()
log.Debugf("StoreMode: %s", storeMode)
switch storeMode {
case store.Database:
return &DatabaseNetworkElementStore{
storeName: "networkElement-store.json",
}
return NewDatabaseNetworkElementStore(pndUUID, db)
default:
store := NewFilesystemNetworkElementStore()
......
package nucleus
import (
"context"
"encoding/json"
"os"
"sync"
......@@ -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(ctx context.Context, pluginToAdd plugin.Plugin) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -85,7 +86,7 @@ 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(ctx context.Context, pluginToUpdate plugin.Plugin) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -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(ctx context.Context, pluginToDelete plugin.Plugin) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -142,7 +143,7 @@ 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(ctx context.Context, query store.Query) (plugin.LoadedPlugin, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -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(ctx context.Context) ([]plugin.LoadedPlugin, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......
package nucleus
import (
"context"
"testing"
"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/store"
"github.com/google/uuid"
"go.mongodb.org/mongo-driver/mongo"
)
func ensureStoreFilesForTestsAreRemoved() {
......@@ -17,10 +19,10 @@ func ensureStoreFilesForTestsAreRemoved() {
func TestAddPlugin(t *testing.T) {
defer ensureStoreFilesForTestsAreRemoved()
pluginStore := NewPluginStore()
pluginStore := NewPluginStore(&mongo.Database{})
mockPlugin := mockPlugin(t)
err := pluginStore.Add(mockPlugin)
err := pluginStore.Add(context.TODO(), mockPlugin)
if err != nil {
t.Error(err)
}
......@@ -29,7 +31,7 @@ func TestAddPlugin(t *testing.T) {
func TestGetAllPlugins(t *testing.T) {
defer ensureStoreFilesForTestsAreRemoved()
pluginStore := NewPluginStore()
pluginStore := NewPluginStore(&mongo.Database{})
mockPlugin1ID, err := uuid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")
if err != nil {
......@@ -48,13 +50,13 @@ func TestGetAllPlugins(t *testing.T) {
inputPlugins := [2]plugin.Plugin{mockPlugin1, mockPlugin2}
for _, plugin := range inputPlugins {
err := pluginStore.Add(plugin)
err := pluginStore.Add(context.TODO(), plugin)
if err != nil {
t.Error(err)
}
}
returnPlugins, err := pluginStore.GetAll()
returnPlugins, err := pluginStore.GetAll(context.TODO())
if err != nil {
t.Error(err)
}
......@@ -74,7 +76,7 @@ func TestGetAllPlugins(t *testing.T) {
func TestGetPlugin(t *testing.T) {
defer ensureStoreFilesForTestsAreRemoved()
pluginStore := NewPluginStore()
pluginStore := NewPluginStore(&mongo.Database{})
mockPlugin1ID, err := uuid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")
if err != nil {
......@@ -92,13 +94,13 @@ func TestGetPlugin(t *testing.T) {
inputPlugins := [2]plugin.Plugin{mockPlugin1, mockPlugin2}
for _, plugins := range inputPlugins {
err := pluginStore.Add(plugins)
err := pluginStore.Add(context.TODO(), plugins)
if err != nil {
t.Error(err)
}
}
returnPlugin, err := pluginStore.Get(store.Query{ID: mockPlugin2ID, Name: ""})
returnPlugin, err := pluginStore.Get(context.TODO(), store.Query{ID: mockPlugin2ID, Name: ""})
if err != nil {
t.Error(err)
}
......@@ -111,7 +113,7 @@ func TestGetPlugin(t *testing.T) {
func TestDeleteAllPlugins(t *testing.T) {
defer ensureStoreFilesForTestsAreRemoved()
pluginStore := NewPluginStore()
pluginStore := NewPluginStore(&mongo.Database{})
mockPlugin1ID, err := uuid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")
if err != nil {
......@@ -129,18 +131,18 @@ func TestDeleteAllPlugins(t *testing.T) {
inputPlugins := [2]plugin.Plugin{mockPlugin1, mockPlugin2}
for _, plugins := range inputPlugins {
err := pluginStore.Add(plugins)
err := pluginStore.Add(context.TODO(), plugins)
if err != nil {
t.Error(err)
}
}
err = pluginStore.Delete(mockPlugin1)
err = pluginStore.Delete(context.TODO(), mockPlugin1)
if err != nil {
t.Error(err)
}
returnPlugins, err := pluginStore.GetAll()
returnPlugins, err := pluginStore.GetAll(context.TODO())
if err != nil {
t.Error(err)
}
......
......@@ -50,7 +50,8 @@ 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) {
loadedPlugin, err := s.pluginStore.Get(query)
ctx := context.Background()
loadedPlugin, err := s.pluginStore.Get(ctx, query)
if err != nil {
return nil, err
}
......@@ -67,7 +68,8 @@ func (s *PluginService) Get(query store.Query) (plugin.Plugin, error) {
func (s *PluginService) GetAll() ([]plugin.Plugin, error) {
var plugins []plugin.Plugin
loadedPlugins, err := s.pluginStore.GetAll()
ctx := context.Background()
loadedPlugins, err := s.pluginStore.GetAll(ctx)
if err != nil {
return nil, err
}
......@@ -86,7 +88,8 @@ func (s *PluginService) GetAll() ([]plugin.Plugin, error) {
// Add adds a plugin to the plugin store.
func (s *PluginService) Add(pluginToAdd plugin.Plugin) error {
err := s.pluginStore.Add(pluginToAdd)
ctx := context.Background()
err := s.pluginStore.Add(ctx, pluginToAdd)
if err != nil {
return err
}
......@@ -100,7 +103,8 @@ func (s *PluginService) Add(pluginToAdd plugin.Plugin) error {
// Delete deletes a plugin from the plugin store.
func (s *PluginService) Delete(pluginToDelete plugin.Plugin) error {
err := s.pluginStore.Delete(pluginToDelete)
ctx := context.Background()
err := s.pluginStore.Delete(ctx, pluginToDelete)
if err != nil {
return err
}
......@@ -116,6 +120,7 @@ func (s *PluginService) Delete(pluginToDelete plugin.Plugin) error {
}
func (s *PluginService) createPluginFromStore(loadedPlugin plugin.LoadedPlugin) (plugin.Plugin, error) {
ctx := context.Background()
plugin, err := s.createPluginFromStoreFn(loadedPlugin)
if err != nil {
if errors.Is(err, hcplugin.ErrProcessNotFound) {
......@@ -123,7 +128,7 @@ func (s *PluginService) createPluginFromStore(loadedPlugin plugin.LoadedPlugin)
if err != nil {
return nil, err
}
err := s.pluginStore.Update(plugin)
err := s.pluginStore.Update(ctx, plugin)
if err != nil {
return nil, err
}
......
......@@ -3,17 +3,16 @@ package nucleus
import (
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"go.mongodb.org/mongo-driver/mongo"
)
// NewPluginStore returns a pluginStore.
func NewPluginStore() plugin.Store {
func NewPluginStore(db *mongo.Database) plugin.Store {
storeMode := store.GetStoreMode()
switch storeMode {
case store.Database:
return &DatabasePluginStore{
pluginStoreName: store.PluginFilenameSuffix,
}
return NewDatabasePluginStore(db)
default:
store := NewFilesystemPluginStore()
......
package nucleus
import (
"context"
"encoding/json"
"os"
"sync"
......@@ -87,7 +88,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(ctx context.Context, pndToAdd networkdomain.NetworkDomain) error {
t.fileMutex.Lock()
defer t.fileMutex.Unlock()
......@@ -113,7 +114,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(ctx context.Context, pndToDelete networkdomain.NetworkDomain) error {
t.fileMutex.Lock()
defer t.fileMutex.Unlock()
......@@ -141,7 +142,7 @@ 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(ctx context.Context, query store.Query) (networkdomain.LoadedPnd, error) {
t.fileMutex.Lock()
defer t.fileMutex.Unlock()
......@@ -162,7 +163,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(ctx context.Context) ([]networkdomain.LoadedPnd, error) {
t.fileMutex.Lock()
defer t.fileMutex.Unlock()
......
package nucleus
import (
"context"
"testing"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"github.com/google/uuid"
"go.mongodb.org/mongo-driver/mongo"
)
func TestAddPnd(t *testing.T) {
defer ensureStoreFileForTestsIsRemoved(store.PndFilename)
pluginServiceMock := NewPluginServiceMock()
pndStore := NewPndStore(pluginServiceMock)
pndStore := NewPndStore(&mongo.Database{}, pluginServiceMock)
pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
pnd := NewPND(pndID, "testpnd", "test")
err := pndStore.Add(pnd)
err := pndStore.Add(context.TODO(), pnd)
if err != nil {
t.Error(err)
......@@ -28,7 +30,7 @@ func TestGetAllPnds(t *testing.T) {
defer ensureStoreFileForTestsIsRemoved(store.PndFilename)
pluginServiceMock := NewPluginServiceMock()
pndStore := NewPndStore(pluginServiceMock)
pndStore := NewPndStore(&mongo.Database{}, pluginServiceMock)
pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
pndID2, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bab")
pnd1 := NewPND(pndID1, "testpnd", "test")
......@@ -37,13 +39,13 @@ func TestGetAllPnds(t *testing.T) {
inputPnds := [2]networkdomain.NetworkDomain{pnd1, pnd2}
for _, pnd := range inputPnds {
err := pndStore.Add(pnd)
err := pndStore.Add(context.TODO(), pnd)
if err != nil {
t.Error(err)
}
}
returnPnds, err := pndStore.GetAll()
returnPnds, err := pndStore.GetAll(context.TODO())
if err != nil {
t.Error(err)
}
......@@ -65,7 +67,7 @@ func TestGetPnd(t *testing.T) {
defer ensureStoreFileForTestsIsRemoved(store.PndFilename)
pluginServiceMock := NewPluginServiceMock()
pndStore := NewPndStore(pluginServiceMock)
pndStore := NewPndStore(&mongo.Database{}, pluginServiceMock)
pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
pndID2, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bab")
pnd1 := NewPND(pndID1, "testpnd", "test")
......@@ -74,13 +76,13 @@ func TestGetPnd(t *testing.T) {
inputPnds := [2]networkdomain.NetworkDomain{pnd1, pnd2}
for _, pnd := range inputPnds {
err := pndStore.Add(pnd)
err := pndStore.Add(context.TODO(), pnd)
if err != nil {
t.Error(err)
}
}
returnPnd, err := pndStore.Get(store.Query{ID: pndID2, Name: ""})
returnPnd, err := pndStore.Get(context.TODO(), store.Query{ID: pndID2, Name: ""})
if err != nil {
t.Error(err)
}
......@@ -100,7 +102,7 @@ func TestDeletePnd(t *testing.T) {
defer ensureStoreFileForTestsIsRemoved(store.PndFilename)
pluginServiceMock := NewPluginServiceMock()
pndStore := NewPndStore(pluginServiceMock)
pndStore := NewPndStore(&mongo.Database{}, pluginServiceMock)
pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
pndID2, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bab")
pnd1 := NewPND(pndID1, "testpnd", "test")
......@@ -109,18 +111,18 @@ func TestDeletePnd(t *testing.T) {
inputPnds := [2]networkdomain.NetworkDomain{pnd1, pnd2}
for _, pnd := range inputPnds {
err := pndStore.Add(pnd)
err := pndStore.Add(context.TODO(), pnd)
if err != nil {
t.Error(err)
}
}
err := pndStore.Delete(pnd1)
err := pndStore.Delete(context.TODO(), pnd1)
if err != nil {
t.Error(err)
}
returnPnds, err := pndStore.GetAll()
returnPnds, err := pndStore.GetAll(context.TODO())
if err != nil {
t.Error(err)
}
......
package nucleus
import (
"context"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"github.com/google/uuid"
......@@ -22,7 +24,8 @@ func NewPndService(pndStore networkdomain.PndStore) networkdomain.Service {
// Add adds a PND to the PND store.
func (p *PndService) Add(pndToAdd networkdomain.NetworkDomain) error {
err := p.pndStore.Add(pndToAdd)
ctx := context.Background()
err := p.pndStore.Add(ctx, pndToAdd)
if err != nil {
return err
}
......@@ -32,7 +35,8 @@ func (p *PndService) Add(pndToAdd networkdomain.NetworkDomain) error {
// Delete deletes a PND from the PND store.
func (p *PndService) Delete(pndToDelete networkdomain.NetworkDomain) error {
err := p.pndStore.Delete(pndToDelete)
ctx := context.Background()
err := p.pndStore.Delete(ctx, pndToDelete)
if err != nil {
return err
}
......@@ -42,7 +46,8 @@ 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) {
loadedPnd, err := p.pndStore.Get(query)
ctx := context.Background()
loadedPnd, err := p.pndStore.Get(ctx, query)
if err != nil {
return nil, err
}
......@@ -53,8 +58,9 @@ 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
ctx := context.Background()
loadedPnds, err := p.pndStore.GetAll()
loadedPnds, err := p.pndStore.GetAll(ctx)
if err != nil {
return nil, err
}
......
......@@ -2,11 +2,10 @@ package nucleus
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/store"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
"go.mongodb.org/mongo-driver/mongo"
)
// LoadedPnd represents a Principal Network Domain that was loaeded by using
......@@ -22,17 +21,13 @@ type PndStore struct {
}
// NewPndStore returns a PndStore.
func NewPndStore(pluginService plugin.Service) networkdomain.PndStore {
func NewPndStore(db *mongo.Database, pluginService plugin.Service) networkdomain.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 NewDatabasePndStore(db, pluginService)
default:
store := NewFilesystemPndStore(pluginService)
......
package rbac
import (
"context"
"fmt"
"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/store"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
......@@ -15,28 +15,24 @@ import (
"go.mongodb.org/mongo-driver/mongo/options"
)
const roleStoreName = "role-store.json"
// DatabaseRoleStore is used to store roles in database.
type DatabaseRoleStore struct {
roleStoreName string
collection *mongo.Collection
}
// Add adds a Role.
func (s *DatabaseRoleStore) Add(roleToAdd rbac.Role) (err error) {
client, ctx, cancel, err := database.GetMongoConnection()
if err != nil {
return err
func NewDatabaseRoleStore(db *mongo.Database) *DatabaseRoleStore {
collection := db.Collection(roleStoreName)
return &DatabaseRoleStore{
collection: collection,
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
}
_, err = client.Database(database.DatabaseName).
Collection(s.roleStoreName).
InsertOne(ctx, roleToAdd)
// Add adds a Role.
func (s *DatabaseRoleStore) Add(ctx context.Context, roleToAdd rbac.Role) (err error) {
_, err = s.collection.InsertOne(ctx, roleToAdd)
if err != nil {
if mongo.IsDuplicateKeyError(err) {
return nil
......@@ -49,22 +45,8 @@ 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, err := database.GetMongoConnection()
if err != nil {
return err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
_, err = client.Database(database.DatabaseName).
Collection(s.roleStoreName).
DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: roleToDelete.ID().String()}})
func (s *DatabaseRoleStore) Delete(ctx context.Context, roleToDelete rbac.Role) (err error) {
_, err = s.collection.DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: roleToDelete.ID().String()}})
if err != nil {
return customerrs.CouldNotDeleteError{Identifier: roleToDelete.ID(), Type: roleToDelete, Err: err}
}
......@@ -74,11 +56,11 @@ func (s *DatabaseRoleStore) Delete(roleToDelete rbac.Role) (err error) {
// Get takes a Roles's UUID or name and returns the Role. If the requested
// Role does not exist an error is returned.
func (s *DatabaseRoleStore) Get(query store.Query) (rbac.LoadedRole, error) {
func (s *DatabaseRoleStore) Get(ctx context.Context, query store.Query) (rbac.LoadedRole, error) {
var loadedRole rbac.LoadedRole
if query.ID != uuid.Nil {
loadedRole, err := s.getByID(query.ID)
loadedRole, err := s.getByID(ctx, query.ID)
if err != nil {
return loadedRole, err
}
......@@ -86,7 +68,7 @@ func (s *DatabaseRoleStore) Get(query store.Query) (rbac.LoadedRole, error) {
return loadedRole, nil
}
loadedRole, err := s.getByName(query.Name)
loadedRole, err := s.getByName(ctx, query.Name)
if err != nil {
return loadedRole, err
}
......@@ -94,22 +76,8 @@ func (s *DatabaseRoleStore) Get(query store.Query) (rbac.LoadedRole, error) {
return loadedRole, nil
}
func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (loadedRole rbac.LoadedRole, err error) {
client, ctx, cancel, err := database.GetMongoConnection()
if err != nil {
return loadedRole, err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
db := client.Database(database.DatabaseName)
collection := db.Collection(s.roleStoreName)
result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfRole.String()}})
func (s *DatabaseRoleStore) getByID(ctx context.Context, idOfRole uuid.UUID) (loadedRole rbac.LoadedRole, err error) {
result := s.collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfRole.String()}})
if result == nil {
return loadedRole, customerrs.CouldNotFindError{ID: idOfRole}
}
......@@ -123,22 +91,8 @@ func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (loadedRole rbac.LoadedR
return loadedRole, nil
}
func (s *DatabaseRoleStore) getByName(nameOfRole string) (loadedRole rbac.LoadedRole, err error) {
client, ctx, cancel, err := database.GetMongoConnection()
if err != nil {
return loadedRole, err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
db := client.Database(database.DatabaseName)
collection := db.Collection(s.roleStoreName)
result := collection.FindOne(ctx, bson.D{primitive.E{Key: "rolename", Value: nameOfRole}})
func (s *DatabaseRoleStore) getByName(ctx context.Context, nameOfRole string) (loadedRole rbac.LoadedRole, err error) {
result := s.collection.FindOne(ctx, bson.D{primitive.E{Key: "rolename", Value: nameOfRole}})
if result == nil {
return loadedRole, customerrs.CouldNotFindError{Name: nameOfRole}
}
......@@ -153,23 +107,8 @@ 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, err := database.GetMongoConnection()
if err != nil {
return nil, err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
db := client.Database(database.DatabaseName)
collection := db.Collection(s.roleStoreName)
cursor, err := collection.Find(ctx, bson.D{})
func (s *DatabaseRoleStore) GetAll(ctx context.Context) (loadedRoles []rbac.LoadedRole, err error) {
cursor, err := s.collection.Find(ctx, bson.D{})
if err != nil {
return nil, err
}
......@@ -190,20 +129,9 @@ func (s *DatabaseRoleStore) GetAll() (loadedRoles []rbac.LoadedRole, err error)
}
// Update updates the role.
func (s *DatabaseRoleStore) Update(roleToUpdate rbac.Role) (err error) {
func (s *DatabaseRoleStore) Update(ctx context.Context, roleToUpdate rbac.Role) (err error) {
var updatedLoadedRole rbac.LoadedRole
client, ctx, cancel, err := database.GetMongoConnection()
if err != nil {
return err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
update := bson.D{primitive.E{Key: "$set", Value: roleToUpdate}}
upsert := false
......@@ -213,10 +141,8 @@ func (s *DatabaseRoleStore) Update(roleToUpdate rbac.Role) (err error) {
ReturnDocument: &after,
}
err = client.Database(database.DatabaseName).
Collection(s.roleStoreName).
FindOneAndUpdate(
ctx, bson.M{"_id": roleToUpdate.ID().String()}, update, &opt).
err = s.collection.FindOneAndUpdate(
ctx, bson.M{"_id": roleToUpdate.ID().String()}, update, &opt).
Decode(&updatedLoadedRole)
if err != nil {
log.Printf("Could not update Role: %v", err)
......
package rbac
import (
"context"
"fmt"
"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
......@@ -16,28 +17,24 @@ import (
"go.mongodb.org/mongo-driver/mongo/writeconcern"
)
const storeName = "user.json"
// DatabaseUserStore is used to store users in database.
type DatabaseUserStore struct {
userStoreName string
collection *mongo.Collection
}
// Add adds an User.
func (s *DatabaseUserStore) Add(userToAdd rbac.User) (err error) {
client, ctx, cancel, err := database.GetMongoConnection()
if err != nil {
return err
func NewDatabaseUserStore(db *mongo.Database) *DatabaseUserStore {
collection := db.Collection(storeName)
return &DatabaseUserStore{
collection: collection,
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
}
_, err = client.Database(database.DatabaseName).
Collection(s.userStoreName).
InsertOne(ctx, userToAdd)
// Add adds an User.
func (s *DatabaseUserStore) Add(ctx context.Context, userToAdd rbac.User) (err error) {
_, err = s.collection.InsertOne(ctx, userToAdd)
if err != nil {
if mongo.IsDuplicateKeyError(err) {
return nil
......@@ -50,22 +47,8 @@ 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, err := database.GetMongoConnection()
if err != nil {
return err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
_, err = client.Database(database.DatabaseName).
Collection(s.userStoreName).
DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: userToDelete.ID().String()}})
func (s *DatabaseUserStore) Delete(ctx context.Context, userToDelete rbac.User) (err error) {
_, err = s.collection.DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: userToDelete.ID().String()}})
if err != nil {
return customerrs.CouldNotDeleteError{Identifier: userToDelete.ID(), Type: userToDelete, Err: err}
}
......@@ -75,11 +58,11 @@ func (s *DatabaseUserStore) Delete(userToDelete rbac.User) (err error) {
// Get takes a User's UUID or name and returns the User. If the requested
// User does not exist an error is returned.
func (s *DatabaseUserStore) Get(query store.Query) (rbac.LoadedUser, error) {
func (s *DatabaseUserStore) Get(ctx context.Context, query store.Query) (rbac.LoadedUser, error) {
var loadedUser rbac.LoadedUser
if query.ID != uuid.Nil {
loadedUser, err := s.getByID(query.ID)
loadedUser, err := s.getByID(ctx, query.ID)
if err != nil {
return loadedUser, err
}
......@@ -87,7 +70,7 @@ func (s *DatabaseUserStore) Get(query store.Query) (rbac.LoadedUser, error) {
return loadedUser, nil
}
loadedUser, err := s.getByName(query.Name)
loadedUser, err := s.getByName(ctx, query.Name)
if err != nil {
return loadedUser, err
}
......@@ -95,22 +78,8 @@ func (s *DatabaseUserStore) Get(query store.Query) (rbac.LoadedUser, error) {
return loadedUser, nil
}
func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (loadedUser rbac.LoadedUser, err error) {
client, ctx, cancel, err := database.GetMongoConnection()
if err != nil {
return loadedUser, err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
db := client.Database(database.DatabaseName)
collection := db.Collection(s.userStoreName)
result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfUser.String()}})
func (s *DatabaseUserStore) getByID(ctx context.Context, idOfUser uuid.UUID) (loadedUser rbac.LoadedUser, err error) {
result := s.collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfUser.String()}})
if result == nil {
return loadedUser, customerrs.CouldNotFindError{ID: idOfUser}
}
......@@ -124,22 +93,8 @@ func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (loadedUser rbac.LoadedU
return loadedUser, nil
}
func (s *DatabaseUserStore) getByName(nameOfUser string) (loadedUser rbac.LoadedUser, err error) {
client, ctx, cancel, err := database.GetMongoConnection()
if err != nil {
return loadedUser, err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
db := client.Database(database.DatabaseName)
collection := db.Collection(s.userStoreName)
result := collection.FindOne(ctx, bson.D{primitive.E{Key: "username", Value: nameOfUser}})
func (s *DatabaseUserStore) getByName(ctx context.Context, nameOfUser string) (loadedUser rbac.LoadedUser, err error) {
result := s.collection.FindOne(ctx, bson.D{primitive.E{Key: "username", Value: nameOfUser}})
if result == nil {
return loadedUser, customerrs.CouldNotFindError{Name: nameOfUser}
}
......@@ -154,23 +109,8 @@ 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, err := database.GetMongoConnection()
if err != nil {
return nil, err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
db := client.Database(database.DatabaseName)
collection := db.Collection(s.userStoreName)
cursor, err := collection.Find(ctx, bson.D{})
func (s *DatabaseUserStore) GetAll(ctx context.Context) (loadedUsers []rbac.LoadedUser, err error) {
cursor, err := s.collection.Find(ctx, bson.D{})
if err != nil {
return nil, err
}
......@@ -191,52 +131,44 @@ func (s *DatabaseUserStore) GetAll() (loadedUsers []rbac.LoadedUser, err error)
}
// Update updates the User.
func (s *DatabaseUserStore) Update(userToUpdate rbac.User) (err error) {
func (s *DatabaseUserStore) Update(ctx context.Context, userToUpdate rbac.User) (err error) {
var updatedLoadedUser rbac.LoadedUser
client, ctx, cancel, err := database.GetMongoConnection()
db, err := database.Connect()
if err != nil {
return err
}
defer cancel()
defer func() {
if ferr := client.Disconnect(ctx); ferr != nil {
fErrString := ferr.Error()
err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
}
}()
// 1. Start Transaction
wcMajority := writeconcern.Majority()
wcMajorityCollectionOpts := options.Collection().SetWriteConcern(wcMajority)
userCollection := client.Database(database.DatabaseName).Collection(s.userStoreName, wcMajorityCollectionOpts)
session, err := client.StartSession()
wc := writeconcern.Majority()
txnOptions := options.Transaction().SetWriteConcern(wc)
// Starts a session on the client
session, err := db.Client().StartSession()
if err != nil {
return err
}
// Defers ending the session after the transaction is committed or ended
defer session.EndSession(ctx)
// 2. Fetch exisiting Entity
existingUser, err := s.getByID(userToUpdate.ID())
if err != nil {
return err
}
// 3.2.1 If yes -> Update entity in callback
callback := func(sessCtx mongo.SessionContext) (interface{}, error) {
// 2. Fetch exisiting Entity
existingUser, err := s.getByID(ctx, userToUpdate.ID())
if err != nil {
return nil, err
}
// 3. Check if Entity.Metadata.ResourceVersion == UpdatedEntity.Metadata.ResourceVersion
if userToUpdate.GetMetadata().ResourceVersion != existingUser.Metadata.ResourceVersion {
// 3.1.1 End transaction
// 3.1.2 If no -> return error
// 3. Check if Entity.Metadata.ResourceVersion == UpdatedEntity.Metadata.ResourceVersion
if userToUpdate.GetMetadata().ResourceVersion != existingUser.Metadata.ResourceVersion {
// 3.1.1 End transaction
// 3.1.2 If no -> return error
return fmt.Errorf(
"resource version %d of provided user %s is older or newer than %d in the store",
userToUpdate.GetMetadata().ResourceVersion,
userToUpdate.ID().String(), existingUser.Metadata.ResourceVersion,
)
}
return nil, fmt.Errorf(
"resource version %d of provided user %s is older or newer than %d in the store",
userToUpdate.GetMetadata().ResourceVersion,
userToUpdate.ID().String(), existingUser.Metadata.ResourceVersion,
)
}
// 3.2.1 If yes -> Update entity in callback
callback := func(sessCtx mongo.SessionContext) (interface{}, error) {
// Important: You must pass sessCtx as the Context parameter to the operations for them to be executed in the
// transaction.
......@@ -252,9 +184,8 @@ func (s *DatabaseUserStore) Update(userToUpdate rbac.User) (err error) {
ReturnDocument: &after,
}
err = userCollection.
FindOneAndUpdate(
ctx, bson.M{"_id": userToUpdate.ID().String()}, update, &opt).
err = s.collection.FindOneAndUpdate(
ctx, bson.M{"_id": userToUpdate.ID().String()}, update, &opt).
Decode(&updatedLoadedUser)
if err != nil {
log.Printf("Could not update User: %v", err)
......@@ -266,7 +197,7 @@ func (s *DatabaseUserStore) Update(userToUpdate rbac.User) (err error) {
return "", nil
}
_, err = session.WithTransaction(ctx, callback)
_, err = session.WithTransaction(ctx, callback, txnOptions)
if err != nil {
return err
}
......
package rbac
import (
"context"
"encoding/json"
"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
......@@ -23,7 +24,7 @@ func NewMemoryRoleStore() rbac.RoleStore {
}
// Add adds a item to the store.
func (s *MemoryRoleStore) Add(item rbac.Role) error {
func (s *MemoryRoleStore) Add(ctx context.Context, item rbac.Role) error {
var role rbac.LoadedRole
b, err := json.Marshal(item)
......@@ -47,13 +48,13 @@ func (s *MemoryRoleStore) Add(item rbac.Role) error {
}
// Delete deletes a role from the role store.
func (s *MemoryRoleStore) Delete(item rbac.Role) error {
func (s *MemoryRoleStore) Delete(ctx context.Context, item rbac.Role) error {
delete(s.Store, item.ID().String())
return nil
}
// Update updates an existing role.
func (s *MemoryRoleStore) Update(item rbac.Role) error {
func (s *MemoryRoleStore) Update(ctx context.Context, item rbac.Role) error {
_, ok := s.Store[item.ID().String()]
if !ok {
return customerrs.CouldNotFindError{ID: item.ID(), Name: item.Name()}
......@@ -77,7 +78,7 @@ func (s *MemoryRoleStore) Update(item rbac.Role) error {
}
// Get takes a role's UUID or name and returns the role.
func (s *MemoryRoleStore) Get(query store.Query) (rbac.LoadedRole, error) {
func (s *MemoryRoleStore) Get(ctx context.Context, query store.Query) (rbac.LoadedRole, error) {
// First search for direct hit on UUID.
item, ok := s.Store[query.ID.String()]
if !ok {
......@@ -99,7 +100,7 @@ func (s *MemoryRoleStore) Get(query store.Query) (rbac.LoadedRole, error) {
}
// GetAll returns all stored roles.
func (s *MemoryRoleStore) GetAll() ([]rbac.LoadedRole, error) {
func (s *MemoryRoleStore) GetAll(ctx context.Context) ([]rbac.LoadedRole, error) {
var allItems []rbac.LoadedRole
for _, item := range s.Store {
......
package rbac
import (
"context"
"encoding/json"
"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
......@@ -23,7 +24,7 @@ func NewMemoryUserStore() rbac.UserStore {
}
// Add adds a item to the store.
func (s *MemoryUserStore) Add(item rbac.User) error {
func (s *MemoryUserStore) Add(ctx context.Context, item rbac.User) error {
var user rbac.LoadedUser
b, err := json.Marshal(item)
......@@ -47,13 +48,13 @@ func (s *MemoryUserStore) Add(item rbac.User) error {
}
// Delete deletes a user from the user store.
func (s *MemoryUserStore) Delete(item rbac.User) error {
func (s *MemoryUserStore) Delete(ctx context.Context, item rbac.User) error {
delete(s.Store, item.ID().String())
return nil
}
// Update updates an existing user.
func (s *MemoryUserStore) Update(item rbac.User) error {
func (s *MemoryUserStore) Update(ctx context.Context, item rbac.User) error {
_, ok := s.Store[item.ID().String()]
if !ok {
return customerrs.CouldNotFindError{ID: item.ID(), Name: item.Name()}
......@@ -77,7 +78,7 @@ func (s *MemoryUserStore) Update(item rbac.User) error {
}
// Get takes a user's UUID or name and returns the user.
func (s *MemoryUserStore) Get(query store.Query) (rbac.LoadedUser, error) {
func (s *MemoryUserStore) Get(ctx context.Context, query store.Query) (rbac.LoadedUser, error) {
// First search for direct hit on UUID.
item, ok := s.Store[query.ID.String()]
if !ok {
......@@ -99,7 +100,7 @@ func (s *MemoryUserStore) Get(query store.Query) (rbac.LoadedUser, error) {
}
// GetAll returns all stored users.
func (s *MemoryUserStore) GetAll() ([]rbac.LoadedUser, error) {
func (s *MemoryUserStore) GetAll(ctx context.Context) ([]rbac.LoadedUser, error) {
var allItems []rbac.LoadedUser
for _, item := range s.Store {
......
package rbac
import (
"context"
"code.fbi.h-da.de/danet/gosdn/controller/event"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
"code.fbi.h-da.de/danet/gosdn/controller/store"
......@@ -35,7 +37,8 @@ func NewUserService(userStore rbac.UserStore, eventService eventInterfaces.Servi
// Add adds a user to the user store.
func (s *UserService) Add(userToAdd rbac.User) error {
err := s.userStore.Add(userToAdd)
ctx := context.Background()
err := s.userStore.Add(ctx, userToAdd)
if err != nil {
return err
}
......@@ -57,7 +60,8 @@ func (s *UserService) Add(userToAdd rbac.User) error {
// Delete deletes a user from the user store.
func (s *UserService) Delete(userToDelete rbac.User) error {
err := s.userStore.Delete(userToDelete)
ctx := context.Background()
err := s.userStore.Delete(ctx, userToDelete)
if err != nil {
return err
}
......@@ -79,7 +83,8 @@ func (s *UserService) Delete(userToDelete rbac.User) error {
// Update updates a existing user.
func (s *UserService) Update(userToUpdate rbac.User) error {
err := s.userStore.Update(userToUpdate)
ctx := context.Background()
err := s.userStore.Update(ctx, userToUpdate)
if err != nil {
return err
}
......@@ -101,7 +106,8 @@ func (s *UserService) Update(userToUpdate rbac.User) error {
// Get takes a user's UUID or name and returns the user.
func (s *UserService) Get(query store.Query) (rbac.User, error) {
loadedUser, err := s.userStore.Get(query)
ctx := context.Background()
loadedUser, err := s.userStore.Get(ctx, query)
if err != nil {
return nil, err
}
......@@ -113,7 +119,8 @@ func (s *UserService) Get(query store.Query) (rbac.User, error) {
func (s *UserService) GetAll() ([]rbac.User, error) {
var users []rbac.User
loadedUsers, err := s.userStore.GetAll()
ctx := context.Background()
loadedUsers, err := s.userStore.GetAll(ctx)
if err != nil {
return nil, err
}
......@@ -126,7 +133,15 @@ func (s *UserService) GetAll() ([]rbac.User, error) {
}
func (s *UserService) createUserFromStore(loadedUser rbac.LoadedUser) rbac.User {
return NewUser(uuid.MustParse(loadedUser.ID), loadedUser.UserName, loadedUser.Roles, loadedUser.Password, loadedUser.Token, loadedUser.Salt, loadedUser.Metadata)
return NewUser(
uuid.MustParse(loadedUser.ID),
loadedUser.UserName,
loadedUser.Roles,
loadedUser.Password,
loadedUser.Token,
loadedUser.Salt,
loadedUser.Metadata,
)
}
// RoleService provides a role service implementation.
......@@ -145,7 +160,8 @@ func NewRoleService(roleStore rbac.RoleStore, eventService eventInterfaces.Servi
// Add adds a role to the role store.
func (s *RoleService) Add(roleToAdd rbac.Role) error {
err := s.roleStore.Add(roleToAdd)
ctx := context.Background()
err := s.roleStore.Add(ctx, roleToAdd)
if err != nil {
return err
}
......@@ -167,7 +183,8 @@ func (s *RoleService) Add(roleToAdd rbac.Role) error {
// Delete deletes a role from the role store.
func (s *RoleService) Delete(roleToDelete rbac.Role) error {
err := s.roleStore.Delete(roleToDelete)
ctx := context.Background()
err := s.roleStore.Delete(ctx, roleToDelete)
if err != nil {
return err
}
......@@ -188,7 +205,8 @@ func (s *RoleService) Delete(roleToDelete rbac.Role) error {
// Update updates a existing role.
func (s *RoleService) Update(roleToUpdate rbac.Role) error {
err := s.roleStore.Update(roleToUpdate)
ctx := context.Background()
err := s.roleStore.Update(ctx, roleToUpdate)
if err != nil {
return err
}
......@@ -210,7 +228,8 @@ func (s *RoleService) Update(roleToUpdate rbac.Role) error {
// Get takes a roles's UUID or name and returns the role.
func (s *RoleService) Get(query store.Query) (rbac.Role, error) {
loadedRole, err := s.roleStore.Get(query)
ctx := context.Background()
loadedRole, err := s.roleStore.Get(ctx, query)
if err != nil {
return nil, err
}
......@@ -222,7 +241,8 @@ func (s *RoleService) Get(query store.Query) (rbac.Role, error) {
func (s *RoleService) GetAll() ([]rbac.Role, error) {
var roles []rbac.Role
loadedRoles, err := s.roleStore.GetAll()
ctx := context.Background()
loadedRoles, err := s.roleStore.GetAll(ctx)
if err != nil {
return nil, err
}
......@@ -235,5 +255,10 @@ func (s *RoleService) GetAll() ([]rbac.Role, error) {
}
func (s *RoleService) createRoleFromStore(loadedRole rbac.LoadedRole) rbac.Role {
return NewRole(uuid.MustParse(loadedRole.ID), loadedRole.RoleName, loadedRole.Description, loadedRole.Permissions)
return NewRole(
uuid.MustParse(loadedRole.ID),
loadedRole.RoleName,
loadedRole.Description,
loadedRole.Permissions,
)
}
package rbac
import (
"context"
"encoding/json"
"os"
"sync"
......@@ -59,7 +60,7 @@ func (s *FileSystemRoleStore) writeAllRolesToFile(roles []rbac.LoadedRole) error
}
// Add adds a Role to the Role store.
func (s *FileSystemRoleStore) Add(roleToAdd rbac.Role) error {
func (s *FileSystemRoleStore) Add(ctx context.Context, roleToAdd rbac.Role) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -85,7 +86,7 @@ func (s *FileSystemRoleStore) Add(roleToAdd rbac.Role) error {
}
// Delete deletes a Role from the Role store.
func (s *FileSystemRoleStore) Delete(roleToDelete rbac.Role) error {
func (s *FileSystemRoleStore) Delete(ctx context.Context, roleToDelete rbac.Role) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -113,7 +114,7 @@ func (s *FileSystemRoleStore) Delete(roleToDelete rbac.Role) error {
}
// Get takes a Roles ID and return the Role if found.
func (s *FileSystemRoleStore) Get(query store.Query) (rbac.LoadedRole, error) {
func (s *FileSystemRoleStore) Get(ctx context.Context, query store.Query) (rbac.LoadedRole, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -133,7 +134,7 @@ func (s *FileSystemRoleStore) Get(query store.Query) (rbac.LoadedRole, error) {
}
// GetAll returns all the Roles.
func (s *FileSystemRoleStore) GetAll() ([]rbac.LoadedRole, error) {
func (s *FileSystemRoleStore) GetAll(ctx context.Context) ([]rbac.LoadedRole, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......@@ -142,7 +143,7 @@ func (s *FileSystemRoleStore) GetAll() ([]rbac.LoadedRole, error) {
}
// Update updates an exsisting Role.
func (s *FileSystemRoleStore) Update(roleToUpdate rbac.Role) error {
func (s *FileSystemRoleStore) Update(ctx context.Context, roleToUpdate rbac.Role) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
......
package rbac
import (
"context"
"reflect"
"testing"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
"code.fbi.h-da.de/danet/gosdn/controller/store"
"github.com/google/uuid"
"go.mongodb.org/mongo-driver/mongo"
)
func TestFileSystemRoleStore_Add(t *testing.T) {
......@@ -25,8 +27,9 @@ func TestFileSystemRoleStore_Add(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := NewRoleStore()
if err := s.Add(tt.args.RoleToAdd); (err != nil) != tt.wantErr {
s := NewRoleStore(&mongo.Database{})
if err := s.Add(context.TODO(), tt.args.RoleToAdd); (err != nil) != tt.wantErr {
t.Errorf("FileSystemRoleStore.Add() error = %v, wantErr %v", err, tt.wantErr)
}
})
......@@ -52,11 +55,11 @@ func TestFileSystemRoleStore_Delete(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := NewRoleStore()
if err := s.Add(addRole); err != nil {
s := NewRoleStore(&mongo.Database{})
if err := s.Add(context.TODO(), addRole); err != nil {
t.Error(err)
}
if err := s.Delete(tt.args.RoleToDelete); (err != nil) != tt.wantErr {
if err := s.Delete(context.TODO(), tt.args.RoleToDelete); (err != nil) != tt.wantErr {
t.Errorf("FileSystemRoleStore.Delete() error = %v, wantErr %v", err, tt.wantErr)
}
})
......@@ -88,11 +91,11 @@ func TestFileSystemRoleStore_Get(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := NewRoleStore()
if err := s.Add(addRole); err != nil {
s := NewRoleStore(&mongo.Database{})
if err := s.Add(context.TODO(), addRole); err != nil {
t.Error(err)
}
got, err := s.Get(tt.args.query)
got, err := s.Get(context.TODO(), tt.args.query)
if (err != nil) != tt.wantErr {
t.Errorf("FileSystemRoleStore.Get() error = %v, wantErr %v", err, tt.wantErr)
return
......@@ -126,14 +129,14 @@ func TestFileSystemRoleStore_GetAll(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var errs []error
s := NewRoleStore()
if err := s.Add(addRole1); err != nil {
s := NewRoleStore(&mongo.Database{})
if err := s.Add(context.TODO(), addRole1); err != nil {
errs = append(errs, err)
}
if err := s.Add(addRole2); err != nil {
if err := s.Add(context.TODO(), addRole2); err != nil {
errs = append(errs, err)
}
if err := s.Add(addRole3); err != nil {
if err := s.Add(context.TODO(), addRole3); err != nil {
errs = append(errs, err)
}
......@@ -141,7 +144,7 @@ func TestFileSystemRoleStore_GetAll(t *testing.T) {
t.Error(errs)
}
got, err := s.GetAll()
got, err := s.GetAll(context.TODO())
if (err != nil) != tt.wantErr {
t.Errorf("FileSystemRoleStore.GetAll() error = %v, wantErr %v", err, tt.wantErr)
return
......@@ -173,11 +176,11 @@ func TestFileSystemRoleStore_Update(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := NewRoleStore()
if err := s.Add(addRole1); err != nil {
s := NewRoleStore(&mongo.Database{})
if err := s.Add(context.TODO(), addRole1); err != nil {
t.Error(err)
}
if err := s.Update(tt.args.roleToUpdate); (err != nil) != tt.wantErr {
if err := s.Update(context.TODO(), tt.args.roleToUpdate); (err != nil) != tt.wantErr {
t.Errorf("FileSystemRoleStore.Update() error = %v, wantErr %v", err, tt.wantErr)
}
})
......