|
|
|
@ -18,6 +18,7 @@
|
|
|
|
|
package io.entgra.device.mgt.core.device.mgt.core.operation.timeout.task.impl;
|
|
|
|
|
|
|
|
|
|
import com.google.gson.Gson;
|
|
|
|
|
import io.entgra.device.mgt.core.server.bootup.heartbeat.beacon.exception.HeartBeatManagementException;
|
|
|
|
|
import org.apache.commons.logging.Log;
|
|
|
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
|
|
import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
|
|
|
|
@ -36,7 +37,6 @@ import java.util.List;
|
|
|
|
|
public class OperationTimeoutTask extends DynamicPartitionedScheduleTask {
|
|
|
|
|
|
|
|
|
|
private static final Log log = LogFactory.getLog(OperationTimeoutTask.class);
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void setup() {
|
|
|
|
|
|
|
|
|
@ -44,45 +44,60 @@ public class OperationTimeoutTask extends DynamicPartitionedScheduleTask {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void executeDynamicTask() {
|
|
|
|
|
String operationTimeoutTaskConfigStr = getProperty(
|
|
|
|
|
OperationTimeoutTaskManagerServiceImpl.OPERATION_TIMEOUT_TASK_CONFIG);
|
|
|
|
|
Gson gson = new Gson();
|
|
|
|
|
OperationTimeout operationTimeoutConfig = gson.fromJson(operationTimeoutTaskConfigStr, OperationTimeout.class);
|
|
|
|
|
try {
|
|
|
|
|
long timeMillis = System.currentTimeMillis() - operationTimeoutConfig.getTimeout() * 60 * 1000;
|
|
|
|
|
List<String> deviceTypes = new ArrayList<>();
|
|
|
|
|
if (operationTimeoutConfig.getDeviceTypes().size() == 1 &&
|
|
|
|
|
"ALL".equals(operationTimeoutConfig.getDeviceTypes().get(0))) {
|
|
|
|
|
try {
|
|
|
|
|
List<DeviceType> deviceTypeList = DeviceManagementDataHolder.getInstance()
|
|
|
|
|
.getDeviceManagementProvider().getDeviceTypes();
|
|
|
|
|
for (DeviceType deviceType : deviceTypeList) {
|
|
|
|
|
deviceTypes.add(deviceType.getName());
|
|
|
|
|
if (isQualifiedToExecuteTask()) { // this task will run only in one node when the deployment has multiple nodes
|
|
|
|
|
String operationTimeoutTaskConfigStr = getProperty(
|
|
|
|
|
OperationTimeoutTaskManagerServiceImpl.OPERATION_TIMEOUT_TASK_CONFIG);
|
|
|
|
|
Gson gson = new Gson();
|
|
|
|
|
OperationTimeout operationTimeoutConfig = gson.fromJson(operationTimeoutTaskConfigStr, OperationTimeout.class);
|
|
|
|
|
try {
|
|
|
|
|
long timeMillis = System.currentTimeMillis() - (long) operationTimeoutConfig.getTimeout();
|
|
|
|
|
List<String> deviceTypes = new ArrayList<>();
|
|
|
|
|
if (operationTimeoutConfig.getDeviceTypes().size() == 1 &&
|
|
|
|
|
"ALL".equals(operationTimeoutConfig.getDeviceTypes().get(0))) {
|
|
|
|
|
try {
|
|
|
|
|
List<DeviceType> deviceTypeList = DeviceManagementDataHolder.getInstance()
|
|
|
|
|
.getDeviceManagementProvider().getDeviceTypes();
|
|
|
|
|
for (DeviceType deviceType : deviceTypeList) {
|
|
|
|
|
deviceTypes.add(deviceType.getName());
|
|
|
|
|
}
|
|
|
|
|
} catch (DeviceManagementException e) {
|
|
|
|
|
log.error("Error occurred while reading device types", e);
|
|
|
|
|
}
|
|
|
|
|
} catch (DeviceManagementException e) {
|
|
|
|
|
log.error("Error occurred while reading device types", e);
|
|
|
|
|
} else {
|
|
|
|
|
deviceTypes = operationTimeoutConfig.getDeviceTypes();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
deviceTypes = operationTimeoutConfig.getDeviceTypes();
|
|
|
|
|
}
|
|
|
|
|
List<Activity> activities = DeviceManagementDataHolder.getInstance().getOperationManager()
|
|
|
|
|
.getActivities(deviceTypes, operationTimeoutConfig.getCode(), timeMillis,
|
|
|
|
|
operationTimeoutConfig.getInitialStatus());
|
|
|
|
|
for (Activity activity : activities) {
|
|
|
|
|
for (ActivityStatus activityStatus : activity.getActivityStatus()) {
|
|
|
|
|
String operationId = activity.getActivityId().replace("ACTIVITY_", "");
|
|
|
|
|
Operation operation = DeviceManagementDataHolder.getInstance().getOperationManager()
|
|
|
|
|
.getOperation(Integer.parseInt(operationId));
|
|
|
|
|
operation.setStatus(Operation.Status.valueOf(operationTimeoutConfig.getNextStatus()));
|
|
|
|
|
DeviceManagementDataHolder.getInstance().getOperationManager()
|
|
|
|
|
.updateOperation(activityStatus.getDeviceIdentifier(), operation);
|
|
|
|
|
List<Activity> activities = DeviceManagementDataHolder.getInstance().getOperationManager()
|
|
|
|
|
.getActivities(deviceTypes, operationTimeoutConfig.getCode(), timeMillis,
|
|
|
|
|
operationTimeoutConfig.getInitialStatus());
|
|
|
|
|
for (Activity activity : activities) {
|
|
|
|
|
for (ActivityStatus activityStatus : activity.getActivityStatus()) {
|
|
|
|
|
String operationId = activity.getActivityId().replace("ACTIVITY_", "");
|
|
|
|
|
Operation operation = DeviceManagementDataHolder.getInstance().getOperationManager()
|
|
|
|
|
.getOperation(Integer.parseInt(operationId));
|
|
|
|
|
operation.setStatus(Operation.Status.valueOf(operationTimeoutConfig.getNextStatus()));
|
|
|
|
|
DeviceManagementDataHolder.getInstance().getOperationManager()
|
|
|
|
|
.updateOperation(activityStatus.getDeviceIdentifier(), operation);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} catch (OperationManagementException e) {
|
|
|
|
|
String msg = "Error occurred while retrieving operations.";
|
|
|
|
|
log.error(msg, e);
|
|
|
|
|
} catch (OperationManagementException e) {
|
|
|
|
|
String msg = "Error occurred while retrieving operations.";
|
|
|
|
|
log.error(msg, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean isQualifiedToExecuteTask() {
|
|
|
|
|
if (isDynamicTaskEligible()) {
|
|
|
|
|
try {
|
|
|
|
|
return DeviceManagementDataHolder.getInstance().getHeartBeatService().isQualifiedToExecuteTask();
|
|
|
|
|
} catch (HeartBeatManagementException e) {
|
|
|
|
|
log.error("Error while checking is qualified to execute task", e);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|