From 4659f3c9573ace2f6e02c9563374041ebc67e9f5 Mon Sep 17 00:00:00 2001
From: Fabian Seidl <fabian.b.seidl@stud.h-da.de>
Date: Tue, 14 Jun 2022 14:50:19 +0200
Subject: [PATCH] updated ErrCouldNotMarshall to use underlying error and
 provide more information

---
 controller/nucleus/databaseDeviceStore.go | 7 ++++---
 controller/nucleus/databasePndStore.go    | 6 ++++--
 controller/nucleus/databaseSbiStore.go    | 6 ++++--
 controller/nucleus/errors/errors.go       | 6 ++++--
 controller/rbac/databaseRoleStore.go      | 8 +++++---
 controller/rbac/databaseUserStore.go      | 8 +++++---
 6 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/controller/nucleus/databaseDeviceStore.go b/controller/nucleus/databaseDeviceStore.go
index 530bbec1e..4aea432e7 100644
--- a/controller/nucleus/databaseDeviceStore.go
+++ b/controller/nucleus/databaseDeviceStore.go
@@ -2,6 +2,7 @@ package nucleus
 
 import (
 	"fmt"
+	"reflect"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/device"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
@@ -65,7 +66,7 @@ func (s *DatabaseDeviceStore) getByID(idOfDevice uuid.UUID) (device.LoadedDevice
 	err := result.Decode(&loadedDevice)
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
-		return loadedDevice, errors.ErrCouldNotMarshall{StoreName: s.storeName}
+		return loadedDevice, errors.ErrCouldNotMarshall{Object: idOfDevice, Type: reflect.TypeOf(loadedDevice), Err: err}
 	}
 
 	return loadedDevice, nil
@@ -88,7 +89,7 @@ func (s *DatabaseDeviceStore) getByName(nameOfDevice string) (device.LoadedDevic
 	err := result.Decode(&loadedDevice)
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
-		return loadedDevice, errors.ErrCouldNotMarshall{StoreName: s.storeName}
+		return loadedDevice, errors.ErrCouldNotMarshall{Object: nameOfDevice, Type: reflect.TypeOf(loadedDevice), Err: err}
 	}
 
 	return loadedDevice, nil
@@ -114,7 +115,7 @@ func (s *DatabaseDeviceStore) GetAll() ([]device.LoadedDevice, error) {
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
 
-		return nil, errors.ErrCouldNotMarshall{StoreName: pndStoreName}
+		return nil, errors.ErrCouldNotMarshall{Type: reflect.TypeOf(loadedDevices), Err: err}
 	}
 
 	return loadedDevices, nil
diff --git a/controller/nucleus/databasePndStore.go b/controller/nucleus/databasePndStore.go
index f39ef1138..a1eb29323 100644
--- a/controller/nucleus/databasePndStore.go
+++ b/controller/nucleus/databasePndStore.go
@@ -1,6 +1,8 @@
 package nucleus
 
 import (
+	"reflect"
+
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/device"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
 
@@ -44,7 +46,7 @@ func (s *DatabasePndStore) Get(query store.Query) (networkdomain.NetworkDomain,
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
 
-		return nil, errors.ErrCouldNotMarshall{StoreName: pndStoreName}
+		return nil, errors.ErrCouldNotMarshall{Object: query.ID, Type: reflect.TypeOf(loadedPND), Err: err}
 	}
 
 	csbiClient, err := s.getCsbiClient()
@@ -87,7 +89,7 @@ func (s *DatabasePndStore) GetAll() ([]networkdomain.NetworkDomain, error) {
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
 
-		return nil, errors.ErrCouldNotMarshall{StoreName: pndStoreName}
+		return nil, errors.ErrCouldNotMarshall{Type: reflect.TypeOf(loadedPnds), Err: err}
 	}
 
 	csbiClient, err := s.getCsbiClient()
diff --git a/controller/nucleus/databaseSbiStore.go b/controller/nucleus/databaseSbiStore.go
index 43a1bca99..cadd71981 100644
--- a/controller/nucleus/databaseSbiStore.go
+++ b/controller/nucleus/databaseSbiStore.go
@@ -1,6 +1,8 @@
 package nucleus
 
 import (
+	"reflect"
+
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/errors"
@@ -75,7 +77,7 @@ func (s *DatabaseSbiStore) Get(query store.Query) (southbound.LoadedSbi, error)
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
 
-		return loadedSbi, errors.ErrCouldNotMarshall{StoreName: sbiStoreName}
+		return loadedSbi, errors.ErrCouldNotMarshall{Object: query.ID, Type: reflect.TypeOf(loadedSbi), Err: err}
 	}
 
 	return loadedSbi, nil
@@ -101,7 +103,7 @@ func (s *DatabaseSbiStore) GetAll() ([]southbound.LoadedSbi, error) {
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
 
-		return nil, errors.ErrCouldNotMarshall{StoreName: sbiStoreName}
+		return nil, errors.ErrCouldNotMarshall{Type: reflect.TypeOf(loadedSbis), Err: err}
 	}
 
 	return loadedSbis, nil
diff --git a/controller/nucleus/errors/errors.go b/controller/nucleus/errors/errors.go
index eac05eb44..43cf54e9a 100644
--- a/controller/nucleus/errors/errors.go
+++ b/controller/nucleus/errors/errors.go
@@ -162,11 +162,13 @@ func (e ErrTypeNotSupported) Error() string {
 // ErrCouldNotMarshall implements Error interface and is called if a
 // database respone can not be parsed.
 type ErrCouldNotMarshall struct {
-	StoreName string
+	Object any
+	Type   any
+	Err    error
 }
 
 func (e ErrCouldNotMarshall) Error() string {
-	return fmt.Sprintf("could not marshall %s", e.StoreName)
+	return fmt.Sprintf("could not marshall Object: %v of Type: %v, Internal error: %v", e.Object, e.Type, e.Err)
 }
 
 // ErrCouldNotUpdate implements the Error interface and is called if a
diff --git a/controller/rbac/databaseRoleStore.go b/controller/rbac/databaseRoleStore.go
index b97da6d9a..8d1ac67a7 100644
--- a/controller/rbac/databaseRoleStore.go
+++ b/controller/rbac/databaseRoleStore.go
@@ -1,6 +1,8 @@
 package rbac
 
 import (
+	"reflect"
+
 	"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/errors"
@@ -93,7 +95,7 @@ func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (rbac.LoadedRole, error)
 	err := result.Decode(&loadedRole)
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
-		return loadedRole, errors.ErrCouldNotMarshall{StoreName: s.roleStoreName}
+		return loadedRole, errors.ErrCouldNotMarshall{Object: idOfRole, Type: reflect.TypeOf(loadedRole), Err: err}
 	}
 
 	return loadedRole, nil
@@ -116,7 +118,7 @@ func (s *DatabaseRoleStore) getByName(nameOfRole string) (rbac.LoadedRole, error
 	err := result.Decode(&loadedRole)
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
-		return loadedRole, errors.ErrCouldNotMarshall{StoreName: s.roleStoreName}
+		return loadedRole, errors.ErrCouldNotMarshall{Object: nameOfRole, Type: reflect.TypeOf(loadedRole), Err: err}
 	}
 
 	return loadedRole, nil
@@ -142,7 +144,7 @@ func (s *DatabaseRoleStore) GetAll() ([]rbac.LoadedRole, error) {
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
 
-		return nil, errors.ErrCouldNotMarshall{StoreName: s.roleStoreName}
+		return nil, errors.ErrCouldNotMarshall{Type: reflect.TypeOf(loadedRoles), Err: err}
 	}
 	return loadedRoles, nil
 }
diff --git a/controller/rbac/databaseUserStore.go b/controller/rbac/databaseUserStore.go
index a300c96ed..dda2bc790 100644
--- a/controller/rbac/databaseUserStore.go
+++ b/controller/rbac/databaseUserStore.go
@@ -1,6 +1,8 @@
 package rbac
 
 import (
+	"reflect"
+
 	"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/errors"
@@ -93,7 +95,7 @@ func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (rbac.LoadedUser, error)
 	err := result.Decode(&loadedUser)
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
-		return loadedUser, errors.ErrCouldNotMarshall{StoreName: s.userStoreName}
+		return loadedUser, errors.ErrCouldNotMarshall{Object: idOfUser, Type: reflect.TypeOf(loadedUser), Err: err}
 	}
 
 	return loadedUser, nil
@@ -116,7 +118,7 @@ func (s *DatabaseUserStore) getByName(nameOfUser string) (rbac.LoadedUser, error
 	err := result.Decode(&loadedUser)
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
-		return loadedUser, errors.ErrCouldNotMarshall{StoreName: s.userStoreName}
+		return loadedUser, errors.ErrCouldNotMarshall{Object: nameOfUser, Type: reflect.TypeOf(loadedUser), Err: err}
 	}
 
 	return loadedUser, nil
@@ -142,7 +144,7 @@ func (s *DatabaseUserStore) GetAll() ([]rbac.LoadedUser, error) {
 	if err != nil {
 		log.Printf("Failed marshalling %v", err)
 
-		return nil, errors.ErrCouldNotMarshall{StoreName: s.userStoreName}
+		return nil, errors.ErrCouldNotMarshall{Type: reflect.TypeOf(loadedUsers), Err: err}
 	}
 	return loadedUsers, nil
 }
-- 
GitLab