From a57165686e2f2d785e6361f16360fabfdf9c6ed7 Mon Sep 17 00:00:00 2001 From: Kai Zimmermann Date: Wed, 23 Nov 2016 20:57:29 +0100 Subject: [PATCH] Fixed broken rollout management API concerning target status map. (#365) Signed-off-by: kaizimmerm --- .../rollout/MgmtRolloutResponseBody.java | 12 +- .../MgmtRolloutGroupResponseBody.java | 32 +-- .../mgmt/rest/resource/MgmtRolloutMapper.java | 25 +- .../rest/resource/MgmtRolloutResource.java | 24 +- .../resource/MgmtRolloutResourceTest.java | 267 ++++++++++++++++-- .../repository/ControllerManagement.java | 3 - .../repository/RolloutGroupManagement.java | 2 +- .../hawkbit/repository/RolloutManagement.java | 19 +- .../jpa/JpaRolloutGroupManagement.java | 11 +- .../repository/jpa/JpaRolloutManagement.java | 38 +-- .../condition/PauseRolloutGroupAction.java | 2 +- .../repository/jpa/RolloutManagementTest.java | 34 +-- .../jpa/rsql/RSQLRolloutGroupFields.java | 4 +- .../ui/rollout/rollout/RolloutBeanQuery.java | 2 +- .../ui/rollout/rollout/RolloutListGrid.java | 6 +- 15 files changed, 363 insertions(+), 118 deletions(-) diff --git a/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/rollout/MgmtRolloutResponseBody.java b/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/rollout/MgmtRolloutResponseBody.java index 79455f5013..a35adce9f2 100644 --- a/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/rollout/MgmtRolloutResponseBody.java +++ b/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/rollout/MgmtRolloutResponseBody.java @@ -37,8 +37,8 @@ public class MgmtRolloutResponseBody extends MgmtNamedEntity { @JsonProperty(required = true) private Long totalTargets; - @JsonProperty(required = true) - private final Map totalTargetsPerStatus = new HashMap<>(); + @JsonProperty + private Map totalTargetsPerStatus; /** * @return the status @@ -121,4 +121,12 @@ public Long getTotalTargets() { public Map getTotalTargetsPerStatus() { return totalTargetsPerStatus; } + + public void addTotalTargetsPerStatus(final String status, final Long totalTargetCountByStatus) { + if (totalTargetsPerStatus == null) { + totalTargetsPerStatus = new HashMap<>(); + } + + totalTargetsPerStatus.put(status, totalTargetCountByStatus); + } } diff --git a/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/rolloutgroup/MgmtRolloutGroupResponseBody.java b/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/rolloutgroup/MgmtRolloutGroupResponseBody.java index 7b69137d9c..8cd1d5a729 100644 --- a/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/rolloutgroup/MgmtRolloutGroupResponseBody.java +++ b/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/rolloutgroup/MgmtRolloutGroupResponseBody.java @@ -8,14 +8,14 @@ */ package org.eclipse.hawkbit.mgmt.json.model.rolloutgroup; +import java.util.HashMap; +import java.util.Map; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.HashMap; -import java.util.Map; - /** * Model for the rollout group annotated with json-annotations for easier * serialization and de-serialization. @@ -32,34 +32,20 @@ public class MgmtRolloutGroupResponseBody extends MgmtRolloutGroup { private int totalTargets; - private final Map totalTargetsPerStatus = new HashMap<>(); + private Map totalTargetsPerStatus; - /** - * @return the rolloutGroupId - */ public Long getRolloutGroupId() { return rolloutGroupId; } - /** - * @param rolloutGroupId - * the rolloutGroupId to set - */ public void setRolloutGroupId(final Long rolloutGroupId) { this.rolloutGroupId = rolloutGroupId; } - /** - * @return the status - */ public String getStatus() { return status; } - /** - * @param status - * the status to set - */ public void setStatus(final String status) { this.status = status; } @@ -68,7 +54,7 @@ public int getTotalTargets() { return totalTargets; } - public void setTotalTargets(int totalTargets) { + public void setTotalTargets(final int totalTargets) { this.totalTargets = totalTargets; } @@ -76,4 +62,12 @@ public Map getTotalTargetsPerStatus() { return totalTargetsPerStatus; } + public void addTotalTargetsPerStatus(final String status, final Long totalTargetCountByStatus) { + if (totalTargetsPerStatus == null) { + totalTargetsPerStatus = new HashMap<>(); + } + + totalTargetsPerStatus.put(status, totalTargetCountByStatus); + } + } diff --git a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutMapper.java b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutMapper.java index c7073bfd05..9d97b9bbd1 100644 --- a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutMapper.java +++ b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutMapper.java @@ -61,10 +61,10 @@ static List toResponseRollout(final List rollo return Collections.emptyList(); } - return rollouts.stream().map(MgmtRolloutMapper::toResponseRollout).collect(Collectors.toList()); + return rollouts.stream().map(rollout -> toResponseRollout(rollout, false)).collect(Collectors.toList()); } - static MgmtRolloutResponseBody toResponseRollout(final Rollout rollout) { + static MgmtRolloutResponseBody toResponseRollout(final Rollout rollout, final boolean withDetails) { final MgmtRolloutResponseBody body = new MgmtRolloutResponseBody(); body.setCreatedAt(rollout.getCreatedAt()); body.setCreatedBy(rollout.getCreatedBy()); @@ -78,9 +78,11 @@ static MgmtRolloutResponseBody toResponseRollout(final Rollout rollout) { body.setStatus(rollout.getStatus().toString().toLowerCase()); body.setTotalTargets(rollout.getTotalTargets()); - for (final TotalTargetCountStatus.Status status : TotalTargetCountStatus.Status.values()) { - body.getTotalTargetsPerStatus().put(status.name().toLowerCase(), - rollout.getTotalTargetCountStatus().getTotalTargetCountByStatus(status)); + if (withDetails) { + for (final TotalTargetCountStatus.Status status : TotalTargetCountStatus.Status.values()) { + body.addTotalTargetsPerStatus(status.name().toLowerCase(), + rollout.getTotalTargetCountStatus().getTotalTargetCountByStatus(status)); + } } body.add(linkTo(methodOn(MgmtRolloutRestApi.class).getRollout(rollout.getId())).withRel("self")); @@ -144,10 +146,11 @@ static List toResponseRolloutGroup(final List toResponseRolloutGroup(group, false)).collect(Collectors.toList()); } - static MgmtRolloutGroupResponseBody toResponseRolloutGroup(final RolloutGroup rolloutGroup) { + static MgmtRolloutGroupResponseBody toResponseRolloutGroup(final RolloutGroup rolloutGroup, + final boolean withDetailedStatus) { final MgmtRolloutGroupResponseBody body = new MgmtRolloutGroupResponseBody(); body.setCreatedAt(rolloutGroup.getCreatedAt()); body.setCreatedBy(rolloutGroup.getCreatedBy()); @@ -171,9 +174,11 @@ static MgmtRolloutGroupResponseBody toResponseRolloutGroup(final RolloutGroup ro body.setErrorAction( new MgmtRolloutErrorAction(map(rolloutGroup.getErrorAction()), rolloutGroup.getErrorActionExp())); - for (final TotalTargetCountStatus.Status status : TotalTargetCountStatus.Status.values()) { - body.getTotalTargetsPerStatus().put(status.name().toLowerCase(), - rolloutGroup.getTotalTargetCountStatus().getTotalTargetCountByStatus(status)); + if (withDetailedStatus) { + for (final TotalTargetCountStatus.Status status : TotalTargetCountStatus.Status.values()) { + body.addTotalTargetsPerStatus(status.name().toLowerCase(), + rolloutGroup.getTotalTargetCountStatus().getTotalTargetCountByStatus(status)); + } } body.add(linkTo(methodOn(MgmtRolloutRestApi.class).getRolloutGroup(rolloutGroup.getRollout().getId(), diff --git a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutResource.java b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutResource.java index afc31eb814..59f76b27c3 100644 --- a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutResource.java +++ b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutResource.java @@ -83,7 +83,7 @@ public ResponseEntity> getRollouts( final Page findModulesAll; if (rsqlParam != null) { - findModulesAll = this.rolloutManagement.findAllWithDetailedStatusByPredicate(rsqlParam, pageable); + findModulesAll = this.rolloutManagement.findAllByPredicate(rsqlParam, pageable); } else { findModulesAll = this.rolloutManagement.findAll(pageable); } @@ -95,7 +95,7 @@ public ResponseEntity> getRollouts( @Override public ResponseEntity getRollout(@PathVariable("rolloutId") final Long rolloutId) { final Rollout findRolloutById = findRolloutOrThrowException(rolloutId); - return new ResponseEntity<>(MgmtRolloutMapper.toResponseRollout(findRolloutById), HttpStatus.OK); + return new ResponseEntity<>(MgmtRolloutMapper.toResponseRollout(findRolloutById, true), HttpStatus.OK); } @Override @@ -126,27 +126,24 @@ public ResponseEntity create( throw new ConstraintViolationException("Either 'amountGroups' or 'groups' must be defined in the request"); } - return ResponseEntity.status(HttpStatus.CREATED).body(MgmtRolloutMapper.toResponseRollout(rollout)); + return ResponseEntity.status(HttpStatus.CREATED).body(MgmtRolloutMapper.toResponseRollout(rollout, true)); } @Override public ResponseEntity start(@PathVariable("rolloutId") final Long rolloutId) { - final Rollout rollout = findRolloutOrThrowException(rolloutId); - this.rolloutManagement.startRollout(rollout); + this.rolloutManagement.startRollout(rolloutId); return ResponseEntity.ok().build(); } @Override public ResponseEntity pause(@PathVariable("rolloutId") final Long rolloutId) { - final Rollout rollout = findRolloutOrThrowException(rolloutId); - this.rolloutManagement.pauseRollout(rollout); + this.rolloutManagement.pauseRollout(rolloutId); return ResponseEntity.ok().build(); } @Override public ResponseEntity resume(@PathVariable("rolloutId") final Long rolloutId) { - final Rollout rollout = findRolloutOrThrowException(rolloutId); - this.rolloutManagement.resumeRollout(rollout); + this.rolloutManagement.resumeRollout(rolloutId); return ResponseEntity.ok().build(); } @@ -157,8 +154,6 @@ public ResponseEntity> getRolloutGroups( @RequestParam(value = MgmtRestConstants.REQUEST_PARAMETER_PAGING_LIMIT, defaultValue = MgmtRestConstants.REQUEST_PARAMETER_PAGING_DEFAULT_LIMIT) final int pagingLimitParam, @RequestParam(value = MgmtRestConstants.REQUEST_PARAMETER_SORTING, required = false) final String sortParam, @RequestParam(value = MgmtRestConstants.REQUEST_PARAMETER_SEARCH, required = false) final String rsqlParam) { - final Rollout rollout = findRolloutOrThrowException(rolloutId); - final int sanitizedOffsetParam = PagingUtility.sanitizeOffsetParam(pagingOffsetParam); final int sanitizedLimitParam = PagingUtility.sanitizePageLimitParam(pagingLimitParam); final Sort sorting = PagingUtility.sanitizeRolloutGroupSortParam(sortParam); @@ -167,7 +162,7 @@ public ResponseEntity> getRolloutGroups( final Page findRolloutGroupsAll; if (rsqlParam != null) { - findRolloutGroupsAll = this.rolloutGroupManagement.findRolloutGroupsAll(rollout, rsqlParam, pageable); + findRolloutGroupsAll = this.rolloutGroupManagement.findRolloutGroupsAll(rolloutId, rsqlParam, pageable); } else { findRolloutGroupsAll = this.rolloutGroupManagement.findRolloutGroupsByRolloutId(rolloutId, pageable); } @@ -182,7 +177,7 @@ public ResponseEntity getRolloutGroup(@PathVariabl @PathVariable("groupId") final Long groupId) { findRolloutOrThrowException(rolloutId); final RolloutGroup rolloutGroup = findRolloutGroupOrThrowException(groupId); - return ResponseEntity.ok(MgmtRolloutMapper.toResponseRolloutGroup(rolloutGroup)); + return ResponseEntity.ok(MgmtRolloutMapper.toResponseRolloutGroup(rolloutGroup, true)); } @Override @@ -223,7 +218,8 @@ private Rollout findRolloutOrThrowException(final Long rolloutId) { } private RolloutGroup findRolloutGroupOrThrowException(final Long rolloutGroupId) { - final RolloutGroup rolloutGroup = this.rolloutGroupManagement.findRolloutGroupById(rolloutGroupId); + final RolloutGroup rolloutGroup = this.rolloutGroupManagement + .findRolloutGroupWithDetailedStatus(rolloutGroupId); if (rolloutGroup == null) { throw new EntityNotFoundException("Group with Id {" + rolloutGroupId + DOES_NOT_EXIST); } diff --git a/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutResourceTest.java b/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutResourceTest.java index abea4f28f1..0880b30023 100644 --- a/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutResourceTest.java +++ b/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtRolloutResourceTest.java @@ -9,9 +9,13 @@ package org.eclipse.hawkbit.mgmt.rest.resource; import static org.fest.assertions.api.Assertions.assertThat; -import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.CoreMatchers.allOf; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.notNullValue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; @@ -47,6 +51,7 @@ import com.google.common.collect.Lists; import ru.yandex.qatools.allure.annotations.Features; +import ru.yandex.qatools.allure.annotations.Step; import ru.yandex.qatools.allure.annotations.Stories; /** @@ -56,6 +61,8 @@ @Stories("Rollout Resource") public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest { + private static final String HREF_ROLLOUT_PREFIX = "http://localhost/rest/v1/rollouts/"; + @Autowired private RolloutManagement rolloutManagement; @@ -123,7 +130,7 @@ public void createRollout() throws Exception { testdataFactory.createTargets(20, "target", "rollout"); final DistributionSet dsA = testdataFactory.createDistributionSet(""); - postRollout("rollout1", 10, dsA.getId(), "id==target*"); + postRollout("rollout1", 10, dsA.getId(), "id==target*", 20); } @Test @@ -211,6 +218,103 @@ public void noRolloutReturnsEmptyList() throws Exception { .andExpect(jsonPath("$.content", hasSize(0))).andExpect(jsonPath("$.total", equalTo(0))); } + @Test + @Description("Terives sinle rollout from management API includinfg extra data that is delieverd only for single rollout access.") + public void retrieveSingleRollout() throws Exception { + testdataFactory.createTargets(20, "rollout", "rollout"); + final DistributionSet dsA = testdataFactory.createDistributionSet(""); + + // create rollout including the created targets with prefix 'rollout' + final Rollout rollout = rolloutManagement.createRollout( + entityFactory.rollout().create().name("rollout1").set(dsA.getId()) + .targetFilterQuery("controllerId==rollout*"), + 4, new RolloutGroupConditionBuilder().withDefaults() + .successCondition(RolloutGroupSuccessCondition.THRESHOLD, "100").build()); + + retrieveAndVerifyRolloutInCreating(dsA, rollout); + retrieveAndVerifyRolloutInReady(rollout); + retrieveAndVerifyRolloutInStarting(rollout); + retrieveAndVerifyRolloutInRunning(rollout); + } + + @Step + private void retrieveAndVerifyRolloutInRunning(final Rollout rollout) throws Exception { + rolloutManagement.checkStartingRollouts(0); + + mvc.perform(get("/rest/v1/rollouts/" + rollout.getId())).andDo(MockMvcResultPrinter.print()) + .andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.id", equalTo(rollout.getId().intValue()))) + .andExpect(jsonPath("$.name", equalTo("rollout1"))).andExpect(jsonPath("$.status", equalTo("running"))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(5))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(15))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))); + } + + @Step + private void retrieveAndVerifyRolloutInStarting(final Rollout rollout) throws Exception { + rolloutManagement.startRollout(rollout.getId()); + + mvc.perform(get("/rest/v1/rollouts/" + rollout.getId())).andDo(MockMvcResultPrinter.print()) + .andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.id", equalTo(rollout.getId().intValue()))) + .andExpect(jsonPath("$.name", equalTo("rollout1"))).andExpect(jsonPath("$.status", equalTo("starting"))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(20))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))); + } + + @Step + private void retrieveAndVerifyRolloutInReady(final Rollout rollout) throws Exception { + rolloutManagement.checkCreatingRollouts(0); + + mvc.perform(get("/rest/v1/rollouts/" + rollout.getId())).andDo(MockMvcResultPrinter.print()) + .andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.id", equalTo(rollout.getId().intValue()))) + .andExpect(jsonPath("$.name", equalTo("rollout1"))).andExpect(jsonPath("$.status", equalTo("ready"))) + .andExpect(jsonPath("$.lastModifiedBy", equalTo("bumlux"))) + .andExpect(jsonPath("$.lastModifiedAt", not(equalTo(0)))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(20))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))); + } + + @Step + private void retrieveAndVerifyRolloutInCreating(final DistributionSet dsA, final Rollout rollout) throws Exception { + mvc.perform(get("/rest/v1/rollouts/" + rollout.getId())).andDo(MockMvcResultPrinter.print()) + .andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("$.id", equalTo(rollout.getId().intValue()))) + .andExpect(jsonPath("$.name", equalTo("rollout1"))).andExpect(jsonPath("$.status", equalTo("creating"))) + .andExpect(jsonPath("$.targetFilterQuery", equalTo("controllerId==rollout*"))) + .andExpect(jsonPath("$.distributionSetId", equalTo(dsA.getId().intValue()))) + .andExpect(jsonPath("$.createdBy", equalTo("bumlux"))) + .andExpect(jsonPath("$.createdAt", not(equalTo(0)))) + .andExpect(jsonPath("$.lastModifiedBy").doesNotExist()) + .andExpect(jsonPath("$.lastModifiedAt").doesNotExist()) + .andExpect(jsonPath("$.totalTargets", equalTo(20))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(20))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))) + .andExpect(jsonPath("$._links.self.href", startsWith(HREF_ROLLOUT_PREFIX))) + .andExpect(jsonPath("$._links.start.href", allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/start")))) + .andExpect(jsonPath("$._links.pause.href", allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/pause")))) + .andExpect( + jsonPath("$._links.resume.href", allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/resume")))) + .andExpect(jsonPath("$._links.groups.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), containsString("/deploygroups")))); + } + @Test @Description("Testing that rollout paged list contains rollouts") public void rolloutPagedListContainsAllRollouts() throws Exception { @@ -219,8 +323,8 @@ public void rolloutPagedListContainsAllRollouts() throws Exception { testdataFactory.createTargets(20, "target", "rollout"); // setup - create 2 rollouts - postRollout("rollout1", 10, dsA.getId(), "id==target*"); - postRollout("rollout2", 5, dsA.getId(), "id==target-0001*"); + postRollout("rollout1", 10, dsA.getId(), "id==target*", 20); + postRollout("rollout2", 5, dsA.getId(), "id==target-0001*", 10); // Run here, because Scheduler is disabled during tests rolloutManagement.checkCreatingRollouts(0); @@ -232,10 +336,40 @@ public void rolloutPagedListContainsAllRollouts() throws Exception { .andExpect(jsonPath("content[0].status", equalTo("ready"))) .andExpect(jsonPath("content[0].targetFilterQuery", equalTo("id==target*"))) .andExpect(jsonPath("content[0].distributionSetId", equalTo(dsA.getId().intValue()))) + .andExpect(jsonPath("content[0].createdBy", equalTo("bumlux"))) + .andExpect(jsonPath("content[0].createdAt", not(equalTo(0)))) + .andExpect(jsonPath("content[0].lastModifiedBy", equalTo("bumlux"))) + .andExpect(jsonPath("content[0].lastModifiedAt", not(equalTo(0)))) + .andExpect(jsonPath("content[0].totalTargets", equalTo(20))) + .andExpect(jsonPath("content[0].totalTargetsPerStatus").doesNotExist()) + .andExpect(jsonPath("content[0]._links.self.href", startsWith(HREF_ROLLOUT_PREFIX))) + .andExpect(jsonPath("content[0]._links.start.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/start")))) + .andExpect(jsonPath("content[0]._links.pause.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/pause")))) + .andExpect(jsonPath("content[0]._links.resume.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/resume")))) + .andExpect(jsonPath("content[0]._links.groups.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), containsString("/deploygroups")))) .andExpect(jsonPath("content[1].name", equalTo("rollout2"))) .andExpect(jsonPath("content[1].status", equalTo("ready"))) .andExpect(jsonPath("content[1].targetFilterQuery", equalTo("id==target-0001*"))) - .andExpect(jsonPath("content[1].distributionSetId", equalTo(dsA.getId().intValue()))); + .andExpect(jsonPath("content[1].distributionSetId", equalTo(dsA.getId().intValue()))) + .andExpect(jsonPath("content[1].createdBy", equalTo("bumlux"))) + .andExpect(jsonPath("content[1].createdAt", not(equalTo(0)))) + .andExpect(jsonPath("content[1].lastModifiedBy", equalTo("bumlux"))) + .andExpect(jsonPath("content[1].lastModifiedAt", not(equalTo(0)))) + .andExpect(jsonPath("content[1].totalTargets", equalTo(10))) + .andExpect(jsonPath("content[1].totalTargetsPerStatus").doesNotExist()) + .andExpect(jsonPath("content[1]._links.self.href", startsWith(HREF_ROLLOUT_PREFIX))) + .andExpect(jsonPath("content[1]._links.start.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/start")))) + .andExpect(jsonPath("content[1]._links.pause.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/pause")))) + .andExpect(jsonPath("content[1]._links.resume.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/resume")))) + .andExpect(jsonPath("content[1]._links.groups.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), containsString("/deploygroups")))); } @Test @@ -246,8 +380,8 @@ public void rolloutPagedListIsLimitedToQueryParam() throws Exception { testdataFactory.createTargets(20, "target", "rollout"); // setup - create 2 rollouts - postRollout("rollout1", 10, dsA.getId(), "id==target*"); - postRollout("rollout2", 5, dsA.getId(), "id==target*"); + postRollout("rollout1", 10, dsA.getId(), "id==target*", 20); + postRollout("rollout2", 5, dsA.getId(), "id==target*", 20); // Run here, because Scheduler is disabled during tests rolloutManagement.checkCreatingRollouts(0); @@ -445,23 +579,100 @@ public void startingRolloutFirstRolloutGroupIsInRunningState() throws Exception @Description("Testing that a single rollout group can be retrieved") public void retrieveSingleRolloutGroup() throws Exception { // setup - final int amountTargets = 10; + final int amountTargets = 20; testdataFactory.createTargets(amountTargets, "rollout", "rollout"); final DistributionSet dsA = testdataFactory.createDistributionSet(""); // create rollout including the created targets with prefix 'rollout' - final Rollout rollout = createRollout("rollout1", 4, dsA.getId(), "controllerId==rollout*"); + final Rollout rollout = rolloutManagement.createRollout( + entityFactory.rollout().create().name("rollout1").set(dsA.getId()) + .targetFilterQuery("controllerId==rollout*"), + 4, new RolloutGroupConditionBuilder().withDefaults() + .successCondition(RolloutGroupSuccessCondition.THRESHOLD, "100").build()); final RolloutGroup firstGroup = rolloutGroupManagement .findRolloutGroupsByRolloutId(rollout.getId(), new PageRequest(0, 1, Direction.ASC, "id")).getContent() .get(0); + final RolloutGroup secondGroup = rolloutGroupManagement + .findRolloutGroupsByRolloutId(rollout.getId(), new PageRequest(1, 1, Direction.ASC, "id")).getContent() + .get(0); - // retrieve single rollout group with known ID + retrieveAndVerifyRolloutGroupInCreating(rollout, firstGroup); + retrieveAndVerifyRolloutGroupInReady(rollout, firstGroup); + retrieveAndVerifyRolloutGroupInRunningAndScheduled(rollout, firstGroup, secondGroup); + } + + @Step + private void retrieveAndVerifyRolloutGroupInRunningAndScheduled(final Rollout rollout, + final RolloutGroup firstGroup, final RolloutGroup secondGroup) throws Exception { + rolloutManagement.startRollout(rollout.getId()); + rolloutManagement.checkStartingRollouts(0); + mvc.perform(get("/rest/v1/rollouts/{rolloutId}/deploygroups/{groupId}", rollout.getId(), firstGroup.getId())) + .andDo(MockMvcResultPrinter.print()).andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("status", equalTo("running"))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(5))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))); + + mvc.perform(get("/rest/v1/rollouts/{rolloutId}/deploygroups/{groupId}", rollout.getId(), secondGroup.getId())) + .andDo(MockMvcResultPrinter.print()).andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("status", equalTo("scheduled"))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(5))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))); + } + + @Step + private void retrieveAndVerifyRolloutGroupInReady(final Rollout rollout, final RolloutGroup firstGroup) + throws Exception { + rolloutManagement.checkCreatingRollouts(0); + mvc.perform(get("/rest/v1/rollouts/{rolloutId}/deploygroups/{groupId}", rollout.getId(), firstGroup.getId())) + .andDo(MockMvcResultPrinter.print()).andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) + .andExpect(jsonPath("status", equalTo("ready"))) + .andExpect(jsonPath("$.lastModifiedBy", equalTo("bumlux"))) + .andExpect(jsonPath("$.lastModifiedAt", not(equalTo(0)))) + .andExpect(jsonPath("$.totalTargets", equalTo(5))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(5))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))); + } + + @Step + private void retrieveAndVerifyRolloutGroupInCreating(final Rollout rollout, final RolloutGroup firstGroup) + throws Exception { mvc.perform(get("/rest/v1/rollouts/{rolloutId}/deploygroups/{groupId}", rollout.getId(), firstGroup.getId())) .andDo(MockMvcResultPrinter.print()).andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) .andExpect(jsonPath("id", equalTo(firstGroup.getId().intValue()))) - .andExpect(jsonPath("status", equalTo("ready"))).andExpect(jsonPath("name", notNullValue())); + .andExpect(jsonPath("status", equalTo("creating"))).andExpect(jsonPath("name", endsWith("1"))) + .andExpect(jsonPath("description", endsWith("1"))) + .andExpect(jsonPath("$.targetFilterQuery", equalTo(""))) + .andExpect(jsonPath("$.targetPercentage", equalTo(25.0))) + .andExpect(jsonPath("$.createdBy", equalTo("bumlux"))) + .andExpect(jsonPath("$.createdAt", not(equalTo(0)))) + .andExpect(jsonPath("$.lastModifiedBy").doesNotExist()) + .andExpect(jsonPath("$.lastModifiedAt").doesNotExist()) + .andExpect(jsonPath("$.totalTargets", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))) + .andExpect(jsonPath("$._links.self.href", equalTo( + HREF_ROLLOUT_PREFIX + rollout.getId() + "/deploygroups/" + firstGroup.getId().intValue()))); } @Test @@ -521,7 +732,7 @@ public void retrieveTargetsFromRolloutGroupAfterRolloutIsStarted() throws Except // create rollout including the created targets with prefix 'rollout' final Rollout rollout = createRollout("rollout1", 2, dsA.getId(), "controllerId==rollout*"); - rolloutManagement.startRollout(rollout); + rolloutManagement.startRollout(rollout.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -664,13 +875,37 @@ protected boolean untilTimeoutReached(final long timeout, final long duration) { return duration <= timeout || timeout < 0; } - private void postRollout(final String name, final int groupSize, final long distributionSetId, - final String targetFilterQuery) throws Exception { + private void postRollout(final String name, final int groupSize, final Long distributionSetId, + final String targetFilterQuery, final int targets) throws Exception { mvc.perform(post("/rest/v1/rollouts") .content(JsonBuilder.rollout(name, "desc", groupSize, distributionSetId, targetFilterQuery, new RolloutGroupConditionBuilder().withDefaults().build())) .contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)) - .andDo(MockMvcResultPrinter.print()).andExpect(status().isCreated()).andReturn(); + .andDo(MockMvcResultPrinter.print()).andExpect(status().isCreated()) + .andExpect(jsonPath("$.name", equalTo(name))).andExpect(jsonPath("$.status", equalTo("creating"))) + .andExpect(jsonPath("$.targetFilterQuery", equalTo(targetFilterQuery))) + .andExpect(jsonPath("$.description", equalTo("desc"))) + .andExpect(jsonPath("$.distributionSetId", equalTo(distributionSetId.intValue()))) + .andExpect(jsonPath("$.createdBy", equalTo("bumlux"))) + .andExpect(jsonPath("$.createdAt", not(equalTo(0)))) + .andExpect(jsonPath("$.lastModifiedBy", equalTo("bumlux"))) + .andExpect(jsonPath("$.lastModifiedAt", not(equalTo(0)))) + .andExpect(jsonPath("$.totalTargets", equalTo(targets))) + .andExpect(jsonPath("$.totalTargetsPerStatus.running", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.notstarted", equalTo(targets))) + .andExpect(jsonPath("$.totalTargetsPerStatus.scheduled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.cancelled", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.finished", equalTo(0))) + .andExpect(jsonPath("$.totalTargetsPerStatus.error", equalTo(0))) + .andExpect(jsonPath("$._links.self.href", startsWith(HREF_ROLLOUT_PREFIX))) + .andExpect(jsonPath("$._links.start.href", allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/start")))) + .andExpect(jsonPath("$._links.pause.href", allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/pause")))) + .andExpect( + jsonPath("$._links.resume.href", allOf(startsWith(HREF_ROLLOUT_PREFIX), endsWith("/resume")))) + .andExpect(jsonPath("$._links.groups.href", + allOf(startsWith(HREF_ROLLOUT_PREFIX), containsString("/deploygroups")))) + + ; } private Rollout createRollout(final String name, final int amountGroups, final long distributionSetId, diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java index f4e382909f..9136e43d00 100644 --- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java +++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java @@ -108,9 +108,6 @@ public interface ControllerManagement { * @throws TooManyStatusEntriesException * if more than the allowed number of status entries are * inserted - * @throws TooManyStatusEntriesException - * if more than the allowed number of status entries are - * inserted */ @PreAuthorize(SpringEvalExpressions.IS_CONTROLLER) Action addUpdateActionStatus(@NotNull ActionStatusCreate create); diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/RolloutGroupManagement.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/RolloutGroupManagement.java index 292777e625..c8d4533d3c 100644 --- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/RolloutGroupManagement.java +++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/RolloutGroupManagement.java @@ -90,7 +90,7 @@ Page findAllTargetsWithActionStatus(@NotNull PageRequest * if the RSQL syntax is wrong */ @PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_READ) - Page findRolloutGroupsAll(@NotNull Rollout rollout, @NotNull String rsqlParam, + Page findRolloutGroupsAll(@NotNull Long rollout, @NotNull String rsqlParam, @NotNull Pageable pageable); /** diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/RolloutManagement.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/RolloutManagement.java index 732d5644f8..738f2ff21f 100644 --- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/RolloutManagement.java +++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/RolloutManagement.java @@ -236,7 +236,7 @@ Rollout createRollout(@NotNull RolloutCreate rollout, @NotNull List findAllWithDetailedStatusByPredicate(@NotNull String rsqlParam, @NotNull Pageable pageable); + Page findAllByPredicate(@NotNull String rsqlParam, @NotNull Pageable pageable); /** * Finds rollouts by given text in name or description. @@ -249,7 +249,7 @@ Rollout createRollout(@NotNull RolloutCreate rollout, @NotNull List findRolloutByFilters(@NotNull Pageable pageable, @NotEmpty String searchText); + Slice findRolloutWithDetailedStatusByFilters(@NotNull Pageable pageable, @NotEmpty String searchText); /** * Retrieves a specific rollout by its ID. @@ -312,12 +312,14 @@ Rollout createRollout(@NotNull RolloutCreate rollout, @NotNull List convertTPage(final Page findAll, final Pa } @Override - public Page findRolloutGroupsAll(final Rollout rollout, final String rsqlParam, + public Page findRolloutGroupsAll(final Long rolloutId, final String rsqlParam, final Pageable pageable) { final Specification specification = RSQLUtility.parse(rsqlParam, RolloutGroupFields.class, @@ -103,9 +103,10 @@ public Page findRolloutGroupsAll(final Rollout rollout, final Stri return convertPage( rolloutGroupRepository .findAll( - (root, query, criteriaBuilder) -> criteriaBuilder.and( - criteriaBuilder.equal(root.get(JpaRolloutGroup_.rollout), rollout), - specification.toPredicate(root, query, criteriaBuilder)), + (root, query, + criteriaBuilder) -> criteriaBuilder.and(criteriaBuilder.equal( + root.get(JpaRolloutGroup_.rollout).get(JpaRollout_.id), rolloutId), + specification.toPredicate(root, query, criteriaBuilder)), pageable), pageable); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java index 63dcedef22..9954f590e4 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java @@ -148,13 +148,12 @@ private static Slice convertPage(final Slice findAll, final } @Override - public Page findAllWithDetailedStatusByPredicate(final String rsqlParam, final Pageable pageable) { + public Page findAllByPredicate(final String rsqlParam, final Pageable pageable) { final Specification specification = RSQLUtility.parse(rsqlParam, RolloutFields.class, virtualPropertyReplacer); final Page findAll = rolloutRepository.findAll(specification, pageable); - setRolloutStatusDetails(findAll); return convertPage(findAll, pageable); } @@ -468,11 +467,12 @@ private long countOverlappingTargetsWithPreviousGroups(final String baseFilter, @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED) @Modifying - public Rollout startRollout(final Rollout rollout) { - final JpaRollout mergedRollout = entityManager.merge((JpaRollout) rollout); - checkIfRolloutCanStarted(rollout, mergedRollout); - mergedRollout.setStatus(RolloutStatus.STARTING); - return rolloutRepository.save(mergedRollout); + public Rollout startRollout(final Long rolloutId) { + final JpaRollout rollout = Optional.ofNullable(rolloutRepository.findOne(rolloutId)) + .orElseThrow(() -> new EntityNotFoundException("Rollout with id " + rolloutId + " not found.")); + checkIfRolloutCanStarted(rollout, rollout); + rollout.setStatus(RolloutStatus.STARTING); + return rolloutRepository.save(rollout); } private void startFirstRolloutGroup(final Rollout rollout) { @@ -575,9 +575,10 @@ private Integer createActionsForTargetsInNewTransaction(final long rolloutId, fi @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED) @Modifying - public void pauseRollout(final Rollout rollout) { - final JpaRollout mergedRollout = entityManager.merge((JpaRollout) rollout); - if (mergedRollout.getStatus() != RolloutStatus.RUNNING) { + public void pauseRollout(final Long rolloutId) { + final JpaRollout rollout = Optional.ofNullable(rolloutRepository.findOne(rolloutId)) + .orElseThrow(() -> new EntityNotFoundException("Rollout with id " + rolloutId + " not found.")); + if (rollout.getStatus() != RolloutStatus.RUNNING) { throw new RolloutIllegalStateException("Rollout can only be paused in state running but current state is " + rollout.getStatus().name().toLowerCase()); } @@ -586,21 +587,22 @@ public void pauseRollout(final Rollout rollout) { // not started until rollout goes back to running state again. The // periodically check for running rollouts will skip rollouts in pause // state. - mergedRollout.setStatus(RolloutStatus.PAUSED); - rolloutRepository.save(mergedRollout); + rollout.setStatus(RolloutStatus.PAUSED); + rolloutRepository.save(rollout); } @Override @Transactional(isolation = Isolation.READ_UNCOMMITTED) @Modifying - public void resumeRollout(final Rollout rollout) { - final JpaRollout mergedRollout = entityManager.merge((JpaRollout) rollout); - if (!(RolloutStatus.PAUSED.equals(mergedRollout.getStatus()))) { + public void resumeRollout(final Long rolloutId) { + final JpaRollout rollout = Optional.ofNullable(rolloutRepository.findOne(rolloutId)) + .orElseThrow(() -> new EntityNotFoundException("Rollout with id " + rolloutId + " not found.")); + if (!(RolloutStatus.PAUSED.equals(rollout.getStatus()))) { throw new RolloutIllegalStateException("Rollout can only be resumed in state paused but current state is " + rollout.getStatus().name().toLowerCase()); } - mergedRollout.setStatus(RolloutStatus.RUNNING); - rolloutRepository.save(mergedRollout); + rollout.setStatus(RolloutStatus.RUNNING); + rolloutRepository.save(rollout); } @Override @@ -834,7 +836,7 @@ private static Specification likeNameOrDescription(final String sear } @Override - public Slice findRolloutByFilters(final Pageable pageable, final String searchText) { + public Slice findRolloutWithDetailedStatusByFilters(final Pageable pageable, final String searchText) { final Specification specs = likeNameOrDescription(searchText); final Slice findAll = criteriaNoCountDao.findAll(specs, pageable, JpaRollout.class); setRolloutStatusDetails(findAll); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rollout/condition/PauseRolloutGroupAction.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rollout/condition/PauseRolloutGroupAction.java index fe08fa166f..6257e4e6fe 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rollout/condition/PauseRolloutGroupAction.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rollout/condition/PauseRolloutGroupAction.java @@ -46,7 +46,7 @@ public void eval(final Rollout rollout, final RolloutGroup rolloutG, final Strin systemSecurityContext.runAsSystem(() -> { rolloutGroup.setStatus(RolloutGroupStatus.ERROR); rolloutGroupRepository.save(rolloutGroup); - rolloutManagement.pauseRollout(rollout); + rolloutManagement.pauseRollout(rollout.getId()); return null; }); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/RolloutManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/RolloutManagementTest.java index 7ce1d6f549..77081cee4c 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/RolloutManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/RolloutManagementTest.java @@ -191,7 +191,7 @@ private Rollout createAndStartRollout(final int amountTargetsForRollout, final i final Rollout createdRollout = createSimpleTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout, amountOtherTargets, amountGroups, successCondition, errorCondition); - rolloutManagement.startRollout(createdRollout); + rolloutManagement.startRollout(createdRollout.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -334,7 +334,7 @@ public void errorActionPausesRolloutAndRolloutGetsResumedStartsNextScheduledGrou scheduleGroups.forEach(group -> assertThat(group.getStatus()).isEqualTo(RolloutGroupStatus.SCHEDULED)); // resume the rollout again after it gets paused by error action - rolloutManagement.resumeRollout(rolloutManagement.findRolloutById(createdRollout.getId())); + rolloutManagement.resumeRollout(createdRollout.getId()); // the rollout should be running again assertThat(rolloutManagement.findRolloutById(createdRollout.getId()).getStatus()) @@ -406,7 +406,7 @@ public void countCorrectStatusForEachTargetDuringRollout() { validationMap.put(TotalTargetCountStatus.Status.NOTSTARTED, 8L); validateRolloutActionStatus(createdRollout.getId(), validationMap); - rolloutManagement.startRollout(createdRollout); + rolloutManagement.startRollout(createdRollout.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -469,7 +469,7 @@ public void countCorrectStatusForEachTargetDuringRolloutWithError() { validationMap.put(TotalTargetCountStatus.Status.NOTSTARTED, 8L); validateRolloutActionStatus(createdRollout.getId(), validationMap); - rolloutManagement.startRollout(createdRollout); + rolloutManagement.startRollout(createdRollout.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -599,7 +599,7 @@ public void targetsOfRolloutGetDistributionSetAssignmentByOtherRollout() { expectedTargetCountStatus.put(TotalTargetCountStatus.Status.SCHEDULED, 5L); validateRolloutActionStatus(rolloutOne.getId(), expectedTargetCountStatus); - rolloutManagement.startRollout(rolloutTwo); + rolloutManagement.startRollout(rolloutTwo.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -650,7 +650,7 @@ public void startSecondRolloutAfterFristRolloutEndenWithErrors() { Rollout rolloutTwo = createRolloutByVariables("rolloutTwo", "This is the description for rollout two", amountGroupsForRolloutTwo, "controllerId==rollout-*", distributionSet, "50", "80"); - rolloutManagement.startRollout(rolloutTwo); + rolloutManagement.startRollout(rolloutTwo.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -752,14 +752,14 @@ public void findAllRolloutsWithDetailedStatus() { final String errorCondition = "20"; final Rollout rolloutA = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout, amountGroups, successCondition, errorCondition, "RolloutA", "RolloutA"); - rolloutManagement.startRollout(rolloutA); + rolloutManagement.startRollout(rolloutA.getId()); rolloutManagement.checkStartingRollouts(0); final int amountTargetsForRollout2 = 10; final int amountGroups2 = 2; final Rollout rolloutB = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout2, amountGroups2, successCondition, errorCondition, "RolloutB", "RolloutB"); - rolloutManagement.startRollout(rolloutB); + rolloutManagement.startRollout(rolloutB.getId()); rolloutManagement.checkStartingRollouts(0); changeStatusForAllRunningActions(rolloutB, Status.FINISHED); @@ -769,7 +769,7 @@ public void findAllRolloutsWithDetailedStatus() { final int amountGroups3 = 2; final Rollout rolloutC = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout3, amountGroups3, successCondition, errorCondition, "RolloutC", "RolloutC"); - rolloutManagement.startRollout(rolloutC); + rolloutManagement.startRollout(rolloutC.getId()); rolloutManagement.checkStartingRollouts(0); changeStatusForAllRunningActions(rolloutC, Status.ERROR); @@ -779,7 +779,7 @@ public void findAllRolloutsWithDetailedStatus() { final int amountGroups4 = 3; final Rollout rolloutD = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout4, amountGroups4, successCondition, errorCondition, "RolloutD", "RolloutD"); - rolloutManagement.startRollout(rolloutD); + rolloutManagement.startRollout(rolloutD.getId()); rolloutManagement.checkStartingRollouts(0); changeStatusForRunningActions(rolloutD, Status.ERROR, 1); @@ -873,8 +873,8 @@ public void findRolloutByFilters() { errorCondition, "SomethingElse" + i, "SomethingElse" + i); } - final Slice rollout = rolloutManagement - .findRolloutByFilters(new OffsetBasedPageRequest(0, 100, new Sort(Direction.ASC, "name")), "Rollout%"); + final Slice rollout = rolloutManagement.findRolloutWithDetailedStatusByFilters( + new OffsetBasedPageRequest(0, 100, new Sort(Direction.ASC, "name")), "Rollout%"); final List rolloutList = rollout.getContent(); assertThat(rolloutList.size()).isEqualTo(5); int i = 1; @@ -912,7 +912,7 @@ public void getFinishedPercentForRunningGroup() { final String rolloutName = "MyRollout"; Rollout myRollout = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout, amountGroups, successCondition, errorCondition, rolloutName, rolloutName); - rolloutManagement.startRollout(myRollout); + rolloutManagement.startRollout(myRollout.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -958,7 +958,7 @@ public void findRolloutGroupTargetsWithRsqlParam() { final String rsqlParam = "controllerId==*MyRoll*"; - rolloutManagement.startRollout(myRollout); + rolloutManagement.startRollout(myRollout.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -1060,7 +1060,7 @@ public void createAndStartRolloutWithEmptyGroups() throws Exception { assertThat(groups.get(4).getStatus()).isEqualTo(RolloutGroupStatus.READY); assertThat(groups.get(4).getTotalTargets()).isEqualTo(0); - rolloutManagement.startRollout(myRollout); + rolloutManagement.startRollout(myRollout.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -1096,7 +1096,7 @@ public void createAndStartRollout() throws Exception { "controllerId==" + targetPrefixName + "-*", distributionSet, successCondition, errorCondition); assertThat(myRollout.getStatus()).isEqualTo(RolloutStatus.READY); - rolloutManagement.startRollout(myRollout); + rolloutManagement.startRollout(myRollout.getId()); // Run here, because scheduler is disabled during tests rolloutManagement.checkStartingRollouts(0); @@ -1266,7 +1266,7 @@ public void createAndStartRolloutDuringCreationFails() throws Exception { assertThat(myRollout.getStatus()).isEqualTo(RolloutStatus.CREATING); try { - rolloutManagement.startRollout(myRollout); + rolloutManagement.startRollout(myRollout.getId()); fail("Was able to start a Rollout in CREATING status"); } catch (final RolloutIllegalStateException e) { // OK diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLRolloutGroupFields.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLRolloutGroupFields.java index 99254aca02..230e08139a 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLRolloutGroupFields.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLRolloutGroupFields.java @@ -73,8 +73,8 @@ public void testFilterByParameterDescription() { } private void assertRSQLQuery(final String rsqlParam, final long expcetedTargets) { - final Page findTargetPage = rolloutGroupManagement.findRolloutGroupsAll(rollout, rsqlParam, - new PageRequest(0, 100)); + final Page findTargetPage = rolloutGroupManagement.findRolloutGroupsAll(rollout.getId(), + rsqlParam, new PageRequest(0, 100)); final long countTargetsAll = findTargetPage.getTotalElements(); assertThat(findTargetPage).isNotNull(); assertThat(countTargetsAll).isEqualTo(expcetedTargets); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutBeanQuery.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutBeanQuery.java index 90258fa7fc..a7f1216234 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutBeanQuery.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutBeanQuery.java @@ -109,7 +109,7 @@ protected List loadBeans(final int startIndex, final int count) { rolloutBeans = getRolloutManagement().findAllRolloutsWithDetailedStatus( new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort)); } else { - rolloutBeans = getRolloutManagement().findRolloutByFilters( + rolloutBeans = getRolloutManagement().findRolloutWithDetailedStatusByFilters( new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort), searchText); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java index 0e870a6e56..2721e9a3cc 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutListGrid.java @@ -397,7 +397,7 @@ private void pauseRollout(final Long rolloutId) { final String rolloutName = (String) row.getItemProperty(VAR_NAME).getValue(); - rolloutManagement.pauseRollout(rolloutManagement.findRolloutById(rolloutId)); + rolloutManagement.pauseRollout(rolloutId); uiNotification.displaySuccess(i18n.get("message.rollout.paused", rolloutName)); } @@ -408,13 +408,13 @@ private void startOrResumeRollout(final Long rolloutId) { final String rolloutName = (String) row.getItemProperty(VAR_NAME).getValue(); if (RolloutStatus.READY.equals(rolloutStatus)) { - rolloutManagement.startRollout(rolloutManagement.findRolloutByName(rolloutName)); + rolloutManagement.startRollout(rolloutId); uiNotification.displaySuccess(i18n.get("message.rollout.started", rolloutName)); return; } if (RolloutStatus.PAUSED.equals(rolloutStatus)) { - rolloutManagement.resumeRollout(rolloutManagement.findRolloutById(rolloutId)); + rolloutManagement.resumeRollout(rolloutId); uiNotification.displaySuccess(i18n.get("message.rollout.resumed", rolloutName)); return; }