From 293fad68c0d18a5074238a511d9e0ada979fde84 Mon Sep 17 00:00:00 2001 From: Akshat Soni Date: Mon, 10 Apr 2023 15:59:03 +0530 Subject: [PATCH] Akshat | TP-12345 | dev hotfix (#50) * TP-12345 | add play experiment * TP-12345 | sort experiment audit trails * TP-12345 | add tests * TP-12345 | change name from play to restart * TP-12345 | change log lines * TP-12345 | resolve https://github.cmd.navi-tech.in/medici/litmus/pull/50#discussion_r106754 --- .../main/java/com/navi/medici/Constants.java | 1 + .../controller/v2/ExperimentControllerV2.java | 9 +++++- .../service/experiment/ExperimentService.java | 2 ++ .../experiment/ExperimentServiceImpl.java | 32 ++++++++++++++++--- .../v2/ExperimentControllerV2Test.java | 11 +++++++ .../experiment/ExperimentServiceImplTest.java | 9 ++++++ 6 files changed, 59 insertions(+), 5 deletions(-) diff --git a/litmus-core/src/main/java/com/navi/medici/Constants.java b/litmus-core/src/main/java/com/navi/medici/Constants.java index 76ac181..bbc42ae 100644 --- a/litmus-core/src/main/java/com/navi/medici/Constants.java +++ b/litmus-core/src/main/java/com/navi/medici/Constants.java @@ -12,4 +12,5 @@ public class Constants { public static final String EXPERIMENT_ROLL_BACKED = "Experiment has been roll-backed"; public static final String PAUSE_EXPERIMENT = "Experiment has been paused"; public static final String METRIC_ATTACHED = "Metric %s attached to experiment"; + public static final String EXPERIMENT_RESTARTED = "Experiment Restarted"; } diff --git a/litmus-core/src/main/java/com/navi/medici/controller/v2/ExperimentControllerV2.java b/litmus-core/src/main/java/com/navi/medici/controller/v2/ExperimentControllerV2.java index 1a35649..53df3ff 100644 --- a/litmus-core/src/main/java/com/navi/medici/controller/v2/ExperimentControllerV2.java +++ b/litmus-core/src/main/java/com/navi/medici/controller/v2/ExperimentControllerV2.java @@ -110,10 +110,17 @@ public class ExperimentControllerV2 { @PutMapping("/rollback/{experimentId}") public void rollbackExperiment(@PathVariable("experimentId") String experimentId, @RequestHeader(Constants.HEADER_EMAIL_ID) String emailId) { - log.info("Release request received for experimentId: {}", experimentId); + log.info("Rollback request received for experimentId: {}", experimentId); experimentService.rollbackExperiment(experimentId, emailId); } + @PutMapping("/restart/{experimentId}") + public void restartExperiment(@PathVariable("experimentId") String experimentId, + @RequestHeader(Constants.HEADER_EMAIL_ID) String emailId) { + log.info("Restart request received for experimentId: {}", experimentId); + experimentService.restartExperiment(experimentId, emailId); + } + @GetMapping("/audit-trail/{experimentId}") public ResponseEntity> getExperimentAuditTrail(@PathVariable("experimentId") String experimentId) { return ResponseEntity.ok(experimentService.getExperimentAuditTrail(experimentId)); diff --git a/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentService.java b/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentService.java index 456ddd0..cf35d8d 100644 --- a/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentService.java +++ b/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentService.java @@ -53,5 +53,7 @@ public interface ExperimentService { void rollbackExperiment(String experimentId, String emailId); + void restartExperiment(String experimentId, String emailId); + List getExperimentAuditTrail(String experimentId); } diff --git a/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentServiceImpl.java b/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentServiceImpl.java index 9ae078b..f846580 100644 --- a/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentServiceImpl.java +++ b/litmus-core/src/main/java/com/navi/medici/service/experiment/ExperimentServiceImpl.java @@ -54,6 +54,7 @@ import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -63,6 +64,7 @@ import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; +import static com.navi.medici.enums.ExperimentType.EXPERIMENT; import static com.navi.medici.enums.ExperimentType.KILL_SWITCH; import static com.navi.medici.enums.ExperimentType.RELEASE; @@ -396,12 +398,13 @@ public class ExperimentServiceImpl implements ExperimentService { ExperimentEntity experiment = getExperimentEntityFromId(experimentId); log.info("Releasing experiment with experimentId: {}", experimentId); ExperimentStatus experimentStatus = experiment.getExperimentInfo().getExperimentStatus(); - if (!experimentStatus.equals(ExperimentStatus.RUNNING)) { + if (experimentStatus.equals(ExperimentStatus.DONE)) { throw new UnableToChangeExperimentStatusException("Unable to change release experiment as experiment is in " + experimentStatus.toString() + " state"); } experiment.getExperimentInfo().setExperimentStatus(ExperimentStatus.DONE); experiment.setType(RELEASE); experiment.setUpdatedBy(emailId); + log.info("Saving audit trail for releasing of experiment: {}", experiment.getName()); saveAuditTrail(experimentId, Constants.EXPERIMENT_RELEASED, emailId); experiment.setUpdatedBy(emailId); experimentQuery.save(experiment); @@ -418,6 +421,7 @@ public class ExperimentServiceImpl implements ExperimentService { experiment.getExperimentInfo().setExperimentStatus(ExperimentStatus.HOLD); experiment.setType(KILL_SWITCH); experiment.setUpdatedBy(emailId); + log.info("Saving audit trail for pausing of experiment: {}", experiment.getName()); saveAuditTrail(experimentId, Constants.PAUSE_EXPERIMENT, emailId); experiment.setUpdatedBy(emailId); experimentQuery.save(experiment); @@ -428,17 +432,35 @@ public class ExperimentServiceImpl implements ExperimentService { ExperimentEntity experiment = getExperimentEntityFromId(experimentId); log.info("Rollbacking experiment with experimentId: {}", experimentId); ExperimentStatus experimentStatus = experiment.getExperimentInfo().getExperimentStatus(); - if (!experimentStatus.equals(ExperimentStatus.RUNNING)) { - throw new UnableToChangeExperimentStatusException("Unable to change rollback experiment as experiment is in " + experimentStatus.toString() + " state"); + if (experimentStatus.equals(ExperimentStatus.DONE)) { + throw new UnableToChangeExperimentStatusException("Unable to change rollback experiment as experiment is in" + experimentStatus.toString() + " state"); } experiment.getExperimentInfo().setExperimentStatus(ExperimentStatus.DONE); experiment.setType(KILL_SWITCH); experiment.setUpdatedBy(emailId); + log.info("Saving audit trail for rollbacking of experiment: {}", experiment.getName()); saveAuditTrail(experimentId, Constants.EXPERIMENT_ROLL_BACKED, emailId); experiment.setUpdatedBy(emailId); experimentQuery.save(experiment); } + @Override + public void restartExperiment(String experimentId, String emailId) { + ExperimentEntity experiment = getExperimentEntityFromId(experimentId); + log.info("Restarting experiment with experimentId: {}", experimentId); + ExperimentStatus experimentStatus = experiment.getExperimentInfo().getExperimentStatus(); + if (!experimentStatus.equals(ExperimentStatus.HOLD)) { + throw new UnableToChangeExperimentStatusException("Unable to change rollback experiment as experiment is in " + experimentStatus.toString() + " state"); + } + experiment.getExperimentInfo().setExperimentStatus(ExperimentStatus.RUNNING); + experiment.setType(EXPERIMENT); + experiment.setUpdatedBy(emailId); + log.info("Saving audit trail for restarting of experiment: {}", experiment.getName()); + saveAuditTrail(experimentId, Constants.EXPERIMENT_RESTARTED, emailId); + experiment.setUpdatedBy(emailId); + experimentQuery.save(experiment); + } + private void saveAuditTrail(String experimentId, String log, String emailId) { ExperimentEntity experiment = getExperimentEntityFromId(experimentId); ExperimentAuditTrailEntity experimentAuditTrail = ExperimentAuditTrailEntity.builder() @@ -452,8 +474,10 @@ public class ExperimentServiceImpl implements ExperimentService { @Override public List getExperimentAuditTrail(String experimentId) { ExperimentEntity experiment = getExperimentEntityFromId(experimentId); - return experiment.getExperimentAuditTrails().stream() + List experimentAuditTrail = experiment.getExperimentAuditTrails().stream() .map(experimentMapper::mapExperimentAuditTrailEntityToExperimentAuditTrailDTO) .collect(Collectors.toList()); + experimentAuditTrail.sort(Comparator.comparing(ExperimentAuditTrailDTO::getCreatedAt)); + return experimentAuditTrail; } } diff --git a/litmus-core/src/test/java/com/navi/medici/controller/v2/ExperimentControllerV2Test.java b/litmus-core/src/test/java/com/navi/medici/controller/v2/ExperimentControllerV2Test.java index d265073..38a337e 100644 --- a/litmus-core/src/test/java/com/navi/medici/controller/v2/ExperimentControllerV2Test.java +++ b/litmus-core/src/test/java/com/navi/medici/controller/v2/ExperimentControllerV2Test.java @@ -166,6 +166,17 @@ public class ExperimentControllerV2Test { .andExpect(status().isOk()); } + @Test + void shouldRestartExperiment() throws Exception { + String experimentId = TestUtils.getExperimentEntity().getExperimentId(); + String emailId = TestUtils.TEST_USER; + MockHttpServletRequestBuilder httpRequest = MockMvcRequestBuilders.put("/v2/experiments/restart/" + experimentId) + .header(Constants.HEADER_EMAIL_ID, TestUtils.TEST_USER); + + mockMvc.perform(httpRequest) + .andExpect(status().isOk()); + } + @Test void shouldGetExperimentAuditTrail() throws Exception { String experimentId = TestUtils.getExperimentEntity().getExperimentId(); diff --git a/litmus-core/src/test/java/com/navi/medici/service/experiment/ExperimentServiceImplTest.java b/litmus-core/src/test/java/com/navi/medici/service/experiment/ExperimentServiceImplTest.java index d305178..b141de0 100644 --- a/litmus-core/src/test/java/com/navi/medici/service/experiment/ExperimentServiceImplTest.java +++ b/litmus-core/src/test/java/com/navi/medici/service/experiment/ExperimentServiceImplTest.java @@ -305,4 +305,13 @@ class ExperimentServiceImplTest { .thenReturn(Optional.of(experiment)); assertDoesNotThrow(() -> experimentService.rollbackExperiment(experiment.getExperimentId(), TestUtils.TEST_USER)); } + + @Test + void shouldRestartExperiment() { + ExperimentEntity experiment = TestUtils.getExperimentEntity(); + experiment.getExperimentInfo().setExperimentStatus(ExperimentStatus.HOLD); + Mockito.when(experimentQuery.findByExperimentId(experiment.getExperimentId())) + .thenReturn(Optional.of(experiment)); + assertDoesNotThrow(() -> experimentService.restartExperiment(experiment.getExperimentId(), TestUtils.TEST_USER)); + } } \ No newline at end of file