Search in sources :

Example 56 with FlowLog

use of com.sequenceiq.flow.domain.FlowLog in project cloudbreak by hortonworks.

the class Flow2Handler method restartFlow.

public void restartFlow(String flowId) {
    FlowLog flowLog = flowLogService.findFirstByFlowIdOrderByCreatedDesc(flowId).orElseThrow(() -> new FlowNotFoundException(flowId));
    restartFlow(flowLog);
}
Also used : FlowNotFoundException(com.sequenceiq.flow.core.exception.FlowNotFoundException) FlowLog(com.sequenceiq.flow.domain.FlowLog)

Example 57 with FlowLog

use of com.sequenceiq.flow.domain.FlowLog in project cloudbreak by hortonworks.

the class Flow2Handler method restartFlow.

public void restartFlow(FlowLog flowLog) {
    if (notSupportedFlowType(flowLog)) {
        try {
            LOGGER.error("Flow type or payload is not present on the classpath anymore. Terminating the flow {}.", flowLog);
            flowLogService.terminate(flowLog.getResourceId(), flowLog.getFlowId());
            return;
        } catch (TransactionExecutionException e) {
            throw new TransactionRuntimeExecutionException(e);
        }
    }
    if (flowLog.getFlowType() != null) {
        Optional<FlowConfiguration<?>> flowConfig = flowConfigs.stream().filter(fc -> flowLog.isFlowType(fc.getClass())).findFirst();
        try {
            String flowChainType = flowChainLogService.getFlowChainType(flowLog.getFlowChainId());
            Payload payload = (Payload) JsonReader.jsonToJava(flowLog.getPayload());
            Flow flow = flowConfig.get().createFlow(flowLog.getFlowId(), flowLog.getFlowChainId(), payload.getResourceId(), flowChainType);
            runningFlows.put(flow, flowLog.getFlowChainId());
            flowStatCache.put(flow.getFlowId(), flowLog.getFlowChainId(), payload.getResourceId(), flowConfig.get().getFlowOperationType().name(), flow.getFlowConfigClass(), true);
            if (flowLog.getFlowChainId() != null) {
                flowChainHandler.restoreFlowChain(flowLog.getFlowChainId());
            }
            Map<Object, Object> variables = (Map<Object, Object>) JsonReader.jsonToJava(flowLog.getVariables());
            flow.initialize(flowLog.getCurrentState(), variables);
            RestartAction restartAction = flowConfig.get().getRestartAction(flowLog.getNextEvent());
            if (restartAction != null) {
                LOGGER.debug("Restarting flow with id: '{}', flow chain id: '{}', flow type: '{}', restart action: '{}'", flow.getFlowId(), flowLog.getFlowChainId(), flowLog.getFlowType().getClassValue().getSimpleName(), restartAction.getClass().getSimpleName());
                Span span = tracer.buildSpan(flowLog.getCurrentState()).ignoreActiveSpan().start();
                restartAction.restart(new FlowParameters(flowLog.getFlowId(), flowLog.getFlowTriggerUserCrn(), flowLog.getOperationType().name(), span.context()), flowLog.getFlowChainId(), flowLog.getNextEvent(), payload);
                return;
            }
        } catch (RuntimeException e) {
            String message = String.format("Flow could not be restarted with id: '%s', flow chain id: '%s' and flow type: '%s'", flowLog.getFlowId(), flowLog.getFlowChainId(), flowLog.getFlowType().getClassValue().getSimpleName());
            LOGGER.error(message, e);
        }
        try {
            flowLogService.terminate(flowLog.getResourceId(), flowLog.getFlowId());
        } catch (TransactionExecutionException e) {
            throw new TransactionRuntimeExecutionException(e);
        }
    }
}
Also used : FLOW_ID(com.sequenceiq.flow.core.FlowConstants.FLOW_ID) AcceptResult(com.sequenceiq.cloudbreak.common.event.AcceptResult) LoggerFactory(org.slf4j.LoggerFactory) JsonReader(com.cedarsoftware.util.io.JsonReader) IdempotentEvent(com.sequenceiq.cloudbreak.common.event.IdempotentEvent) TransactionRuntimeExecutionException(com.sequenceiq.cloudbreak.common.service.TransactionService.TransactionRuntimeExecutionException) Benchmark(com.sequenceiq.cloudbreak.util.Benchmark) FlowChains(com.sequenceiq.flow.core.chain.FlowChains) TransactionService(com.sequenceiq.cloudbreak.common.service.TransactionService) Pair(org.apache.commons.lang3.tuple.Pair) InMemoryCleanup(com.sequenceiq.flow.cleanup.InMemoryCleanup) FLOW_CANCEL(com.sequenceiq.flow.core.FlowConstants.FLOW_CANCEL) Map(java.util.Map) BadRequestException(javax.ws.rs.BadRequestException) FLOW_CHAIN_ID(com.sequenceiq.flow.core.FlowConstants.FLOW_CHAIN_ID) FlowLog(com.sequenceiq.flow.domain.FlowLog) FlowStatCache(com.sequenceiq.flow.core.cache.FlowStatCache) FLOW_CHAIN_TYPE(com.sequenceiq.flow.core.FlowConstants.FLOW_CHAIN_TYPE) NullUtil(com.sequenceiq.cloudbreak.util.NullUtil) Resource(javax.annotation.Resource) Set(java.util.Set) InternalServerErrorException(javax.ws.rs.InternalServerErrorException) UUID(java.util.UUID) FLOW_FINAL(com.sequenceiq.flow.core.FlowConstants.FLOW_FINAL) FLOW_OPERATION_TYPE(com.sequenceiq.flow.core.FlowConstants.FLOW_OPERATION_TYPE) List(java.util.List) TransactionExecutionException(com.sequenceiq.cloudbreak.common.service.TransactionService.TransactionExecutionException) Optional(java.util.Optional) FlowStateConstants(com.sequenceiq.flow.core.FlowState.FlowStateConstants) Span(io.opentracing.Span) Consumer(reactor.fn.Consumer) MutableBoolean(org.apache.commons.lang3.mutable.MutableBoolean) Scope(io.opentracing.Scope) Payload(com.sequenceiq.cloudbreak.common.event.Payload) MDCBuilder(com.sequenceiq.cloudbreak.logger.MDCBuilder) FlowLogIdWithTypeAndTimestamp(com.sequenceiq.flow.domain.FlowLogIdWithTypeAndTimestamp) Inject(javax.inject.Inject) Acceptable(com.sequenceiq.cloudbreak.common.event.Acceptable) FlowFinalizerCallback(com.sequenceiq.flow.core.config.FlowFinalizerCallback) FlowChainLogService(com.sequenceiq.flow.service.flowlog.FlowChainLogService) Event(reactor.bus.Event) FlowIdentifier(com.sequenceiq.flow.api.model.FlowIdentifier) FlowLogUtil(com.sequenceiq.cloudbreak.service.flowlog.FlowLogUtil) FlowNotFoundException(com.sequenceiq.flow.core.exception.FlowNotFoundException) Logger(org.slf4j.Logger) Tracer(io.opentracing.Tracer) FlowNotTriggerableException(com.sequenceiq.flow.core.exception.FlowNotTriggerableException) SpanContext(io.opentracing.SpanContext) Component(org.springframework.stereotype.Component) CloudbreakServiceException(com.sequenceiq.cloudbreak.common.exception.CloudbreakServiceException) FlowType(com.sequenceiq.flow.api.model.FlowType) NodeConfig(com.sequenceiq.flow.ha.NodeConfig) FlowConfiguration(com.sequenceiq.flow.core.config.FlowConfiguration) Comparator(java.util.Comparator) FlowChainHandler(com.sequenceiq.flow.core.chain.FlowChainHandler) FlowAcceptResult(com.sequenceiq.flow.core.model.FlowAcceptResult) FlowConfiguration(com.sequenceiq.flow.core.config.FlowConfiguration) Span(io.opentracing.Span) TransactionRuntimeExecutionException(com.sequenceiq.cloudbreak.common.service.TransactionService.TransactionRuntimeExecutionException) TransactionExecutionException(com.sequenceiq.cloudbreak.common.service.TransactionService.TransactionExecutionException) Payload(com.sequenceiq.cloudbreak.common.event.Payload) Map(java.util.Map)

Example 58 with FlowLog

use of com.sequenceiq.flow.domain.FlowLog in project cloudbreak by hortonworks.

the class Flow2Handler method updateFlowLogStatusInTransaction.

private void updateFlowLogStatusInTransaction(String key, Payload payload, FlowParameters flowParameters, String flowChainId, Flow flow, MutableBoolean flowCancelled) throws TransactionExecutionException {
    transactionService.required(() -> {
        Optional<FlowLog> lastFlowLog = flowLogService.getLastFlowLog(flow.getFlowId());
        if (lastFlowLog.isPresent()) {
            String nodeId = nodeConfig.getId();
            FlowLog flowLog = lastFlowLog.get();
            if (flowLog.getFinalized() || flowLog.getCloudbreakNodeId() == null || flowLog.getCloudbreakNodeId().equals(nodeId)) {
                updateFlowLogStatus(key, payload, flowChainId, flow, flowLog, flowParameters);
            } else {
                LOGGER.info("Flow {} was handled by another node {}, current node ID is {}, abandoning.", flow.getFlowId(), flowLog.getCloudbreakNodeId(), nodeId);
                inMemoryCleanup.cancelFlowWithoutDbUpdate(flow.getFlowId());
                flowCancelled.setTrue();
            }
        } else {
            LOGGER.debug("Cannot find LastFlowLog with flowId: {}", flow.getFlowId());
        }
    });
}
Also used : FlowLog(com.sequenceiq.flow.domain.FlowLog)

Example 59 with FlowLog

use of com.sequenceiq.flow.domain.FlowLog in project cloudbreak by hortonworks.

the class HeartbeatServiceTest method testDistributionConcurrencyWithDifferentFlows.

@Test
public void testDistributionConcurrencyWithDifferentFlows() {
    List<Node> clusterNodes = getClusterNodes();
    // myself
    clusterNodes.get(0).setLastUpdated(200_000L);
    // failed node
    clusterNodes.get(1).setLastUpdated(50_000L);
    // active node
    clusterNodes.get(2).setLastUpdated(200_000L);
    when(nodeService.findAll()).thenReturn(clusterNodes);
    when(clock.getCurrentTimeMillis()).thenReturn(200_000L);
    // all flows that need to be re-distributed
    List<FlowLog> node1FlowLogs = getFlowLogs(3, 5000);
    List<String> suspendedFlows = node1FlowLogs.stream().map(FlowLog::getFlowId).distinct().collect(Collectors.toList());
    when(flowLogService.findAllByCloudbreakNodeId(NODE_1_ID)).thenReturn(new HashSet<>(node1FlowLogs));
    Map<Node, List<String>> distribution = new HashMap<>();
    distribution.computeIfAbsent(clusterNodes.get(0), v -> new ArrayList<>()).addAll(Arrays.asList(suspendedFlows.get(0), suspendedFlows.get(2)));
    distribution.computeIfAbsent(clusterNodes.get(2), v -> new ArrayList<>()).addAll(Collections.singletonList(suspendedFlows.get(1)));
    when(flowDistributor.distribute(any(), any())).thenReturn(distribution);
    List<FlowLog> myNewFlowLogs = node1FlowLogs.stream().filter(fl -> fl.getFlowId().equalsIgnoreCase(suspendedFlows.get(0))).collect(Collectors.toList());
    when(flowLogService.findAllByCloudbreakNodeId(MY_ID)).thenReturn(new HashSet<>(myNewFlowLogs));
    when(runningFlows.get(any())).thenReturn(null);
    when(flowLogService.saveAll(anyCollection())).thenThrow(new OptimisticLockingFailureException("Someone already distributed the flows.."));
    heartbeatService.scheduledFlowDistribution();
    verify(flow2Handler, times(1)).restartFlow(stringCaptor.capture());
    List<String> allFlowIds = stringCaptor.getAllValues();
    assertEquals(1L, allFlowIds.size());
    for (FlowLog flowLog : myNewFlowLogs) {
        assertTrue(allFlowIds.contains(flowLog.getFlowId()));
    }
}
Also used : Arrays(java.util.Arrays) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Random(java.util.Random) HaApplication(com.sequenceiq.cloudbreak.service.ha.HaApplication) SecureRandom(java.security.SecureRandom) TransactionService(com.sequenceiq.cloudbreak.common.service.TransactionService) OptimisticLockingFailureException(org.springframework.dao.OptimisticLockingFailureException) InMemoryCleanup(com.sequenceiq.flow.cleanup.InMemoryCleanup) Mockito.doAnswer(org.mockito.Mockito.doAnswer) Map(java.util.Map) ZoneOffset(java.time.ZoneOffset) Mockito.doReturn(org.mockito.Mockito.doReturn) FlowLog(com.sequenceiq.flow.domain.FlowLog) Node(com.sequenceiq.cloudbreak.ha.domain.Node) Collection(java.util.Collection) Set(java.util.Set) UUID(java.util.UUID) ArgumentMatchers.anyList(org.mockito.ArgumentMatchers.anyList) Collectors(java.util.stream.Collectors) HeartbeatService(com.sequenceiq.cloudbreak.service.ha.HeartbeatService) List(java.util.List) TransactionExecutionException(com.sequenceiq.cloudbreak.common.service.TransactionService.TransactionExecutionException) ClassValue(com.sequenceiq.flow.domain.ClassValue) MockitoJUnitRunner(org.mockito.junit.MockitoJUnitRunner) FlowRegister(com.sequenceiq.flow.core.FlowRegister) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) IntStream(java.util.stream.IntStream) Clock(com.sequenceiq.cloudbreak.common.service.Clock) NodeService(com.sequenceiq.cloudbreak.ha.service.NodeService) ArgumentMatchers.anySet(org.mockito.ArgumentMatchers.anySet) Mock(org.mockito.Mock) LocalDateTime(java.time.LocalDateTime) RunWith(org.junit.runner.RunWith) HashMap(java.util.HashMap) Supplier(java.util.function.Supplier) Captor(org.mockito.Captor) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) ArgumentCaptor(org.mockito.ArgumentCaptor) ApplicationFlowInformation(com.sequenceiq.flow.core.ApplicationFlowInformation) OperationType(com.sequenceiq.flow.api.model.operation.OperationType) FlowLogService(com.sequenceiq.flow.core.FlowLogService) StateStatus(com.sequenceiq.flow.domain.StateStatus) Before(org.junit.Before) InjectMocks(org.mockito.InjectMocks) Flow2Handler(com.sequenceiq.flow.core.Flow2Handler) HelloWorldFlowConfig(com.sequenceiq.flow.core.helloworld.config.HelloWorldFlowConfig) InMemoryStateStore(com.sequenceiq.cloudbreak.cloud.store.InMemoryStateStore) Assert.assertTrue(org.junit.Assert.assertTrue) ReflectionTestUtils(org.springframework.test.util.ReflectionTestUtils) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) Mockito.verify(org.mockito.Mockito.verify) ArgumentMatchers.anyCollection(org.mockito.ArgumentMatchers.anyCollection) Assert.assertNull(org.junit.Assert.assertNull) FlowDistributor(com.sequenceiq.cloudbreak.ha.service.FlowDistributor) NodeConfig(com.sequenceiq.flow.ha.NodeConfig) FlowConfiguration(com.sequenceiq.flow.core.config.FlowConfiguration) PollGroup(com.sequenceiq.cloudbreak.cloud.scheduler.PollGroup) Collections(java.util.Collections) Assert.assertEquals(org.junit.Assert.assertEquals) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) FlowLog(com.sequenceiq.flow.domain.FlowLog) HashMap(java.util.HashMap) Node(com.sequenceiq.cloudbreak.ha.domain.Node) ArrayList(java.util.ArrayList) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) OptimisticLockingFailureException(org.springframework.dao.OptimisticLockingFailureException) ArgumentMatchers.anyList(org.mockito.ArgumentMatchers.anyList) List(java.util.List) ArrayList(java.util.ArrayList) Test(org.junit.Test)

Example 60 with FlowLog

use of com.sequenceiq.flow.domain.FlowLog in project cloudbreak by hortonworks.

the class HeartbeatServiceTest method testOneNodeTakesAllFlows.

@Test
public void testOneNodeTakesAllFlows() {
    List<Node> clusterNodes = getClusterNodes();
    // myself
    clusterNodes.get(0).setLastUpdated(200_000L);
    // set all nodes to failed except myself
    for (int i = 1; i < clusterNodes.size(); i++) {
        Node node = clusterNodes.get(i);
        node.setLastUpdated(50_000L);
    }
    when(nodeService.findAll()).thenReturn(clusterNodes);
    when(clock.getCurrentTimeMillis()).thenReturn(200_000L);
    // all flows that need to be re-distributed
    List<FlowLog> node1FlowLogs = getFlowLogs(2, 5000);
    List<String> suspendedFlows = node1FlowLogs.stream().map(FlowLog::getFlowId).distinct().collect(Collectors.toList());
    when(flowLogService.findAllByCloudbreakNodeId(NODE_1_ID)).thenReturn(new HashSet<>(node1FlowLogs));
    Set<FlowLog> node2FlowLogs = new HashSet<>(getFlowLogs(3, 3000));
    suspendedFlows.addAll(node2FlowLogs.stream().map(FlowLog::getFlowId).distinct().collect(Collectors.toList()));
    when(flowLogService.findAllByCloudbreakNodeId(NODE_2_ID)).thenReturn(node2FlowLogs);
    Map<Node, List<String>> distribution = new HashMap<>();
    distribution.computeIfAbsent(clusterNodes.get(0), v -> new ArrayList<>()).addAll(Arrays.asList(suspendedFlows.get(0), suspendedFlows.get(1), suspendedFlows.get(2), suspendedFlows.get(3), suspendedFlows.get(4)));
    when(flowDistributor.distribute(any(), any())).thenReturn(distribution);
    Set<FlowLog> myNewFlowLogs = new HashSet<>();
    myNewFlowLogs.addAll(node1FlowLogs);
    myNewFlowLogs.addAll(node2FlowLogs);
    when(flowLogService.findAllByCloudbreakNodeId(MY_ID)).thenReturn(myNewFlowLogs);
    when(runningFlows.get(any())).thenReturn(null);
    heartbeatService.scheduledFlowDistribution();
    verify(flowLogService).saveAll(flowLogListCaptor.capture());
    List<FlowLog> updatedFlows = flowLogListCaptor.getValue();
    assertEquals(myNewFlowLogs.size(), updatedFlows.size());
    for (FlowLog updatedFlow : updatedFlows) {
        assertEquals(MY_ID, updatedFlow.getCloudbreakNodeId());
    }
    verify(flow2Handler, times(5)).restartFlow(stringCaptor.capture());
    List<String> allFlowIds = stringCaptor.getAllValues();
    assertEquals(5L, allFlowIds.size());
    for (String flowId : suspendedFlows) {
        assertTrue(allFlowIds.contains(flowId));
    }
}
Also used : Arrays(java.util.Arrays) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Random(java.util.Random) HaApplication(com.sequenceiq.cloudbreak.service.ha.HaApplication) SecureRandom(java.security.SecureRandom) TransactionService(com.sequenceiq.cloudbreak.common.service.TransactionService) OptimisticLockingFailureException(org.springframework.dao.OptimisticLockingFailureException) InMemoryCleanup(com.sequenceiq.flow.cleanup.InMemoryCleanup) Mockito.doAnswer(org.mockito.Mockito.doAnswer) Map(java.util.Map) ZoneOffset(java.time.ZoneOffset) Mockito.doReturn(org.mockito.Mockito.doReturn) FlowLog(com.sequenceiq.flow.domain.FlowLog) Node(com.sequenceiq.cloudbreak.ha.domain.Node) Collection(java.util.Collection) Set(java.util.Set) UUID(java.util.UUID) ArgumentMatchers.anyList(org.mockito.ArgumentMatchers.anyList) Collectors(java.util.stream.Collectors) HeartbeatService(com.sequenceiq.cloudbreak.service.ha.HeartbeatService) List(java.util.List) TransactionExecutionException(com.sequenceiq.cloudbreak.common.service.TransactionService.TransactionExecutionException) ClassValue(com.sequenceiq.flow.domain.ClassValue) MockitoJUnitRunner(org.mockito.junit.MockitoJUnitRunner) FlowRegister(com.sequenceiq.flow.core.FlowRegister) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) IntStream(java.util.stream.IntStream) Clock(com.sequenceiq.cloudbreak.common.service.Clock) NodeService(com.sequenceiq.cloudbreak.ha.service.NodeService) ArgumentMatchers.anySet(org.mockito.ArgumentMatchers.anySet) Mock(org.mockito.Mock) LocalDateTime(java.time.LocalDateTime) RunWith(org.junit.runner.RunWith) HashMap(java.util.HashMap) Supplier(java.util.function.Supplier) Captor(org.mockito.Captor) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) ArgumentCaptor(org.mockito.ArgumentCaptor) ApplicationFlowInformation(com.sequenceiq.flow.core.ApplicationFlowInformation) OperationType(com.sequenceiq.flow.api.model.operation.OperationType) FlowLogService(com.sequenceiq.flow.core.FlowLogService) StateStatus(com.sequenceiq.flow.domain.StateStatus) Before(org.junit.Before) InjectMocks(org.mockito.InjectMocks) Flow2Handler(com.sequenceiq.flow.core.Flow2Handler) HelloWorldFlowConfig(com.sequenceiq.flow.core.helloworld.config.HelloWorldFlowConfig) InMemoryStateStore(com.sequenceiq.cloudbreak.cloud.store.InMemoryStateStore) Assert.assertTrue(org.junit.Assert.assertTrue) ReflectionTestUtils(org.springframework.test.util.ReflectionTestUtils) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) Mockito.verify(org.mockito.Mockito.verify) ArgumentMatchers.anyCollection(org.mockito.ArgumentMatchers.anyCollection) Assert.assertNull(org.junit.Assert.assertNull) FlowDistributor(com.sequenceiq.cloudbreak.ha.service.FlowDistributor) NodeConfig(com.sequenceiq.flow.ha.NodeConfig) FlowConfiguration(com.sequenceiq.flow.core.config.FlowConfiguration) PollGroup(com.sequenceiq.cloudbreak.cloud.scheduler.PollGroup) Collections(java.util.Collections) Assert.assertEquals(org.junit.Assert.assertEquals) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) FlowLog(com.sequenceiq.flow.domain.FlowLog) HashMap(java.util.HashMap) Node(com.sequenceiq.cloudbreak.ha.domain.Node) ArrayList(java.util.ArrayList) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) ArgumentMatchers.anyList(org.mockito.ArgumentMatchers.anyList) List(java.util.List) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Test(org.junit.Test)

Aggregations

FlowLog (com.sequenceiq.flow.domain.FlowLog)92 Test (org.junit.jupiter.api.Test)25 Test (org.junit.Test)23 ArrayList (java.util.ArrayList)21 List (java.util.List)13 FlowConfiguration (com.sequenceiq.flow.core.config.FlowConfiguration)12 TransactionService (com.sequenceiq.cloudbreak.common.service.TransactionService)11 Mockito.times (org.mockito.Mockito.times)11 Mockito.verify (org.mockito.Mockito.verify)11 Mockito.when (org.mockito.Mockito.when)11 HelloWorldFlowConfig (com.sequenceiq.flow.core.helloworld.config.HelloWorldFlowConfig)10 Map (java.util.Map)10 UUID (java.util.UUID)10 Collectors (java.util.stream.Collectors)10 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)10 Clock (com.sequenceiq.cloudbreak.common.service.Clock)9 FlowIdentifier (com.sequenceiq.flow.api.model.FlowIdentifier)9 FlowRegister (com.sequenceiq.flow.core.FlowRegister)9 SecureRandom (java.security.SecureRandom)9 Random (java.util.Random)9