CLOUDSTACK-2366: Anti-Affinity - DeleteAffinityGroup API should allow for 
deletion of Afffinity group even when VMs are associated with it.

Changes:
- Allowing group to be deleted even when VMs are associated to it.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/34943adf
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/34943adf
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/34943adf

Branch: refs/heads/vmware-storage-motion
Commit: 34943adfc69f406ba78b7cae17b92abcc1c147e9
Parents: 68275fb
Author: Prachi Damle <pra...@cloud.com>
Authored: Wed May 29 17:58:49 2013 -0700
Committer: Prachi Damle <pra...@cloud.com>
Committed: Wed May 29 17:59:32 2013 -0700

----------------------------------------------------------------------
 .../cloudstack/affinity/AffinityGroupService.java  |    5 +---
 .../user/affinitygroup/DeleteAffinityGroupCmd.java |   18 +++++----------
 .../affinity/AffinityGroupServiceImpl.java         |   13 ++++++++--
 .../cloudstack/affinity/AffinityApiUnitTest.java   |   17 ++-----------
 4 files changed, 20 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/34943adf/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java 
b/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java
index 26c32c8..7423c48 100644
--- a/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java
+++ b/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java
@@ -18,7 +18,6 @@ package org.apache.cloudstack.affinity;
 
 import java.util.List;
 
-import com.cloud.exception.ResourceInUseException;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
 
@@ -45,10 +44,8 @@ public interface AffinityGroupService {
      * @param account
      * @param domainId
      * @param affinityGroupName
-     * @throws ResourceInUseException
      */
-    boolean deleteAffinityGroup(Long affinityGroupId, String account, Long 
domainId, String affinityGroupName)
-            throws ResourceInUseException;
+    boolean deleteAffinityGroup(Long affinityGroupId, String account, Long 
domainId, String affinityGroupName);
 
     /** Lists Affinity Groups in your account
      * @param account

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/34943adf/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
----------------------------------------------------------------------
diff --git 
a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
 
b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
index ea4a010..f80e176 100644
--- 
a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
+++ 
b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
@@ -30,7 +30,6 @@ import org.apache.log4j.Logger;
 import com.cloud.async.AsyncJob;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.ResourceInUseException;
 import com.cloud.user.Account;
 import com.cloud.user.UserContext;
 
@@ -123,17 +122,12 @@ public class DeleteAffinityGroupCmd extends BaseAsyncCmd {
 
     @Override
     public void execute(){
-        try{
-            boolean result = _affinityGroupService.deleteAffinityGroup(id, 
accountName, domainId, name);
-            if (result) {
-                SuccessResponse response = new 
SuccessResponse(getCommandName());
-                this.setResponseObject(response);
-            } else {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, 
"Failed to delete affinity group");
-            }
-        } catch (ResourceInUseException ex) {
-            s_logger.warn("Exception: ", ex);
-            throw new ServerApiException(ApiErrorCode.RESOURCE_IN_USE_ERROR, 
ex.getMessage());
+        boolean result = _affinityGroupService.deleteAffinityGroup(id, 
accountName, domainId, name);
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed 
to delete affinity group");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/34943adf/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java 
b/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
index efe18c3..5211279 100644
--- a/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
+++ b/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
@@ -125,8 +125,7 @@ public class AffinityGroupServiceImpl extends ManagerBase 
implements AffinityGro
     @DB
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_AFFINITY_GROUP_DELETE, 
eventDescription = "Deleting affinity group")
-    public boolean deleteAffinityGroup(Long affinityGroupId, String account, 
Long domainId, String affinityGroupName)
-            throws ResourceInUseException {
+    public boolean deleteAffinityGroup(Long affinityGroupId, String account, 
Long domainId, String affinityGroupName) {
 
         Account caller = UserContext.current().getCaller();
         Account owner = _accountMgr.finalizeOwner(caller, account, domainId, 
null);
@@ -164,7 +163,15 @@ public class AffinityGroupServiceImpl extends ManagerBase 
implements AffinityGro
 
         List<AffinityGroupVMMapVO> affinityGroupVmMap = 
_affinityGroupVMMapDao.listByAffinityGroup(affinityGroupId);
         if (!affinityGroupVmMap.isEmpty()) {
-            throw new ResourceInUseException("Cannot delete affinity group 
when it's in use by virtual machines");
+            SearchBuilder<AffinityGroupVMMapVO> listByAffinityGroup = 
_affinityGroupVMMapDao.createSearchBuilder();
+            listByAffinityGroup.and("affinityGroupId", 
listByAffinityGroup.entity().getAffinityGroupId(),
+                    SearchCriteria.Op.EQ);
+            listByAffinityGroup.done();
+            SearchCriteria<AffinityGroupVMMapVO> sc = 
listByAffinityGroup.create();
+            sc.setParameters("affinityGroupId", affinityGroupId);
+
+            _affinityGroupVMMapDao.lockRows(sc, null, true);
+            _affinityGroupVMMapDao.remove(sc);
         }
 
         _affinityGroupDao.expunge(affinityGroupId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/34943adf/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
----------------------------------------------------------------------
diff --git 
a/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java 
b/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
index 484b044..24c5d3d 100644
--- a/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
+++ b/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
@@ -17,6 +17,7 @@
 package org.apache.cloudstack.affinity;
 
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.anyObject;
@@ -64,6 +65,8 @@ import com.cloud.user.AccountVO;
 import com.cloud.user.UserContext;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.dao.UserVmDao;
@@ -172,20 +175,6 @@ public class AffinityApiUnitTest {
         _affinityService.deleteAffinityGroup(null, "user", domainId, null);
     }
 
-    @Test(expected = ResourceInUseException.class)
-    public void deleteAffinityGroupInUse() throws ResourceInUseException {
-        List<AffinityGroupVMMapVO> affinityGroupVmMap = new 
ArrayList<AffinityGroupVMMapVO>();
-        AffinityGroupVMMapVO mapVO = new AffinityGroupVMMapVO(20L, 10L);
-        affinityGroupVmMap.add(mapVO);
-        
when(_affinityGroupVMMapDao.listByAffinityGroup(20L)).thenReturn(affinityGroupVmMap);
-
-        AffinityGroupVO groupVO = new AffinityGroupVO();
-        when(_groupDao.findById(20L)).thenReturn(groupVO);
-        when(_groupDao.lockRow(20L, true)).thenReturn(groupVO);
-
-        _affinityService.deleteAffinityGroup(20L, "user", domainId, null);
-    }
-
     @Test(expected = InvalidParameterValueException.class)
     public void updateAffinityGroupVMRunning() throws ResourceInUseException {
 

Reply via email to