aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-02-17 13:53:47 +0100
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-02-17 15:10:35 +0100
commitbf27baa7ef13bef1a1296c1c09b845580e65be44 (patch)
treed9b63ddb8af734e2fa0d586b493008a517d818c0
parent49aae6c05466674ccb145d1a37532e338a7d2b8c (diff)
downloadsonarqube-bf27baa7ef13bef1a1296c1c09b845580e65be44.tar.gz
sonarqube-bf27baa7ef13bef1a1296c1c09b845580e65be44.zip
SONAR-7138 WS api/ce/activity filter background tasks by task uuid
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java51
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java89
-rw-r--r--sonar-ws/src/main/java/org/sonarqube/ws/client/ce/ActivityWsRequest.java10
-rw-r--r--sonar-ws/src/main/java/org/sonarqube/ws/client/ce/CeService.java3
-rw-r--r--sonar-ws/src/test/java/org/sonarqube/ws/client/ce/CeServiceTest.java7
5 files changed, 107 insertions, 53 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java
index a75efc58f58..19c1aee5b18 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java
@@ -21,8 +21,10 @@
package org.sonar.server.computation.ws;
import com.google.common.base.Joiner;
+import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
+import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
@@ -57,6 +59,8 @@ import org.sonarqube.ws.WsCe.ActivityResponse;
import org.sonarqube.ws.client.ce.ActivityWsRequest;
import static java.lang.String.format;
+import static java.util.Collections.singletonList;
+import static org.apache.commons.lang.StringUtils.defaultString;
import static org.sonar.api.utils.DateUtils.parseDateQuietly;
import static org.sonar.api.utils.DateUtils.parseDateTimeQuietly;
import static org.sonar.api.utils.Paging.offset;
@@ -107,8 +111,19 @@ public class ActivityAction implements CeWsAction {
"<li>component names that contain the supplied string</li>" +
"<li>component keys that are exactly the same as the supplied string</li>" +
"</ul>" +
+ "Must not be set together with %s.<br />" +
+ "Deprecated and replaced by '%s'", PARAM_COMPONENT_ID, Param.TEXT_QUERY))
+ .setExampleValue("Apache")
+ .setDeprecatedSince("5.5");
+ action.createParam(Param.TEXT_QUERY)
+ .setDescription(format("Limit search to: <ul>" +
+ "<li>component names that contain the supplied string</li>" +
+ "<li>component keys that are exactly the same as the supplied string</li>" +
+ "<li>task ids that are exactly the same as the supplied string</li>" +
+ "</ul>" +
"Must not be set together with %s", PARAM_COMPONENT_ID))
- .setExampleValue("Apache");
+ .setExampleValue("Apache")
+ .setSince("5.5");
action.createParam(PARAM_STATUS)
.setDescription("Comma separated list of task statuses")
.setPossibleValues(ImmutableList.builder()
@@ -144,6 +159,15 @@ public class ActivityAction implements CeWsAction {
private ActivityResponse doHandle(ActivityWsRequest request) {
DbSession dbSession = dbClient.openSession(false);
try {
+ // if a task searched by uuid is found all other parameters are ignored
+ Optional<WsCe.Task> taskSearchedById = searchTaskByUuid(dbSession, request);
+ if (taskSearchedById.isPresent()) {
+ return buildResponse(
+ singletonList(taskSearchedById.get()),
+ Collections.<WsCe.Task>emptyList(),
+ Paging.forPageIndex(1).withPageSize(request.getPageSize()).andTotal(1));
+ }
+
CeTaskQuery query = buildQuery(dbSession, request);
checkPermissions(query);
TaskResult queuedTasks = loadQueuedTasks(dbSession, request, query);
@@ -161,6 +185,25 @@ public class ActivityAction implements CeWsAction {
}
}
+ private Optional<WsCe.Task> searchTaskByUuid(DbSession dbSession, ActivityWsRequest request) {
+ String textQuery = request.getQuery();
+ if (textQuery == null) {
+ return Optional.absent();
+ }
+
+ Optional<CeQueueDto> queue = dbClient.ceQueueDao().selectByUuid(dbSession, textQuery);
+ if (queue.isPresent()) {
+ return Optional.of(formatter.formatQueue(dbSession, queue.get()));
+ }
+
+ Optional<CeActivityDto> activity = dbClient.ceActivityDao().selectByUuid(dbSession, textQuery);
+ if (activity.isPresent()) {
+ return Optional.of(formatter.formatActivity(dbSession, activity.get()));
+ }
+
+ return Optional.absent();
+ }
+
private CeTaskQuery buildQuery(DbSession dbSession, ActivityWsRequest request) {
CeTaskQuery query = new CeTaskQuery();
query.setType(request.getType());
@@ -179,7 +222,7 @@ public class ActivityAction implements CeWsAction {
private void loadComponentUuids(DbSession dbSession, ActivityWsRequest request, CeTaskQuery query) {
String componentUuid = request.getComponentId();
- String componentQuery = request.getComponentQuery();
+ String componentQuery = request.getQuery();
if (componentUuid != null) {
query.setComponentUuid(componentUuid);
@@ -271,7 +314,7 @@ public class ActivityAction implements CeWsAction {
private static ActivityWsRequest toSearchWsRequest(Request request) {
ActivityWsRequest activityWsRequest = new ActivityWsRequest()
.setComponentId(request.param(PARAM_COMPONENT_ID))
- .setComponentQuery(request.param(PARAM_COMPONENT_QUERY))
+ .setQuery(defaultString(request.param(Param.TEXT_QUERY), request.param(PARAM_COMPONENT_QUERY)))
.setStatus(request.paramAsStrings(PARAM_STATUS))
.setType(request.param(PARAM_TYPE))
.setMinSubmittedAt(request.param(PARAM_MIN_SUBMITTED_AT))
@@ -280,7 +323,7 @@ public class ActivityAction implements CeWsAction {
.setPage(request.mandatoryParamAsInt(Param.PAGE))
.setPageSize(request.mandatoryParamAsInt(Param.PAGE_SIZE));
- checkRequest(activityWsRequest.getComponentId() == null || activityWsRequest.getComponentQuery() == null, "%s and %s must not be set at the same time",
+ checkRequest(activityWsRequest.getComponentId() == null || activityWsRequest.getQuery() == null, "%s and %s must not be set at the same time",
PARAM_COMPONENT_ID, PARAM_COMPONENT_QUERY);
checkRequest(activityWsRequest.getPageSize() <= MAX_PAGE_SIZE, "The '%s' parameter must be less than %d", Param.PAGE_SIZE, MAX_PAGE_SIZE);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java
index d6b0b310c65..f51761372e5 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java
@@ -21,6 +21,7 @@
package org.sonar.server.computation.ws;
import com.google.common.base.Optional;
+import com.google.common.base.Throwables;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
@@ -33,7 +34,6 @@ import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
import org.sonar.api.web.UserRole;
import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.core.util.Protobuf;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeQueueDto;
@@ -44,11 +44,13 @@ import org.sonar.server.computation.log.LogFileRef;
import org.sonar.server.computation.taskprocessor.CeTaskProcessor;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.ws.TestRequest;
import org.sonar.server.ws.TestResponse;
import org.sonar.server.ws.WsActionTester;
import org.sonar.test.JsonAssert;
import org.sonarqube.ws.MediaTypes;
import org.sonarqube.ws.WsCe;
+import org.sonarqube.ws.WsCe.ActivityResponse;
import org.sonarqube.ws.client.ce.CeWsParameters;
import static java.util.Arrays.asList;
@@ -58,6 +60,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.db.component.ComponentTesting.newProjectDto;
+import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_QUERY;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_STATUS;
public class ActivityActionTest {
@@ -88,15 +91,10 @@ public class ActivityActionTest {
insertActivity("T1", "PROJECT_1", CeActivityDto.Status.SUCCESS);
insertActivity("T2", "PROJECT_2", CeActivityDto.Status.FAILED);
- TestResponse wsResponse = ws.newRequest()
- .setParam(CeWsParameters.PARAM_MAX_EXECUTED_AT, formatDateTime(EXECUTED_AT + 2_000))
- .setMediaType(MediaTypes.PROTOBUF)
- .execute();
+ ActivityResponse activityResponse = call(ws.newRequest()
+ .setParam(CeWsParameters.PARAM_MAX_EXECUTED_AT, formatDateTime(EXECUTED_AT + 2_000)));
- // verify the protobuf response
- WsCe.ActivityResponse activityResponse = Protobuf.read(wsResponse.getInputStream(), WsCe.ActivityResponse.parser());
assertThat(activityResponse.getTasksCount()).isEqualTo(2);
-
// chronological order, from newest to oldest
assertThat(activityResponse.getTasks(0).getId()).isEqualTo("T2");
assertThat(activityResponse.getTasks(0).getStatus()).isEqualTo(WsCe.TaskStatus.FAILED);
@@ -117,12 +115,9 @@ public class ActivityActionTest {
insertActivity("T2", "PROJECT_2", CeActivityDto.Status.FAILED);
insertQueue("T3", "PROJECT_1", CeQueueDto.Status.IN_PROGRESS);
- TestResponse wsResponse = ws.newRequest()
- .setParam("status", "FAILED,IN_PROGRESS")
- .setMediaType(MediaTypes.PROTOBUF)
- .execute();
+ ActivityResponse activityResponse = call(ws.newRequest()
+ .setParam("status", "FAILED,IN_PROGRESS"));
- WsCe.ActivityResponse activityResponse = Protobuf.read(wsResponse.getInputStream(), WsCe.ActivityResponse.parser());
assertThat(activityResponse.getTasksCount()).isEqualTo(2);
assertThat(activityResponse.getTasks(0).getId()).isEqualTo("T3");
assertThat(activityResponse.getTasks(1).getId()).isEqualTo("T2");
@@ -135,13 +130,10 @@ public class ActivityActionTest {
insertActivity("T2", "PROJECT_2", CeActivityDto.Status.FAILED);
insertQueue("T3", "PROJECT_1", CeQueueDto.Status.IN_PROGRESS);
- TestResponse wsResponse = ws.newRequest()
+ ActivityResponse activityResponse = call(ws.newRequest()
.setParam("status", "FAILED,IN_PROGRESS,SUCCESS")
- .setParam(CeWsParameters.PARAM_MAX_EXECUTED_AT, "2016-02-15")
- .setMediaType(MediaTypes.PROTOBUF)
- .execute();
+ .setParam(CeWsParameters.PARAM_MAX_EXECUTED_AT, "2016-02-15"));
- WsCe.ActivityResponse activityResponse = Protobuf.read(wsResponse.getInputStream(), WsCe.ActivityResponse.parser());
assertThat(activityResponse.getTasksCount()).isEqualTo(0);
}
@@ -153,12 +145,10 @@ public class ActivityActionTest {
insertActivity("T2", "PROJECT_1", CeActivityDto.Status.FAILED);
insertQueue("T3", "PROJECT_1", CeQueueDto.Status.PENDING);
- TestResponse wsResponse = ws.newRequest()
- .setParam("onlyCurrents", "true")
- .setMediaType(MediaTypes.PROTOBUF)
- .execute();
+ ActivityResponse activityResponse = call(
+ ws.newRequest()
+ .setParam("onlyCurrents", "true"));
- WsCe.ActivityResponse activityResponse = Protobuf.read(wsResponse.getInputStream(), WsCe.ActivityResponse.parser());
assertThat(activityResponse.getTasksCount()).isEqualTo(1);
assertThat(activityResponse.getTasks(0).getId()).isEqualTo("T2");
}
@@ -177,14 +167,11 @@ public class ActivityActionTest {
}
private void assertPage(int pageIndex, int pageSize, int expectedTotal, List<String> expectedOrderedTaskIds) {
- TestResponse wsResponse = ws.newRequest()
- .setMediaType(MediaTypes.PROTOBUF)
+ ActivityResponse activityResponse = call(ws.newRequest()
.setParam(Param.PAGE, Integer.toString(pageIndex))
.setParam(Param.PAGE_SIZE, Integer.toString(pageSize))
- .setParam(PARAM_STATUS, "SUCCESS,FAILED,CANCELED,IN_PROGRESS,PENDING")
- .execute();
+ .setParam(PARAM_STATUS, "SUCCESS,FAILED,CANCELED,IN_PROGRESS,PENDING"));
- WsCe.ActivityResponse activityResponse = Protobuf.read(wsResponse.getInputStream(), WsCe.ActivityResponse.parser());
assertThat(activityResponse.getPaging().getPageIndex()).isEqualTo(pageIndex);
assertThat(activityResponse.getPaging().getPageSize()).isEqualTo(pageSize);
assertThat(activityResponse.getPaging().getTotal()).isEqualTo(expectedTotal);
@@ -203,12 +190,8 @@ public class ActivityActionTest {
insertActivity("T1", "PROJECT_1", CeActivityDto.Status.SUCCESS);
insertActivity("T2", "PROJECT_2", CeActivityDto.Status.FAILED);
- TestResponse wsResponse = ws.newRequest()
- .setParam("componentId", "PROJECT_1")
- .setMediaType(MediaTypes.PROTOBUF)
- .execute();
+ ActivityResponse activityResponse = call(ws.newRequest().setParam("componentId", "PROJECT_1"));
- WsCe.ActivityResponse activityResponse = Protobuf.read(wsResponse.getInputStream(), WsCe.ActivityResponse.parser());
assertThat(activityResponse.getTasksCount()).isEqualTo(1);
assertThat(activityResponse.getTasks(0).getId()).isEqualTo("T1");
assertThat(activityResponse.getTasks(0).getStatus()).isEqualTo(WsCe.TaskStatus.SUCCESS);
@@ -227,16 +210,35 @@ public class ActivityActionTest {
insertActivity("T2", "P2", CeActivityDto.Status.SUCCESS);
insertActivity("T3", "P3", CeActivityDto.Status.SUCCESS);
- TestResponse wsResponse = ws.newRequest()
- .setParam("componentQuery", "apac")
- .setMediaType(MediaTypes.PROTOBUF)
- .execute();
+ ActivityResponse activityResponse = call(ws.newRequest().setParam(PARAM_COMPONENT_QUERY, "apac"));
- WsCe.ActivityResponse activityResponse = WsCe.ActivityResponse.parseFrom(wsResponse.getInputStream());
assertThat(activityResponse.getTasksList()).extracting("id").containsOnly("T1", "T2");
}
@Test
+ public void search_task_id_in_queue_ignoring_other_parameters() throws IOException {
+ insertQueue("T1", "PROJECT_1", CeQueueDto.Status.IN_PROGRESS);
+
+ ActivityResponse result = call(
+ ws.newRequest()
+ .setParam(Param.TEXT_QUERY, "T1")
+ .setParam(PARAM_STATUS, CeQueueDto.Status.PENDING.name()));
+
+ assertThat(result.getTasksCount()).isEqualTo(1);
+ assertThat(result.getTasks(0).getId()).isEqualTo("T1");
+ }
+
+ @Test
+ public void search_task_id_in_activity() {
+ insertActivity("T1", "PROJECT_1", CeActivityDto.Status.SUCCESS);
+
+ ActivityResponse result = call(ws.newRequest().setParam(Param.TEXT_QUERY, "T1"));
+
+ assertThat(result.getTasksCount()).isEqualTo(1);
+ assertThat(result.getTasks(0).getId()).isEqualTo("T1");
+ }
+
+ @Test
public void fail_if_both_filters_on_component_id_and_name() {
expectedException.expect(BadRequestException.class);
expectedException.expectMessage("componentId and componentQuery must not be set at the same time");
@@ -303,4 +305,15 @@ public class ActivityActionTest {
dbTester.commit();
return activityDto;
}
+
+ private static ActivityResponse call(TestRequest request) {
+ try {
+ return ActivityResponse.parseFrom(
+ request
+ .setMediaType(MediaTypes.PROTOBUF)
+ .execute().getInputStream());
+ } catch (IOException e) {
+ throw Throwables.propagate(e);
+ }
+ }
}
diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/ce/ActivityWsRequest.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/ce/ActivityWsRequest.java
index a0e53ace029..9701f06480d 100644
--- a/sonar-ws/src/main/java/org/sonarqube/ws/client/ce/ActivityWsRequest.java
+++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/ce/ActivityWsRequest.java
@@ -26,7 +26,7 @@ import javax.annotation.Nullable;
public class ActivityWsRequest {
private String componentId;
- private String componentQuery;
+ private String query;
private List<String> status;
private String type;
private Boolean onlyCurrents;
@@ -46,12 +46,12 @@ public class ActivityWsRequest {
}
@CheckForNull
- public String getComponentQuery() {
- return componentQuery;
+ public String getQuery() {
+ return query;
}
- public ActivityWsRequest setComponentQuery(@Nullable String componentQuery) {
- this.componentQuery = componentQuery;
+ public ActivityWsRequest setQuery(@Nullable String query) {
+ this.query = query;
return this;
}
diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/ce/CeService.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/ce/CeService.java
index 66aa65812ed..a05d383c67d 100644
--- a/sonar-ws/src/main/java/org/sonarqube/ws/client/ce/CeService.java
+++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/ce/CeService.java
@@ -27,7 +27,6 @@ import org.sonarqube.ws.client.GetRequest;
import org.sonarqube.ws.client.WsConnector;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_ID;
-import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_QUERY;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_MAX_EXECUTED_AT;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_MIN_SUBMITTED_AT;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_ONLY_CURRENTS;
@@ -44,7 +43,7 @@ public class CeService extends BaseService {
return call(
new GetRequest(path("activity"))
.setParam(PARAM_COMPONENT_ID, request.getComponentId())
- .setParam(PARAM_COMPONENT_QUERY, request.getComponentQuery())
+ .setParam("q", request.getQuery())
.setParam(PARAM_STATUS, inlineMultipleParamValue(request.getStatus()))
.setParam(PARAM_TYPE, request.getType())
.setParam(PARAM_MAX_EXECUTED_AT, request.getMaxExecutedAt())
diff --git a/sonar-ws/src/test/java/org/sonarqube/ws/client/ce/CeServiceTest.java b/sonar-ws/src/test/java/org/sonarqube/ws/client/ce/CeServiceTest.java
index f93004ffcbc..1125072b933 100644
--- a/sonar-ws/src/test/java/org/sonarqube/ws/client/ce/CeServiceTest.java
+++ b/sonar-ws/src/test/java/org/sonarqube/ws/client/ce/CeServiceTest.java
@@ -32,7 +32,6 @@ import org.sonarqube.ws.client.WsConnector;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_ID;
-import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_COMPONENT_QUERY;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_MAX_EXECUTED_AT;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_MIN_SUBMITTED_AT;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_ONLY_CURRENTS;
@@ -41,7 +40,7 @@ import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_TYPE;
public class CeServiceTest {
private static final String VALUE_COMPONENT_ID = "component-uuid";
- private static final String VALUE_COMPONENT_QUERY = "component-query";
+ private static final String VALUE_QUERY = "component-query";
private static final String VALUE_TASK_STATUS_1 = "task-status";
private static final String VALUE_TASK_STATUS_2 = "task-status-2";
private static final String VALUE_TASK_TYPE = "task-type";
@@ -60,7 +59,7 @@ public class CeServiceTest {
public void activity() {
ActivityWsRequest request = new ActivityWsRequest()
.setComponentId(VALUE_COMPONENT_ID)
- .setComponentQuery(VALUE_COMPONENT_QUERY)
+ .setQuery(VALUE_QUERY)
.setStatus(ImmutableList.of(VALUE_TASK_STATUS_1, VALUE_TASK_STATUS_2))
.setType(VALUE_TASK_TYPE)
.setPage(VALUE_PAGE)
@@ -78,7 +77,7 @@ public class CeServiceTest {
serviceTester.assertThat(result)
.hasPath("activity")
.hasParam(PARAM_COMPONENT_ID, VALUE_COMPONENT_ID)
- .hasParam(PARAM_COMPONENT_QUERY, VALUE_COMPONENT_QUERY)
+ .hasParam("q", VALUE_QUERY)
.hasParam(PARAM_STATUS, VALUE_TASK_STATUS_1 + "," + VALUE_TASK_STATUS_2)
.hasParam(PARAM_TYPE, VALUE_TASK_TYPE)
.hasParam(PARAM_MAX_EXECUTED_AT, VALUE_MAX_EXECUTED_AT)