private ResourceEntity findPredecessor(List<ResourceEntity> predecessorCandidates, ResourceEntity successorResource, PredecessorResult predecessorResult) { ResourceEntity predecessorResource = dependencyResolverService.getResourceEntityForRelease(predecessorCandidates, successorResource.getRelease()); if (predecessorResource == null) { predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, "no suitable release for predecessor application " + (predecessorCandidates.isEmpty() ? "" : predecessorCandidates.get(0).getName()) + " found")); log.warning("No suitable predecessor release found "); } else { log.info("Best matching predecessor release is " + predecessorResource.getRelease().getName()); } return predecessorResource; }
@Test public void shouldPassEvenWhenPredecessorCpiIsNotFound() throws ValidationException { // given ResourceEntity successorResource = ResourceEntityBuilder.createResourceEntity(APPNAME_S, 1); ResourceEntity predecessorResource = ResourceEntityBuilder.createResourceEntity(APPNAME_P, 1); String cpiLocalPortId = "cpiLocalPortId"; ResourceEntity cpi = new ResourceEntityBuilder().withName("cpi").withTypeOfName(ResourceLocator.WS_CPI_TYPE).withId(10).withLocalPortId(cpiLocalPortId).build(); successorResource.addConsumedRelation(relationBuilder.buildConsumedResRelEntity(successorResource, cpi, "fooCpi", 100)); List<ResourceEntity> resources = new ArrayList<>(); resources.add(predecessorResource); Mockito.when(resourceRepositoryMock.getResourcesByGroupNameWithAllRelationsOrderedByRelease(APPNAME_S)).thenReturn(Collections.singletonList(successorResource)); Mockito.when(resourceRepositoryMock.getResourcesByGroupNameWithAllRelationsOrderedByRelease(APPNAME_P)).thenReturn(new LinkedList<ResourceEntity>(resources)); Mockito.when(resourceLocatorMock.hasResourceConsumableSoftlinkType(cpi)).thenReturn(true); Mockito.when(dependencyResolverServiceMock.getResourceEntityForRelease(resources, new ReleaseEntity())).thenReturn(predecessorResource); // when PredecessorResult rh = servicePredecessorHandler.handlePredecessor(APPNAME_S, APPNAME_P, ForeignableOwner.MAIA); // then assertEquals(ProcessingState.OK, rh.getProcessingState()); assertEquals(1, rh.getMessages().size()); assertEquals(MessageSeverity.WARNING, rh.getMessages().get(0).getSeverity()); }
@Test public void shouldPassEvenWhenPredecessorPpiIsNotFound() throws ValidationException { // given ResourceEntity successorResource = ResourceEntityBuilder.createResourceEntity(APPNAME_S, 1); ResourceEntity predecessorResource = ResourceEntityBuilder.createResourceEntity(APPNAME_P, 1); String ppiLocalPortId = "ppiLocalPortId"; ResourceEntity ppi = new ResourceEntityBuilder().withName("ppi").withTypeOfName(ResourceLocator.WS_PPI_TYPE).withId(20).withLocalPortId(ppiLocalPortId).build(); successorResource.addProvidedRelation(relationBuilder.buildProvidedResRelEntity(successorResource, ppi, "fooPpi", 200)); List<ResourceEntity> resources = new ArrayList<>(); resources.add(predecessorResource); Mockito.when(resourceRepositoryMock.getResourcesByGroupNameWithAllRelationsOrderedByRelease(APPNAME_S)).thenReturn(Collections.singletonList(successorResource)); Mockito.when(resourceRepositoryMock.getResourcesByGroupNameWithAllRelationsOrderedByRelease(APPNAME_P)).thenReturn(new LinkedList<ResourceEntity>(resources)); Mockito.when(resourceLocatorMock.hasResourceProvidableSoftlinkType(ppi)).thenReturn(true); Mockito.when(dependencyResolverServiceMock.getResourceEntityForRelease(resources, new ReleaseEntity())).thenReturn(predecessorResource); // when PredecessorResult rh = servicePredecessorHandler.handlePredecessor(APPNAME_S, APPNAME_P, ForeignableOwner.MAIA); // then assertEquals(ProcessingState.OK, rh.getProcessingState()); assertEquals(1, rh.getMessages().size()); assertEquals(MessageSeverity.WARNING, rh.getMessages().get(0).getSeverity()); }
private void predecessorSuccessfullyReplacedResult(ResourceEntity successorResource, String predecessorName, PredecessorResult predecessorResult) { predecessorResult.setProcessingState(ProcessingState.OK); // only if really successful if (predecessorResult.getMessages().isEmpty()) { predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.INFO, "Predecessor application " + predecessorName + " successfully replaced by " + successorResource.getName())); } }
private boolean copyPredecessorApplicationToSuccessor(ResourceEntity successorResource, ForeignableOwner actingOwner, PredecessorResult predecessorResult, ResourceEntity predecessorResource) { // copy application try { copyService.copyFromPredecessorToSuccessorResource(predecessorResource, successorResource, actingOwner); } catch (ForeignableOwnerViolationException e) { log.warning(e.getMessage()); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.ERROR, e.getMessage())); return false; } catch (AMWException e) { log.warning(e.getMessage()); predecessorResult.setProcessingState(ProcessingState.OK); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, e.getMessage())); return false; } return true; }
private void removeAsRelationsInAllFutureReleases(PredecessorResult predecessorResult, List<ResourceEntity> allFutureAsReleases, ResourceEntity predecessorResource) { List<ConsumedResourceRelationEntity> asToRemoveRelations = new ArrayList<>(); for (ResourceEntity futureReleaseAppServer : allFutureAsReleases) { for (ConsumedResourceRelationEntity asToAppRelationInFutureAsRelease : futureReleaseAppServer.getConsumedMasterRelations()) { // compare by Name because we need to remove all predecessor Releases if (predecessorResource.getName().equals(asToAppRelationInFutureAsRelease.getSlaveResource().getName())) { asToRemoveRelations.add(asToAppRelationInFutureAsRelease); } } } for (ConsumedResourceRelationEntity asToAppRelationInFutureAsRelease : asToRemoveRelations) { try { relationImportService.deleteConsumedPortRelations(Collections.singletonList(asToAppRelationInFutureAsRelease)); } catch (ElementAlreadyExistsException | ResourceNotFoundException e) { log.log(Level.WARNING, "Error Could not add Successor to future AS", e); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.ERROR, "Error while adding successor resource to sucessor as release: " + e.getMessage())); } } }
private PredecessorResult handleAsForSuccessorResourceRelease(ResourceEntity successorResource, ResourceGroupEntity asPredecessorGroup) { PredecessorResult predecessorResult = new PredecessorResult(); try { if (getOrCreateAsInSuccessorRelease(asPredecessorGroup, successorResource) == null) { log.warning("No Applicationerver could be created or found for successor release"); throw new AMWException("No Applicationerver could be created or found for successor release"); } } catch (ForeignableOwnerViolationException e) { log.log(Level.WARNING, "Error while creating As in Successor Release", e); predecessorResult.setProcessingState(ProcessingState.FAILED); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.ERROR, "Error while creating As in Successor Release: " + e.getMessage())); } catch (AMWException e) { log.log(Level.WARNING, "Error while creating As in Successor Release", e); predecessorResult.setProcessingState(ProcessingState.FAILED); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, "Error while creating As in Successor Release: " + e.getMessage())); } return predecessorResult; }
private void addSuccessorToAllFutureReleases(PredecessorResult predecessorResult, List<ResourceEntity> allFutureReleases, ResourceEntity successorResource) { for (ResourceEntity resourceEntity : allFutureReleases) { try { resourceRelationService.addRelationByGroup(resourceEntity.getId(), successorResource.getResourceGroup().getId(), false, null, null, ForeignableOwner.getSystemOwner()); } catch (ElementAlreadyExistsException | ResourceNotFoundException e) { log.log(Level.WARNING, "Error Could not add Successor to future AS", e); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.ERROR, "Error while adding successor resource to sucessor as release: " + e.getMessage())); } } }
private boolean copyPpisFromPredecessorToSuccessor(ResourceEntity successorResource, ForeignableOwner actingOwner, PredecessorResult predecessorResult, ResourceEntity predecessorResource) { // copy PPIs for (ProvidedResourceRelationEntity providedResourceRelationEntity : successorResource.getProvidedMasterRelations()) { if (predecessorResource != null && resourceLocator.hasResourceProvidableSoftlinkType(providedResourceRelationEntity.getSlaveResource())) { ResourceEntity successorPpi = providedResourceRelationEntity.getSlaveResource(); try { final ResourceEntity predecessorPpi = getPredecessorForCpiOrPpi(successorPpi, predecessorResource.getProvidedMasterRelations()); if (predecessorPpi != null) { try { copyService.copyFromPredecessorToSuccessorResource(predecessorPpi, successorPpi, actingOwner); } catch (ForeignableOwnerViolationException e) { log.warning(e.getMessage()); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.ERROR, e.getMessage())); return false; } catch (AMWException e) { log.warning(e.getMessage()); predecessorResult.setProcessingState(ProcessingState.OK); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, e.getMessage())); return false; } } } catch (AMWRuntimeException e) { predecessorResult.setProcessingState(ProcessingState.OK); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, e.getMessage())); return false; } } } return true; }
private boolean copyCpisFromPredecessorToSuccessor(ResourceEntity successorResource, ForeignableOwner actingOwner, PredecessorResult predecessorResult, ResourceEntity predecessorResource) { // copy CPIs for (ConsumedResourceRelationEntity consumedResourceRelationEntity : successorResource.getConsumedMasterRelations()) { if (predecessorResource != null && resourceLocator.hasResourceConsumableSoftlinkType(consumedResourceRelationEntity.getSlaveResource())) { ResourceEntity successorCpi = consumedResourceRelationEntity.getSlaveResource(); try { final ResourceEntity predecessorCpi = getPredecessorForCpiOrPpi(successorCpi, predecessorResource.getConsumedMasterRelations()); if (predecessorCpi != null) { try { copyService.copyFromPredecessorToSuccessorResource(predecessorCpi, successorCpi, actingOwner); } catch (ForeignableOwnerViolationException e) { log.warning(e.getMessage()); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.ERROR, e.getMessage())); return false; } catch (AMWException e) { log.warning(e.getMessage()); predecessorResult.setProcessingState(ProcessingState.OK); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, e.getMessage())); return false; } } } catch (AMWRuntimeException e) { predecessorResult.setProcessingState(ProcessingState.OK); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, e.getMessage())); return false; } } } return true; }
private PredecessorResult doHandlePredecessor(ResourceEntity successorResource, String predecessorName, ForeignableOwner actingOwner) { PredecessorResult predecessorResult = new PredecessorResult(successorResource.getName(), ProcessingState.FAILED); List<ResourceEntity> predecessorCandidates = getPredecessorCandidates(predecessorName); if (!predecessorCandidates.isEmpty()) { ResourceEntity predecessorResource = findPredecessor(predecessorCandidates, successorResource, predecessorResult); if (copyPredecessorApplicationToSuccessor(successorResource, actingOwner, predecessorResult, predecessorResource) && copyCpisFromPredecessorToSuccessor(successorResource, actingOwner, predecessorResult, predecessorResource) && copyPpisFromPredecessorToSuccessor(successorResource, actingOwner, predecessorResult, predecessorResource) && handleApplicationServerRelations(successorResource, predecessorResult, predecessorResource)) { predecessorSuccessfullyReplacedResult(successorResource, predecessorName, predecessorResult); } } else { // do "nothing" log.warning("Predecessor application " + predecessorName + " not found"); predecessorResult.setProcessingState(ProcessingState.OK); predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, "Predecessor application " + predecessorName + " not found")); } return predecessorResult; }
private PredecessorResult handleApplicationServerRelations(ResourceEntity predecessorResource, ResourceEntity successorResource) { PredecessorResult predecessorResult = new PredecessorResult(); ResourceGroupEntity asPredecessorGroup = getPredecessorApplicationServer(predecessorResource); if (asPredecessorGroup != null) { predecessorResult = handleAsForSuccessorResourceRelease(successorResource, asPredecessorGroup); List<ResourceEntity> allReleasesFutureRelease = dependencyResolverService.getAllFutureReleases(asPredecessorGroup.getResources(), successorResource.getRelease()); // add successor To all future Releases of the asInSuccessorRelease (including asInSuccessorRelease) addSuccessorToAllFutureReleases(predecessorResult, allReleasesFutureRelease, successorResource); // remove predecessor AS Master Relations where now the Successor is attached removeAsRelationsInAllFutureReleases(predecessorResult, allReleasesFutureRelease, predecessorResource); } else { predecessorResult.addMessage(new PredecessorResultMessage(MessageSeverity.WARNING, "Predecessor application " + (predecessorResource != null ? predecessorResource.getName() : "") + " has no Application Server relation, therefore the Application Server Handling was not performed.")); } return predecessorResult; }