package org.ovirt.engine.core.bll.storage;
import java.util.List;
import org.ovirt.engine.core.bll.InternalCommandAttribute;
import org.ovirt.engine.core.common.action.StorageServerConnectionParametersBase;
import org.ovirt.engine.core.common.businessentities.StorageType;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.storage_pool;
import org.ovirt.engine.core.common.businessentities.storage_server_connections;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
@InternalCommandAttribute
public class AddStorageServerConnectionCommand<T extends StorageServerConnectionParametersBase> extends
ConnectStorageToVdsCommand<T> {
public AddStorageServerConnectionCommand(T parameters) {
super(parameters);
}
@Override
protected void executeCommand() {
if (getParameters().getVdsId().equals(Guid.Empty)) {
for (VDS vds : getAllRunningVdssInPool()) {
Connect(vds.getvds_id());
}
} else {
Connect(getVds().getvds_id());
}
getReturnValue().setActionReturnValue(getConnection().getid());
setSucceeded(true);
}
@Override
protected storage_server_connections getConnection() {
if (StringHelper.isNullOrEmpty(getParameters().getStorageServerConnection().getid())) {
List<storage_server_connections> connections;
if ((connections = DbFacade.getInstance().getStorageServerConnectionDAO().getAllForStorage(
getParameters().getStorageServerConnection().getconnection())).size() != 0) {
getParameters().setStorageServerConnection(connections.get(0));
}
}
return (getParameters()).getStorageServerConnection();
}
@Override
protected boolean canDoAction() {
boolean returnValue = true;
storage_server_connections paramConnection = getParameters().getStorageServerConnection();
storage_server_connections currConnection = getConnection();
if (StringHelper.isNullOrEmpty(currConnection.getid())
|| DbFacade.getInstance().getStorageServerConnectionDAO().get(currConnection.getid()) == null) {
/**
* Storage Connection not in the database - add
*/
currConnection.setid(Guid.NewGuid().toString());
DbFacade.getInstance().getStorageServerConnectionDAO().save(currConnection);
}
if (getParameters().getVdsId().equals(Guid.Empty)) {
returnValue = InitializeVds();
} else if (getVds() == null) {
addCanDoActionMessage(VdcBllMessages.VDS_INVALID_SERVER_ID);
returnValue = false;
} else if (getVds().getstatus() != VDSStatus.Up) {
addCanDoActionMessage(VdcBllMessages.VDS_ADD_STORAGE_SERVER_STATUS_MUST_BE_UP);
returnValue = false;
}
if (returnValue) {
if (paramConnection.getstorage_type() == StorageType.LOCALFS) {
storage_pool storagePool = DbFacade.getInstance().getStoragePoolDAO().getForVds(getVds().getvds_id());
if (storagePool == null || storagePool.getstorage_pool_type() != StorageType.LOCALFS) {
returnValue = false;
addCanDoActionMessage(VdcBllMessages.VDS_CANNOT_ADD_LOCAL_STORAGE_TO_NON_LOCAL_HOST);
}
}
if (returnValue) {
IStorageHelper storageHelper = StorageHelperDirector.getInstance().getItem(
paramConnection.getstorage_type());
if (!storageHelper.ValidateStoragePoolConnectionsInHost(
getVds(),
new java.util.ArrayList<storage_server_connections>(java.util.Arrays
.asList(new storage_server_connections[] { paramConnection })), Guid.Empty))
{
returnValue = false;
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION);
}
}
}
// if the connection has changed and we are going to execute this command we update the connection in the DB
//
// NOTE: this check must be the last check in this method
//
if (returnValue && paramConnection.getstorage_type() != getParameters().getStorageServerConnection().getstorage_type()) {
paramConnection.setid(currConnection.getid());
DbFacade.getInstance().getStorageServerConnectionDAO().update(paramConnection);
}
return returnValue;
}
}