VOL-1774 Etcd Crash Handling

Change-Id: I1eeb726654c3972fd0a4fafae134607e5a810415
diff --git a/ro_core/core/core.go b/ro_core/core/core.go
index da9fead..a125798 100644
--- a/ro_core/core/core.go
+++ b/ro_core/core/core.go
@@ -18,6 +18,7 @@
 
 import (
 	"context"
+	"fmt"
 
 	"time"
 
@@ -60,7 +61,7 @@
 }
 
 // NewCore instantiates core service parameters
-func NewCore(id string, cf *config.ROCoreFlags, kvClient kvstore.Client) *Core {
+func NewCore(ctx context.Context, id string, cf *config.ROCoreFlags, kvClient kvstore.Client) *Core {
 	var core Core
 	core.instanceID = id
 	core.exitChannel = make(chan int, 1)
@@ -85,8 +86,7 @@
 		PathPrefix:              "service/voltha"}
 	core.clusterDataRoot = model.NewRoot(&voltha.Voltha{}, &core.backend)
 	core.localDataRoot = model.NewRoot(&voltha.CoreInstance{}, &core.backend)
-	core.clusterDataProxy = core.clusterDataRoot.CreateProxy(context.Background(), "/", false)
-	core.localDataProxy = core.localDataRoot.CreateProxy(context.Background(), "/", false)
+
 	return &core
 }
 
@@ -123,7 +123,8 @@
 }
 
 // Start will start core adapter services
-func (core *Core) Start(ctx context.Context) {
+func (core *Core) Start(ctx context.Context) error {
+	var err error
 	log.Info("starting-adaptercore", log.Fields{"coreId": core.instanceID})
 
 	// Wait until connection to KV Store is up
@@ -133,6 +134,16 @@
 
 	probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusRunning)
 
+	core.clusterDataProxy, err = core.clusterDataRoot.CreateProxy(context.Background(), "/", false)
+	if err != nil {
+		probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusNotReady)
+		return fmt.Errorf("Failed to create cluster data proxy")
+	}
+	core.localDataProxy, err = core.localDataRoot.CreateProxy(context.Background(), "/", false)
+	if err != nil {
+		probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusNotReady)
+		return fmt.Errorf("Failed to create local cluster data proxy")
+	}
 	core.genericMgr = newModelProxyManager(core.clusterDataProxy)
 	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
 	core.logicalDeviceMgr = newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
@@ -142,6 +153,7 @@
 	go core.monitorKvstoreLiveness(ctx)
 
 	log.Info("adaptercore-started")
+	return nil
 }
 
 // Stop will stop core services
diff --git a/ro_core/core/core_test.go b/ro_core/core/core_test.go
index d88a7de..02cdc84 100644
--- a/ro_core/core/core_test.go
+++ b/ro_core/core/core_test.go
@@ -91,10 +91,12 @@
 
 func TestNewCore(t *testing.T) {
 
+	var ctx context.Context
+
 	roCoreFlgs, roC := makeTestNewCore()
 	assert.NotNil(t, roCoreFlgs)
 	assert.NotNil(t, roC)
-	core := NewCore("ro_core", roCoreFlgs, roC.kvClient)
+	core := NewCore(ctx, "ro_core", roCoreFlgs, roC.kvClient)
 	assert.NotNil(t, core)
 }
 
@@ -105,9 +107,10 @@
 	roCoreFlgs, roC := makeTestNewCore()
 	assert.NotNil(t, roCoreFlgs)
 	assert.NotNil(t, roC)
-	core := NewCore("ro_core", roCoreFlgs, roC.kvClient)
+	core := NewCore(ctx, "ro_core", roCoreFlgs, roC.kvClient)
 	assert.NotNil(t, core)
 
-	core.Start(ctx)
+	err := core.Start(ctx)
+	assert.Nil(t, err)
 	core.Stop(ctx)
 }
diff --git a/ro_core/core/device_agent.go b/ro_core/core/device_agent.go
index 345e424..b056bec 100644
--- a/ro_core/core/device_agent.go
+++ b/ro_core/core/device_agent.go
@@ -59,7 +59,10 @@
 	defer agent.lockDevice.Unlock()
 	log.Debugw("starting-device-agent", log.Fields{"device": agent.lastData})
 	if loadFromDb {
-		if device := agent.clusterDataProxy.Get(ctx, "/devices/"+agent.deviceID, 0, false, ""); device != nil {
+		if device, err := agent.clusterDataProxy.Get(ctx, "/devices/"+agent.deviceID, 0, false, ""); err != nil {
+			log.Errorw("failed-to-get-device", log.Fields{"error": err})
+			return err
+		} else if device != nil {
 			if d, ok := device.(*voltha.Device); ok {
 				agent.lastData = proto.Clone(d).(*voltha.Device)
 			}
@@ -86,7 +89,10 @@
 func (agent *DeviceAgent) getDevice() (*voltha.Device, error) {
 	agent.lockDevice.Lock()
 	defer agent.lockDevice.Unlock()
-	if device := agent.clusterDataProxy.Get(context.Background(), "/devices/"+agent.deviceID, 0, false, ""); device != nil {
+	if device, err := agent.clusterDataProxy.Get(context.Background(), "/devices/"+agent.deviceID, 0, false, ""); err != nil {
+		log.Errorw("failed-to-get-device", log.Fields{"error": err})
+		return nil, err
+	} else if device != nil {
 		if d, ok := device.(*voltha.Device); ok {
 			cloned := proto.Clone(d).(*voltha.Device)
 			return cloned, nil
diff --git a/ro_core/core/device_manager.go b/ro_core/core/device_manager.go
index 634566c..b73ec10 100644
--- a/ro_core/core/device_manager.go
+++ b/ro_core/core/device_manager.go
@@ -132,7 +132,10 @@
 func (dMgr *DeviceManager) ListDevices() (*voltha.Devices, error) {
 	log.Debug("ListDevices")
 	result := &voltha.Devices{}
-	if devices := dMgr.clusterDataProxy.List(context.Background(), "/devices", 0, false, ""); devices != nil {
+	if devices, err := dMgr.clusterDataProxy.List(context.Background(), "/devices", 0, false, ""); err != nil {
+		log.Errorw("failed-to-list-devices", log.Fields{"error": err})
+		return nil, err
+	} else if devices != nil {
 		for _, device := range devices.([]interface{}) {
 			// If device is not in memory then set it up
 			if !dMgr.IsDeviceInCache(device.(*voltha.Device).Id) {
diff --git a/ro_core/core/grpc_nbi_api_handler.go b/ro_core/core/grpc_nbi_api_handler.go
index a611337..0a73ff2 100644
--- a/ro_core/core/grpc_nbi_api_handler.go
+++ b/ro_core/core/grpc_nbi_api_handler.go
@@ -153,7 +153,12 @@
 // ListDevices returns the contents of all devices known to the system
 func (handler *APIHandler) ListDevices(ctx context.Context, empty *empty.Empty) (*voltha.Devices, error) {
 	log.Debug("ListDevices")
-	return handler.deviceMgr.ListDevices()
+	devices, err := handler.deviceMgr.ListDevices()
+	if err != nil {
+		log.Errorw("failed-to-list-devices", log.Fields{"error": err})
+		return nil, err
+	}
+	return devices, nil
 }
 
 // ListDeviceIds returns the list of device ids managed by a voltha core
diff --git a/ro_core/core/grpc_nbi_api_handler_test.go b/ro_core/core/grpc_nbi_api_handler_test.go
index 3244fd3..0a95daa 100644
--- a/ro_core/core/grpc_nbi_api_handler_test.go
+++ b/ro_core/core/grpc_nbi_api_handler_test.go
@@ -29,6 +29,7 @@
 )
 
 func MakeTestGrpcNbiConfig() *Core {
+	var ctx context.Context
 	var core *Core
 	var roCoreFlgs *config.ROCoreFlags
 	var roC *roCore
@@ -44,7 +45,7 @@
 			cli, err := newKVClient("etcd", addr, 5)
 			if err == nil {
 				roC.kvClient = cli
-				core = NewCore("ro_core", roCoreFlgs, roC.kvClient)
+				core = NewCore(ctx, "ro_core", roCoreFlgs, roC.kvClient)
 			}
 		}
 	}
diff --git a/ro_core/core/logical_device_agent.go b/ro_core/core/logical_device_agent.go
index 829aa6b..407511f 100644
--- a/ro_core/core/logical_device_agent.go
+++ b/ro_core/core/logical_device_agent.go
@@ -60,7 +60,10 @@
 	if loadFromDb {
 		//	load from dB - the logical may not exist at this time.  On error, just return and the calling function
 		// will destroy this agent.
-		if logicalDevice := agent.clusterDataProxy.Get(ctx, "/logical_devices/"+agent.logicalDeviceID, 0, false, ""); logicalDevice != nil {
+		if logicalDevice, err := agent.clusterDataProxy.Get(ctx, "/logical_devices/"+agent.logicalDeviceID, 0, false, ""); err != nil {
+			log.Errorw("failed-to-get-logical-device", log.Fields{"error": err})
+			return err
+		} else if logicalDevice != nil {
 			if lDevice, ok := logicalDevice.(*voltha.LogicalDevice); ok {
 				agent.lastData = proto.Clone(lDevice).(*voltha.LogicalDevice)
 			}
@@ -88,7 +91,10 @@
 	log.Debug("GetLogicalDevice")
 	agent.lockLogicalDevice.Lock()
 	defer agent.lockLogicalDevice.Unlock()
-	if logicalDevice := agent.clusterDataProxy.Get(context.Background(), "/logical_devices/"+agent.logicalDeviceID, 0, false, ""); logicalDevice != nil {
+	if logicalDevice, err := agent.clusterDataProxy.Get(context.Background(), "/logical_devices/"+agent.logicalDeviceID, 0, false, ""); err != nil {
+		log.Errorw("failed-to-get-logical-device", log.Fields{"error": err})
+		return nil, err
+	} else if logicalDevice != nil {
 		if lDevice, ok := logicalDevice.(*voltha.LogicalDevice); ok {
 			return lDevice, nil
 		}
diff --git a/ro_core/core/logical_device_agent_test.go b/ro_core/core/logical_device_agent_test.go
index 09de443..1685606 100644
--- a/ro_core/core/logical_device_agent_test.go
+++ b/ro_core/core/logical_device_agent_test.go
@@ -16,7 +16,9 @@
 package core
 
 import (
+	"context"
 	"github.com/opencord/voltha-go/ro_core/config"
+	"github.com/opencord/voltha-lib-go/v2/pkg/log"
 	"github.com/phayes/freeport"
 	"github.com/stretchr/testify/assert"
 	"strconv"
@@ -24,6 +26,7 @@
 )
 
 func MakeTestLogDevAgConfig() (*Core, error) {
+	var ctx context.Context
 	var core *Core
 	var roCoreFlgs *config.ROCoreFlags
 	var roC *roCore
@@ -34,6 +37,7 @@
 
 		roCoreFlgs = config.NewROCoreFlags()
 		roC = newROCore(roCoreFlgs)
+
 		if (roC != nil) && (roCoreFlgs != nil) {
 			addr := "127.0.0.1" + ":" + freePortStr
 			cli, err := newKVClient("etcd", addr, 5)
@@ -44,8 +48,7 @@
 		}
 	}
 
-	core = NewCore("ro_core", roCoreFlgs, roC.kvClient)
-
+	core = NewCore(ctx, "ro_core", roCoreFlgs, roC.kvClient)
 	return core, nil
 }
 
@@ -62,6 +65,12 @@
 	core, _ := MakeTestLogDevAgConfig()
 	assert.NotNil(t, core)
 
+	var err1 error
+	if core.clusterDataProxy, err1 = core.localDataRoot.CreateProxy(context.Background(), "/", false); err1 != nil {
+		log.Errorw("failed-to-create-cluster-proxy", log.Fields{"error": err1})
+		assert.NotNil(t, err1)
+	}
+
 	logDevMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
 	assert.NotNil(t, logDevMgr)
 
diff --git a/ro_core/core/logical_device_manager.go b/ro_core/core/logical_device_manager.go
index 97bc603..fc09f12 100644
--- a/ro_core/core/logical_device_manager.go
+++ b/ro_core/core/logical_device_manager.go
@@ -103,7 +103,11 @@
 func (ldMgr *LogicalDeviceManager) listLogicalDevices() (*voltha.LogicalDevices, error) {
 	log.Debug("ListAllLogicalDevices")
 	result := &voltha.LogicalDevices{}
-	if logicalDevices := ldMgr.clusterDataProxy.List(context.Background(), "/logical_devices", 0, false, ""); logicalDevices != nil {
+	if logicalDevices, err := ldMgr.clusterDataProxy.List(context.Background(), "/logical_devices", 0, false,
+		""); err != nil {
+		log.Errorw("failed-to-list-devices", log.Fields{"error": err})
+		return nil, err
+	} else if logicalDevices != nil {
 		for _, logicalDevice := range logicalDevices.([]interface{}) {
 			result.Items = append(result.Items, logicalDevice.(*voltha.LogicalDevice))
 		}
diff --git a/ro_core/core/logical_device_manager_test.go b/ro_core/core/logical_device_manager_test.go
index e7b33bc..a53e4ec 100644
--- a/ro_core/core/logical_device_manager_test.go
+++ b/ro_core/core/logical_device_manager_test.go
@@ -22,6 +22,7 @@
 
 	"github.com/opencord/voltha-go/db/model"
 	"github.com/opencord/voltha-go/ro_core/config"
+	"github.com/opencord/voltha-lib-go/v2/pkg/log"
 	"github.com/opencord/voltha-protos/v2/go/openflow_13"
 	"github.com/opencord/voltha-protos/v2/go/voltha"
 	"github.com/stretchr/testify/assert"
@@ -30,9 +31,13 @@
 func MakeTestNewCoreConfig() *Core {
 	var core Core
 	core.instanceID = "ro_core"
+	var err error
 	core.config = config.NewROCoreFlags()
 	core.clusterDataRoot = model.NewRoot(&voltha.Voltha{}, nil)
-	core.clusterDataProxy = core.clusterDataRoot.CreateProxy(context.Background(), "/", false)
+	core.clusterDataProxy, err = core.clusterDataRoot.CreateProxy(context.Background(), "/", false)
+	if err != nil {
+		log.With(log.Fields{"error": err}).Fatal("Cannot create cluster data proxy")
+	}
 	core.genericMgr = newModelProxyManager(core.clusterDataProxy)
 	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
 
@@ -127,13 +132,18 @@
 
 	/*** Case: getLogicalDevice() is Success ***/
 	// Add Data
-	if added := core.clusterDataProxy.Add(
+	added, err := core.clusterDataProxy.Add(
 		context.Background(),
 		"/logical_devices",
 		&voltha.LogicalDevice{
 			Id: "id",
 		},
-		""); added == nil {
+		"")
+	if err != nil {
+		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add logical device")
 	}
 	ldAgent := newLogicalDeviceAgent("id", "device_id", ldMgr, core.deviceMgr, core.clusterDataProxy)
@@ -219,7 +229,7 @@
 	device := &voltha.Device{Id: "id", Root: true, ParentId: "parent_id"}
 
 	// Add Data
-	if added := core.clusterDataProxy.Add(
+	added, err := core.clusterDataProxy.Add(
 		context.Background(),
 		"/logical_devices",
 		&voltha.LogicalDevice{
@@ -231,7 +241,12 @@
 				},
 			},
 		},
-		""); added == nil {
+		"")
+	if err != nil {
+		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add logical device")
 	}
 	ldAgent := newLogicalDeviceAgent("parent_id", "device_id", ldMgr, core.deviceMgr, core.clusterDataProxy)
@@ -273,7 +288,7 @@
 	}
 
 	// Add Data
-	if added := core.clusterDataProxy.Add(
+	added, err := core.clusterDataProxy.Add(
 		context.Background(),
 		"/logical_devices",
 		&voltha.LogicalDevice{
@@ -284,7 +299,12 @@
 				},
 			},
 		},
-		""); added == nil {
+		"")
+	if err != nil {
+		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add logical device")
 	}
 	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
@@ -319,7 +339,7 @@
 	wantResult := &voltha.Flows{}
 
 	// Add Data
-	if added := core.clusterDataProxy.Add(
+	added, err := core.clusterDataProxy.Add(
 		context.Background(),
 		"/logical_devices",
 		&voltha.LogicalDevice{
@@ -332,7 +352,12 @@
 				},
 			},
 		},
-		""); added == nil {
+		"")
+	if err != nil {
+		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add logical device")
 	}
 	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
@@ -367,7 +392,7 @@
 	wantResult := &voltha.FlowGroups{}
 
 	// Add Data
-	if added := core.clusterDataProxy.Add(
+	added, err := core.clusterDataProxy.Add(
 		context.Background(),
 		"/logical_devices",
 		&voltha.LogicalDevice{
@@ -382,7 +407,12 @@
 				},
 			},
 		},
-		""); added == nil {
+		"")
+	if err != nil {
+		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add logical device")
 	}
 	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
@@ -417,7 +447,7 @@
 	wantResult := &voltha.LogicalPort{Id: "123"}
 
 	// Add Data
-	if added := core.clusterDataProxy.Add(
+	added, err := core.clusterDataProxy.Add(
 		context.Background(),
 		"/logical_devices",
 		&voltha.LogicalDevice{
@@ -428,7 +458,12 @@
 				},
 			},
 		},
-		""); added == nil {
+		"")
+	if err != nil {
+		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add logical device")
 	}
 	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
diff --git a/ro_core/core/model_proxy.go b/ro_core/core/model_proxy.go
index eb93e44..56233eb 100644
--- a/ro_core/core/model_proxy.go
+++ b/ro_core/core/model_proxy.go
@@ -58,7 +58,10 @@
 
 	log.Debugw("get-data", log.Fields{"path": path})
 
-	if data := mp.rootProxy.Get(context.Background(), path, 1, false, ""); data != nil {
+	if data, err := mp.rootProxy.Get(context.Background(), path, 1, false, ""); err != nil {
+		log.Errorw("failed-to-retrieve-data-from-model-proxy", log.Fields{"error": err})
+		return nil, err
+	} else if data != nil {
 		return data, nil
 	}
 	return nil, status.Errorf(codes.NotFound, "data-path: %s", path)
diff --git a/ro_core/core/model_proxy_manager_test.go b/ro_core/core/model_proxy_manager_test.go
index 10411bf..c375f7d 100644
--- a/ro_core/core/model_proxy_manager_test.go
+++ b/ro_core/core/model_proxy_manager_test.go
@@ -18,6 +18,7 @@
 import (
 	"context"
 	"github.com/opencord/voltha-go/db/model"
+	"github.com/opencord/voltha-lib-go/v2/pkg/log"
 	"github.com/opencord/voltha-protos/v2/go/voltha"
 	"github.com/stretchr/testify/assert"
 	"reflect"
@@ -26,7 +27,10 @@
 
 func makeModelProxyManagerObj() *ModelProxyManager {
 	cdRoot := model.NewRoot(&voltha.Voltha{}, nil)
-	cdProxy := cdRoot.CreateProxy(context.Background(), "/", false)
+	cdProxy, err := cdRoot.CreateProxy(context.Background(), "/", false)
+	if err != nil {
+		log.With(log.Fields{"error": err}).Fatal("Failed to create model proxy manager")
+	}
 	mpMgr := newModelProxyManager(cdProxy)
 	return mpMgr
 }
@@ -103,7 +107,12 @@
 	assert.Nil(t, err0)
 
 	// Case 2: Found
-	if added := mpMgr.clusterDataProxy.Add(context.Background(), "/adapters", &voltha.Adapter{Id: "id"}, ""); added == nil {
+	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/adapters", &voltha.Adapter{Id: "id"}, "")
+	if err != nil {
+		log.Errorw("failed-to-add-adapter-to-cluster-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add adapter")
 	}
 	result1, err1 := mpMgr.ListAdapters(context.Background())
@@ -135,7 +144,12 @@
 	assert.Nil(t, err0)
 
 	// Case 2: Found
-	if added := mpMgr.clusterDataProxy.Add(context.Background(), "/device_types", &voltha.DeviceType{Id: "id"}, ""); added == nil {
+	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/device_types", &voltha.DeviceType{Id: "id"}, "")
+	if err != nil {
+		log.Errorw("failed-to-add-device-types-to-cluster-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add device type")
 	}
 	result1, err1 := mpMgr.ListDeviceTypes(context.Background())
@@ -160,7 +174,11 @@
 	assert.NotNil(t, err0)
 
 	// Case 2: Found
-	if added := mpMgr.clusterDataProxy.Add(context.Background(), "/device_types", &voltha.DeviceType{Id: "id"}, ""); added == nil {
+	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/device_types", &voltha.DeviceType{Id: "id"}, "")
+	if err != nil {
+		log.Errorw("failed-to-add-adapter-to-device-types-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	} else if added == nil {
 		t.Error("Failed to add device type")
 	}
 	result1, err1 := mpMgr.GetDeviceType(context.Background(), "id")
@@ -192,7 +210,12 @@
 	assert.Nil(t, err0)
 
 	// Case 2: Found
-	if added := mpMgr.clusterDataProxy.Add(context.Background(), "/device_groups", &voltha.DeviceGroup{Id: "id"}, ""); added == nil {
+	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/device_groups", &voltha.DeviceGroup{Id: "id"}, "")
+	if err != nil {
+		log.Errorw("failed-to-add-device-groups-to-cluster-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add device group")
 	}
 	result1, err1 := mpMgr.ListDeviceGroups(context.Background())
@@ -217,7 +240,12 @@
 	assert.NotNil(t, err0)
 
 	// Case 2: Found
-	if added := mpMgr.clusterDataProxy.Add(context.Background(), "/device_groups", &voltha.DeviceGroup{Id: "id"}, ""); added == nil {
+	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/device_groups", &voltha.DeviceGroup{Id: "id"}, "")
+	if err != nil {
+		log.Errorw("failed-to-add-device-groups-to-cluster-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add device group")
 	}
 	result1, err1 := mpMgr.GetDeviceGroup(context.Background(), "id")
@@ -249,7 +277,12 @@
 	assert.Nil(t, err0)
 
 	// Case 2: Found
-	if added := mpMgr.clusterDataProxy.Add(context.Background(), "/event_filters", &voltha.EventFilter{Id: "id"}, ""); added == nil {
+	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/event_filters", &voltha.EventFilter{Id: "id"}, "")
+	if err != nil {
+		log.Errorw("failed-to-add-alarm-filters-to-cluster-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add event filter")
 	}
 	result1, err1 := mpMgr.ListEventFilters(context.Background())
@@ -279,7 +312,13 @@
 	}
 	assert.Nil(t, result0)
 	// Case 2: Found
-	if added := mpMgr.clusterDataProxy.Add(context.Background(), "/event_filters", &voltha.EventFilter{Id: "id"}, ""); added == nil {
+	//added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/alarm_filters", &voltha.EventFilter{Id: "id"}, "")
+	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/event_filters", &voltha.EventFilter{Id: "id"}, "")
+	if err != nil {
+		log.Errorw("failed-to-add-adapter-to-alarm-filter-to-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
+	if added == nil {
 		t.Error("Failed to add event filter")
 	}
 	result1, err1 := mpMgr.ListEventFilters(context.Background())
diff --git a/ro_core/core/model_proxy_test.go b/ro_core/core/model_proxy_test.go
index a9caa00..5c26563 100644
--- a/ro_core/core/model_proxy_test.go
+++ b/ro_core/core/model_proxy_test.go
@@ -17,6 +17,8 @@
 
 import (
 	"context"
+	"github.com/opencord/voltha-lib-go/v2/pkg/log"
+	"github.com/stretchr/testify/assert"
 	"reflect"
 	"testing"
 
@@ -31,22 +33,30 @@
 	basePath  string
 }
 
-func getModelProxyPathNotFound() *fields {
+func getModelProxyPathNotFound(t *testing.T) *fields {
 	var modelProxy fields
 
 	TestProxyRoot := model.NewRoot(&voltha.Voltha{}, nil)
-	TestProxyRootProxy := TestProxyRoot.CreateProxy(context.Background(), "/", false)
+	TestProxyRootProxy, err := TestProxyRoot.CreateProxy(context.Background(), "/", false)
+	if err != nil {
+		log.Errorw("failed-to-create-test-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
 	modelProxy.rootProxy = TestProxyRootProxy
 	modelProxy.basePath = "base_path"
 
 	return &modelProxy
 }
 
-func getModelProxyPathFound() *fields {
+func getModelProxyPathFound(t *testing.T) *fields {
 	var modelProxy fields
 
 	TestProxyRoot := model.NewRoot(&voltha.Voltha{}, nil)
-	TestProxyRootProxy := TestProxyRoot.CreateProxy(context.Background(), "/", false)
+	TestProxyRootProxy, err := TestProxyRoot.CreateProxy(context.Background(), "/", false)
+	if err != nil {
+		log.Errorw("failed-to-create-test-proxy", log.Fields{"error": err})
+		assert.NotNil(t, err)
+	}
 	modelProxy.rootProxy = TestProxyRootProxy
 	modelProxy.basePath = "devices"
 
@@ -88,8 +98,8 @@
 		fields  *fields
 		wantErr error
 	}{
-		{"Get-PathNotFound", getModelProxyPathNotFound(), status.Errorf(codes.NotFound, "data-path: base_path")},
-		{"Get-PathFound", getModelProxyPathFound(), nil},
+		{"Get-PathNotFound", getModelProxyPathNotFound(t), status.Errorf(codes.NotFound, "data-path: base_path")},
+		{"Get-PathFound", getModelProxyPathFound(t), nil},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/ro_core/main.go b/ro_core/main.go
index dc78302..b203bec 100644
--- a/ro_core/main.go
+++ b/ro_core/main.go
@@ -111,14 +111,16 @@
 	}
 
 	// Create the core service
-	ro.core = c.NewCore(ro.config.InstanceID, ro.config, ro.kvClient)
+	ro.core = c.NewCore(ctx, ro.config.InstanceID, ro.config, ro.kvClient)
 
 	if p != nil {
 		p.UpdateStatus("kv-store", probe.ServiceStatusPrepared)
 	}
 
 	// start the core
-	ro.core.Start(ctx)
+	if err := ro.core.Start(ctx); err != nil {
+		log.Fatalf("failed-to-start-rocore", log.Fields{"error": err})
+	}
 }
 
 func (ro *roCore) stop(ctx context.Context) {