/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.volumecontroller.impl.plugins.discovery.smis;
import java.net.URI;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.ComputeSystem;
import com.emc.storageos.db.client.model.DataObject;
import com.emc.storageos.db.client.model.DiscoveredDataObject;
import com.emc.storageos.db.client.model.DiscoveredSystemObject;
import com.emc.storageos.db.client.model.Host;
import com.emc.storageos.db.client.model.NetworkSystem;
import com.emc.storageos.db.client.model.ProtectionSet;
import com.emc.storageos.db.client.model.Vcenter;
import com.emc.storageos.db.exceptions.DatabaseException;
import com.emc.storageos.exceptions.DeviceControllerException;
import com.emc.storageos.model.ResourceOperationTypeEnum;
import com.emc.storageos.volumecontroller.AsyncTask;
public class DiscoverTaskCompleter extends DataCollectionTaskCompleter {
private static final long serialVersionUID = 6012924628969009805L;
private String _jobType;
public DiscoverTaskCompleter(Class clazz, URI id, String opId, String jobType) {
super(clazz, id, opId);
_jobType = jobType;
}
public DiscoverTaskCompleter(AsyncTask task, String jobType) {
super(task);
_jobType = jobType;
}
public String getJobType() {
return _jobType;
}
protected void updateObjectState(DbClient dbClient,
DiscoveredDataObject.DataCollectionJobStatus jobStatus) {
Class type = getType();
if (DiscoveredSystemObject.class.isAssignableFrom(type)) {
try {
DiscoveredSystemObject dbObject = (DiscoveredSystemObject) DataObject.createInstance(type, getId());
dbObject.trackChanges();
dbObject.setDiscoveryStatus(jobStatus.toString());
dbClient.persistObject(dbObject);
} catch (InstantiationException ex) {
DatabaseException.fatals.queryFailed(ex);
} catch (IllegalAccessException ex) {
DatabaseException.fatals.queryFailed(ex);
}
}
else {
throw DeviceControllerException.exceptions.invalidSystemType(type.toString());
}
}
@Override
final public void setNextRunTime(DbClient dbClient, long time) {
Class type = getType();
if (DiscoveredSystemObject.class.isAssignableFrom(type)) {
try {
DiscoveredSystemObject dbObject = (DiscoveredSystemObject) DataObject.createInstance(type, getId());
dbObject.trackChanges();
dbObject.setNextDiscoveryRunTime(time);
dbClient.persistObject(dbObject);
} catch (InstantiationException ex) {
DatabaseException.fatals.queryFailed(ex);
} catch (IllegalAccessException ex) {
DatabaseException.fatals.queryFailed(ex);
}
}
else {
throw new RuntimeException("Unsupported system Type : " + type.toString());
}
}
@Override
final public void setLastTime(DbClient dbClient, long time) {
Class type = getType();
if (DiscoveredSystemObject.class.isAssignableFrom(type)) {
try {
DiscoveredSystemObject dbObject = (DiscoveredSystemObject) DataObject.createInstance(type, getId());
dbObject.trackChanges();
dbObject.setLastDiscoveryRunTime(time);
dbClient.persistObject(dbObject);
} catch (InstantiationException ex) {
DatabaseException.fatals.queryFailed(ex);
} catch (IllegalAccessException ex) {
DatabaseException.fatals.queryFailed(ex);
}
}
else {
throw new RuntimeException("Unsupported system Type : " + type.toString());
}
}
@Override
final public void setSuccessTime(DbClient dbClient, long time) {
Class type = getType();
if (DiscoveredSystemObject.class.isAssignableFrom(type)) {
try {
DiscoveredSystemObject dbObject = (DiscoveredSystemObject) DataObject.createInstance(type, getId());
dbObject.trackChanges();
dbObject.setSuccessDiscoveryTime(time);
dbClient.persistObject(dbObject);
} catch (InstantiationException ex) {
DatabaseException.fatals.queryFailed(ex);
} catch (IllegalAccessException ex) {
DatabaseException.fatals.queryFailed(ex);
}
}
else {
throw new RuntimeException("Unsupported system Type : " + type.toString());
}
}
@Override
protected void createDefaultOperation(DbClient dbClient) {
ResourceOperationTypeEnum opType = ResourceOperationTypeEnum.DISCOVER_STORAGE_SYSTEM;
Class type = getType();
if (Host.class.equals(type)) {
opType = ResourceOperationTypeEnum.DISCOVER_HOST;
} else if (Vcenter.class.equals(type)) {
opType = ResourceOperationTypeEnum.DISCOVER_VCENTER;
} else if (ComputeSystem.class.equals(type)) {
opType = ResourceOperationTypeEnum.DISCOVER_COMPUTE_SYSTEM;
} else if (NetworkSystem.class.equals(type)) {
opType = ResourceOperationTypeEnum.DISCOVER_NETWORK_SYSTEM;
} else if (ProtectionSet.class.equals(type)) {
opType = ResourceOperationTypeEnum.DISCOVER_PROTECTION_SET;
}
dbClient.createTaskOpStatus(getType(), getId(), getOpId(),
opType);
}
}