[VOL-1614] Device Management update in the Core

This commit went over the device management of devices in the Core
and made the following changes:
1) Update the device state machine to not remove logical
device or ports when a device is disabled.
2) Fix some issues around device deletion
3) Add additional APIs between the Core and Adapters to handle
the scenarios of enable/disable/delete a device
4) Update the simulated Adapters to handle disable/reenable/delete
5) Add a new set of tests for teh device state machine.

Change-Id: Ib2be87ec011762d5315a6d54581a87c1891e92be
diff --git a/rw_core/core/logical_device_manager.go b/rw_core/core/logical_device_manager.go
index e9b5a4f..7a625b4 100644
--- a/rw_core/core/logical_device_manager.go
+++ b/rw_core/core/logical_device_manager.go
@@ -319,7 +319,7 @@
 	return nil
 }
 
-// deleteLogicalPort removes the logical port associated with a child device
+// deleteLogicalPort removes the logical port associated with a device
 func (ldMgr *LogicalDeviceManager) deleteLogicalPort(ctx context.Context, lPortId *voltha.LogicalPortId) error {
 	log.Debugw("deleting-logical-port", log.Fields{"LDeviceId": lPortId.Id})
 	// Get logical port
@@ -334,13 +334,34 @@
 		return errors.New("device-root")
 	}
 	if agent := ldMgr.getLogicalDeviceAgent(lPortId.Id); agent != nil {
-		agent.deleteLogicalPort(logicalPort)
+		if err := agent.deleteLogicalPort(logicalPort); err != nil {
+			log.Warnw("deleting-logicalport-failed", log.Fields{"LDeviceId": lPortId.Id, "error": err})
+		}
 	}
 
 	log.Debug("deleting-logical-port-ends")
 	return nil
 }
 
+// deleteLogicalPort removes the logical port associated with a child device
+func (ldMgr *LogicalDeviceManager) deleteLogicalPorts(deviceId string) error {
+	log.Debugw("deleting-logical-ports", log.Fields{"deviceId": deviceId})
+	// Get logical port
+	if ldId, err := ldMgr.getLogicalDeviceIdFromDeviceId(deviceId); err != nil {
+		log.Warnw("logical-device-not-found", log.Fields{"deviceId": deviceId})
+		return err
+	} else {
+		if agent := ldMgr.getLogicalDeviceAgent(*ldId); agent != nil {
+			if err = agent.deleteLogicalPorts(deviceId); err != nil {
+				log.Warnw("deleteLogicalPorts-failed", log.Fields{"ldeviceId": *ldId})
+				return err
+			}
+		}
+	}
+	log.Debug("deleting-logical-port-ends")
+	return nil
+}
+
 func (ldMgr *LogicalDeviceManager) setupUNILogicalPorts(ctx context.Context, childDevice *voltha.Device) error {
 	log.Debugw("setupUNILogicalPorts", log.Fields{"childDeviceId": childDevice.Id, "parentDeviceId": childDevice.ParentId})
 	// Sanity check
@@ -366,6 +387,24 @@
 	return nil
 }
 
+func (ldMgr *LogicalDeviceManager) deleteAllLogicalPorts(device *voltha.Device) error {
+	log.Debugw("deleteAllLogicalPorts", log.Fields{"deviceId": device.Id})
+
+	var ldId *string
+	var err error
+	//Get the logical device Id for this device
+	if ldId, err = ldMgr.getLogicalDeviceId(device); err != nil {
+		log.Warnw("no-logical-device-found", log.Fields{"deviceId": device.Id, "error": err})
+		return err
+	}
+	if agent := ldMgr.getLogicalDeviceAgent(*ldId); agent != nil {
+		if err := agent.deleteAllLogicalPorts(device); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
 func (ldMgr *LogicalDeviceManager) updatePortsState(device *voltha.Device, state voltha.AdminState_AdminState) error {
 	log.Debugw("updatePortsState", log.Fields{"deviceId": device.Id, "state": state})