Maor Lipchuk has uploaded a new change for review. Change subject: core: Add vdc query for attached Storage Domain ......................................................................
core: Add vdc query for attached Storage Domain Add vdc query for validating that the Storage Domain is not attached to another Data Center. The validation is being done on the Storage Domain metadata which contains the storage pool id. The Query uses connect and disconnect operations for the Storage Domain to fetch the storage domain info. Change-Id: I749cad223d90dcc8d193765ed842d7e062ad566c Bug-Url: https://bugzilla.redhat.com/1138115 Signed-off-by: Maor Lipchuk <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/GetStorageDomainsWithAttachedStoragePoolGuidQuery.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/GetStorageDomainsWithAttachedStoragePoolGuidQueryTest.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/StorageDomainsAndStoragePoolIdQueryParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java 4 files changed, 345 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/47/36447/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/GetStorageDomainsWithAttachedStoragePoolGuidQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/GetStorageDomainsWithAttachedStoragePoolGuidQuery.java new file mode 100644 index 0000000..c00010b --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/GetStorageDomainsWithAttachedStoragePoolGuidQuery.java @@ -0,0 +1,140 @@ +package org.ovirt.engine.core.bll.storage; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.ovirt.engine.core.bll.Backend; +import org.ovirt.engine.core.bll.QueriesCommandBase; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSStatus; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend; +import org.ovirt.engine.core.common.queries.StorageDomainsAndStoragePoolIdQueryParameters; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.common.vdscommands.HSMGetStorageDomainInfoVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSParametersBase; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.compat.Guid; + +public class GetStorageDomainsWithAttachedStoragePoolGuidQuery<P extends StorageDomainsAndStoragePoolIdQueryParameters> extends QueriesCommandBase<P> { + + public GetStorageDomainsWithAttachedStoragePoolGuidQuery(P parameters) { + super(parameters); + } + + private Guid vdsId; + protected List<StorageDomainStatic> storageDomainsWithAttachedStoragePoolId = new ArrayList<>(); + + public Guid setVdsForConnectStorage() { + vdsId = getParameters().getVdsId(); + if (vdsId == null) { + // Get a Host which is at UP state to connect to the Storage Domain. + List<VDS> hosts = + getDbFacade().getVdsDao().getAllForStoragePoolAndStatus(getParameters().getId(), VDSStatus.Up); + if (!hosts.isEmpty()) { + vdsId = hosts.get(new Random().nextInt(hosts.size())).getId(); + log.info("vds id '{}' was chosen to fetch the Storage domain info", vdsId); + } else { + log.warn("There is no available vds in UP state to fetch the Storage domain info from VDSM"); + return null; + } + } + return vdsId; + } + + @Override + protected void executeQueryCommand() { + if (setVdsForConnectStorage() == null) { + return; + } + storageDomainsWithAttachedStoragePoolId = filterAttachedStorageDomains(); + getQueryReturnValue().setReturnValue(storageDomainsWithAttachedStoragePoolId); + } + + protected List<StorageDomainStatic> filterAttachedStorageDomains() { + List<StorageDomain> connectedStorageDomainsToVds = new ArrayList<>(); + for (StorageDomain storageDomain : getParameters().getStorageDomainList()) { + if (!connectStorageDomain(storageDomain)) { + logErrorMessage(storageDomain); + } else { + connectedStorageDomainsToVds.add(storageDomain); + } + } + + storageDomainsWithAttachedStoragePoolId = getAttachedStorageDomains(connectedStorageDomainsToVds); + for (StorageDomain storageDomain : connectedStorageDomainsToVds) { + if (!disConnectStorageDomain(storageDomain)) { + log.warn("Could not disconnect Storage Domain {} from VDS '{}'. ", storageDomain.getName(), getVdsId()); + } + } + return storageDomainsWithAttachedStoragePoolId; + } + + public Guid getVdsId() { + return vdsId; + } + + protected List<StorageDomainStatic> getAttachedStorageDomains(List<StorageDomain> storageDomains) { + VDSReturnValue vdsReturnValue = null; + List<StorageDomainStatic> storageDomainsWithAttachedStoragePoolId = new ArrayList<>(); + + // Go over the list of Storage Domains and try to get the Storage Domain info to check if it attached to another + // Storage Pool + for (StorageDomain storageDomain : storageDomains) { + try { + vdsReturnValue = + runVdsCommand(VDSCommandType.HSMGetStorageDomainInfo, + new HSMGetStorageDomainInfoVDSCommandParameters(getVdsId(), storageDomain.getId())); + } catch (RuntimeException e) { + logErrorMessage(storageDomain); + continue; + } + if (!vdsReturnValue.getSucceeded()) { + logErrorMessage(storageDomain); + continue; + } + Pair<StorageDomainStatic, Guid> domainFromIrs = + (Pair<StorageDomainStatic, Guid>) vdsReturnValue.getReturnValue(); + if (domainFromIrs.getSecond() != null) { + storageDomainsWithAttachedStoragePoolId.add(domainFromIrs.getFirst()); + } + } + return storageDomainsWithAttachedStoragePoolId; + } + + protected VDSBrokerFrontend getVdsBroker() { + return Backend.getInstance().getResourceManager(); + } + + protected VDSReturnValue runVdsCommand(VDSCommandType commandType, VDSParametersBase parameters) + throws VdcBLLException { + return getVdsBroker().RunVdsCommand(commandType, parameters); + } + + protected boolean connectStorageDomain(StorageDomain storageDomain) { + return StorageHelperDirector.getInstance() + .getItem(storageDomain.getStorageType()) + .connectStorageToDomainByVdsId(storageDomain, getVdsId()); + } + + protected boolean disConnectStorageDomain(StorageDomain storageDomain) { + return StorageHelperDirector.getInstance() + .getItem(storageDomain.getStorageType()) + .disconnectStorageFromDomainByVdsId(storageDomain, getVdsId()); + } + + protected void logErrorMessage(StorageDomain storageDomain) { + if (storageDomain != null) { + log.error("Could not get Storage Domain info for Storage Domain (name:'{}', id:'{}') with VDS '{}'. ", + storageDomain.getName(), + storageDomain.getId(), + getVdsId()); + } else { + log.error("Could not get Storage Domain info with VDS '{}'. ", getVdsId()); + } + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/GetStorageDomainsWithAttachedStoragePoolGuidQueryTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/GetStorageDomainsWithAttachedStoragePoolGuidQueryTest.java new file mode 100644 index 0000000..e6ccc01 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/GetStorageDomainsWithAttachedStoragePoolGuidQueryTest.java @@ -0,0 +1,143 @@ +package org.ovirt.engine.core.bll.storage; + +import static junit.framework.TestCase.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.ovirt.engine.core.bll.AbstractQueryTest; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; +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.interfaces.VDSBrokerFrontend; +import org.ovirt.engine.core.common.queries.StorageDomainsAndStoragePoolIdQueryParameters; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.common.vdscommands.HSMGetStorageDomainInfoVDSCommandParameters; +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.dao.VdsDAO; + +public class GetStorageDomainsWithAttachedStoragePoolGuidQueryTest extends + AbstractQueryTest<StorageDomainsAndStoragePoolIdQueryParameters, GetStorageDomainsWithAttachedStoragePoolGuidQuery<StorageDomainsAndStoragePoolIdQueryParameters>> +{ + @Mock + private VDSBrokerFrontend vdsBrokerFrontendMock; + + private StorageDomain storageDomain; + + @Before + public void initMocking() { + storageDomain = new StorageDomain(); + storageDomain.setStorageName("Name of Storage"); + storageDomain.setStorageType(StorageType.ISCSI); + + VDS vds = new VDS(); + vds.setId(Guid.newGuid()); + VdsDAO vdsDAOMock = mock(VdsDAO.class); + List<VDS> listVds = new ArrayList<>(); + listVds.add(vds); + when(vdsDAOMock.getAllForStoragePoolAndStatus(any(Guid.class), eq(VDSStatus.Up))).thenReturn(listVds); + when(getDbFacadeMockInstance().getVdsDao()).thenReturn(vdsDAOMock); + VDSBrokerFrontend vdsBrokerFrontendMock = mock(VDSBrokerFrontend.class); + doReturn(vdsBrokerFrontendMock).when(getQuery()).getVdsBroker(); + doReturn(Boolean.TRUE).when(getQuery()).connectStorageDomain(eq(storageDomain)); + doReturn(Boolean.TRUE).when(getQuery()).disConnectStorageDomain(eq(storageDomain)); + } + + @Test + public void testAttachedStorageDomainQuery() { + mockVdsCommand(); + + // Create parameters + List<StorageDomain> storageDomainList = new ArrayList<>(); + storageDomainList.add(storageDomain); + StorageDomainsAndStoragePoolIdQueryParameters paramsMock = getQueryParameters(); + when(paramsMock.getStorageDomainList()).thenReturn(storageDomainList); + + // Run 'HSMGetStorageDomainInfo' command + VDSReturnValue returnValue = new VDSReturnValue(); + returnValue.setSucceeded(true); + + Pair<StorageDomainStatic, Guid> storageDomainToPoolId = new Pair<>(storageDomain.getStorageStaticData(), Guid.newGuid()); + returnValue.setReturnValue(storageDomainToPoolId); + when(vdsBrokerFrontendMock.RunVdsCommand(eq(VDSCommandType.HSMGetStorageDomainInfo), + any(HSMGetStorageDomainInfoVDSCommandParameters.class))).thenReturn(returnValue); + + // Execute command + getQuery().executeQueryCommand(); + + // Assert the query's results + List<StorageDomainStatic> returnedStorageDomainList = new ArrayList<>(); + returnedStorageDomainList.add(storageDomain.getStorageStaticData()); + assertEquals(returnedStorageDomainList, getQuery().getQueryReturnValue().getReturnValue()); + } + + @Test + public void testUnattachedStorageDomainQuery() { + mockVdsCommand(); + + // Create parameters + List<StorageDomain> storageDomainList = new ArrayList<>(); + storageDomainList.add(storageDomain); + StorageDomainsAndStoragePoolIdQueryParameters paramsMock = getQueryParameters(); + when(paramsMock.getStorageDomainList()).thenReturn(storageDomainList); + + // Run 'HSMGetStorageDomainInfo' command + VDSReturnValue returnValue = new VDSReturnValue(); + returnValue.setSucceeded(true); + + Pair<StorageDomainStatic, Guid> storageDomainToPoolId = new Pair<>(storageDomain.getStorageStaticData(), null); + returnValue.setReturnValue(storageDomainToPoolId); + when(vdsBrokerFrontendMock.RunVdsCommand(eq(VDSCommandType.HSMGetStorageDomainInfo), + any(HSMGetStorageDomainInfoVDSCommandParameters.class))).thenReturn(returnValue); + + // Execute command + getQuery().executeQueryCommand(); + + // Assert the query's results + List<StorageDomainStatic> returnedStorageDomainList = new ArrayList<>(); + assertEquals(returnedStorageDomainList, getQuery().getQueryReturnValue().getReturnValue()); + } + + @Test + public void testEmptyStorageDomainListQuery() { + mockVdsCommand(); + + // Create parameters + List<StorageDomain> storageDomainList = new ArrayList<>(); + StorageDomainsAndStoragePoolIdQueryParameters paramsMock = getQueryParameters(); + when(paramsMock.getStorageDomainList()).thenReturn(storageDomainList); + + // Run 'HSMGetStorageDomainInfo' command + VDSReturnValue returnValue = new VDSReturnValue(); + returnValue.setSucceeded(true); + + Pair<StorageDomainStatic, Guid> storageDomainToPoolId = new Pair<>(storageDomain.getStorageStaticData(), Guid.newGuid()); + returnValue.setReturnValue(storageDomainToPoolId); + when(vdsBrokerFrontendMock.RunVdsCommand(eq(VDSCommandType.HSMGetStorageDomainInfo), + any(HSMGetStorageDomainInfoVDSCommandParameters.class))).thenReturn(returnValue); + + // Execute command + getQuery().executeQueryCommand(); + + // Assert the query's results + List<StorageDomainStatic> returnedStorageDomainList = new ArrayList<>(); + assertEquals(returnedStorageDomainList, getQuery().getQueryReturnValue().getReturnValue()); + } + + private void mockVdsCommand() { + vdsBrokerFrontendMock = mock(VDSBrokerFrontend.class); + doReturn(vdsBrokerFrontendMock).when(getQuery()).getVdsBroker(); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/StorageDomainsAndStoragePoolIdQueryParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/StorageDomainsAndStoragePoolIdQueryParameters.java new file mode 100644 index 0000000..8fde705 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/StorageDomainsAndStoragePoolIdQueryParameters.java @@ -0,0 +1,61 @@ +package org.ovirt.engine.core.common.queries; + +import java.util.ArrayList; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageServerConnections; +import org.ovirt.engine.core.compat.Guid; + +public class StorageDomainsAndStoragePoolIdQueryParameters extends IdQueryParameters { + private List<StorageDomain> storageDomainList; + private StorageServerConnections storageServerConnection; + private Guid vdsId; + + public Guid getVdsId() { + return vdsId; + } + + public void setVdsId(Guid vdsId) { + this.vdsId = vdsId; + } + + public List<StorageDomain> getStorageDomainList() { + return storageDomainList; + } + + public void setStorageDomainIdList(List<StorageDomain> storageDomainList) { + this.storageDomainList = storageDomainList; + } + + public StorageServerConnections getStorageServerConnection() { + return storageServerConnection; + } + + public void setStorageServerConnection(StorageServerConnections storageServerConnection) { + this.storageServerConnection = storageServerConnection; + } + + public StorageDomainsAndStoragePoolIdQueryParameters() { + } + + public StorageDomainsAndStoragePoolIdQueryParameters(List<StorageDomain> storageDomainList, Guid storagePoolId, Guid vdsId) { + super(storagePoolId); + this.storageDomainList = storageDomainList; + this.vdsId = vdsId; + } + + public StorageDomainsAndStoragePoolIdQueryParameters(StorageDomain storageDomain, Guid storagePoolId, Guid vdsId) { + super(storagePoolId); + List<StorageDomain> storageDomainList = new ArrayList<StorageDomain>(); + storageDomainList.add(storageDomain); + this.storageDomainList = storageDomainList; + this.vdsId = vdsId; + } + + public StorageDomainsAndStoragePoolIdQueryParameters(StorageServerConnections storageServerConnection, Guid storagePoolId, Guid vdsId) { + super(storagePoolId); + this.storageServerConnection = storageServerConnection; + this.vdsId = vdsId; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index 2864d22..be83c97 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -374,6 +374,7 @@ GetAffinityGroupById, GetAffinityGroupsByClusterId, GetAffinityGroupsByVmId, + GetStorageDomainsWithAttachedStoragePoolGuid, GetAllDisksPartialDataByVmId(VdcQueryAuthType.User), GetVmTemplateCount, -- To view, visit http://gerrit.ovirt.org/36447 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I749cad223d90dcc8d193765ed842d7e062ad566c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Maor Lipchuk <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
