Search in sources :

Example 6 with RepairEvent

use of com.sequenceiq.freeipa.flow.freeipa.repair.event.RepairEvent in project cloudbreak by hortonworks.

the class RepairInstancesService method repairInstances.

/**
 * If no instance passed in request, repair all bad instances (at least 1 instance must be good)
 * If instances passed in request, repair all valid passed bad instances (at least 1 instance must remain)
 * If force and instances passed in request, repair all valid passed instances (at least 1 instance must remain)
 * If force and no instances passed in request then report an error
 *
 * @param accountId - The account id for the instance to repair.
 * @param request   - A RepairInstanceRequest containing request parameters.
 */
public OperationStatus repairInstances(String accountId, RepairInstancesRequest request) {
    Stack stack = stackService.getByEnvironmentCrnAndAccountIdWithListsAndMdcContext(request.getEnvironmentCrn(), accountId);
    if (request.isForceRepair() && CollectionUtils.isEmpty(request.getInstanceIds())) {
        throw new UnsupportedOperationException("Force repair requires the instance IDs to be provided.");
    }
    Map<String, InstanceStatus> healthMap = request.isForceRepair() ? Collections.emptyMap() : getInstanceHealthMap(accountId, request.getEnvironmentCrn());
    Map<String, InstanceMetaData> allInstancesByInstanceId = getAllInstancesFromStack(stack);
    Map<String, InstanceMetaData> instancesToRepair = getInstancesToRepair(healthMap, allInstancesByInstanceId, request.getInstanceIds(), request.isForceRepair(), false);
    Set<InstanceMetaData> remainingGoodInstances = getRemainingGoodInstances(allInstancesByInstanceId, instancesToRepair, healthMap, request.isForceRepair());
    Set<InstanceMetaData> remainingBadInstances = getRemainingBadInstances(allInstancesByInstanceId, instancesToRepair, healthMap, request.isForceRepair());
    validate(accountId, stack, remainingGoodInstances, remainingBadInstances, instancesToRepair.values());
    int nodeCount = stack.getInstanceGroups().stream().findFirst().get().getNodeCount();
    List<String> additionalTerminatedInstanceIds = getAdditionalTerminatedInstanceIds(allInstancesByInstanceId.values(), request.getInstanceIds());
    Operation operation = operationService.startOperation(accountId, OperationType.REPAIR, Set.of(stack.getEnvironmentCrn()), Collections.emptySet());
    if (operation.getStatus() == OperationState.RUNNING) {
        stackUpdater.updateStackStatus(stack.getId(), DetailedStackStatus.REPAIR_REQUESTED, "Repair requested");
        flowManager.notify(FlowChainTriggers.REPAIR_TRIGGER_EVENT, new RepairEvent(FlowChainTriggers.REPAIR_TRIGGER_EVENT, stack.getId(), operation.getOperationId(), nodeCount, new ArrayList<>(instancesToRepair.keySet()), additionalTerminatedInstanceIds));
    }
    return operationToOperationStatusConverter.convert(operation);
}
Also used : ArrayList(java.util.ArrayList) Operation(com.sequenceiq.freeipa.entity.Operation) Stack(com.sequenceiq.freeipa.entity.Stack) InstanceMetaData(com.sequenceiq.freeipa.entity.InstanceMetaData) InstanceStatus(com.sequenceiq.freeipa.api.v1.freeipa.stack.model.common.instance.InstanceStatus) RepairEvent(com.sequenceiq.freeipa.flow.freeipa.repair.event.RepairEvent)

Aggregations

RepairEvent (com.sequenceiq.freeipa.flow.freeipa.repair.event.RepairEvent)6 Stack (com.sequenceiq.freeipa.entity.Stack)5 RepairInstancesRequest (com.sequenceiq.freeipa.api.v1.freeipa.stack.model.repair.RepairInstancesRequest)4 OperationStatus (com.sequenceiq.freeipa.api.v1.operation.model.OperationStatus)4 Test (org.junit.jupiter.api.Test)4 ArgumentCaptor (org.mockito.ArgumentCaptor)4 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)4 Selectable (com.sequenceiq.cloudbreak.common.event.Selectable)1 InstanceStatus (com.sequenceiq.freeipa.api.v1.freeipa.stack.model.common.instance.InstanceStatus)1 InstanceMetaData (com.sequenceiq.freeipa.entity.InstanceMetaData)1 Operation (com.sequenceiq.freeipa.entity.Operation)1 ArrayList (java.util.ArrayList)1 Test (org.junit.Test)1