/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.computecontroller.impl;
import java.net.URI;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.Controller;
import com.emc.storageos.computecontroller.ComputeController;
import com.emc.storageos.computesystemcontroller.exceptions.ComputeSystemControllerException;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.ComputeElement;
import com.emc.storageos.db.client.model.ComputeSystem;
import com.emc.storageos.db.client.model.DiscoveredSystemObject;
import com.emc.storageos.db.client.model.Host;
import com.emc.storageos.db.client.util.NullColumnValueGetter;
import com.emc.storageos.exceptions.ClientControllerException;
import com.emc.storageos.impl.AbstractDiscoveredSystemController;
import com.emc.storageos.svcs.errorhandling.resources.InternalException;
import com.emc.storageos.volumecontroller.AsyncTask;
import com.emc.storageos.volumecontroller.impl.ControllerServiceImpl;
import com.emc.storageos.volumecontroller.impl.Dispatcher;
public class ComputeControllerImpl extends AbstractDiscoveredSystemController implements ComputeController {
private static final Logger _log = LoggerFactory.getLogger(ComputeControllerImpl.class);
private Set<ComputeDeviceController> _deviceImpl;
private Dispatcher _dispatcher;
private DbClient _dbClient;
public void setDeviceImpl(Set<ComputeDeviceController> deviceImpl) {
_deviceImpl = deviceImpl;
}
public void setDispatcher(Dispatcher dispatcher) {
_dispatcher = dispatcher;
}
public void setDbClient(DbClient dbClient) {
_dbClient = dbClient;
}
private void execCompute(String methodName, Object... args) {
queueTask(_dbClient, ComputeSystem.class, _dispatcher, methodName, args);
}
@Override
public void discoverComputeSystems(AsyncTask[] tasks)
throws InternalException {
_log.info("discoverComputeSystems");
try {
ControllerServiceImpl.scheduleDiscoverJobs(tasks, ControllerServiceImpl.Lock.COMPUTE_DATA_COLLECTION_LOCK,
ControllerServiceImpl.COMPUTE_DISCOVERY);
} catch (Exception e) {
_log.error("Problem in discoverStorageSystem due to {} ",
e.getMessage());
throw ClientControllerException.fatals.unableToScheduleDiscoverJobs(tasks, e);
}
}
@Override
public void createHosts(URI varray, URI vcpoolId, AsyncTask[] tasks) throws InternalException {
_log.info("createHosts");
for (AsyncTask task : tasks) {
Host host = _dbClient.queryObject(Host.class, task._id);
if (host != null) {
if (!NullColumnValueGetter.isNullURI(host.getComputeElement())) {
ComputeElement computeElement = _dbClient.queryObject(ComputeElement.class,
host.getComputeElement());
execCompute("createHost", computeElement.getComputeSystem(), vcpoolId, varray, task._id, task._opId);
} else {
_dbClient.error(Host.class, task._id, task._opId, ComputeSystemControllerException.exceptions
.noComputeElementAssociatedWithHost(host.getNativeGuid().toString(), host.getId()
.toString(), null));
}
} else {
// TODO Better treat this failure! Right now, can't do anything
// if the host comes out to be null... Skipping for now
continue;
}
}
}
@Override
protected Controller lookupDeviceController(DiscoveredSystemObject device) {
if (device == null) {
throw ClientControllerException.fatals.unableToLookupStorageDeviceIsNull();
}
ComputeDeviceController cc = _deviceImpl.iterator().next();
if (cc == null) {
throw ClientControllerException.fatals.unableToLocateDeviceController("ComputeController");
}
return cc;
}
@Override
public void clearDeviceSession(URI computeSystemId) throws InternalException {
ComputeSystem cs = _dbClient.queryObject(ComputeSystem.class, computeSystemId);
execCompute("clearDeviceSession", cs.getId());
}
@Override
public void deactivateHost(AsyncTask[] tasks) throws InternalException {
AsyncTask task = tasks[0];
Host host = _dbClient.queryObject(Host.class, task._id);
if (host != null) {
if (!NullColumnValueGetter.isNullURI(host.getComputeElement())) {
ComputeElement computeElement = _dbClient.queryObject(
ComputeElement.class, host.getComputeElement());
execCompute("deactivateHost", computeElement.getComputeSystem(),
task._id, task._opId);
} else {
_dbClient.error(Host.class, task._id, task._opId,
ComputeSystemControllerException.exceptions
.noComputeElementAssociatedWithHost(host
.getNativeGuid().toString(), host
.getId().toString(), null));
}
}
}
}