package org.ovirt.engine.core.bll.storage.domain; import java.util.ArrayList; import javax.inject.Inject; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator; import org.ovirt.engine.core.common.action.AddSANStorageDomainParameters; import org.ovirt.engine.core.common.businessentities.storage.LUNs; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.vdscommands.CreateVGVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.GetDeviceListVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.GetVGInfoVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dao.StorageDomainStaticDao; import org.ovirt.engine.core.utils.transaction.TransactionSupport; public class AddSANStorageDomainCommand<T extends AddSANStorageDomainParameters> extends AddStorageDomainCommand<T> { @Inject private BlockStorageDomainHelper blockStorageDomainHelper; @Inject private StorageDomainStaticDao storageDomainStaticDao; /** * Constructor for command creation when compensation is applied on startup */ public AddSANStorageDomainCommand(Guid commandId) { super(commandId); } public AddSANStorageDomainCommand(T parameters, CommandContext commandContext) { super(parameters, commandContext); } @Override protected void executeCommand() { initializeStorageDomain(); // save storage if got from parameters in order to save first empty // storage in db and use it later String storage = (getStorageDomain().getStorage() != null) ? getStorageDomain().getStorage() : ""; // set domain storage to empty because not nullable in db and for shared // status to be locked getStorageDomain().setStorage(""); addStorageDomainInDb(); if(StringUtils.isEmpty(storage)) { storage = createVG(); } getStorageDomain().setStorage(storage); if (StringUtils.isNotEmpty(getStorageDomain().getStorage()) && addStorageDomainInIrs()) { updateStorageDomainDynamicFromIrs(); proceedVGLunsInDb(); blockStorageDomainHelper.fillMetadataDevicesInfo(getStorageDomain().getStorageStaticData(), getVds().getId()); storageDomainStaticDao.update(getStorageDomain().getStorageStaticData()); setSucceeded(true); } } protected void proceedVGLunsInDb() { final ArrayList<LUNs> luns = (ArrayList<LUNs>) runVdsCommand(VDSCommandType.GetVGInfo, new GetVGInfoVDSCommandParameters(getVds().getId(), getStorageDomain().getStorage())) .getReturnValue(); TransactionSupport.executeInNewTransaction(() -> { for (LUNs lun : luns) { lunHelper.proceedLUNInDb(lun, getStorageDomain().getStorageType(), getStorageDomain().getStorage()); } return null; }); } private String createVG() { VDSReturnValue returnValue = runVdsCommand( VDSCommandType.CreateVG, new CreateVGVDSCommandParameters(getVds().getId(), getStorageDomain().getId(), getParameters().getLunIds(), getParameters().isForce())); String volumeGroupId = (String) ((returnValue.getReturnValue() instanceof String) ? returnValue .getReturnValue() : null); return volumeGroupId; } @Override protected boolean canAddDomain() { if ((getParameters().getLunIds() == null || getParameters().getLunIds().isEmpty()) && StringUtils .isEmpty(getStorageDomain().getStorage())) { return failValidation(EngineMessage.ERROR_CANNOT_CREATE_STORAGE_DOMAIN_WITHOUT_VG_LV); } if (isLunsAlreadyInUse(getParameters().getLunIds())) { return false; } return true; } @Override @SuppressWarnings("unchecked") protected boolean validateDiscardAfterDeleteLegal(StorageDomainValidator storageDomainValidator, Version compatibilityVersion) { if (!validate(storageDomainValidator.isDiscardAfterDeleteSupportedByDcVersion(compatibilityVersion))) { return false; } ArrayList<LUNs> luns = (ArrayList<LUNs>) runVdsCommand(VDSCommandType.GetDeviceList, new GetDeviceListVDSCommandParameters(getVds().getId(), getStorageDomain().getStorageType(), false, getParameters().getLunIds())).getReturnValue(); return validate(storageDomainValidator.isDiscardAfterDeleteLegalForNewBlockStorageDomain(luns)); } }