Browse Source

AMBARI-7040 SystemException occurred while deleting config group (dsen)

Dmytro Sen 11 năm trước cách đây
mục cha
commit
4a61ae33b4

+ 8 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/handlers/DeleteHandler.java

@@ -18,8 +18,13 @@
 
 package org.apache.ambari.server.api.handlers;
 
+import org.apache.ambari.server.ConfigGroupNotFoundException;
 import org.apache.ambari.server.api.resources.ResourceInstance;
-import org.apache.ambari.server.api.services.*;
+
+import org.apache.ambari.server.api.services.RequestBody;
+import org.apache.ambari.server.api.services.Result;
+import org.apache.ambari.server.api.services.ResultImpl;
+import org.apache.ambari.server.api.services.ResultStatus;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.RequestStatus;
@@ -54,6 +59,8 @@ public class DeleteHandler extends BaseManagementHandler implements RequestHandl
           //todo: 200 may be ok but we need to return a collection
           //todo: of resources that were updated.
           result = new ResultImpl(new ResultStatus(ResultStatus.STATUS.OK, e));
+        } else if (e.getCause() instanceof ConfigGroupNotFoundException){
+          result = new ResultImpl(new ResultStatus(ResultStatus.STATUS.ACCEPTED, e));
         } else {
           result = new ResultImpl(new ResultStatus(ResultStatus.STATUS.NOT_FOUND, e));
         }

+ 2 - 1
ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java

@@ -85,6 +85,7 @@ import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.persist.Transactional;
+import org.apache.ambari.server.ConfigGroupNotFoundException;
 
 public class ClusterImpl implements Cluster {
 
@@ -545,7 +546,7 @@ public class ClusterImpl implements Cluster {
       try {
         ConfigGroup configGroup = clusterConfigGroups.get(id);
         if (configGroup == null) {
-          throw new AmbariException("Config group does not exist, id = " + id);
+          throw new ConfigGroupNotFoundException(getClusterName(), id.toString());
         }
         LOG.debug("Deleting Config group"
           + ", clusterName = " + getClusterName()

+ 34 - 2
ambari-server/src/test/java/org/apache/ambari/server/api/handlers/DeleteHandlerTest.java

@@ -22,7 +22,10 @@ import org.apache.ambari.server.api.query.Query;
 import org.apache.ambari.server.api.query.render.DefaultRenderer;
 import org.apache.ambari.server.api.query.render.Renderer;
 import org.apache.ambari.server.api.resources.ResourceInstance;
-import org.apache.ambari.server.api.services.*;
+import org.apache.ambari.server.api.services.Request;
+import org.apache.ambari.server.api.services.RequestBody;
+import org.apache.ambari.server.api.services.Result;
+import org.apache.ambari.server.api.services.ResultStatus;
 import org.apache.ambari.server.api.services.persistence.PersistenceManager;
 import org.apache.ambari.server.api.util.TreeNode;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -33,6 +36,8 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.util.*;
+import org.apache.ambari.server.ConfigGroupNotFoundException;
+import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 
 import static org.easymock.EasyMock.*;
 import static org.junit.Assert.*;
@@ -233,6 +238,33 @@ public class DeleteHandlerTest {
     verify(request, body, resource, pm, status, resource1, resource2, requestResource, query);
   }
 
+  @Test
+  public void testIdempotentPersist() throws Exception {
+    Request request = createNiceMock(Request.class);
+    RequestBody body = createNiceMock(RequestBody.class);
+    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+    PersistenceManager pm = createNiceMock(PersistenceManager.class);
+    RequestStatus status = createNiceMock(RequestStatus.class);
+    Resource resource1 = createNiceMock(Resource.class);
+    Resource requestResource = createNiceMock(Resource.class);
+    ConfigGroupNotFoundException configGroupNotFoundException = createNiceMock(ConfigGroupNotFoundException.class); 
+    Query query = createNiceMock(Query.class);
+
+    // expectations
+    expect(request.getResource()).andReturn(resource).anyTimes();
+    expect(request.getBody()).andReturn(body).atLeastOnce();
+
+    expect(pm.delete(resource, body)).andThrow(
+        new NoSuchResourceException("Configgroup not exist", configGroupNotFoundException));    
+    
+    replay(request, body, resource, pm, status, resource1, requestResource, query);
+
+    Result result = new TestDeleteHandler(pm).persist(resource, body);
+
+    assertNotNull(result);
+    assertEquals(ResultStatus.STATUS.ACCEPTED, result.getStatus().getStatus());
+  }  
+  
   private class TestDeleteHandler extends DeleteHandler {
     private PersistenceManager m_testPm;
 
@@ -245,4 +277,4 @@ public class DeleteHandlerTest {
       return m_testPm;
     }
   }
-}
+}