From cea0eacfa2a9d78804397db06a07aeb88e66d760 Mon Sep 17 00:00:00 2001
From: Fabian Seidl <fabian.b.seidl@stud.h-da.de>
Date: Wed, 17 Aug 2022 15:26:00 +0000
Subject: [PATCH] Resolve "Delete the store files after the unit testing"

See merge request danet/gosdn!369

Co-authored-by: Fabian Seidl <fabian.seidl@h-da.de>
---
 controller/api/api_test.go                    | 30 +++++++++++++++
 controller/api/api_test.toml                  |  2 +-
 .../nucleus/deviceFilesystemStore_test.go     | 37 +++----------------
 controller/nucleus/initialise_test.go         | 24 +++++++++++-
 controller/nucleus/pndFilesystemStore_test.go | 27 ++------------
 .../nucleus/principalNetworkDomain_test.go    | 31 ++++++++++++----
 controller/nucleus/sbiFilesystemStore_test.go | 36 ++++--------------
 controller/nucleus/sbiStore.go                |  4 --
 controller/rbac/rbacTestUtil_test.go          | 29 +++++++++++++++
 controller/rbac/roleFileSystemStore_test.go   | 32 +++-------------
 controller/rbac/userFileSystemStore_test.go   | 32 +++-------------
 11 files changed, 132 insertions(+), 152 deletions(-)
 create mode 100644 controller/rbac/rbacTestUtil_test.go

diff --git a/controller/api/api_test.go b/controller/api/api_test.go
index a789e65b1..f6e8e29a6 100644
--- a/controller/api/api_test.go
+++ b/controller/api/api_test.go
@@ -2,12 +2,15 @@ package api
 
 import (
 	"context"
+	"os"
+	"path/filepath"
 	"testing"
 
 	ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
 	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/nucleus"
+	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/viper"
 )
@@ -28,7 +31,34 @@ func Test_GetIds(t *testing.T) {
 	log.Info(resp)
 }
 
+func ensureFilesForTestsAreRemoved() {
+	ensureStoreFileForTestsIsRemoved(store.SbiFilenameSuffix)
+	ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix)
+}
+
+func ensureStoreFileForTestsIsRemoved(storeName string) {
+	if err := store.EnsureFilesystemStorePathExists(storeName); err != nil {
+		log.Println(err)
+	}
+
+	wildcartFilename := "*" + storeName
+	path := store.GetCompletePathToFileStore(wildcartFilename)
+
+	files, err := filepath.Glob(path)
+
+	if err != nil {
+		log.Println(err)
+	}
+	for _, f := range files {
+		if err := os.Remove(f); err != nil {
+			log.Println(err)
+		}
+	}
+}
+
 func Test_AddPnd(t *testing.T) {
+	defer ensureFilesForTestsAreRemoved()
+
 	sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG)
 	if err != nil {
 		t.Errorf("AddPnd() error = %v", err)
diff --git a/controller/api/api_test.toml b/controller/api/api_test.toml
index fb66a3754..caa343d3b 100644
--- a/controller/api/api_test.toml
+++ b/controller/api/api_test.toml
@@ -1 +1 @@
-cli_pnd = "2043519e-46d1-4963-9a8e-d99007e104b8"
+cli_pnd = '2043519e-46d1-4963-9a8e-d99007e104b8'
diff --git a/controller/nucleus/deviceFilesystemStore_test.go b/controller/nucleus/deviceFilesystemStore_test.go
index 0e1337a99..0a6ae8605 100644
--- a/controller/nucleus/deviceFilesystemStore_test.go
+++ b/controller/nucleus/deviceFilesystemStore_test.go
@@ -1,8 +1,6 @@
 package nucleus
 
 import (
-	"os"
-	"path/filepath"
 	"testing"
 
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
@@ -10,28 +8,8 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/device"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
-	log "github.com/sirupsen/logrus"
 )
 
-func ensureDeviceFilesForTestAreRemoved() {
-	if err := store.EnsureFilesystemStorePathExists(store.DeviceFilenameSuffix); err != nil {
-		log.Error(err)
-	}
-	wildcartFilename := "*-" + store.DeviceFilenameSuffix
-	path := store.GetCompletePathToFileStore(wildcartFilename)
-
-	files, err := filepath.Glob(path)
-
-	if err != nil {
-		log.Println(err)
-	}
-	for _, f := range files {
-		if err := os.Remove(f); err != nil {
-			log.Println(err)
-		}
-	}
-}
-
 func returnBasicTransportOption() tpb.TransportOption {
 	return tpb.TransportOption{
 		Address:  "test:///",
@@ -49,8 +27,7 @@ func returnBasicTransportOption() tpb.TransportOption {
 }
 
 func TestAddDevice(t *testing.T) {
-	ensureDeviceFilesForTestAreRemoved()
-	defer ensureDeviceFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix)
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	deviceID, _ := uuid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")
@@ -69,8 +46,7 @@ func TestAddDevice(t *testing.T) {
 }
 
 func TestGetAllDevices(t *testing.T) {
-	ensureDeviceFilesForTestAreRemoved()
-	defer ensureDeviceFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix)
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	deviceStore := NewDeviceStore(pndID)
@@ -123,8 +99,7 @@ func TestGetAllDevices(t *testing.T) {
 }
 
 func TestGetDevice(t *testing.T) {
-	ensureDeviceFilesForTestAreRemoved()
-	defer ensureDeviceFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix)
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	deviceStore := NewDeviceStore(pndID)
@@ -170,8 +145,7 @@ func TestGetDevice(t *testing.T) {
 }
 
 func TestUpdateDevice(t *testing.T) {
-	ensureDeviceFilesForTestAreRemoved()
-	defer ensureDeviceFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix)
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	deviceID, _ := uuid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")
@@ -212,8 +186,7 @@ func TestUpdateDevice(t *testing.T) {
 }
 
 func TestDeleteDevice(t *testing.T) {
-	ensureDeviceFilesForTestAreRemoved()
-	defer ensureDeviceFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix)
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	deviceStore := NewDeviceStore(pndID)
diff --git a/controller/nucleus/initialise_test.go b/controller/nucleus/initialise_test.go
index bd7799944..3b1ace8cb 100644
--- a/controller/nucleus/initialise_test.go
+++ b/controller/nucleus/initialise_test.go
@@ -174,9 +174,9 @@ func newPnd() pndImplementation {
 	}
 }
 
-// removeTestPlugins removes the plugins created during running the test in the current directory based on their name consisting of a uuid
+// removeTestGoStructs removes the plugins created during running the test in the current directory based on their name consisting of a uuid
 // and the time since they`ve been created.
-func removeTestPlugins() {
+func removeTestGoStructs() {
 	currentDirectory := "./"
 	// pattern to match plugin uuid used as dir name
 	pattern := "*-*-*-*-*"
@@ -212,3 +212,23 @@ func isDirYoungerThanSeconds(dirName string, seconds int64) bool {
 
 	return fs.FileInfo.ModTime(fileInfo).Unix() > (time.Now().Unix() - seconds)
 }
+
+func ensureStoreFileForTestsIsRemoved(storeName string) {
+	if err := store.EnsureFilesystemStorePathExists(storeName); err != nil {
+		log.Println(err)
+	}
+
+	wildcartFilename := "*" + storeName
+	path := store.GetCompletePathToFileStore(wildcartFilename)
+
+	files, err := filepath.Glob(path)
+
+	if err != nil {
+		log.Println(err)
+	}
+	for _, f := range files {
+		if err := os.Remove(f); err != nil {
+			log.Println(err)
+		}
+	}
+}
diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pndFilesystemStore_test.go
index abc08fa16..420c9d27b 100644
--- a/controller/nucleus/pndFilesystemStore_test.go
+++ b/controller/nucleus/pndFilesystemStore_test.go
@@ -1,8 +1,6 @@
 package nucleus
 
 import (
-	"log"
-	"os"
 	"testing"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
@@ -10,22 +8,8 @@ import (
 	"github.com/google/uuid"
 )
 
-func ensurePndFileForTestIsRemoved() {
-	if err := store.EnsureFilesystemStorePathExists(store.PndFilename); err != nil {
-		log.Println(err)
-	}
-
-	path := store.GetCompletePathToFileStore(store.PndFilename)
-
-	err := os.Remove(path)
-	if err != nil {
-		log.Println(err)
-	}
-}
-
 func TestAddPnd(t *testing.T) {
-	ensurePndFileForTestIsRemoved()
-	defer ensurePndFileForTestIsRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.PndFilename)
 
 	pndStore := NewPndStore()
 
@@ -40,8 +24,7 @@ func TestAddPnd(t *testing.T) {
 }
 
 func TestGetAllPnds(t *testing.T) {
-	ensurePndFileForTestIsRemoved()
-	defer ensurePndFileForTestIsRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.PndFilename)
 
 	pndStore := NewPndStore()
 	pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
@@ -77,8 +60,7 @@ func TestGetAllPnds(t *testing.T) {
 }
 
 func TestGetPnd(t *testing.T) {
-	ensurePndFileForTestIsRemoved()
-	defer ensurePndFileForTestIsRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.PndFilename)
 
 	pndStore := NewPndStore()
 	pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
@@ -112,8 +94,7 @@ func TestGetPnd(t *testing.T) {
 }
 
 func TestDeletePnd(t *testing.T) {
-	ensurePndFileForTestIsRemoved()
-	defer ensurePndFileForTestIsRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.PndFilename)
 
 	pndStore := NewPndStore()
 	pndID1, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
diff --git a/controller/nucleus/principalNetworkDomain_test.go b/controller/nucleus/principalNetworkDomain_test.go
index 8f5001121..8a5d69611 100644
--- a/controller/nucleus/principalNetworkDomain_test.go
+++ b/controller/nucleus/principalNetworkDomain_test.go
@@ -4,6 +4,7 @@ import (
 	"errors"
 	"io"
 	"reflect"
+	"sync"
 	"testing"
 
 	"code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
@@ -1128,7 +1129,7 @@ func Test_pndImplementation_ConfirmedChanges(t *testing.T) {
 }
 
 func Test_pndImplementation_saveGoStructsToFile(t *testing.T) {
-	defer removeTestPlugins()
+	defer removeTestGoStructs()
 
 	type genericGoStructClientArg struct {
 		fn    string
@@ -1208,16 +1209,30 @@ func Test_pndImplementation_saveGoStructsToFile(t *testing.T) {
 			wantErr: true,
 		},
 	}
+	var wg sync.WaitGroup
 	for _, tt := range tests {
+		wg.Add(1)
 		tt := tt
-		t.Run(tt.name, func(t *testing.T) {
-			t.Parallel()
-			err := saveStreamToFile(tt.args.client, util.GoStructName, tt.args.id)
-			if (err != nil) != tt.wantErr {
-				t.Errorf("saveGoStructsToFile() error = %v, wantErr %v", err, tt.wantErr)
-			}
-		})
+
+		// waitgroup and extra func needed to be able to clean up generated pnd directories while running test cases in parallel mode,
+		// var x is just a dummy to be able to call the func,
+		// outer t.Run() required for defered wg.Done().
+		// reference: https://stackoverflow.com/a/63609718
+		x := func() {
+			defer wg.Done()
+			t.Run("parallel waiting func", func(t *testing.T) {
+				t.Run(tt.name, func(t *testing.T) {
+					t.Parallel()
+					err := saveStreamToFile(tt.args.client, util.GoStructName, tt.args.id)
+					if (err != nil) != tt.wantErr {
+						t.Errorf("saveGoStructsToFile() error = %v, wantErr %v", err, tt.wantErr)
+					}
+				})
+			})
+		}
+		x()
 	}
+	wg.Wait()
 }
 
 func Test_pndImplementation_SubscribePath(t *testing.T) {
diff --git a/controller/nucleus/sbiFilesystemStore_test.go b/controller/nucleus/sbiFilesystemStore_test.go
index 179fe2b87..24ab4dae9 100644
--- a/controller/nucleus/sbiFilesystemStore_test.go
+++ b/controller/nucleus/sbiFilesystemStore_test.go
@@ -1,9 +1,6 @@
 package nucleus
 
 import (
-	"log"
-	"os"
-	"path/filepath"
 	"testing"
 
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
@@ -12,29 +9,13 @@ import (
 	"github.com/google/uuid"
 )
 
-func ensureSbiFilesForTestAreRemoved() {
-	if err := store.EnsureFilesystemStorePathExists(store.SbiFilenameSuffix); err != nil {
-		log.Println(err)
-	}
-
-	wildcartFilename := "*-" + store.SbiFilenameSuffix
-	path := store.GetCompletePathToFileStore(wildcartFilename)
-
-	files, err := filepath.Glob(path)
-
-	if err != nil {
-		log.Println(err)
-	}
-	for _, f := range files {
-		if err := os.Remove(f); err != nil {
-			log.Println(err)
-		}
-	}
+func ensureStoreFilesForTestsAreRemoved() {
+	ensureStoreFileForTestsIsRemoved(store.SbiFilenameSuffix)
+	ensureStoreFileForTestsIsRemoved(store.DeviceFilenameSuffix)
 }
 
 func TestAddSbi(t *testing.T) {
-	ensureSbiFilesForTestAreRemoved()
-	defer ensureSbiFilesForTestAreRemoved()
+	defer ensureStoreFilesForTestsAreRemoved()
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	sbiStore := NewSbiStore(pndID)
@@ -50,8 +31,7 @@ func TestAddSbi(t *testing.T) {
 }
 
 func TestGetAllSbis(t *testing.T) {
-	ensureSbiFilesForTestAreRemoved()
-	defer ensureSbiFilesForTestAreRemoved()
+	defer ensureStoreFilesForTestsAreRemoved()
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	sbiStore := NewSbiStore(pndID)
@@ -89,8 +69,7 @@ func TestGetAllSbis(t *testing.T) {
 }
 
 func TestGetSbi(t *testing.T) {
-	ensureSbiFilesForTestAreRemoved()
-	defer ensureSbiFilesForTestAreRemoved()
+	defer ensureStoreFilesForTestsAreRemoved()
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 
@@ -122,8 +101,7 @@ func TestGetSbi(t *testing.T) {
 }
 
 func TestDeleteAllSbis(t *testing.T) {
-	ensureSbiFilesForTestAreRemoved()
-	defer ensureSbiFilesForTestAreRemoved()
+	defer ensureStoreFilesForTestsAreRemoved()
 
 	pndID, _ := uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
 	sbiStore := NewSbiStore(pndID)
diff --git a/controller/nucleus/sbiStore.go b/controller/nucleus/sbiStore.go
index 5b07b69ea..81cfc077d 100644
--- a/controller/nucleus/sbiStore.go
+++ b/controller/nucleus/sbiStore.go
@@ -9,10 +9,6 @@ import (
 	"github.com/google/uuid"
 )
 
-// SbiStore is used to store SouthboundInterfaces.
-type SbiStore struct {
-}
-
 // NewSbiStore returns a sbiStore.
 func NewSbiStore(pndUUID uuid.UUID) southbound.Store {
 	storeMode := store.GetStoreMode()
diff --git a/controller/rbac/rbacTestUtil_test.go b/controller/rbac/rbacTestUtil_test.go
new file mode 100644
index 000000000..dd007e3b1
--- /dev/null
+++ b/controller/rbac/rbacTestUtil_test.go
@@ -0,0 +1,29 @@
+package rbac
+
+import (
+	"log"
+	"os"
+	"path/filepath"
+
+	"code.fbi.h-da.de/danet/gosdn/controller/store"
+)
+
+func ensureStoreFileForTestsIsRemoved(storeName string) {
+	if err := store.EnsureFilesystemStorePathExists(storeName); err != nil {
+		log.Println(err)
+	}
+
+	wildcartFilename := "*" + storeName
+	path := store.GetCompletePathToFileStore(wildcartFilename)
+
+	files, err := filepath.Glob(path)
+
+	if err != nil {
+		log.Println(err)
+	}
+	for _, f := range files {
+		if err := os.Remove(f); err != nil {
+			log.Println(err)
+		}
+	}
+}
diff --git a/controller/rbac/roleFileSystemStore_test.go b/controller/rbac/roleFileSystemStore_test.go
index be1e55071..347b42853 100644
--- a/controller/rbac/roleFileSystemStore_test.go
+++ b/controller/rbac/roleFileSystemStore_test.go
@@ -1,9 +1,6 @@
 package rbac
 
 import (
-	"log"
-	"os"
-	"path/filepath"
 	"reflect"
 	"testing"
 
@@ -12,26 +9,8 @@ import (
 	"github.com/google/uuid"
 )
 
-func ensureRoleFilesForTestAreRemoved() {
-	if err := store.EnsureFilesystemStorePathExists(store.RoleFilename); err != nil {
-		log.Fatal(err)
-	}
-	path := store.GetCompletePathToFileStore(store.RoleFilename)
-
-	files, err := filepath.Glob(path)
-
-	if err != nil {
-		log.Println(err)
-	}
-	for _, f := range files {
-		if err := os.Remove(f); err != nil {
-			log.Println(err)
-		}
-	}
-}
-
 func TestFileSystemRoleStore_Add(t *testing.T) {
-	ensureRoleFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.RoleFilename)
 
 	type args struct {
 		RoleToAdd rbac.Role
@@ -55,7 +34,7 @@ func TestFileSystemRoleStore_Add(t *testing.T) {
 }
 
 func TestFileSystemRoleStore_Delete(t *testing.T) {
-	ensureRoleFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.RoleFilename)
 
 	type args struct {
 		RoleToDelete rbac.Role
@@ -85,7 +64,7 @@ func TestFileSystemRoleStore_Delete(t *testing.T) {
 }
 
 func TestFileSystemRoleStore_Get(t *testing.T) {
-	ensureRoleFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.RoleFilename)
 
 	type args struct {
 		query store.Query
@@ -126,7 +105,8 @@ func TestFileSystemRoleStore_Get(t *testing.T) {
 }
 
 func TestFileSystemRoleStore_GetAll(t *testing.T) {
-	ensureRoleFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.RoleFilename)
+
 	var idtest uuid.UUID
 	var arrTest []string
 	addRole1 := NewRole(idtest, "testRole1", "role1", arrTest)
@@ -174,7 +154,7 @@ func TestFileSystemRoleStore_GetAll(t *testing.T) {
 }
 
 func TestFileSystemRoleStore_Update(t *testing.T) {
-	ensureRoleFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.RoleFilename)
 
 	var idtest uuid.UUID
 	var arrTest []string
diff --git a/controller/rbac/userFileSystemStore_test.go b/controller/rbac/userFileSystemStore_test.go
index d5f88cc25..29f76a6c3 100644
--- a/controller/rbac/userFileSystemStore_test.go
+++ b/controller/rbac/userFileSystemStore_test.go
@@ -1,9 +1,6 @@
 package rbac
 
 import (
-	"log"
-	"os"
-	"path/filepath"
 	"reflect"
 	"testing"
 
@@ -12,27 +9,8 @@ import (
 	"github.com/google/uuid"
 )
 
-func ensureUserFilesForTestAreRemoved() {
-	if err := store.EnsureFilesystemStorePathExists(store.UserFilename); err != nil {
-		log.Fatal(err)
-	}
-
-	path := store.GetCompletePathToFileStore(store.UserFilename)
-
-	files, err := filepath.Glob(path)
-
-	if err != nil {
-		log.Println(err)
-	}
-	for _, f := range files {
-		if err := os.Remove(f); err != nil {
-			log.Println(err)
-		}
-	}
-}
-
 func TestFileSystemUserStore_Add(t *testing.T) {
-	ensureUserFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.UserFilename)
 
 	type args struct {
 		UserToAdd rbac.User
@@ -63,7 +41,7 @@ func TestFileSystemUserStore_Add(t *testing.T) {
 }
 
 func TestFileSystemUserStore_Delete(t *testing.T) {
-	ensureUserFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.UserFilename)
 
 	type args struct {
 		UserToDelete rbac.User
@@ -96,7 +74,7 @@ func TestFileSystemUserStore_Delete(t *testing.T) {
 }
 
 func TestFileSystemUserStore_Get(t *testing.T) {
-	ensureUserFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.UserFilename)
 
 	type args struct {
 		query store.Query
@@ -138,7 +116,7 @@ func TestFileSystemUserStore_Get(t *testing.T) {
 }
 
 func TestFileSystemUserStore_GetAll(t *testing.T) {
-	ensureUserFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.UserFilename)
 
 	var idtest uuid.UUID
 	var role map[string]string
@@ -187,7 +165,7 @@ func TestFileSystemUserStore_GetAll(t *testing.T) {
 }
 
 func TestFileSystemUserStore_Update(t *testing.T) {
-	ensureUserFilesForTestAreRemoved()
+	defer ensureStoreFileForTestsIsRemoved(store.UserFilename)
 
 	type args struct {
 		userToUpdate rbac.User
-- 
GitLab