AMBARI-25449. Fix bulk delete api, response code 400 - Bulk DELETE API is broken (#3163) (praveenkjvs via dgrinenko)


diff --git a/ambari-admin/src/main/resources/ui/admin-web/bower.json b/ambari-admin/src/main/resources/ui/admin-web/bower.json
index 739eb3f..b814b9f 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/bower.json
+++ b/ambari-admin/src/main/resources/ui/admin-web/bower.json
@@ -19,8 +19,5 @@
     "chai": "1.8.0",
     "mocha": "1.14.0",
     "sinon": "1.10.3"
-  },
-  "resolutions": {
-    "angular": "1.7.5"
   }
-}
\ No newline at end of file
+}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/DeleteHandler.java b/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/DeleteHandler.java
index f0314e1..f8b0a29 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/DeleteHandler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/DeleteHandler.java
@@ -83,8 +83,10 @@
       return null;
     }
 
-    if (requestStatusMetaData.getClass() != DeleteStatusMetaData.class) {
-      throw new IllegalArgumentException("RequestStatusDetails is not of type DeleteStatusDetails");
+    if (!(requestStatusMetaData instanceof DeleteStatusMetaData)) {
+      throw new IllegalArgumentException(
+		  String.format("Wrong status details class received - expecting: %s; actual: %s", 
+			   DeleteStatusMetaData.class, requestStatusMetaData.getClass()));
     }
 
     DeleteStatusMetaData statusDetails = (DeleteStatusMetaData) requestStatusMetaData;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index cc82a2d..c6794f8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -3605,12 +3605,13 @@
     ServiceComponentHost componentHost = component.getServiceComponentHost(request.getHostname());
 
     if (!componentHost.canBeRemoved()) {
-      throw new AmbariException("Host Component cannot be removed"
+      throw new AmbariException("Current host component state prohibiting component removal."
               + ", clusterName=" + request.getClusterName()
               + ", serviceName=" + request.getServiceName()
               + ", componentName=" + request.getComponentName()
               + ", hostname=" + request.getHostname()
-              + ", request=" + request);
+              + ", request=" + request
+              + ", state=" + componentHost.getState());
     }
   }
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java
index 7237f5b..79bc26b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DeleteHostComponentStatusMetaData.java
@@ -37,7 +37,7 @@
                                       String clusterId, String version, State lastComponentState) {
     removedHostComponents.add(new HostComponent(componentName, serviceName, hostId,
         hostName, clusterId, version, lastComponentState));
-    addDeletedKey(componentName + "/" + hostName);
+    addDeletedKey(hostName + "/" + componentName);
   }
 
   public Set<HostComponent> getRemovedHostComponents() {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
index 3374521..4cfa00d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
@@ -558,14 +558,15 @@
       ServiceComponentHost sch = getServiceComponentHost(hostname);
       LOG.info("Deleting servicecomponenthost for cluster" + ", clusterName=" + getClusterName()
           + ", serviceName=" + getServiceName() + ", componentName=" + getName()
-          + ", recoveryEnabled=" + isRecoveryEnabled() + ", hostname=" + sch.getHostName());
+          + ", recoveryEnabled=" + isRecoveryEnabled() + ", hostname=" + sch.getHostName() + ", state=" + sch.getState());
       if (!sch.canBeRemoved()) {
-        throw new AmbariException("Could not delete hostcomponent from cluster"
+        throw new AmbariException("Current host component state prohibiting component removal."
             + ", clusterName=" + getClusterName()
             + ", serviceName=" + getServiceName()
             + ", componentName=" + getName()
             + ", recoveryEnabled=" + isRecoveryEnabled()
-            + ", hostname=" + sch.getHostName());
+            + ", hostname=" + sch.getHostName()
+            + ", state=" + sch.getState());
       }
       sch.delete(deleteMetaData);
       hostComponents.remove(hostname);
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 92b32ef..f8b8f4a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -7927,7 +7927,7 @@
       Assert.fail("Expect failure while deleting.");
     } catch (Exception ex) {
       Assert.assertTrue(ex.getMessage().contains(
-          "Host Component cannot be removed"));
+          "Current host component state prohibiting component removal"));
     }
 
     sc1.getServiceComponentHosts().values().iterator().next().setDesiredState(State.STARTED);