From 9d962b9234ae6689eed46d0b4b221e5087389d3a Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Sun, 1 Oct 2017 14:10:24 +0100 Subject: [PATCH 1/4] DashboardApi: Add method to set a dashboard as the default dashboard Change-Id: If20358d2507faca7b4a57840cef53bfb04c2d34f --- .../acceptance/api/project/DashboardIT.java | 9 +++++++++ .../extensions/api/projects/DashboardApi.java | 7 +++++++ .../server/api/projects/DashboardApiImpl.java | 16 ++++++++++++++++ .../gerrit/server/project/SetDashboard.java | 2 +- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java index eafd29fa31..70cd89605b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java @@ -58,6 +58,15 @@ public class DashboardIT extends AbstractDaemonTest { assertThat(dashboards()).hasSize(1); } + @Test + public void setDefaultDashboard() throws Exception { + DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test"); + assertThat(info.isDefault).isNull(); + gApi.projects().name(project.get()).dashboard(info.id).setDefault(); + assertThat(gApi.projects().name(project.get()).dashboard(info.id).get().isDefault).isTrue(); + assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(info.id); + } + @Test public void cannotGetDashboardWithInheritedForNonDefault() throws Exception { DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test"); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardApi.java index a411e0eafe..3cde570913 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardApi.java @@ -23,6 +23,8 @@ public interface DashboardApi { DashboardInfo get(boolean inherited) throws RestApiException; + void setDefault() throws RestApiException; + /** * A default implementation which allows source compatibility when adding new methods to the * interface. @@ -37,5 +39,10 @@ public interface DashboardApi { public DashboardInfo get(boolean inherited) throws RestApiException { throw new NotImplementedException(); } + + @Override + public void setDefault() throws RestApiException { + throw new NotImplementedException(); + } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java index 58cb59e7c3..f0a6009aa1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java @@ -18,6 +18,7 @@ import static com.google.gerrit.server.api.ApiUtil.asRestApiException; import com.google.gerrit.extensions.api.projects.DashboardApi; import com.google.gerrit.extensions.api.projects.DashboardInfo; +import com.google.gerrit.extensions.common.SetDashboardInput; import com.google.gerrit.extensions.restapi.IdString; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestApiException; @@ -26,6 +27,7 @@ import com.google.gerrit.server.project.DashboardResource; import com.google.gerrit.server.project.DashboardsCollection; import com.google.gerrit.server.project.GetDashboard; import com.google.gerrit.server.project.ProjectResource; +import com.google.gerrit.server.project.SetDashboard; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; @@ -39,6 +41,7 @@ public class DashboardApiImpl implements DashboardApi { private final DashboardsCollection dashboards; private final Provider get; + private final SetDashboard set; private final ProjectResource project; private final String id; @@ -46,10 +49,12 @@ public class DashboardApiImpl implements DashboardApi { DashboardApiImpl( DashboardsCollection dashboards, Provider get, + SetDashboard set, @Assisted ProjectResource project, @Assisted String id) { this.dashboards = dashboards; this.get = get; + this.set = set; this.project = project; this.id = id; } @@ -68,6 +73,17 @@ public class DashboardApiImpl implements DashboardApi { } } + @Override + public void setDefault() throws RestApiException { + SetDashboardInput input = new SetDashboardInput(); + input.id = id; + try { + set.apply(DashboardResource.projectDefault(project.getControl()), input); + } catch (Exception e) { + throw asRestApiException("Cannot set default dashboard", e); + } + } + private DashboardResource resource() throws ResourceNotFoundException, IOException, ConfigInvalidException, PermissionBackendException { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java index a9683cf2fa..21ec077621 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java @@ -27,7 +27,7 @@ import com.google.inject.Singleton; import java.io.IOException; @Singleton -class SetDashboard implements RestModifyView { +public class SetDashboard implements RestModifyView { private final Provider defaultSetter; @Inject From 28e5bda9112cab83276d4705ad906a99c787fc4a Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Sun, 1 Oct 2017 14:41:42 +0100 Subject: [PATCH 2/4] DashboardIT: Move setup of permission into @Before annotated method Change-Id: I1adae529194caec51efac8bf2592df630218a1e4 --- .../google/gerrit/acceptance/api/project/DashboardIT.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java index 70cd89605b..a3efba9a16 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java @@ -29,10 +29,16 @@ import java.util.List; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; +import org.junit.Before; import org.junit.Test; @NoHttpd public class DashboardIT extends AbstractDaemonTest { + @Before + public void setup() throws Exception { + allow("refs/meta/dashboards/*", Permission.CREATE, REGISTERED_USERS); + } + @Test public void defaultDashboardDoesNotExist() throws Exception { exception.expect(ResourceNotFoundException.class); @@ -82,7 +88,6 @@ public class DashboardIT extends AbstractDaemonTest { private DashboardInfo createDashboard(String ref, String path) throws Exception { DashboardInfo info = DashboardsCollection.newDashboardInfo(ref, path); String canonicalRef = DashboardsCollection.normalizeDashboardRef(info.ref); - allow("refs/meta/dashboards/*", Permission.CREATE, REGISTERED_USERS); gApi.projects().name(project.get()).branch(canonicalRef).create(new BranchInput()); try (Repository r = repoManager.openRepository(project)) { TestRepository.CommitBuilder cb = From 8de7771c01ebdc1e10fce0f1c22f8f1ddc238e00 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Sun, 1 Oct 2017 14:44:34 +0100 Subject: [PATCH 3/4] DashboardIT: Handle case where default dashboard ref already exists Change-Id: I2336e1ee7692236294d2cf775552ba808fedb24f --- .../gerrit/acceptance/api/project/DashboardIT.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java index a3efba9a16..24e5c688e0 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java @@ -23,6 +23,7 @@ import com.google.gerrit.common.data.Permission; import com.google.gerrit.extensions.api.projects.BranchInput; import com.google.gerrit.extensions.api.projects.DashboardInfo; import com.google.gerrit.extensions.restapi.BadRequestException; +import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.server.project.DashboardsCollection; import java.util.List; @@ -88,7 +89,14 @@ public class DashboardIT extends AbstractDaemonTest { private DashboardInfo createDashboard(String ref, String path) throws Exception { DashboardInfo info = DashboardsCollection.newDashboardInfo(ref, path); String canonicalRef = DashboardsCollection.normalizeDashboardRef(info.ref); - gApi.projects().name(project.get()).branch(canonicalRef).create(new BranchInput()); + try { + gApi.projects().name(project.get()).branch(canonicalRef).create(new BranchInput()); + } catch (ResourceConflictException e) { + // The branch already exists if this method has already been called once. + if (!e.getMessage().contains("already exists")) { + throw e; + } + } try (Repository r = repoManager.openRepository(project)) { TestRepository.CommitBuilder cb = new TestRepository<>(r).branch(canonicalRef).commit(); From ea12cba92d0623c2ee44513166ed5c9e8a6af67f Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Sun, 1 Oct 2017 14:45:16 +0100 Subject: [PATCH 4/4] DashboardIT: Test that replacing the default dashboard works Change-Id: I0edb4137a94f6ec0fcc452cdb1512591900be5ca --- .../acceptance/api/project/DashboardIT.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java index 24e5c688e0..5cdb5833c1 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java @@ -74,6 +74,22 @@ public class DashboardIT extends AbstractDaemonTest { assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(info.id); } + @Test + public void replaceDefaultDashboard() throws Exception { + DashboardInfo d1 = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test1"); + DashboardInfo d2 = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test2"); + assertThat(d1.isDefault).isNull(); + assertThat(d2.isDefault).isNull(); + gApi.projects().name(project.get()).dashboard(d1.id).setDefault(); + assertThat(gApi.projects().name(project.get()).dashboard(d1.id).get().isDefault).isTrue(); + assertThat(gApi.projects().name(project.get()).dashboard(d2.id).get().isDefault).isNull(); + assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(d1.id); + gApi.projects().name(project.get()).dashboard(d2.id).setDefault(); + assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(d2.id); + assertThat(gApi.projects().name(project.get()).dashboard(d1.id).get().isDefault).isNull(); + assertThat(gApi.projects().name(project.get()).dashboard(d2.id).get().isDefault).isTrue(); + } + @Test public void cannotGetDashboardWithInheritedForNonDefault() throws Exception { DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");