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

Reply via email to