[VOL-1605] Update disable/reenable device management logic

This is the initial commit of updating the device management
logic around disable and reenable of a device.

Change-Id: If6d40a0055e5e1ab61503b9ae9c5a4070ec53f35
diff --git a/rw_core/core/device_manager.go b/rw_core/core/device_manager.go
index f6540e4..d173308 100755
--- a/rw_core/core/device_manager.go
+++ b/rw_core/core/device_manager.go
@@ -608,6 +608,43 @@
 	return status.Errorf(codes.NotFound, "%s", deviceId)
 }
 
+//updatePortsState updates all ports on the device
+func (dMgr *DeviceManager) updatePortsState(deviceId string, state voltha.OperStatus_OperStatus) error {
+	log.Debugw("updatePortsState", log.Fields{"deviceid": deviceId})
+
+	var adminState voltha.AdminState_AdminState
+	if agent := dMgr.getDeviceAgent(deviceId); agent != nil {
+		switch state {
+		case voltha.OperStatus_ACTIVE:
+			adminState = voltha.AdminState_ENABLED
+			if err := agent.enablePorts(); err != nil {
+				log.Warnw("enable-all-ports-failed", log.Fields{"deviceId": deviceId, "error": err})
+				return err
+			}
+		case voltha.OperStatus_UNKNOWN:
+			adminState = voltha.AdminState_DISABLED
+			if err := agent.disablePorts(); err != nil {
+				log.Warnw("disable-all-ports-failed", log.Fields{"deviceId": deviceId, "error": err})
+				return err
+			}
+		default:
+			return status.Error(codes.Unimplemented, "state-change-not-implemented")
+		}
+		// Notify the logical device about the state change
+		if device, err := dMgr.GetDevice(deviceId); err != nil {
+			log.Warnw("non-existent-device", log.Fields{"deviceId": deviceId, "error": err})
+			return err
+		} else {
+			if err := dMgr.logicalDeviceMgr.updatePortsState(device, adminState); err != nil {
+				log.Warnw("failed-updating-ports-state", log.Fields{"deviceId": deviceId, "error": err})
+				return err
+			}
+			return nil
+		}
+	}
+	return status.Errorf(codes.NotFound, "%s", deviceId)
+}
+
 func (dMgr *DeviceManager) childDeviceDetected(parentDeviceId string, parentPortNo int64, deviceType string,
 	channelId int64, vendorId string, serialNumber string, onuId int64) error {
 	log.Debugw("childDeviceDetected", log.Fields{"parentDeviceId": parentDeviceId})