use of io.gravitee.rest.api.model.EnvironmentEntity in project gravitee-management-rest-api by gravitee-io.
the class PromotionServiceTest method shouldPromote.
@Test
public void shouldPromote() throws TechnicalException {
when(userService.findById(any())).thenReturn(getAUserEntity());
EnvironmentEntity environmentEntity = new EnvironmentEntity();
environmentEntity.setCockpitId("env#cockpit-1");
environmentEntity.setName("Env 1");
when(environmentService.findById(any())).thenReturn(environmentEntity);
Page<Promotion> promotionPage = new Page<>(emptyList(), 0, 0, 0);
when(promotionRepository.search(any(), any(), any())).thenReturn(promotionPage);
when(promotionRepository.create(any())).thenReturn(getAPromotion());
when(cockpitService.requestPromotion(any())).thenReturn(new CockpitReply<>(getAPromotionEntity(), CockpitReplyStatus.SUCCEEDED));
when(promotionRepository.update(any())).thenReturn(mock(Promotion.class));
final PromotionEntity promotionEntity = promotionService.promote("api#1", getAPromotionRequestEntity(), "user#1");
assertThat(promotionEntity).isNotNull();
verify(auditService).createApiAuditLog(eq("api#1"), any(), eq(PROMOTION_CREATED), any(), isNull(), any());
}
use of io.gravitee.rest.api.model.EnvironmentEntity in project gravitee-management-rest-api by gravitee-io.
the class PromotionServiceTest method shouldNotProcessPromotionIfNoPermissionForTargetEnvironment.
@Test(expected = ForbiddenAccessException.class)
public void shouldNotProcessPromotionIfNoPermissionForTargetEnvironment() throws Exception {
when(promotionRepository.findById(any())).thenReturn(Optional.of(getAPromotion()));
when(environmentService.findByCockpitId(any())).thenReturn(new EnvironmentEntity());
when(apiService.exists(any())).thenReturn(true);
Page<Promotion> promotionPage = new Page<>(singletonList(getAPromotion()), 0, 1, 1);
when(promotionRepository.search(any(), any(), any())).thenReturn(promotionPage);
when(permissionService.hasPermission(any(), any(), any())).thenReturn(false);
promotionService.processPromotion(PROMOTION_ID, true, USER_ID);
}
use of io.gravitee.rest.api.model.EnvironmentEntity in project gravitee-management-rest-api by gravitee-io.
the class PromotionServiceTest method shouldNotPromoteIfThereIsAlreadyAnInProgressPromotionForTheSameEnv.
@Test(expected = PromotionAlreadyInProgressException.class)
public void shouldNotPromoteIfThereIsAlreadyAnInProgressPromotionForTheSameEnv() throws TechnicalException {
when(userService.findById(any())).thenReturn(getAUserEntity());
EnvironmentEntity environmentEntity = new EnvironmentEntity();
environmentEntity.setCockpitId("env#cockpit-1");
environmentEntity.setName("Env 1");
when(environmentService.findById(any())).thenReturn(environmentEntity);
String targetEnvCockpitId = "env#cockpit-target";
Promotion promotion = getAPromotion();
promotion.setApiId("api#1");
promotion.setStatus(PromotionStatus.TO_BE_VALIDATED);
promotion.setTargetEnvCockpitId(targetEnvCockpitId);
Promotion promotion2 = getAPromotion();
promotion2.setApiId("api#1");
promotion2.setStatus(PromotionStatus.TO_BE_VALIDATED);
promotion2.setTargetEnvCockpitId("env#another-env");
Page<Promotion> promotionPage = new Page<>(List.of(promotion, promotion2), 0, 2, 2);
when(promotionRepository.search(any(), any(), any())).thenReturn(promotionPage);
PromotionRequestEntity promotionRequestEntity = getAPromotionRequestEntity();
promotionRequestEntity.setTargetEnvCockpitId(targetEnvCockpitId);
promotionService.promote("api#1", promotionRequestEntity, "user#1");
}
use of io.gravitee.rest.api.model.EnvironmentEntity in project gravitee-management-rest-api by gravitee-io.
the class PromotionServiceImpl method processPromotion.
@Override
public PromotionEntity processPromotion(String promotion, boolean accepted, String user) {
try {
final Promotion existing = promotionRepository.findById(promotion).orElseThrow(() -> new PromotionNotFoundException(promotion));
EnvironmentEntity environment = environmentService.findByCockpitId(existing.getTargetEnvCockpitId());
existing.setStatus(accepted ? PromotionStatus.ACCEPTED : PromotionStatus.REJECTED);
final PromotionQuery promotionQuery = new PromotionQuery();
promotionQuery.setStatuses(Collections.singletonList(PromotionEntityStatus.ACCEPTED));
promotionQuery.setTargetEnvCockpitIds(singletonList(existing.getTargetEnvCockpitId()));
promotionQuery.setTargetApiExists(true);
promotionQuery.setApiId(existing.getApiId());
List<PromotionEntity> previousPromotions = search(promotionQuery, new SortableImpl("created_at", false), null).getContent();
// Should create a new API if there is no previous promotion for this API or if the API existed once (after a promotion) but has been deleted since
boolean shouldCreate = CollectionUtils.isEmpty(previousPromotions) || !apiService.exists(previousPromotions.get(0).getTargetApiId());
if (PromotionStatus.ACCEPTED.equals(existing.getStatus())) {
ApiEntity promoted = null;
// FIXME: All the methods should take then env id as input instead of relying on GraviteeContext.getCurrentEnv
GraviteeContext.setCurrentEnvironment(environment.getId());
if (shouldCreate) {
if (!permissionService.hasPermission(ENVIRONMENT_API, environment.getId(), CREATE)) {
throw new ForbiddenAccessException();
}
promoted = apiDuplicatorService.createWithImportedDefinition(existing.getApiDefinition(), user, GraviteeContext.getCurrentOrganization(), GraviteeContext.getCurrentEnvironment());
} else {
if (!permissionService.hasPermission(ENVIRONMENT_API, environment.getId(), UPDATE)) {
throw new ForbiddenAccessException();
}
PromotionEntity lastAcceptedPromotion = previousPromotions.get(0);
final ApiEntity existingApi = apiService.findById(lastAcceptedPromotion.getTargetApiId());
promoted = apiDuplicatorService.updateWithImportedDefinition(existingApi.getId(), existing.getApiDefinition(), user, GraviteeContext.getCurrentOrganization(), GraviteeContext.getCurrentEnvironment());
}
existing.setTargetApiId(promoted.getId());
}
final PromotionEntity promotionEntity = convert(existing);
final CockpitReply<PromotionEntity> cockpitReply = cockpitService.processPromotion(promotionEntity);
if (cockpitReply.getStatus() != CockpitReplyStatus.SUCCEEDED) {
throw new BridgeOperationException(BridgeOperation.PROMOTE_API);
}
final Promotion updated = promotionRepository.update(existing);
return convert(updated);
} catch (TechnicalException ex) {
LOGGER.error("An error occurs while trying to process promotion", ex);
throw new TechnicalManagementException("An error occurs while trying to process promotion", ex);
}
}
use of io.gravitee.rest.api.model.EnvironmentEntity in project gravitee-management-rest-api by gravitee-io.
the class PromotionServiceImpl method promote.
@Override
public PromotionEntity promote(String apiId, PromotionRequestEntity promotionRequest, String userId) {
// TODO: do we have to use filteredFields like for duplicate (i think no need members and groups)
// FIXME: can we get the version from target environment
String apiDefinition = apiDuplicatorService.exportAsJson(apiId, ApiSerializer.Version.DEFAULT.getVersion(), "id", "members", "groups");
EnvironmentEntity currentEnvironmentEntity = environmentService.findById(GraviteeContext.getCurrentEnvironment());
UserEntity author = userService.findById(userId);
PromotionQuery promotionQuery = new PromotionQuery();
promotionQuery.setStatuses(List.of(PromotionEntityStatus.CREATED, PromotionEntityStatus.TO_BE_VALIDATED));
promotionQuery.setApiId(apiId);
List<PromotionEntity> inProgressPromotions = search(promotionQuery, null, null).getContent().stream().filter(promotionEntity -> promotionEntity.getTargetEnvCockpitId().equals(promotionRequest.getTargetEnvCockpitId())).collect(Collectors.toList());
if (!inProgressPromotions.isEmpty()) {
throw new PromotionAlreadyInProgressException(inProgressPromotions.get(0).getId());
}
Promotion promotionToSave = convert(apiId, apiDefinition, currentEnvironmentEntity, promotionRequest, author);
promotionToSave.setId(UuidString.generateRandom());
Promotion createdPromotion = null;
try {
createdPromotion = promotionRepository.create(promotionToSave);
auditService.createApiAuditLog(createdPromotion.getApiId(), emptyMap(), PROMOTION_CREATED, createdPromotion.getCreatedAt(), null, createdPromotion);
} catch (TechnicalException exception) {
throw new TechnicalManagementException(String.format("An error occurs while trying to create a promotion request for API %s", apiId), exception);
}
PromotionEntity promotionEntity = convert(createdPromotion);
CockpitReply<PromotionEntity> cockpitReply = cockpitService.requestPromotion(promotionEntity);
promotionEntity.setStatus(cockpitReply.getStatus() != CockpitReplyStatus.SUCCEEDED ? PromotionEntityStatus.ERROR : PromotionEntityStatus.TO_BE_VALIDATED);
try {
promotionRepository.update(convert(promotionEntity));
} catch (TechnicalException exception) {
throw new TechnicalManagementException(String.format("An error occurs while trying to update promotion %s", promotionEntity.getId()), exception);
}
if (cockpitReply.getStatus() != CockpitReplyStatus.SUCCEEDED) {
throw new BridgeOperationException(BridgeOperation.PROMOTE_API);
}
return promotionEntity;
}
Aggregations