Repository: ambari
Updated Branches:
  refs/heads/trunk 13bc58216 -> 941bc1685


Batch requests(Rolling Restart, HSI enable/disable, decommission/recommission) 
not working when Ambari is configured with Knox proxy. (jaimin)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/941bc168
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/941bc168
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/941bc168

Branch: refs/heads/trunk
Commit: 941bc1685417eb82dd6186ed713250c153b55bcd
Parents: 13bc582
Author: Jaimin Jetly <jai...@hortonworks.com>
Authored: Mon Sep 18 10:59:35 2017 -0700
Committer: Jaimin Jetly <jai...@hortonworks.com>
Committed: Mon Sep 18 11:00:00 2017 -0700

----------------------------------------------------------------------
 .../scheduler/ExecutionScheduleManager.java     | 23 +++++++++++--
 .../scheduler/ExecutionScheduleManagerTest.java | 36 ++++++++++++++++++++
 ambari-web/app/controllers/main/host/details.js | 16 ++++-----
 ambari-web/app/controllers/main/service/item.js |  4 +--
 .../configs/component_actions_by_configs.js     | 10 +++---
 .../app/utils/batch_scheduled_requests.js       |  2 +-
 .../component_actions_by_configs_test.js        | 10 +++---
 7 files changed, 78 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/941bc168/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
index f3b3c41..e804961 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
@@ -35,6 +35,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.SSLContext;
@@ -58,6 +59,7 @@ import org.apache.ambari.server.state.scheduler.BatchSettings;
 import org.apache.ambari.server.state.scheduler.RequestExecution;
 import org.apache.ambari.server.state.scheduler.Schedule;
 import org.apache.ambari.server.utils.DateUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.text.StrBuilder;
 import org.quartz.CronExpression;
 import org.quartz.JobDetail;
@@ -115,6 +117,8 @@ public class ExecutionScheduleManager {
   protected static final String REQUESTS_TIMEDOUT_TASKS_KEY = 
"timed_out_task_count";
   protected static final String REQUESTS_TOTAL_TASKS_KEY = "task_count";
 
+  protected static final Pattern CONTAINS_API_VERSION_PATTERN = 
Pattern.compile("^/?" + DEFAULT_API_PATH+ ".*");
+
   @Inject
   public ExecutionScheduleManager(Configuration configuration,
                                   ExecutionScheduler executionScheduler,
@@ -662,7 +666,7 @@ public class ExecutionScheduleManager {
   }
 
   protected BatchRequestResponse performApiGetRequest(String relativeUri, 
boolean queryAllFields) {
-    WebResource webResource = ambariWebResource.path(relativeUri);
+    WebResource webResource = extendApiResource(ambariWebResource, 
relativeUri);
     if (queryAllFields) {
       webResource = webResource.queryParam("fields", "*");
     }
@@ -678,7 +682,8 @@ public class ExecutionScheduleManager {
   protected BatchRequestResponse performApiRequest(String relativeUri, String 
body, String method, Integer userId) {
     ClientResponse response;
     try {
-      response = ambariWebResource.path(relativeUri).header(USER_ID_HEADER, 
userId).method(method, ClientResponse.class, body);
+      response = extendApiResource(ambariWebResource, relativeUri)
+          .header(USER_ID_HEADER, userId).method(method, ClientResponse.class, 
body);
     } catch (UniformInterfaceException e) {
       response = e.getResponse();
     }
@@ -794,5 +799,19 @@ public class ExecutionScheduleManager {
       requestExecution.updateStatus(RequestExecution.Status.COMPLETED);
     }
   }
+
+  /**
+   * Returns the absolute web resource with {@link #DEFAULT_API_PATH}
+   * @param webResource Ambari WebResource as provided by the client {@link 
#ambariWebResource}
+   * @param relativeUri relative request URI
+   * @return  Extended WebResource
+   */
+  protected WebResource extendApiResource(WebResource webResource, String 
relativeUri) {
+    WebResource result = webResource;
+    if (StringUtils.isNotEmpty(relativeUri) && 
!CONTAINS_API_VERSION_PATTERN.matcher(relativeUri).matches()) {
+      result = webResource.path(DEFAULT_API_PATH);
+    }
+    return result.path(relativeUri);
+  }
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/941bc168/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
index f901bda..9cc582f 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
@@ -31,6 +31,7 @@ import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -85,6 +86,8 @@ import com.google.inject.Injector;
 import com.google.inject.Module;
 import com.google.inject.persist.Transactional;
 import com.google.inject.util.Modules;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
 
 import junit.framework.Assert;
 
@@ -636,4 +639,37 @@ public class ExecutionScheduleManagerTest {
 
     verify(scheduleManagerMock, executionJob, context, jobDataMap, jobDetail);
   }
+
+  @Test
+  public void testExtendApiResource() throws NoSuchMethodException, 
InvocationTargetException, IllegalAccessException {
+    WebResource webResource = 
Client.create().resource("http://localhost:8080/";);
+
+    String clustersEndpoint = "http://localhost:8080/api/v1/clusters";;
+
+    Clusters clustersMock = createMock(Clusters.class);
+
+    Configuration configurationMock = createNiceMock(Configuration.class);
+    ExecutionScheduler executionSchedulerMock = 
createMock(ExecutionScheduler.class);
+    InternalTokenStorage tokenStorageMock = 
createMock(InternalTokenStorage.class);
+    ActionDBAccessor actionDBAccessorMock = createMock(ActionDBAccessor.class);
+    Gson gson = new Gson();
+
+    replay(clustersMock, configurationMock, executionSchedulerMock, 
tokenStorageMock,
+      actionDBAccessorMock);
+
+    ExecutionScheduleManager scheduleManager =
+      new ExecutionScheduleManager(configurationMock, executionSchedulerMock,
+        tokenStorageMock, clustersMock, actionDBAccessorMock, gson);
+    
+    assertEquals(clustersEndpoint,
+      scheduleManager.extendApiResource(webResource, 
"clusters").getURI().toString());
+    assertEquals(clustersEndpoint,
+      scheduleManager.extendApiResource(webResource, 
"/clusters").getURI().toString());
+    assertEquals(clustersEndpoint,
+      scheduleManager.extendApiResource(webResource, 
"/api/v1/clusters").getURI().toString());
+    assertEquals(clustersEndpoint,
+      scheduleManager.extendApiResource(webResource, 
"api/v1/clusters").getURI().toString());
+    assertEquals("http://localhost:8080/";,
+      scheduleManager.extendApiResource(webResource, "").getURI().toString());
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/941bc168/ambari-web/app/controllers/main/host/details.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/host/details.js 
b/ambari-web/app/controllers/main/host/details.js
index ad2ac98..299a0d8 100644
--- a/ambari-web/app/controllers/main/host/details.js
+++ b/ambari-web/app/controllers/main/host/details.js
@@ -2081,7 +2081,7 @@ App.MainHostDetailsController = 
Em.Controller.extend(App.SupportClientConfigsDow
       {
         "order_id": 1,
         "type": "POST",
-        "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/requests",
+        "uri": "/clusters/" + App.get('clusterName') + "/requests",
         "RequestBodyInfo": {
           "RequestInfo": {
             "context": 
Em.I18n.t('hosts.host.regionserver.decommission.batch1'),
@@ -2109,7 +2109,7 @@ App.MainHostDetailsController = 
Em.Controller.extend(App.SupportClientConfigsDow
       batches.push({
         "order_id": id,
         "type": "PUT",
-        "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/hosts/" + hAray[i] + "/host_components/" + slaveType,
+        "uri": "/clusters/" + App.get('clusterName') + "/hosts/" + hAray[i] + 
"/host_components/" + slaveType,
         "RequestBodyInfo": {
           "RequestInfo": {
             context: Em.I18n.t('hosts.host.regionserver.decommission.batch2'),
@@ -2133,7 +2133,7 @@ App.MainHostDetailsController = 
Em.Controller.extend(App.SupportClientConfigsDow
     batches.push({
       "order_id": id,
       "type": "POST",
-      "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/requests",
+      "uri": "/clusters/" + App.get('clusterName') + "/requests",
       "RequestBodyInfo": {
         "RequestInfo": {
           "context": Em.I18n.t('hosts.host.regionserver.decommission.batch3'),
@@ -2220,7 +2220,7 @@ App.MainHostDetailsController = 
Em.Controller.extend(App.SupportClientConfigsDow
       {
         "order_id": 1,
         "type": "POST",
-        "uri": App.apiPrefix + "/clusters/" + App.get('clusterName') + 
"/requests",
+        "uri": "/clusters/" + App.get('clusterName') + "/requests",
         "RequestBodyInfo": {
           "RequestInfo": {
             "context": context_1,
@@ -2245,7 +2245,7 @@ App.MainHostDetailsController = 
Em.Controller.extend(App.SupportClientConfigsDow
       batches.push({
         "order_id": id,
         "type": "PUT",
-        "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/hosts/" + hAray[i] + "/host_components/" + slaveType,
+        "uri": "/clusters/" + App.get('clusterName') + "/hosts/" + hAray[i] + 
"/host_components/" + slaveType,
         "RequestBodyInfo": {
           "RequestInfo": {
             context: startContext,
@@ -3111,7 +3111,7 @@ App.MainHostDetailsController = 
Em.Controller.extend(App.SupportClientConfigsDow
       {
         "order_id": 1,
         "type": "PUT",
-        "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/hosts/" + hostName + "/host_components",
+        "uri": "/clusters/" + App.get('clusterName') + "/hosts/" + hostName + 
"/host_components",
         "RequestBodyInfo": {
           "RequestInfo": {
             context: Em.I18n.t('hosts.host.recover.initAllComponents.context'),
@@ -3133,7 +3133,7 @@ App.MainHostDetailsController = 
Em.Controller.extend(App.SupportClientConfigsDow
       {
         "order_id": 2,
         "type": "PUT",
-        "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/hosts/" + hostName + "/host_components",
+        "uri": "/clusters/" + App.get('clusterName') + "/hosts/" + hostName + 
"/host_components",
         "RequestBodyInfo": {
           "RequestInfo": {
             context: 
Em.I18n.t('hosts.host.recover.installAllComponents.context'),
@@ -3156,7 +3156,7 @@ App.MainHostDetailsController = 
Em.Controller.extend(App.SupportClientConfigsDow
       batches.push({
         "order_id": 3,
         "type": "PUT",
-        "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName'),
+        "uri": "/clusters/" + App.get('clusterName'),
         "RequestBodyInfo": {
           "RequestInfo": {
             context: Em.I18n.t('hosts.host.recover.regenerateKeytabs.context'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/941bc168/ambari-web/app/controllers/main/service/item.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/item.js 
b/ambari-web/app/controllers/main/service/item.js
index 7edf0f0..aff2743 100644
--- a/ambari-web/app/controllers/main/service/item.js
+++ b/ambari-web/app/controllers/main/service/item.js
@@ -656,7 +656,7 @@ App.MainServiceItemController = 
Em.Controller.extend(App.SupportClientConfigsDow
     var batches = [{
       "order_id": 1,
       "type": "POST",
-      "uri": App.apiPrefix + "/clusters/" + App.get('clusterName') + 
"/requests",
+      "uri": "/clusters/" + App.get('clusterName') + "/requests",
       "RequestBodyInfo": {
         "RequestInfo": {
           "context": "Refresh YARN Capacity Scheduler",
@@ -672,7 +672,7 @@ App.MainServiceItemController = 
Em.Controller.extend(App.SupportClientConfigsDow
     }, {
       "order_id": 2,
       "type": "POST",
-      "uri": App.apiPrefix + "/clusters/" + App.get('clusterName') + 
"/requests",
+      "uri": "/clusters/" + App.get('clusterName') + "/requests",
       "RequestBodyInfo": {
         "RequestInfo": {"context": "Restart LLAP", "command": "RESTART_LLAP"},
         "Requests/resource_filters": [{

http://git-wip-us.apache.org/repos/asf/ambari/blob/941bc168/ambari-web/app/mixins/main/service/configs/component_actions_by_configs.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/mixins/main/service/configs/component_actions_by_configs.js 
b/ambari-web/app/mixins/main/service/configs/component_actions_by_configs.js
index 140e7de..b687752 100644
--- a/ambari-web/app/mixins/main/service/configs/component_actions_by_configs.js
+++ b/ambari-web/app/mixins/main/service/configs/component_actions_by_configs.js
@@ -319,7 +319,7 @@ App.ComponentActionsByConfigs = Em.Mixin.create({
 
     return {
       "type": 'POST',
-      "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/hosts",
+      "uri": "/clusters/" + App.get('clusterName') + "/hosts",
       "RequestBodyInfo": {
         "RequestInfo": {
           "query": query
@@ -372,7 +372,7 @@ App.ComponentActionsByConfigs = Em.Mixin.create({
 
     return {
       "type": 'PUT',
-      "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/hosts/" + hostName + "/host_components",
+      "uri": "/clusters/" + App.get('clusterName') + "/hosts/" + hostName + 
"/host_components",
       "RequestBodyInfo": {
         "RequestInfo": {
           "context": context,
@@ -403,7 +403,7 @@ App.ComponentActionsByConfigs = Em.Mixin.create({
   getDeleteHostComponentRequest: function (hostName, component) {
     return {
       "type": 'DELETE',
-      "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/hosts/" + hostName + "/host_components/" + component
+      "uri": "/clusters/" + App.get('clusterName') + "/hosts/" + hostName + 
"/host_components/" + component
     }
   },
 
@@ -424,7 +424,7 @@ App.ComponentActionsByConfigs = Em.Mixin.create({
       if (!serviceComponents.contains(_componentName)) {
         batches.push({
           "type": 'POST',
-          "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') 
+ "/services/" + serviceName + "/components/" + _componentName
+          "uri": "/clusters/" + App.get('clusterName') + "/services/" + 
serviceName + "/components/" + _componentName
         });
       }
     });
@@ -453,7 +453,7 @@ App.ComponentActionsByConfigs = Em.Mixin.create({
       this.isYarnQueueRefreshed = true;
       batches.push({
         "type": 'POST',
-        "uri": App.get('apiPrefix') + "/clusters/" + App.get('clusterName') + 
"/requests",
+        "uri": "/clusters/" + App.get('clusterName') + "/requests",
         "RequestBodyInfo": {
           "RequestInfo": {
             "context": 
Em.I18n.t('services.service.actions.run.yarnRefreshQueues.context'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/941bc168/ambari-web/app/utils/batch_scheduled_requests.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/batch_scheduled_requests.js 
b/ambari-web/app/utils/batch_scheduled_requests.js
index 6d1e721..c3201e4 100644
--- a/ambari-web/app/utils/batch_scheduled_requests.js
+++ b/ambari-web/app/utils/batch_scheduled_requests.js
@@ -347,7 +347,7 @@ module.exports = {
         batches.push({
           "order_id" : count + 1,
           "type" : "POST",
-          "uri" : App.apiPrefix + "/clusters/" + App.get('clusterName') + 
"/requests",
+          "uri" : "/clusters/" + App.get('clusterName') + "/requests",
           "RequestBodyInfo" : {
             "RequestInfo" : {
               "context" : "_PARSE_.ROLLING-RESTART." + componentName + "." + 
(count + 1) + "." + batchCount,

http://git-wip-us.apache.org/repos/asf/ambari/blob/941bc168/ambari-web/test/mixins/main/service/configs/component_actions_by_configs_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/mixins/main/service/configs/component_actions_by_configs_test.js
 
b/ambari-web/test/mixins/main/service/configs/component_actions_by_configs_test.js
index 9a73a9a..a926ac2 100644
--- 
a/ambari-web/test/mixins/main/service/configs/component_actions_by_configs_test.js
+++ 
b/ambari-web/test/mixins/main/service/configs/component_actions_by_configs_test.js
@@ -344,7 +344,7 @@ describe('App.ComponentActionsByConfigs', function () {
     it("App.ajax.send should be called", function() {
       expect(mixin.getCreateHostComponentsRequest('host1', ['C1'])).to.be.eql({
         "type": 'POST',
-        "uri": "/api/v1/clusters/mycluster/hosts",
+        "uri": "/clusters/mycluster/hosts",
         "RequestBodyInfo": {
           "RequestInfo": {
             "query": "Hosts/host_name.in(host1)"
@@ -406,7 +406,7 @@ describe('App.ComponentActionsByConfigs', function () {
     it("should return request object", function() {
       expect(mixin.getUpdateHostComponentsRequest('host1', ['C1', 'C2'], 
'INSTALLED', 'context')).to.be.eql({
         "type": 'PUT',
-        "uri": "/api/v1/clusters/mycluster/hosts/host1/host_components",
+        "uri": "/clusters/mycluster/hosts/host1/host_components",
         "RequestBodyInfo": {
           "RequestInfo": {
             "context": 'context',
@@ -432,7 +432,7 @@ describe('App.ComponentActionsByConfigs', function () {
     it("should return request object", function() {
       expect(mixin.getDeleteHostComponentRequest('host1', 'C1')).to.be.eql({
         "type": 'DELETE',
-        "uri": "/api/v1/clusters/mycluster/hosts/host1/host_components/C1"
+        "uri": "/clusters/mycluster/hosts/host1/host_components/C1"
       });
     });
   });
@@ -461,7 +461,7 @@ describe('App.ComponentActionsByConfigs', function () {
       expect(batches).to.be.eql([
         {
           "type": 'POST',
-          "uri": "/api/v1/clusters/mycluster/services/S1/components/C1"
+          "uri": "/clusters/mycluster/services/S1/components/C1"
         }
       ]);
 
@@ -500,7 +500,7 @@ describe('App.ComponentActionsByConfigs', function () {
       mixin.setRefreshYarnQueueRequest(batches);
       expect(batches).to.be.eql([{
         "type": 'POST',
-        "uri": "/api/v1/clusters/mycluster/requests",
+        "uri": "/clusters/mycluster/requests",
         "RequestBodyInfo": {
           "RequestInfo": {
             "context": 
Em.I18n.t('services.service.actions.run.yarnRefreshQueues.context'),

Reply via email to