package org.ovirt.engine.core.bll.storage; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.common.action.AddSANStorageDomainParameters; import org.ovirt.engine.core.common.businessentities.LUNs; import org.ovirt.engine.core.common.vdscommands.CreateVGVDSCommandParameters; 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.StringHelper; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.transaction.TransactionMethod; import org.ovirt.engine.core.utils.transaction.TransactionSupport; public class AddSANStorageDomainCommand<T extends AddSANStorageDomainParameters> extends AddStorageDomainCommand<T> { /** * Constructor for command creation when compensation is applied on startup * * @param commandId */ protected AddSANStorageDomainCommand(Guid commandId) { super(commandId); } public AddSANStorageDomainCommand(T parameters) { super(parameters); } @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(); getStorageDomain().setstorage(storage); if (StringHelper.isNullOrEmpty(getStorageDomain().getstorage())) { getStorageDomain().setstorage(CreateVG()); } if (!StringHelper.isNullOrEmpty(getStorageDomain().getstorage()) && (AddStorageDomainInIrs())) { DbFacade.getInstance().getStorageDomainStaticDAO().update(getStorageDomain().getStorageStaticData()); UpdateStorageDomainDynamicFromIrs(); ProceedVGLunsInDb(); setSucceeded(true); } } protected void ProceedVGLunsInDb() { final java.util.ArrayList<LUNs> luns = (java.util.ArrayList<LUNs>) Backend .getInstance() .getResourceManager() .RunVdsCommand(VDSCommandType.GetVGInfo, new GetVGInfoVDSCommandParameters(getVds().getvds_id(), getStorageDomain().getstorage())) .getReturnValue(); TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { @Override public Void runInTransaction() { for (LUNs lun : luns) { ProceedLUNInDb(lun); } return null; } }); } private String CreateVG() { VDSReturnValue returnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.CreateVG, new CreateVGVDSCommandParameters(getVds().getvds_id(), getStorageDomain().getid(), getParameters().getLunIds())); String volumeGroupId = (String) ((returnValue.getReturnValue() instanceof String) ? returnValue .getReturnValue() : null); return volumeGroupId; } @Override protected boolean CanAddDomain() { boolean returnValue = true; // !AddSANStorageDomainParametersValue.IsExistingStorageDomain && if (((getParameters().getLunIds() == null || getParameters().getLunIds().isEmpty()) && StringHelper .isNullOrEmpty(getStorageDomain().getstorage()))) { returnValue = false; addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_CREATE_STORAGE_DOMAIN_WITHOUT_VG_LV); } return returnValue; } }