VOL-1512: Set device Active ownership per Core in a Core pair
- Changed NB & SB APIs to seize requests based on device ownership
- Added queue support for change-events
- Need to make prefix & timeout for the device ownership key configurable,
  currently hard-coded
- Need to make KV Transaction Monitor timeout configurable,
  currently hard-coded
- Need to clean up AdapterRequestHandlerProxy & LogicalDeviceManager
  constructors

Change-Id: Ieeb3df6d70baa529b87c8253cb9f0f5b2a94382a
diff --git a/rw_core/core/device_manager.go b/rw_core/core/device_manager.go
index 09eca3b..06d3bd4 100644
--- a/rw_core/core/device_manager.go
+++ b/rw_core/core/device_manager.go
@@ -33,6 +33,7 @@
 
 type DeviceManager struct {
 	deviceAgents        map[string]*DeviceAgent
+	core                *Core
 	adapterProxy        *AdapterProxy
 	adapterMgr          *AdapterManager
 	logicalDeviceMgr    *LogicalDeviceManager
@@ -44,15 +45,16 @@
 	lockDeviceAgentsMap sync.RWMutex
 }
 
-func newDeviceManager(kafkaICProxy *kafka.InterContainerProxy, cdProxy *model.Proxy, adapterMgr *AdapterManager, coreInstanceId string) *DeviceManager {
+func newDeviceManager(core *Core) *DeviceManager {
 	var deviceMgr DeviceManager
+	deviceMgr.core = core
 	deviceMgr.exitChannel = make(chan int, 1)
 	deviceMgr.deviceAgents = make(map[string]*DeviceAgent)
-	deviceMgr.adapterProxy = NewAdapterProxy(kafkaICProxy)
-	deviceMgr.kafkaICProxy = kafkaICProxy
-	deviceMgr.coreInstanceId = coreInstanceId
-	deviceMgr.clusterDataProxy = cdProxy
-	deviceMgr.adapterMgr = adapterMgr
+	deviceMgr.kafkaICProxy = core.kmp
+	deviceMgr.adapterProxy = NewAdapterProxy(core.kmp)
+	deviceMgr.coreInstanceId = core.instanceId
+	deviceMgr.clusterDataProxy = core.clusterDataProxy
+	deviceMgr.adapterMgr = core.adapterMgr
 	deviceMgr.lockDeviceAgentsMap = sync.RWMutex{}
 	return &deviceMgr
 }
@@ -184,6 +186,7 @@
 		if res == nil { //Success
 			agent.stop(ctx)
 			dMgr.deleteDeviceAgentToMap(agent)
+			dMgr.core.deviceOwnership.AbandonDevice(id.Id)
 		}
 		log.Debugw("deleteDevice-result", log.Fields{"result": res})
 	} else {
@@ -624,6 +627,9 @@
 	dMgr.addDeviceAgentToMap(agent)
 	agent.start(nil, false)
 
+	// Set device ownership
+	dMgr.core.deviceOwnership.OwnedByMe(agent.deviceId)
+
 	// Activate the child device
 	if agent := dMgr.getDeviceAgent(agent.deviceId); agent != nil {
 		go agent.enableDevice(nil)