package org.ovirt.engine.core.bll.storage.domain;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.Backend;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.common.action.AttachStorageDomainToPoolParameters;
import org.ovirt.engine.core.common.action.StorageDomainManagementParameter;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.StoragePoolDao;
import org.ovirt.engine.core.dao.StorageServerConnectionDao;
public class AddLocalStorageDomainCommand<T extends StorageDomainManagementParameter> extends AddStorageDomainCommon<T> {
@Inject
private StorageServerConnectionDao storageServerConnectionDao;
@Inject
private StoragePoolDao storagePoolDao;
/**
* Constructor for command creation when compensation is applied on startup
*/
public AddLocalStorageDomainCommand(Guid commandId) {
super(commandId);
}
public AddLocalStorageDomainCommand(T parameters, CommandContext commandContext) {
super(parameters, commandContext);
}
@Override
protected boolean validate() {
if (!super.validate()) {
return false;
}
StoragePool storagePool = storagePoolDao.getForVds(getParameters().getVdsId());
if (storagePool == null) {
return failValidation(EngineMessage.NETWORK_CLUSTER_HAVE_NOT_EXISTING_DATA_CENTER_NETWORK);
}
setStoragePool(storagePool);
if (getStorageDomain().getStorageType() == StorageType.LOCALFS && !storagePool.isLocal()) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_STORAGE_POOL_IS_NOT_LOCAL);
}
if (storagePool.getStatus() != StoragePoolStatus.Uninitialized) {
if (!checkMasterDomainIsUp()) {
return false;
}
}
// we limit RHEV-H local storage to its persistence mount - /data/images/rhev/
if (getVds().isOvirtVintageNode()) {
StorageServerConnections conn =
storageServerConnectionDao.get(getParameters().getStorageDomain().getStorage());
String rhevhLocalFSPath = Config.getValue(ConfigValues.RhevhLocalFSPath);
if (!conn.getConnection().equals(rhevhLocalFSPath)) {
addValidationMessage(EngineMessage.RHEVH_LOCALFS_WRONG_PATH_LOCATION);
addValidationMessageVariable("path", rhevhLocalFSPath);
return false;
}
}
return true;
}
@Override
protected void executeCommand() {
super.executeCommand();
if (getSucceeded()) {
VdcReturnValueBase returnValue = Backend.getInstance()
.runInternalAction(
VdcActionType.AttachStorageDomainToPool,
new AttachStorageDomainToPoolParameters(getStorageDomain().getId(), getStoragePool().getId()));
if(!returnValue.getSucceeded()) {
getReturnValue().setSucceeded(false);
getReturnValue().setFault(returnValue.getFault());
}
}
}
}