package org.ovirt.engine.core.bll.storage.connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.LockMessagesMatchUtil;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.storage.domain.StorageDomainCommandBase;
import org.ovirt.engine.core.bll.validator.storage.StorageConnectionValidator;
import org.ovirt.engine.core.common.action.AttachDetachStorageConnectionParameters;
import org.ovirt.engine.core.common.businessentities.BusinessEntitiesDefinitions;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.storage.LUNStorageServerConnectionMap;
import org.ovirt.engine.core.common.businessentities.storage.LUNs;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.locks.LockingGroup;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.dao.LunDao;
import org.ovirt.engine.core.dao.StorageServerConnectionDao;
import org.ovirt.engine.core.dao.StorageServerConnectionLunMapDao;
public class AttachStorageConnectionToStorageDomainCommand<T extends AttachDetachStorageConnectionParameters>
extends StorageDomainCommandBase<T> {
@Inject
private StorageServerConnectionDao storageServerConnectionDao;
@Inject
private StorageServerConnectionLunMapDao storageServerConnectionLunMapDao;
@Inject
private LunDao lunDao;
public AttachStorageConnectionToStorageDomainCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
@Override
protected boolean validate() {
StorageConnectionValidator storageConnectionValidator = createStorageConnectionValidator();
if (!validate(storageConnectionValidator.isConnectionExists())
|| !validate(storageConnectionValidator.isDomainOfConnectionExistsAndInactive(getStorageDomain()))
|| !validate(storageConnectionValidator.isISCSIConnectionAndDomain(getStorageDomain()))) {
return false;
}
if (storageConnectionValidator.isConnectionForISCSIDomainAttached(getStorageDomain())) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_ALREADY_EXISTS);
}
return true;
}
protected StorageConnectionValidator createStorageConnectionValidator() {
String connectionId = getParameters().getStorageConnectionId();
StorageServerConnections connection = storageServerConnectionDao.get(connectionId);
return new StorageConnectionValidator(connection);
}
@Override
protected void executeCommand() {
// Create a dummy lun
LUNs dummyLun = createDummyLun();
// Create storage server connection mapping
LUNStorageServerConnectionMap connectionMapRecord =
new LUNStorageServerConnectionMap(dummyLun.getLUNId(), getParameters().getStorageConnectionId());
List<StorageServerConnections> connectionsForDomain;
if (lunDao.get(dummyLun.getLUNId()) == null) {
lunDao.save(dummyLun);
// Save connection maps when creating the dummy lun for the first time
connectionsForDomain = storageServerConnectionDao.getAllForDomain(getStorageDomainId());
for (StorageServerConnections connection : connectionsForDomain) {
saveConnection(new LUNStorageServerConnectionMap(dummyLun.getLUNId(), connection.getId()));
}
}
// Save new connection map
saveConnection(connectionMapRecord);
setSucceeded(true);
}
private void saveConnection(LUNStorageServerConnectionMap connectionMapRecord) {
if (storageServerConnectionLunMapDao.get(connectionMapRecord.getId()) == null) {
storageServerConnectionLunMapDao.save(connectionMapRecord);
}
}
private LUNs createDummyLun() {
final LUNs dummyLun = new LUNs();
dummyLun.setLUNId(BusinessEntitiesDefinitions.DUMMY_LUN_ID_PREFIX + getStorageDomainId());
dummyLun.setVolumeGroupId(getStorageDomain().getStorage());
return dummyLun;
}
@Override
protected Map<String, Pair<String, String>> getExclusiveLocks() {
Map<String, Pair<String, String>> locks = new HashMap<>();
// lock connection's id to avoid removing this connection at the same time
// by another user
locks.put(getParameters().getStorageConnectionId(),
LockMessagesMatchUtil.makeLockingPair(LockingGroup.STORAGE_CONNECTION,
EngineMessage.ACTION_TYPE_FAILED_OBJECT_LOCKED));
return locks;
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__ACTION__ATTACH);
addValidationMessage(EngineMessage.VAR__TYPE__STORAGE__CONNECTION);
}
}