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
This commit is contained in:
Akshat Soni
2023-04-10 15:59:03 +05:30
committed by GitHub Enterprise
parent c7b148d856
commit 293fad68c0
6 changed files with 59 additions and 5 deletions

View File

@@ -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";
}

View File

@@ -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<List<ExperimentAuditTrailDTO>> getExperimentAuditTrail(@PathVariable("experimentId") String experimentId) {
return ResponseEntity.ok(experimentService.getExperimentAuditTrail(experimentId));

View File

@@ -53,5 +53,7 @@ public interface ExperimentService {
void rollbackExperiment(String experimentId, String emailId);
void restartExperiment(String experimentId, String emailId);
List<ExperimentAuditTrailDTO> getExperimentAuditTrail(String experimentId);
}

View File

@@ -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<ExperimentAuditTrailDTO> getExperimentAuditTrail(String experimentId) {
ExperimentEntity experiment = getExperimentEntityFromId(experimentId);
return experiment.getExperimentAuditTrails().stream()
List<ExperimentAuditTrailDTO> experimentAuditTrail = experiment.getExperimentAuditTrails().stream()
.map(experimentMapper::mapExperimentAuditTrailEntityToExperimentAuditTrailDTO)
.collect(Collectors.toList());
experimentAuditTrail.sort(Comparator.comparing(ExperimentAuditTrailDTO::getCreatedAt));
return experimentAuditTrail;
}
}

View File

@@ -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();

View File

@@ -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));
}
}