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'),