/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.DataObject;
import com.emc.storageos.db.client.model.DiscoveredDataObject;
import com.emc.storageos.db.client.model.Operation;
import com.emc.storageos.db.client.model.Operation.Status;
import com.emc.storageos.exceptions.DeviceControllerException;
import com.emc.storageos.svcs.errorhandling.model.ServiceCoded;
import com.emc.storageos.volumecontroller.AsyncTask;
import com.emc.storageos.volumecontroller.TaskCompleter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URI;
import java.util.List;
public abstract class DataCollectionTaskCompleter extends TaskCompleter {
/**
* Reference to logger
*/
private transient static final Logger _log = LoggerFactory.getLogger(DataCollectionTaskCompleter.class);
private static final long serialVersionUID = -7594173946994954408L;
/**
* @param clazz
* @param id
* @param opId
*/
public DataCollectionTaskCompleter(Class clazz, URI id, String opId) {
super(clazz, id, opId);
}
public DataCollectionTaskCompleter(Class clazz, List<URI> ids, String opId) {
super(clazz, ids, opId);
}
public DataCollectionTaskCompleter(AsyncTask task) {
super(task);
}
public void schedule(DbClient dbClient) {
updateObjectState(dbClient, DiscoveredDataObject.DataCollectionJobStatus.SCHEDULED);
DataObject dbObject = dbClient.queryObject(getType(), getId());
if (!dbObject.getOpStatus().containsKey(getOpId())) {
createDefaultOperation(dbClient);
}
_log.info(String.format("Scheduled JobType: %s, Class: %s, Id: %s, OpId: %s",
getJobType(), getType().toString(), getId().toString(), getOpId()));
// TODO : Need to record the event of task completion in the DB
// RecordableEventManager.EventType eventType = ....
// recordBourneDiscoverEvent(dbClient, eventType, status, "Discover");
}
@Override
public void statusError(DbClient dbClient, ServiceCoded code) {
DataObject dbObject = dbClient.queryObject(getType(), getId());
if (!dbObject.getOpStatus().containsKey(getOpId())) {
createDefaultOperation(dbClient);
}
super.statusError(dbClient, code);
_log.info(String.format("Failed JobType: %s, Class: %s Id: %s, OpId: %s, status: %s, cause: %s",
getJobType(), getType().toString(), getId().toString(), getOpId(), Status.error.name(), code.getMessage()));
}
@Override
public void statusReady(DbClient dbClient, String message) {
DataObject dbObject = dbClient.queryObject(getType(), getId());
if (!dbObject.getOpStatus().containsKey(getOpId())) {
createDefaultOperation(dbClient);
}
super.statusReady(dbClient, message);
_log.info(String.format("Completed JobType: %s, Class: %s Id: %s, OpId: %s, status: %s, message: %s",
getJobType(), getType().toString(), getId().toString(), getOpId(), Status.ready.name(), message));
}
@Override
public void statusReady(DbClient dbClient) {
statusReady(dbClient, (String) null);
}
@Override
public void statusPending(DbClient dbClient, String message) {
DataObject dbObject = dbClient.queryObject(getType(), getId());
if (!dbObject.getOpStatus().containsKey(getOpId())) {
createDefaultOperation(dbClient);
}
super.statusPending(dbClient, message);
_log.info(String.format("Updated JobType: %s, Class: %s Id: %s, OpId: %s, status: %s, message: %s",
getJobType(), getType().toString(), getId().toString(), getOpId(),
Status.pending.name(), message));
}
@Override
protected void complete(DbClient dbClient, Status status, ServiceCoded coded) throws DeviceControllerException {
updateObjectState(dbClient, getJobStatus(status));
long time = System.currentTimeMillis();
setLastTime(dbClient, time);
if (status == Status.error) {
statusError(dbClient, coded);
}
else if (status == Status.ready) {
setSuccessTime(dbClient, time);
statusReady(dbClient, null);
}
// TODO : Need to record the event of task completion in the DB
// RecordableEventManager.EventType eventType = ....
// recordBourneDiscoverEvent(dbClient, eventType, status, "Discover");
}
private DiscoveredDataObject.DataCollectionJobStatus getJobStatus(Operation.Status status) {
switch (status) {
case pending:
return DiscoveredDataObject.DataCollectionJobStatus.IN_PROGRESS;
case ready:
return DiscoveredDataObject.DataCollectionJobStatus.COMPLETE;
case error:
return DiscoveredDataObject.DataCollectionJobStatus.ERROR;
default:
return DiscoveredDataObject.DataCollectionJobStatus.IN_PROGRESS;
}
}
abstract public String getJobType();
abstract protected void updateObjectState(DbClient dbClient,
DiscoveredDataObject.DataCollectionJobStatus jobStatus);
abstract public void setNextRunTime(DbClient dbClient, long time);
abstract protected void setLastTime(DbClient dbClient, long time);
abstract protected void setSuccessTime(DbClient dbClient, long time);
abstract protected void createDefaultOperation(DbClient dbClient);
}