Fixed broken rollout management API concerning target status map. (#365)

Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>
This commit is contained in:
Kai Zimmermann
2016-11-23 20:57:29 +01:00
committed by Michael Hirsch
parent 54ba35966e
commit a57165686e
15 changed files with 363 additions and 118 deletions

View File

@@ -37,8 +37,8 @@ public class MgmtRolloutResponseBody extends MgmtNamedEntity {
@JsonProperty(required = true) @JsonProperty(required = true)
private Long totalTargets; private Long totalTargets;
@JsonProperty(required = true) @JsonProperty
private final Map<String, Long> totalTargetsPerStatus = new HashMap<>(); private Map<String, Long> totalTargetsPerStatus;
/** /**
* @return the status * @return the status
@@ -121,4 +121,12 @@ public class MgmtRolloutResponseBody extends MgmtNamedEntity {
public Map<String, Long> getTotalTargetsPerStatus() { public Map<String, Long> getTotalTargetsPerStatus() {
return totalTargetsPerStatus; return totalTargetsPerStatus;
} }
public void addTotalTargetsPerStatus(final String status, final Long totalTargetCountByStatus) {
if (totalTargetsPerStatus == null) {
totalTargetsPerStatus = new HashMap<>();
}
totalTargetsPerStatus.put(status, totalTargetCountByStatus);
}
} }

View File

@@ -8,14 +8,14 @@
*/ */
package org.eclipse.hawkbit.mgmt.json.model.rolloutgroup; 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.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty; 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 * Model for the rollout group annotated with json-annotations for easier
* serialization and de-serialization. * serialization and de-serialization.
@@ -32,34 +32,20 @@ public class MgmtRolloutGroupResponseBody extends MgmtRolloutGroup {
private int totalTargets; private int totalTargets;
private final Map<String, Long> totalTargetsPerStatus = new HashMap<>(); private Map<String, Long> totalTargetsPerStatus;
/**
* @return the rolloutGroupId
*/
public Long getRolloutGroupId() { public Long getRolloutGroupId() {
return rolloutGroupId; return rolloutGroupId;
} }
/**
* @param rolloutGroupId
* the rolloutGroupId to set
*/
public void setRolloutGroupId(final Long rolloutGroupId) { public void setRolloutGroupId(final Long rolloutGroupId) {
this.rolloutGroupId = rolloutGroupId; this.rolloutGroupId = rolloutGroupId;
} }
/**
* @return the status
*/
public String getStatus() { public String getStatus() {
return status; return status;
} }
/**
* @param status
* the status to set
*/
public void setStatus(final String status) { public void setStatus(final String status) {
this.status = status; this.status = status;
} }
@@ -68,7 +54,7 @@ public class MgmtRolloutGroupResponseBody extends MgmtRolloutGroup {
return totalTargets; return totalTargets;
} }
public void setTotalTargets(int totalTargets) { public void setTotalTargets(final int totalTargets) {
this.totalTargets = totalTargets; this.totalTargets = totalTargets;
} }
@@ -76,4 +62,12 @@ public class MgmtRolloutGroupResponseBody extends MgmtRolloutGroup {
return totalTargetsPerStatus; return totalTargetsPerStatus;
} }
public void addTotalTargetsPerStatus(final String status, final Long totalTargetCountByStatus) {
if (totalTargetsPerStatus == null) {
totalTargetsPerStatus = new HashMap<>();
}
totalTargetsPerStatus.put(status, totalTargetCountByStatus);
}
} }

View File

@@ -61,10 +61,10 @@ final class MgmtRolloutMapper {
return Collections.emptyList(); 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(); final MgmtRolloutResponseBody body = new MgmtRolloutResponseBody();
body.setCreatedAt(rollout.getCreatedAt()); body.setCreatedAt(rollout.getCreatedAt());
body.setCreatedBy(rollout.getCreatedBy()); body.setCreatedBy(rollout.getCreatedBy());
@@ -78,10 +78,12 @@ final class MgmtRolloutMapper {
body.setStatus(rollout.getStatus().toString().toLowerCase()); body.setStatus(rollout.getStatus().toString().toLowerCase());
body.setTotalTargets(rollout.getTotalTargets()); body.setTotalTargets(rollout.getTotalTargets());
if (withDetails) {
for (final TotalTargetCountStatus.Status status : TotalTargetCountStatus.Status.values()) { for (final TotalTargetCountStatus.Status status : TotalTargetCountStatus.Status.values()) {
body.getTotalTargetsPerStatus().put(status.name().toLowerCase(), body.addTotalTargetsPerStatus(status.name().toLowerCase(),
rollout.getTotalTargetCountStatus().getTotalTargetCountByStatus(status)); rollout.getTotalTargetCountStatus().getTotalTargetCountByStatus(status));
} }
}
body.add(linkTo(methodOn(MgmtRolloutRestApi.class).getRollout(rollout.getId())).withRel("self")); body.add(linkTo(methodOn(MgmtRolloutRestApi.class).getRollout(rollout.getId())).withRel("self"));
body.add(linkTo(methodOn(MgmtRolloutRestApi.class).start(rollout.getId())).withRel("start")); body.add(linkTo(methodOn(MgmtRolloutRestApi.class).start(rollout.getId())).withRel("start"));
@@ -144,10 +146,11 @@ final class MgmtRolloutMapper {
return Collections.emptyList(); return Collections.emptyList();
} }
return rollouts.stream().map(MgmtRolloutMapper::toResponseRolloutGroup).collect(Collectors.toList()); return rollouts.stream().map(group -> 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(); final MgmtRolloutGroupResponseBody body = new MgmtRolloutGroupResponseBody();
body.setCreatedAt(rolloutGroup.getCreatedAt()); body.setCreatedAt(rolloutGroup.getCreatedAt());
body.setCreatedBy(rolloutGroup.getCreatedBy()); body.setCreatedBy(rolloutGroup.getCreatedBy());
@@ -171,10 +174,12 @@ final class MgmtRolloutMapper {
body.setErrorAction( body.setErrorAction(
new MgmtRolloutErrorAction(map(rolloutGroup.getErrorAction()), rolloutGroup.getErrorActionExp())); new MgmtRolloutErrorAction(map(rolloutGroup.getErrorAction()), rolloutGroup.getErrorActionExp()));
if (withDetailedStatus) {
for (final TotalTargetCountStatus.Status status : TotalTargetCountStatus.Status.values()) { for (final TotalTargetCountStatus.Status status : TotalTargetCountStatus.Status.values()) {
body.getTotalTargetsPerStatus().put(status.name().toLowerCase(), body.addTotalTargetsPerStatus(status.name().toLowerCase(),
rolloutGroup.getTotalTargetCountStatus().getTotalTargetCountByStatus(status)); rolloutGroup.getTotalTargetCountStatus().getTotalTargetCountByStatus(status));
} }
}
body.add(linkTo(methodOn(MgmtRolloutRestApi.class).getRolloutGroup(rolloutGroup.getRollout().getId(), body.add(linkTo(methodOn(MgmtRolloutRestApi.class).getRolloutGroup(rolloutGroup.getRollout().getId(),
rolloutGroup.getId())).withRel("self")); rolloutGroup.getId())).withRel("self"));

View File

@@ -83,7 +83,7 @@ public class MgmtRolloutResource implements MgmtRolloutRestApi {
final Page<Rollout> findModulesAll; final Page<Rollout> findModulesAll;
if (rsqlParam != null) { if (rsqlParam != null) {
findModulesAll = this.rolloutManagement.findAllWithDetailedStatusByPredicate(rsqlParam, pageable); findModulesAll = this.rolloutManagement.findAllByPredicate(rsqlParam, pageable);
} else { } else {
findModulesAll = this.rolloutManagement.findAll(pageable); findModulesAll = this.rolloutManagement.findAll(pageable);
} }
@@ -95,7 +95,7 @@ public class MgmtRolloutResource implements MgmtRolloutRestApi {
@Override @Override
public ResponseEntity<MgmtRolloutResponseBody> getRollout(@PathVariable("rolloutId") final Long rolloutId) { public ResponseEntity<MgmtRolloutResponseBody> getRollout(@PathVariable("rolloutId") final Long rolloutId) {
final Rollout findRolloutById = findRolloutOrThrowException(rolloutId); final Rollout findRolloutById = findRolloutOrThrowException(rolloutId);
return new ResponseEntity<>(MgmtRolloutMapper.toResponseRollout(findRolloutById), HttpStatus.OK); return new ResponseEntity<>(MgmtRolloutMapper.toResponseRollout(findRolloutById, true), HttpStatus.OK);
} }
@Override @Override
@@ -126,27 +126,24 @@ public class MgmtRolloutResource implements MgmtRolloutRestApi {
throw new ConstraintViolationException("Either 'amountGroups' or 'groups' must be defined in the request"); 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 @Override
public ResponseEntity<Void> start(@PathVariable("rolloutId") final Long rolloutId) { public ResponseEntity<Void> start(@PathVariable("rolloutId") final Long rolloutId) {
final Rollout rollout = findRolloutOrThrowException(rolloutId); this.rolloutManagement.startRollout(rolloutId);
this.rolloutManagement.startRollout(rollout);
return ResponseEntity.ok().build(); return ResponseEntity.ok().build();
} }
@Override @Override
public ResponseEntity<Void> pause(@PathVariable("rolloutId") final Long rolloutId) { public ResponseEntity<Void> pause(@PathVariable("rolloutId") final Long rolloutId) {
final Rollout rollout = findRolloutOrThrowException(rolloutId); this.rolloutManagement.pauseRollout(rolloutId);
this.rolloutManagement.pauseRollout(rollout);
return ResponseEntity.ok().build(); return ResponseEntity.ok().build();
} }
@Override @Override
public ResponseEntity<Void> resume(@PathVariable("rolloutId") final Long rolloutId) { public ResponseEntity<Void> resume(@PathVariable("rolloutId") final Long rolloutId) {
final Rollout rollout = findRolloutOrThrowException(rolloutId); this.rolloutManagement.resumeRollout(rolloutId);
this.rolloutManagement.resumeRollout(rollout);
return ResponseEntity.ok().build(); return ResponseEntity.ok().build();
} }
@@ -157,8 +154,6 @@ public class MgmtRolloutResource implements MgmtRolloutRestApi {
@RequestParam(value = MgmtRestConstants.REQUEST_PARAMETER_PAGING_LIMIT, defaultValue = MgmtRestConstants.REQUEST_PARAMETER_PAGING_DEFAULT_LIMIT) final int pagingLimitParam, @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_SORTING, required = false) final String sortParam,
@RequestParam(value = MgmtRestConstants.REQUEST_PARAMETER_SEARCH, required = false) final String rsqlParam) { @RequestParam(value = MgmtRestConstants.REQUEST_PARAMETER_SEARCH, required = false) final String rsqlParam) {
final Rollout rollout = findRolloutOrThrowException(rolloutId);
final int sanitizedOffsetParam = PagingUtility.sanitizeOffsetParam(pagingOffsetParam); final int sanitizedOffsetParam = PagingUtility.sanitizeOffsetParam(pagingOffsetParam);
final int sanitizedLimitParam = PagingUtility.sanitizePageLimitParam(pagingLimitParam); final int sanitizedLimitParam = PagingUtility.sanitizePageLimitParam(pagingLimitParam);
final Sort sorting = PagingUtility.sanitizeRolloutGroupSortParam(sortParam); final Sort sorting = PagingUtility.sanitizeRolloutGroupSortParam(sortParam);
@@ -167,7 +162,7 @@ public class MgmtRolloutResource implements MgmtRolloutRestApi {
final Page<RolloutGroup> findRolloutGroupsAll; final Page<RolloutGroup> findRolloutGroupsAll;
if (rsqlParam != null) { if (rsqlParam != null) {
findRolloutGroupsAll = this.rolloutGroupManagement.findRolloutGroupsAll(rollout, rsqlParam, pageable); findRolloutGroupsAll = this.rolloutGroupManagement.findRolloutGroupsAll(rolloutId, rsqlParam, pageable);
} else { } else {
findRolloutGroupsAll = this.rolloutGroupManagement.findRolloutGroupsByRolloutId(rolloutId, pageable); findRolloutGroupsAll = this.rolloutGroupManagement.findRolloutGroupsByRolloutId(rolloutId, pageable);
} }
@@ -182,7 +177,7 @@ public class MgmtRolloutResource implements MgmtRolloutRestApi {
@PathVariable("groupId") final Long groupId) { @PathVariable("groupId") final Long groupId) {
findRolloutOrThrowException(rolloutId); findRolloutOrThrowException(rolloutId);
final RolloutGroup rolloutGroup = findRolloutGroupOrThrowException(groupId); final RolloutGroup rolloutGroup = findRolloutGroupOrThrowException(groupId);
return ResponseEntity.ok(MgmtRolloutMapper.toResponseRolloutGroup(rolloutGroup)); return ResponseEntity.ok(MgmtRolloutMapper.toResponseRolloutGroup(rolloutGroup, true));
} }
@Override @Override
@@ -223,7 +218,8 @@ public class MgmtRolloutResource implements MgmtRolloutRestApi {
} }
private RolloutGroup findRolloutGroupOrThrowException(final Long rolloutGroupId) { private RolloutGroup findRolloutGroupOrThrowException(final Long rolloutGroupId) {
final RolloutGroup rolloutGroup = this.rolloutGroupManagement.findRolloutGroupById(rolloutGroupId); final RolloutGroup rolloutGroup = this.rolloutGroupManagement
.findRolloutGroupWithDetailedStatus(rolloutGroupId);
if (rolloutGroup == null) { if (rolloutGroup == null) {
throw new EntityNotFoundException("Group with Id {" + rolloutGroupId + DOES_NOT_EXIST); throw new EntityNotFoundException("Group with Id {" + rolloutGroupId + DOES_NOT_EXIST);
} }

View File

@@ -9,9 +9,13 @@
package org.eclipse.hawkbit.mgmt.rest.resource; package org.eclipse.hawkbit.mgmt.rest.resource;
import static org.fest.assertions.api.Assertions.assertThat; 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.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.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
@@ -47,6 +51,7 @@ import org.springframework.http.MediaType;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import ru.yandex.qatools.allure.annotations.Features; import ru.yandex.qatools.allure.annotations.Features;
import ru.yandex.qatools.allure.annotations.Step;
import ru.yandex.qatools.allure.annotations.Stories; import ru.yandex.qatools.allure.annotations.Stories;
/** /**
@@ -56,6 +61,8 @@ import ru.yandex.qatools.allure.annotations.Stories;
@Stories("Rollout Resource") @Stories("Rollout Resource")
public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest { public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
private static final String HREF_ROLLOUT_PREFIX = "http://localhost/rest/v1/rollouts/";
@Autowired @Autowired
private RolloutManagement rolloutManagement; private RolloutManagement rolloutManagement;
@@ -123,7 +130,7 @@ public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
testdataFactory.createTargets(20, "target", "rollout"); testdataFactory.createTargets(20, "target", "rollout");
final DistributionSet dsA = testdataFactory.createDistributionSet(""); final DistributionSet dsA = testdataFactory.createDistributionSet("");
postRollout("rollout1", 10, dsA.getId(), "id==target*"); postRollout("rollout1", 10, dsA.getId(), "id==target*", 20);
} }
@Test @Test
@@ -211,6 +218,103 @@ public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
.andExpect(jsonPath("$.content", hasSize(0))).andExpect(jsonPath("$.total", equalTo(0))); .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 @Test
@Description("Testing that rollout paged list contains rollouts") @Description("Testing that rollout paged list contains rollouts")
public void rolloutPagedListContainsAllRollouts() throws Exception { public void rolloutPagedListContainsAllRollouts() throws Exception {
@@ -219,8 +323,8 @@ public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
testdataFactory.createTargets(20, "target", "rollout"); testdataFactory.createTargets(20, "target", "rollout");
// setup - create 2 rollouts // setup - create 2 rollouts
postRollout("rollout1", 10, dsA.getId(), "id==target*"); postRollout("rollout1", 10, dsA.getId(), "id==target*", 20);
postRollout("rollout2", 5, dsA.getId(), "id==target-0001*"); postRollout("rollout2", 5, dsA.getId(), "id==target-0001*", 10);
// Run here, because Scheduler is disabled during tests // Run here, because Scheduler is disabled during tests
rolloutManagement.checkCreatingRollouts(0); rolloutManagement.checkCreatingRollouts(0);
@@ -232,10 +336,40 @@ public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
.andExpect(jsonPath("content[0].status", equalTo("ready"))) .andExpect(jsonPath("content[0].status", equalTo("ready")))
.andExpect(jsonPath("content[0].targetFilterQuery", equalTo("id==target*"))) .andExpect(jsonPath("content[0].targetFilterQuery", equalTo("id==target*")))
.andExpect(jsonPath("content[0].distributionSetId", equalTo(dsA.getId().intValue()))) .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].name", equalTo("rollout2")))
.andExpect(jsonPath("content[1].status", equalTo("ready"))) .andExpect(jsonPath("content[1].status", equalTo("ready")))
.andExpect(jsonPath("content[1].targetFilterQuery", equalTo("id==target-0001*"))) .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 @Test
@@ -246,8 +380,8 @@ public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
testdataFactory.createTargets(20, "target", "rollout"); testdataFactory.createTargets(20, "target", "rollout");
// setup - create 2 rollouts // setup - create 2 rollouts
postRollout("rollout1", 10, dsA.getId(), "id==target*"); postRollout("rollout1", 10, dsA.getId(), "id==target*", 20);
postRollout("rollout2", 5, dsA.getId(), "id==target*"); postRollout("rollout2", 5, dsA.getId(), "id==target*", 20);
// Run here, because Scheduler is disabled during tests // Run here, because Scheduler is disabled during tests
rolloutManagement.checkCreatingRollouts(0); rolloutManagement.checkCreatingRollouts(0);
@@ -445,23 +579,100 @@ public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
@Description("Testing that a single rollout group can be retrieved") @Description("Testing that a single rollout group can be retrieved")
public void retrieveSingleRolloutGroup() throws Exception { public void retrieveSingleRolloutGroup() throws Exception {
// setup // setup
final int amountTargets = 10; final int amountTargets = 20;
testdataFactory.createTargets(amountTargets, "rollout", "rollout"); testdataFactory.createTargets(amountTargets, "rollout", "rollout");
final DistributionSet dsA = testdataFactory.createDistributionSet(""); final DistributionSet dsA = testdataFactory.createDistributionSet("");
// create rollout including the created targets with prefix 'rollout' // 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 final RolloutGroup firstGroup = rolloutGroupManagement
.findRolloutGroupsByRolloutId(rollout.getId(), new PageRequest(0, 1, Direction.ASC, "id")).getContent() .findRolloutGroupsByRolloutId(rollout.getId(), new PageRequest(0, 1, Direction.ASC, "id")).getContent()
.get(0); .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())) mvc.perform(get("/rest/v1/rollouts/{rolloutId}/deploygroups/{groupId}", rollout.getId(), firstGroup.getId()))
.andDo(MockMvcResultPrinter.print()).andExpect(status().isOk()) .andDo(MockMvcResultPrinter.print()).andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(jsonPath("id", equalTo(firstGroup.getId().intValue()))) .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 @Test
@@ -521,7 +732,7 @@ public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
// create rollout including the created targets with prefix 'rollout' // create rollout including the created targets with prefix 'rollout'
final Rollout rollout = createRollout("rollout1", 2, dsA.getId(), "controllerId==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 // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -664,13 +875,37 @@ public class MgmtRolloutResourceTest extends AbstractRestIntegrationTest {
return duration <= timeout || timeout < 0; return duration <= timeout || timeout < 0;
} }
private void postRollout(final String name, final int groupSize, final long distributionSetId, private void postRollout(final String name, final int groupSize, final Long distributionSetId,
final String targetFilterQuery) throws Exception { final String targetFilterQuery, final int targets) throws Exception {
mvc.perform(post("/rest/v1/rollouts") mvc.perform(post("/rest/v1/rollouts")
.content(JsonBuilder.rollout(name, "desc", groupSize, distributionSetId, targetFilterQuery, .content(JsonBuilder.rollout(name, "desc", groupSize, distributionSetId, targetFilterQuery,
new RolloutGroupConditionBuilder().withDefaults().build())) new RolloutGroupConditionBuilder().withDefaults().build()))
.contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)) .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, private Rollout createRollout(final String name, final int amountGroups, final long distributionSetId,

View File

@@ -108,9 +108,6 @@ public interface ControllerManagement {
* @throws TooManyStatusEntriesException * @throws TooManyStatusEntriesException
* if more than the allowed number of status entries are * if more than the allowed number of status entries are
* inserted * inserted
* @throws TooManyStatusEntriesException
* if more than the allowed number of status entries are
* inserted
*/ */
@PreAuthorize(SpringEvalExpressions.IS_CONTROLLER) @PreAuthorize(SpringEvalExpressions.IS_CONTROLLER)
Action addUpdateActionStatus(@NotNull ActionStatusCreate create); Action addUpdateActionStatus(@NotNull ActionStatusCreate create);

View File

@@ -90,7 +90,7 @@ public interface RolloutGroupManagement {
* if the RSQL syntax is wrong * if the RSQL syntax is wrong
*/ */
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_READ) @PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_READ)
Page<RolloutGroup> findRolloutGroupsAll(@NotNull Rollout rollout, @NotNull String rsqlParam, Page<RolloutGroup> findRolloutGroupsAll(@NotNull Long rollout, @NotNull String rsqlParam,
@NotNull Pageable pageable); @NotNull Pageable pageable);
/** /**

View File

@@ -236,7 +236,7 @@ public interface RolloutManagement {
* if the RSQL syntax is wrong * if the RSQL syntax is wrong
*/ */
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_READ) @PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_READ)
Page<Rollout> findAllWithDetailedStatusByPredicate(@NotNull String rsqlParam, @NotNull Pageable pageable); Page<Rollout> findAllByPredicate(@NotNull String rsqlParam, @NotNull Pageable pageable);
/** /**
* Finds rollouts by given text in name or description. * Finds rollouts by given text in name or description.
@@ -249,7 +249,7 @@ public interface RolloutManagement {
* not exists * not exists
*/ */
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_READ) @PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_READ)
Slice<Rollout> findRolloutByFilters(@NotNull Pageable pageable, @NotEmpty String searchText); Slice<Rollout> findRolloutWithDetailedStatusByFilters(@NotNull Pageable pageable, @NotEmpty String searchText);
/** /**
* Retrieves a specific rollout by its ID. * Retrieves a specific rollout by its ID.
@@ -312,12 +312,14 @@ public interface RolloutManagement {
* @param rollout * @param rollout
* the rollout to be paused. * the rollout to be paused.
* *
* @throws EntityNotFoundException
* if rollout with given ID does not exist
* @throws RolloutIllegalStateException * @throws RolloutIllegalStateException
* if given rollout is not in {@link RolloutStatus#RUNNING}. * if given rollout is not in {@link RolloutStatus#RUNNING}.
* Only running rollouts can be paused. * Only running rollouts can be paused.
*/ */
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_WRITE) @PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_WRITE)
void pauseRollout(@NotNull Rollout rollout); void pauseRollout(@NotNull Long rollout);
/** /**
* Resumes a paused rollout. The rollout switches back to * Resumes a paused rollout. The rollout switches back to
@@ -326,12 +328,15 @@ public interface RolloutManagement {
* *
* @param rollout * @param rollout
* the rollout to be resumed * the rollout to be resumed
*
* @throws EntityNotFoundException
* if rollout with given ID does not exist
* @throws RolloutIllegalStateException * @throws RolloutIllegalStateException
* if given rollout is not in {@link RolloutStatus#PAUSED}. Only * if given rollout is not in {@link RolloutStatus#PAUSED}. Only
* paused rollouts can be resumed. * paused rollouts can be resumed.
*/ */
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_WRITE) @PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_WRITE)
void resumeRollout(@NotNull Rollout rollout); void resumeRollout(@NotNull Long rollout);
/** /**
* Starts a rollout which has been created. The rollout must be in * Starts a rollout which has been created. The rollout must be in
@@ -345,12 +350,14 @@ public interface RolloutManagement {
* *
* @return started rollout * @return started rollout
* *
* @throws EntityNotFoundException
* if rollout with given ID does not exist
* @throws RolloutIllegalStateException * @throws RolloutIllegalStateException
* if given rollout is not in {@link RolloutStatus#READY}. Only * if given rollout is not in {@link RolloutStatus#READY}. Only
* ready rollouts can be started. * ready rollouts can be started.
*/ */
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_WRITE) @PreAuthorize(SpringEvalExpressions.HAS_AUTH_ROLLOUT_MANAGEMENT_WRITE)
Rollout startRollout(@NotNull Rollout rollout); Rollout startRollout(@NotNull Long rollout);
/** /**
* Update rollout details. * Update rollout details.

View File

@@ -29,13 +29,13 @@ import org.eclipse.hawkbit.repository.jpa.model.JpaAction;
import org.eclipse.hawkbit.repository.jpa.model.JpaAction_; import org.eclipse.hawkbit.repository.jpa.model.JpaAction_;
import org.eclipse.hawkbit.repository.jpa.model.JpaRolloutGroup; import org.eclipse.hawkbit.repository.jpa.model.JpaRolloutGroup;
import org.eclipse.hawkbit.repository.jpa.model.JpaRolloutGroup_; import org.eclipse.hawkbit.repository.jpa.model.JpaRolloutGroup_;
import org.eclipse.hawkbit.repository.jpa.model.JpaRollout_;
import org.eclipse.hawkbit.repository.jpa.model.JpaTarget; import org.eclipse.hawkbit.repository.jpa.model.JpaTarget;
import org.eclipse.hawkbit.repository.jpa.model.JpaTarget_; import org.eclipse.hawkbit.repository.jpa.model.JpaTarget_;
import org.eclipse.hawkbit.repository.jpa.model.RolloutTargetGroup; import org.eclipse.hawkbit.repository.jpa.model.RolloutTargetGroup;
import org.eclipse.hawkbit.repository.jpa.model.RolloutTargetGroup_; import org.eclipse.hawkbit.repository.jpa.model.RolloutTargetGroup_;
import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility; import org.eclipse.hawkbit.repository.jpa.rsql.RSQLUtility;
import org.eclipse.hawkbit.repository.model.Action; import org.eclipse.hawkbit.repository.model.Action;
import org.eclipse.hawkbit.repository.model.Rollout;
import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus; import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus;
import org.eclipse.hawkbit.repository.model.RolloutGroup; import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.Target;
@@ -94,7 +94,7 @@ public class JpaRolloutGroupManagement implements RolloutGroupManagement {
} }
@Override @Override
public Page<RolloutGroup> findRolloutGroupsAll(final Rollout rollout, final String rsqlParam, public Page<RolloutGroup> findRolloutGroupsAll(final Long rolloutId, final String rsqlParam,
final Pageable pageable) { final Pageable pageable) {
final Specification<JpaRolloutGroup> specification = RSQLUtility.parse(rsqlParam, RolloutGroupFields.class, final Specification<JpaRolloutGroup> specification = RSQLUtility.parse(rsqlParam, RolloutGroupFields.class,
@@ -103,8 +103,9 @@ public class JpaRolloutGroupManagement implements RolloutGroupManagement {
return convertPage( return convertPage(
rolloutGroupRepository rolloutGroupRepository
.findAll( .findAll(
(root, query, criteriaBuilder) -> criteriaBuilder.and( (root, query,
criteriaBuilder.equal(root.get(JpaRolloutGroup_.rollout), rollout), criteriaBuilder) -> criteriaBuilder.and(criteriaBuilder.equal(
root.get(JpaRolloutGroup_.rollout).get(JpaRollout_.id), rolloutId),
specification.toPredicate(root, query, criteriaBuilder)), specification.toPredicate(root, query, criteriaBuilder)),
pageable), pageable),
pageable); pageable);

View File

@@ -148,13 +148,12 @@ public class JpaRolloutManagement implements RolloutManagement {
} }
@Override @Override
public Page<Rollout> findAllWithDetailedStatusByPredicate(final String rsqlParam, final Pageable pageable) { public Page<Rollout> findAllByPredicate(final String rsqlParam, final Pageable pageable) {
final Specification<JpaRollout> specification = RSQLUtility.parse(rsqlParam, RolloutFields.class, final Specification<JpaRollout> specification = RSQLUtility.parse(rsqlParam, RolloutFields.class,
virtualPropertyReplacer); virtualPropertyReplacer);
final Page<JpaRollout> findAll = rolloutRepository.findAll(specification, pageable); final Page<JpaRollout> findAll = rolloutRepository.findAll(specification, pageable);
setRolloutStatusDetails(findAll);
return convertPage(findAll, pageable); return convertPage(findAll, pageable);
} }
@@ -468,11 +467,12 @@ public class JpaRolloutManagement implements RolloutManagement {
@Override @Override
@Transactional(isolation = Isolation.READ_UNCOMMITTED) @Transactional(isolation = Isolation.READ_UNCOMMITTED)
@Modifying @Modifying
public Rollout startRollout(final Rollout rollout) { public Rollout startRollout(final Long rolloutId) {
final JpaRollout mergedRollout = entityManager.merge((JpaRollout) rollout); final JpaRollout rollout = Optional.ofNullable(rolloutRepository.findOne(rolloutId))
checkIfRolloutCanStarted(rollout, mergedRollout); .orElseThrow(() -> new EntityNotFoundException("Rollout with id " + rolloutId + " not found."));
mergedRollout.setStatus(RolloutStatus.STARTING); checkIfRolloutCanStarted(rollout, rollout);
return rolloutRepository.save(mergedRollout); rollout.setStatus(RolloutStatus.STARTING);
return rolloutRepository.save(rollout);
} }
private void startFirstRolloutGroup(final Rollout rollout) { private void startFirstRolloutGroup(final Rollout rollout) {
@@ -575,9 +575,10 @@ public class JpaRolloutManagement implements RolloutManagement {
@Override @Override
@Transactional(isolation = Isolation.READ_UNCOMMITTED) @Transactional(isolation = Isolation.READ_UNCOMMITTED)
@Modifying @Modifying
public void pauseRollout(final Rollout rollout) { public void pauseRollout(final Long rolloutId) {
final JpaRollout mergedRollout = entityManager.merge((JpaRollout) rollout); final JpaRollout rollout = Optional.ofNullable(rolloutRepository.findOne(rolloutId))
if (mergedRollout.getStatus() != RolloutStatus.RUNNING) { .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 " throw new RolloutIllegalStateException("Rollout can only be paused in state running but current state is "
+ rollout.getStatus().name().toLowerCase()); + rollout.getStatus().name().toLowerCase());
} }
@@ -586,21 +587,22 @@ public class JpaRolloutManagement implements RolloutManagement {
// not started until rollout goes back to running state again. The // not started until rollout goes back to running state again. The
// periodically check for running rollouts will skip rollouts in pause // periodically check for running rollouts will skip rollouts in pause
// state. // state.
mergedRollout.setStatus(RolloutStatus.PAUSED); rollout.setStatus(RolloutStatus.PAUSED);
rolloutRepository.save(mergedRollout); rolloutRepository.save(rollout);
} }
@Override @Override
@Transactional(isolation = Isolation.READ_UNCOMMITTED) @Transactional(isolation = Isolation.READ_UNCOMMITTED)
@Modifying @Modifying
public void resumeRollout(final Rollout rollout) { public void resumeRollout(final Long rolloutId) {
final JpaRollout mergedRollout = entityManager.merge((JpaRollout) rollout); final JpaRollout rollout = Optional.ofNullable(rolloutRepository.findOne(rolloutId))
if (!(RolloutStatus.PAUSED.equals(mergedRollout.getStatus()))) { .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 " throw new RolloutIllegalStateException("Rollout can only be resumed in state paused but current state is "
+ rollout.getStatus().name().toLowerCase()); + rollout.getStatus().name().toLowerCase());
} }
mergedRollout.setStatus(RolloutStatus.RUNNING); rollout.setStatus(RolloutStatus.RUNNING);
rolloutRepository.save(mergedRollout); rolloutRepository.save(rollout);
} }
@Override @Override
@@ -834,7 +836,7 @@ public class JpaRolloutManagement implements RolloutManagement {
} }
@Override @Override
public Slice<Rollout> findRolloutByFilters(final Pageable pageable, final String searchText) { public Slice<Rollout> findRolloutWithDetailedStatusByFilters(final Pageable pageable, final String searchText) {
final Specification<JpaRollout> specs = likeNameOrDescription(searchText); final Specification<JpaRollout> specs = likeNameOrDescription(searchText);
final Slice<JpaRollout> findAll = criteriaNoCountDao.findAll(specs, pageable, JpaRollout.class); final Slice<JpaRollout> findAll = criteriaNoCountDao.findAll(specs, pageable, JpaRollout.class);
setRolloutStatusDetails(findAll); setRolloutStatusDetails(findAll);

View File

@@ -46,7 +46,7 @@ public class PauseRolloutGroupAction implements RolloutGroupActionEvaluator {
systemSecurityContext.runAsSystem(() -> { systemSecurityContext.runAsSystem(() -> {
rolloutGroup.setStatus(RolloutGroupStatus.ERROR); rolloutGroup.setStatus(RolloutGroupStatus.ERROR);
rolloutGroupRepository.save(rolloutGroup); rolloutGroupRepository.save(rolloutGroup);
rolloutManagement.pauseRollout(rollout); rolloutManagement.pauseRollout(rollout.getId());
return null; return null;
}); });
} }

View File

@@ -191,7 +191,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
final Rollout createdRollout = createSimpleTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout, final Rollout createdRollout = createSimpleTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout,
amountOtherTargets, amountGroups, successCondition, errorCondition); amountOtherTargets, amountGroups, successCondition, errorCondition);
rolloutManagement.startRollout(createdRollout); rolloutManagement.startRollout(createdRollout.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -334,7 +334,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
scheduleGroups.forEach(group -> assertThat(group.getStatus()).isEqualTo(RolloutGroupStatus.SCHEDULED)); scheduleGroups.forEach(group -> assertThat(group.getStatus()).isEqualTo(RolloutGroupStatus.SCHEDULED));
// resume the rollout again after it gets paused by error action // 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 // the rollout should be running again
assertThat(rolloutManagement.findRolloutById(createdRollout.getId()).getStatus()) assertThat(rolloutManagement.findRolloutById(createdRollout.getId()).getStatus())
@@ -406,7 +406,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
validationMap.put(TotalTargetCountStatus.Status.NOTSTARTED, 8L); validationMap.put(TotalTargetCountStatus.Status.NOTSTARTED, 8L);
validateRolloutActionStatus(createdRollout.getId(), validationMap); validateRolloutActionStatus(createdRollout.getId(), validationMap);
rolloutManagement.startRollout(createdRollout); rolloutManagement.startRollout(createdRollout.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -469,7 +469,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
validationMap.put(TotalTargetCountStatus.Status.NOTSTARTED, 8L); validationMap.put(TotalTargetCountStatus.Status.NOTSTARTED, 8L);
validateRolloutActionStatus(createdRollout.getId(), validationMap); validateRolloutActionStatus(createdRollout.getId(), validationMap);
rolloutManagement.startRollout(createdRollout); rolloutManagement.startRollout(createdRollout.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -599,7 +599,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
expectedTargetCountStatus.put(TotalTargetCountStatus.Status.SCHEDULED, 5L); expectedTargetCountStatus.put(TotalTargetCountStatus.Status.SCHEDULED, 5L);
validateRolloutActionStatus(rolloutOne.getId(), expectedTargetCountStatus); validateRolloutActionStatus(rolloutOne.getId(), expectedTargetCountStatus);
rolloutManagement.startRollout(rolloutTwo); rolloutManagement.startRollout(rolloutTwo.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -650,7 +650,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
Rollout rolloutTwo = createRolloutByVariables("rolloutTwo", "This is the description for rollout two", Rollout rolloutTwo = createRolloutByVariables("rolloutTwo", "This is the description for rollout two",
amountGroupsForRolloutTwo, "controllerId==rollout-*", distributionSet, "50", "80"); amountGroupsForRolloutTwo, "controllerId==rollout-*", distributionSet, "50", "80");
rolloutManagement.startRollout(rolloutTwo); rolloutManagement.startRollout(rolloutTwo.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -752,14 +752,14 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
final String errorCondition = "20"; final String errorCondition = "20";
final Rollout rolloutA = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout, amountGroups, final Rollout rolloutA = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout, amountGroups,
successCondition, errorCondition, "RolloutA", "RolloutA"); successCondition, errorCondition, "RolloutA", "RolloutA");
rolloutManagement.startRollout(rolloutA); rolloutManagement.startRollout(rolloutA.getId());
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
final int amountTargetsForRollout2 = 10; final int amountTargetsForRollout2 = 10;
final int amountGroups2 = 2; final int amountGroups2 = 2;
final Rollout rolloutB = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout2, amountGroups2, final Rollout rolloutB = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout2, amountGroups2,
successCondition, errorCondition, "RolloutB", "RolloutB"); successCondition, errorCondition, "RolloutB", "RolloutB");
rolloutManagement.startRollout(rolloutB); rolloutManagement.startRollout(rolloutB.getId());
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
changeStatusForAllRunningActions(rolloutB, Status.FINISHED); changeStatusForAllRunningActions(rolloutB, Status.FINISHED);
@@ -769,7 +769,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
final int amountGroups3 = 2; final int amountGroups3 = 2;
final Rollout rolloutC = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout3, amountGroups3, final Rollout rolloutC = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout3, amountGroups3,
successCondition, errorCondition, "RolloutC", "RolloutC"); successCondition, errorCondition, "RolloutC", "RolloutC");
rolloutManagement.startRollout(rolloutC); rolloutManagement.startRollout(rolloutC.getId());
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
changeStatusForAllRunningActions(rolloutC, Status.ERROR); changeStatusForAllRunningActions(rolloutC, Status.ERROR);
@@ -779,7 +779,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
final int amountGroups4 = 3; final int amountGroups4 = 3;
final Rollout rolloutD = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout4, amountGroups4, final Rollout rolloutD = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout4, amountGroups4,
successCondition, errorCondition, "RolloutD", "RolloutD"); successCondition, errorCondition, "RolloutD", "RolloutD");
rolloutManagement.startRollout(rolloutD); rolloutManagement.startRollout(rolloutD.getId());
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
changeStatusForRunningActions(rolloutD, Status.ERROR, 1); changeStatusForRunningActions(rolloutD, Status.ERROR, 1);
@@ -873,8 +873,8 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
errorCondition, "SomethingElse" + i, "SomethingElse" + i); errorCondition, "SomethingElse" + i, "SomethingElse" + i);
} }
final Slice<Rollout> rollout = rolloutManagement final Slice<Rollout> rollout = rolloutManagement.findRolloutWithDetailedStatusByFilters(
.findRolloutByFilters(new OffsetBasedPageRequest(0, 100, new Sort(Direction.ASC, "name")), "Rollout%"); new OffsetBasedPageRequest(0, 100, new Sort(Direction.ASC, "name")), "Rollout%");
final List<Rollout> rolloutList = rollout.getContent(); final List<Rollout> rolloutList = rollout.getContent();
assertThat(rolloutList.size()).isEqualTo(5); assertThat(rolloutList.size()).isEqualTo(5);
int i = 1; int i = 1;
@@ -912,7 +912,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
final String rolloutName = "MyRollout"; final String rolloutName = "MyRollout";
Rollout myRollout = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout, amountGroups, Rollout myRollout = createTestRolloutWithTargetsAndDistributionSet(amountTargetsForRollout, amountGroups,
successCondition, errorCondition, rolloutName, rolloutName); successCondition, errorCondition, rolloutName, rolloutName);
rolloutManagement.startRollout(myRollout); rolloutManagement.startRollout(myRollout.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -958,7 +958,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
final String rsqlParam = "controllerId==*MyRoll*"; final String rsqlParam = "controllerId==*MyRoll*";
rolloutManagement.startRollout(myRollout); rolloutManagement.startRollout(myRollout.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -1060,7 +1060,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
assertThat(groups.get(4).getStatus()).isEqualTo(RolloutGroupStatus.READY); assertThat(groups.get(4).getStatus()).isEqualTo(RolloutGroupStatus.READY);
assertThat(groups.get(4).getTotalTargets()).isEqualTo(0); assertThat(groups.get(4).getTotalTargets()).isEqualTo(0);
rolloutManagement.startRollout(myRollout); rolloutManagement.startRollout(myRollout.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -1096,7 +1096,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
"controllerId==" + targetPrefixName + "-*", distributionSet, successCondition, errorCondition); "controllerId==" + targetPrefixName + "-*", distributionSet, successCondition, errorCondition);
assertThat(myRollout.getStatus()).isEqualTo(RolloutStatus.READY); assertThat(myRollout.getStatus()).isEqualTo(RolloutStatus.READY);
rolloutManagement.startRollout(myRollout); rolloutManagement.startRollout(myRollout.getId());
// Run here, because scheduler is disabled during tests // Run here, because scheduler is disabled during tests
rolloutManagement.checkStartingRollouts(0); rolloutManagement.checkStartingRollouts(0);
@@ -1266,7 +1266,7 @@ public class RolloutManagementTest extends AbstractJpaIntegrationTest {
assertThat(myRollout.getStatus()).isEqualTo(RolloutStatus.CREATING); assertThat(myRollout.getStatus()).isEqualTo(RolloutStatus.CREATING);
try { try {
rolloutManagement.startRollout(myRollout); rolloutManagement.startRollout(myRollout.getId());
fail("Was able to start a Rollout in CREATING status"); fail("Was able to start a Rollout in CREATING status");
} catch (final RolloutIllegalStateException e) { } catch (final RolloutIllegalStateException e) {
// OK // OK

View File

@@ -73,8 +73,8 @@ public class RSQLRolloutGroupFields extends AbstractJpaIntegrationTest {
} }
private void assertRSQLQuery(final String rsqlParam, final long expcetedTargets) { private void assertRSQLQuery(final String rsqlParam, final long expcetedTargets) {
final Page<RolloutGroup> findTargetPage = rolloutGroupManagement.findRolloutGroupsAll(rollout, rsqlParam, final Page<RolloutGroup> findTargetPage = rolloutGroupManagement.findRolloutGroupsAll(rollout.getId(),
new PageRequest(0, 100)); rsqlParam, new PageRequest(0, 100));
final long countTargetsAll = findTargetPage.getTotalElements(); final long countTargetsAll = findTargetPage.getTotalElements();
assertThat(findTargetPage).isNotNull(); assertThat(findTargetPage).isNotNull();
assertThat(countTargetsAll).isEqualTo(expcetedTargets); assertThat(countTargetsAll).isEqualTo(expcetedTargets);

View File

@@ -109,7 +109,7 @@ public class RolloutBeanQuery extends AbstractBeanQuery<ProxyRollout> {
rolloutBeans = getRolloutManagement().findAllRolloutsWithDetailedStatus( rolloutBeans = getRolloutManagement().findAllRolloutsWithDetailedStatus(
new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort)); new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort));
} else { } else {
rolloutBeans = getRolloutManagement().findRolloutByFilters( rolloutBeans = getRolloutManagement().findRolloutWithDetailedStatusByFilters(
new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort), new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort),
searchText); searchText);
} }

View File

@@ -397,7 +397,7 @@ public class RolloutListGrid extends AbstractGrid {
final String rolloutName = (String) row.getItemProperty(VAR_NAME).getValue(); 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)); uiNotification.displaySuccess(i18n.get("message.rollout.paused", rolloutName));
} }
@@ -408,13 +408,13 @@ public class RolloutListGrid extends AbstractGrid {
final String rolloutName = (String) row.getItemProperty(VAR_NAME).getValue(); final String rolloutName = (String) row.getItemProperty(VAR_NAME).getValue();
if (RolloutStatus.READY.equals(rolloutStatus)) { if (RolloutStatus.READY.equals(rolloutStatus)) {
rolloutManagement.startRollout(rolloutManagement.findRolloutByName(rolloutName)); rolloutManagement.startRollout(rolloutId);
uiNotification.displaySuccess(i18n.get("message.rollout.started", rolloutName)); uiNotification.displaySuccess(i18n.get("message.rollout.started", rolloutName));
return; return;
} }
if (RolloutStatus.PAUSED.equals(rolloutStatus)) { if (RolloutStatus.PAUSED.equals(rolloutStatus)) {
rolloutManagement.resumeRollout(rolloutManagement.findRolloutById(rolloutId)); rolloutManagement.resumeRollout(rolloutId);
uiNotification.displaySuccess(i18n.get("message.rollout.resumed", rolloutName)); uiNotification.displaySuccess(i18n.get("message.rollout.resumed", rolloutName));
return; return;
} }