Federico Simoncelli has uploaded a new change for review.

Change subject: core: add the domain detaching state
......................................................................

core: add the domain detaching state

A domain is effectively detached only when all hosts of the pool are not
reporting it as attached.
This patch adds the new "Detaching" state used while we wait for all the
hosts to detach the domain.
Most of the operations on the storage domain must be prohibited in the
Detaching.

Change-Id: I5732ef00a67ef1381ee0b6f29d08ab39cf63a1bf
Signed-off-by: Federico Simoncelli <fsimo...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
M 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java
9 files changed, 47 insertions(+), 41 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/56/23556/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
index 78b1ea9..6ea303f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java
@@ -5,17 +5,12 @@
 import 
org.ovirt.engine.core.common.action.DetachStorageDomainFromPoolParameters;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomainType;
-import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId;
-import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import 
org.ovirt.engine.core.common.vdscommands.DetachStorageDomainVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters;
 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.dal.dbbroker.DbFacade;
-import org.ovirt.engine.core.utils.transaction.TransactionMethod;
-import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
 @NonTransactiveCommandAttribute(forceCompensation=true)
 public class DetachStorageDomainFromPoolCommand<T extends 
DetachStorageDomainFromPoolParameters> extends
@@ -38,7 +33,7 @@
     protected void executeCommand() {
         log.info("Start detach storage domain");
         
changeStorageDomainStatusInTransaction(getStorageDomain().getStoragePoolIsoMapData(),
-                StorageDomainStatus.Locked);
+                StorageDomainStatus.Detaching);
         log.info(" Detach storage domain: before connect");
         connectAllHostsToPool();
 
@@ -52,20 +47,6 @@
         log.info(" Detach storage domain: after detach in vds");
         disconnectAllHostsInPool();
 
-        log.info(" Detach storage domain: after disconnect storage");
-        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Object>() {
-            @Override
-            public Object runInTransaction() {
-                StoragePoolIsoMap mapToRemove = 
getStorageDomain().getStoragePoolIsoMapData();
-                getCompensationContext().snapshotEntity(mapToRemove);
-                DbFacade.getInstance()
-                        .getStoragePoolIsoMapDao()
-                        .remove(new 
StoragePoolIsoMapId(mapToRemove.getstorage_id(),
-                                mapToRemove.getstorage_pool_id()));
-                getCompensationContext().stateChanged();
-                return null;
-            }
-        });
         if (returnValue.getSucceeded() && 
getStorageDomain().getStorageDomainType() == StorageDomainType.ISO) {
             // reset iso for this pool in vdsBroker cache
             runVdsCommand(VDSCommandType.ResetISOPath,
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java
index 044865d..fa300df 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java
@@ -300,6 +300,10 @@
         storageDomainMatrix.put(
                 StorageDomainStatus.MovingToMaintenance,
                 EnumSet.of(VdcActionType.DetachStorageDomainFromPool, 
VdcActionType.DeactivateStorageDomain));
+        storageDomainMatrix.put(
+                StorageDomainStatus.Detaching,
+                EnumSet.of(VdcActionType.DetachStorageDomainFromPool,
+                        VdcActionType.DeactivateStorageDomain, 
VdcActionType.ActivateStorageDomain));
         _matrix.put(StorageDomain.class, storageDomainMatrix);
     }
 
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java
index 3ae56c4..8048c72 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java
@@ -8,7 +8,8 @@
     InActive,
     Locked,
     Maintenance,
-    MovingToMaintenance;
+    MovingToMaintenance,
+    Detaching;
 
     public int getValue() {
         return this.ordinal();
@@ -19,6 +20,6 @@
     }
 
     public boolean isLocked() {
-        return this == Locked || this == MovingToMaintenance;
+        return this == Locked || this == MovingToMaintenance || this == 
Detaching;
     }
 }
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java
index b2d7063..20868b1 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java
@@ -25,6 +25,7 @@
     UNATTACHED,
     MAINTENANCE,
     MOVINGTOMAINTENANCE,
+    DETACHING,
     UNKNOWN;
 
     public String value() {
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
index 293f82f..baa80e2 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java
@@ -394,6 +394,8 @@
             return StorageDomainStatus.LOCKED;
         case MovingToMaintenance:
             return StorageDomainStatus.MOVINGTOMAINTENANCE;
+        case Detaching:
+            return StorageDomainStatus.DETACHING;
         case Maintenance:
             return StorageDomainStatus.MAINTENANCE;
         case Unknown:
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
index e2463e6..1d2301b 100644
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
@@ -17,7 +17,7 @@
             if (domain.getStatus() == StorageDomainStatus.Maintenance
                     || domain.getStatus() == 
StorageDomainStatus.MovingToMaintenance) {
                 storageDomains.put(domain.getstorage_id().toString(), 
"attached");
-            } else {
+            } else if (domain.getStatus() != StorageDomainStatus.Detaching) {
                 storageDomains.put(domain.getstorage_id().toString(),
                         StorageDomainStatus.Active.toString().toLowerCase());
             }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
index 6cae7c9..94c1366 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
@@ -293,20 +293,6 @@
                     domainsInVds.add(domainData.getId());
                     proceedStorageDomain(domainData, masterVersion, 
storagePool);
                 }
-                List<StorageDomain> domainsInDb = 
DbFacade.getInstance().getStorageDomainDao()
-                        .getAllForStoragePool(_storagePoolId);
-
-                for (final StorageDomain domainInDb : domainsInDb) {
-                    if (domainInDb.getStorageDomainType() != 
StorageDomainType.Master
-                            && domainInDb.getStatus() != 
StorageDomainStatus.Locked
-                            && !domainsInVds.contains(domainInDb.getId())) {
-                        // domain not attached to pool anymore
-                        DbFacade.getInstance()
-                                .getStoragePoolIsoMapDao()
-                                .remove(new 
StoragePoolIsoMapId(domainInDb.getId(),
-                                        _storagePoolId));
-                    }
-                }
             }
         }
 
@@ -1050,12 +1036,15 @@
                         domainStatus = DomainVisibility.Status.MAINTENANCE;
                         if (poolDomain.getStatus() == 
StorageDomainStatus.MovingToMaintenance) {
                             moveDomainToMaintenance(poolDomain);
+                        } else if (poolDomain.getStatus() == 
StorageDomainStatus.Detaching) {
+                            detachDomainFromPool(poolDomain);
                         }
                     }
                 } else {
                     domainStatus = isDomainReportedAsProblematic(domainData, 
false) ?
                             DomainVisibility.Status.UNREACHABLE : 
DomainVisibility.Status.ACTIVE;
-                    if (poolDomain.getStatus() == 
StorageDomainStatus.MovingToMaintenance) {
+                    if (poolDomain.getStatus() == 
StorageDomainStatus.MovingToMaintenance
+                            || poolDomain.getStatus() == 
StorageDomainStatus.Maintenance) {
                         vdsNeedsRefresh = true;
                     }
                 }
@@ -1074,8 +1063,9 @@
 
                 domainsVisibility.setVdsDomainStatus(vds.getId(), 
poolDomain.getId(), domainStatus);
 
-                if (domainStatus == DomainVisibility.Status.UNREPORTED
-                        || domainStatus == 
DomainVisibility.Status.UNREACHABLE) {
+                if (poolDomain.getStatus() != StorageDomainStatus.Detaching
+                        && (domainStatus == DomainVisibility.Status.UNREPORTED
+                            || domainStatus == 
DomainVisibility.Status.UNREACHABLE)) {
                     setTimerIfAbsent(poolDomain.getId());
                 } else if 
(domainsVisibility.getDomainProblematicVds(poolDomain.getId()).size() == 0) {
                     clearTimer(poolDomain.getId());
@@ -1115,6 +1105,30 @@
             }
         }
 
+        private void detachDomainFromPool(StorageDomain domain) {
+            if (domain.getStatus() != StorageDomainStatus.Detaching) {
+                return;
+            }
+
+            for (VDS hosts : 
DbFacade.getInstance().getVdsDao().getAllForStoragePool(_storagePoolId)) {
+                // Skip vds that are in maintenance
+                if (hosts.getStatus() == VDSStatus.Maintenance) {
+                    continue;
+                }
+
+                if (domainsVisibility.getDomainStatusByVds(domain.getId(), 
hosts.getId())
+                        != DomainVisibility.Status.MAINTENANCE) {
+                    // Domain is still reachable by one vds, cannot be detached
+                    return;
+                }
+            }
+
+            log.infoFormat("Detaching domain {0} from pool", domain.getId(), 
_storagePoolId);
+            StoragePoolIsoMap mapToRemove = domain.getStoragePoolIsoMapData();
+            DbFacade.getInstance().getStoragePoolIsoMapDao().remove(
+                    new StoragePoolIsoMapId(mapToRemove.getstorage_id(), 
mapToRemove.getstorage_pool_id()));
+        }
+
         private void moveDomainToMaintenance(StorageDomain domain) {
             // This is relevant only for domains that are in the process of 
being moved to maintenance
             if (domain.getStatus() != StorageDomainStatus.MovingToMaintenance) 
{
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
index ae97051..260ad05 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java
@@ -480,6 +480,7 @@
                     || storage.getStorageDomainType() == 
StorageDomainType.Master)
                         && (storage.getStatus() == 
StorageDomainStatus.Maintenance
                             || storage.getStatus() == 
StorageDomainStatus.MovingToMaintenance
+                            || storage.getStatus() == 
StorageDomainStatus.Detaching
                             || storage.getStorageDomainSharedStatus() == 
StorageDomainSharedStatus.Unattached));
         }
         return false;
@@ -1155,7 +1156,8 @@
                 || storageDomain.getStorageDomainSharedStatus() == 
StorageDomainSharedStatus.Mixed;
         boolean isInMaintenance = (storageDomain.getStatus() == 
StorageDomainStatus.Maintenance
                 || storageDomain.getStatus() == 
StorageDomainStatus.MovingToMaintenance);
-        boolean isUnattached = (storageDomain.getStorageDomainSharedStatus() 
== StorageDomainSharedStatus.Unattached);
+        boolean isUnattached = (storageDomain.getStorageDomainSharedStatus() 
== StorageDomainSharedStatus.Unattached
+                || storageDomain.getStatus() == StorageDomainStatus.Detaching);
         boolean isDataDomain = (storageDomain.getStorageDomainType() == 
StorageDomainType.Data) || (storageDomain.getStorageDomainType() == 
StorageDomainType.Master);
         boolean isBlockStorage = 
storageDomain.getStorageType().isBlockDomain();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java
index ca35614..3feebc8 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java
@@ -25,6 +25,7 @@
             return getApplicationResources().unconfiguredImage();
         case Locked:
         case MovingToMaintenance:
+        case Detaching:
             return getApplicationResources().lockImage();
         default:
             return getApplicationResources().downImage();


-- 
To view, visit http://gerrit.ovirt.org/23556
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5732ef00a67ef1381ee0b6f29d08ab39cf63a1bf
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimo...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to