Search in sources :

Example 1 with FlowSynchronizer

use of org.apache.nifi.controller.serialization.FlowSynchronizer in project nifi by apache.

the class TestFlowController method testSynchronizeFlowWhenProposedAuthorizationsAreNull.

@Test(expected = UninheritableFlowException.class)
public void testSynchronizeFlowWhenProposedAuthorizationsAreNull() {
    final FlowSynchronizer standardFlowSynchronizer = new StandardFlowSynchronizer(StringEncryptor.createEncryptor(nifiProperties), nifiProperties);
    final DataFlow proposedDataFlow = Mockito.mock(DataFlow.class);
    when(proposedDataFlow.getAuthorizerFingerprint()).thenReturn(null);
    controller.synchronize(standardFlowSynchronizer, proposedDataFlow);
}
Also used : FlowSynchronizer(org.apache.nifi.controller.serialization.FlowSynchronizer) DataFlow(org.apache.nifi.cluster.protocol.DataFlow) Test(org.junit.Test)

Example 2 with FlowSynchronizer

use of org.apache.nifi.controller.serialization.FlowSynchronizer in project nifi by apache.

the class TestFlowController method testSynchronizeFlowWithProcessorReferencingControllerService.

@Test
public void testSynchronizeFlowWithProcessorReferencingControllerService() throws IOException {
    final FlowSynchronizer standardFlowSynchronizer = new StandardFlowSynchronizer(StringEncryptor.createEncryptor(nifiProperties), nifiProperties);
    // create a mock proposed data flow with the same auth fingerprint as the current authorizer
    final String authFingerprint = authorizer.getFingerprint();
    final DataFlow proposedDataFlow = Mockito.mock(DataFlow.class);
    when(proposedDataFlow.getAuthorizerFingerprint()).thenReturn(authFingerprint.getBytes(StandardCharsets.UTF_8));
    final File flowFile = new File("src/test/resources/conf/processor-with-cs-flow-0.7.0.xml");
    final String flow = IOUtils.toString(new FileInputStream(flowFile));
    when(proposedDataFlow.getFlow()).thenReturn(flow.getBytes(StandardCharsets.UTF_8));
    controller.synchronize(standardFlowSynchronizer, proposedDataFlow);
    // should be two controller services
    final Set<ControllerServiceNode> controllerServiceNodes = controller.getAllControllerServices();
    assertNotNull(controllerServiceNodes);
    assertEquals(1, controllerServiceNodes.size());
    // find the controller service that was moved to the root group
    final ControllerServiceNode rootGroupCs = controllerServiceNodes.stream().filter(c -> c.getProcessGroup() != null).findFirst().get();
    assertNotNull(rootGroupCs);
    // should be one processor
    final Set<ProcessorNode> processorNodes = controller.getGroup(controller.getRootGroupId()).getProcessors();
    assertNotNull(processorNodes);
    assertEquals(1, processorNodes.size());
    // verify the processor is still pointing at the controller service that got moved to the root group
    final ProcessorNode processorNode = processorNodes.stream().findFirst().get();
    final PropertyDescriptor procControllerServiceProp = processorNode.getProperties().entrySet().stream().filter(e -> e.getValue().equals(rootGroupCs.getIdentifier())).map(e -> e.getKey()).findFirst().get();
    assertNotNull(procControllerServiceProp);
}
Also used : MockPolicyBasedAuthorizer(org.apache.nifi.authorization.MockPolicyBasedAuthorizer) Bundle(org.apache.nifi.bundle.Bundle) Arrays(java.util.Arrays) ProcessorInstantiationException(org.apache.nifi.controller.exception.ProcessorInstantiationException) FlowFileEventRepository(org.apache.nifi.controller.repository.FlowFileEventRepository) ProcessGroup(org.apache.nifi.groups.ProcessGroup) BundleCoordinate(org.apache.nifi.bundle.BundleCoordinate) ProcessorConfigDTO(org.apache.nifi.web.api.dto.ProcessorConfigDTO) URL(java.net.URL) AbstractPolicyBasedAuthorizer(org.apache.nifi.authorization.AbstractPolicyBasedAuthorizer) BundleDTO(org.apache.nifi.web.api.dto.BundleDTO) ReportingTaskInstantiationException(org.apache.nifi.controller.reporting.ReportingTaskInstantiationException) PropertyDescriptor(org.apache.nifi.components.PropertyDescriptor) PositionDTO(org.apache.nifi.web.api.dto.PositionDTO) FlowSynchronizer(org.apache.nifi.controller.serialization.FlowSynchronizer) ServiceB(org.apache.nifi.controller.service.mock.ServiceB) SchedulingStrategy(org.apache.nifi.scheduling.SchedulingStrategy) After(org.junit.After) Map(java.util.Map) MockProvenanceRepository(org.apache.nifi.provenance.MockProvenanceRepository) FlowRegistryClient(org.apache.nifi.registry.flow.FlowRegistryClient) ControllerServiceDTO(org.apache.nifi.web.api.dto.ControllerServiceDTO) Set(java.util.Set) UUID(java.util.UUID) StandardCharsets(java.nio.charset.StandardCharsets) User(org.apache.nifi.authorization.User) VariableRegistry(org.apache.nifi.registry.VariableRegistry) IOUtils(org.apache.commons.io.IOUtils) Stateful(org.apache.nifi.annotation.behavior.Stateful) Assert.assertFalse(org.junit.Assert.assertFalse) DummyProcessor(org.apache.nifi.controller.service.mock.DummyProcessor) ProcessorDTO(org.apache.nifi.web.api.dto.ProcessorDTO) ExtensionManager(org.apache.nifi.nar.ExtensionManager) DummyReportingTask(org.apache.nifi.controller.service.mock.DummyReportingTask) AuditService(org.apache.nifi.admin.service.AuditService) FlowSnippetDTO(org.apache.nifi.web.api.dto.FlowSnippetDTO) Mockito.mock(org.mockito.Mockito.mock) DataFlow(org.apache.nifi.cluster.protocol.DataFlow) ControllerServiceNode(org.apache.nifi.controller.service.ControllerServiceNode) HashMap(java.util.HashMap) Group(org.apache.nifi.authorization.Group) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) StringEncryptor(org.apache.nifi.encrypt.StringEncryptor) Relationship(org.apache.nifi.processor.Relationship) SystemBundle(org.apache.nifi.nar.SystemBundle) LogLevel(org.apache.nifi.logging.LogLevel) LinkedHashSet(java.util.LinkedHashSet) Before(org.junit.Before) InstanceClassLoader(org.apache.nifi.nar.InstanceClassLoader) FileBasedVariableRegistry(org.apache.nifi.registry.variable.FileBasedVariableRegistry) MalformedURLException(java.net.MalformedURLException) RequestAction(org.apache.nifi.authorization.RequestAction) Assert.assertNotNull(org.junit.Assert.assertNotNull) Assert.assertTrue(org.junit.Assert.assertTrue) LogRepository(org.apache.nifi.logging.LogRepository) Test(org.junit.Test) IOException(java.io.IOException) FileUtils(org.apache.commons.io.FileUtils) FileInputStream(java.io.FileInputStream) Mockito.when(org.mockito.Mockito.when) ServiceA(org.apache.nifi.controller.service.mock.ServiceA) File(java.io.File) Assert.assertNotEquals(org.junit.Assert.assertNotEquals) TimeUnit(java.util.concurrent.TimeUnit) Mockito(org.mockito.Mockito) NiFiProperties(org.apache.nifi.util.NiFiProperties) AccessPolicy(org.apache.nifi.authorization.AccessPolicy) BulletinRepository(org.apache.nifi.reporting.BulletinRepository) Assert(org.junit.Assert) Collections(java.util.Collections) LogRepositoryFactory(org.apache.nifi.logging.LogRepositoryFactory) Assert.assertEquals(org.junit.Assert.assertEquals) InputStream(java.io.InputStream) PropertyDescriptor(org.apache.nifi.components.PropertyDescriptor) ControllerServiceNode(org.apache.nifi.controller.service.ControllerServiceNode) FlowSynchronizer(org.apache.nifi.controller.serialization.FlowSynchronizer) File(java.io.File) DataFlow(org.apache.nifi.cluster.protocol.DataFlow) FileInputStream(java.io.FileInputStream) Test(org.junit.Test)

Example 3 with FlowSynchronizer

use of org.apache.nifi.controller.serialization.FlowSynchronizer in project nifi by apache.

the class TestFlowController method testSynchronizeFlowWhenBundlesAreDifferent.

@Test
public void testSynchronizeFlowWhenBundlesAreDifferent() throws IOException {
    final FlowSynchronizer standardFlowSynchronizer = new StandardFlowSynchronizer(StringEncryptor.createEncryptor(nifiProperties), nifiProperties);
    final LogRepository logRepository = LogRepositoryFactory.getRepository("d89ada5d-35fb-44ff-83f1-4cc00b48b2df");
    logRepository.removeAllObservers();
    // first sync should work because we are syncing to an empty flow controller
    syncFlow("src/test/resources/nifi/fingerprint/flow4.xml", standardFlowSynchronizer);
    // second sync should fail because the bundle of the processor is different
    try {
        syncFlow("src/test/resources/nifi/fingerprint/flow4-with-different-bundle.xml", standardFlowSynchronizer);
        Assert.fail("Should have thrown UninheritableFlowException");
    } catch (UninheritableFlowException e) {
    // e.printStackTrace();
    }
}
Also used : FlowSynchronizer(org.apache.nifi.controller.serialization.FlowSynchronizer) LogRepository(org.apache.nifi.logging.LogRepository) Test(org.junit.Test)

Example 4 with FlowSynchronizer

use of org.apache.nifi.controller.serialization.FlowSynchronizer in project nifi by apache.

the class TestFlowController method testSynchronizeFlowWhenExistingMissingComponentsAreDifferent.

@Test
public void testSynchronizeFlowWhenExistingMissingComponentsAreDifferent() throws IOException {
    final StringEncryptor stringEncryptor = StringEncryptor.createEncryptor(nifiProperties);
    final FlowSynchronizer standardFlowSynchronizer = new StandardFlowSynchronizer(stringEncryptor, nifiProperties);
    final ProcessorNode mockProcessorNode = mock(ProcessorNode.class);
    when(mockProcessorNode.getIdentifier()).thenReturn("1");
    when(mockProcessorNode.isExtensionMissing()).thenReturn(true);
    final ControllerServiceNode mockControllerServiceNode = mock(ControllerServiceNode.class);
    when(mockControllerServiceNode.getIdentifier()).thenReturn("2");
    when(mockControllerServiceNode.isExtensionMissing()).thenReturn(true);
    final ReportingTaskNode mockReportingTaskNode = mock(ReportingTaskNode.class);
    when(mockReportingTaskNode.getIdentifier()).thenReturn("3");
    when(mockReportingTaskNode.isExtensionMissing()).thenReturn(true);
    final ProcessGroup mockRootGroup = mock(ProcessGroup.class);
    when(mockRootGroup.findAllProcessors()).thenReturn(Collections.singletonList(mockProcessorNode));
    final SnippetManager mockSnippetManager = mock(SnippetManager.class);
    when(mockSnippetManager.export()).thenReturn(new byte[0]);
    final FlowController mockFlowController = mock(FlowController.class);
    when(mockFlowController.getRootGroup()).thenReturn(mockRootGroup);
    when(mockFlowController.getAllControllerServices()).thenReturn(new HashSet<>(Arrays.asList(mockControllerServiceNode)));
    when(mockFlowController.getAllReportingTasks()).thenReturn(new HashSet<>(Arrays.asList(mockReportingTaskNode)));
    when(mockFlowController.getAuthorizer()).thenReturn(authorizer);
    when(mockFlowController.getSnippetManager()).thenReturn(mockSnippetManager);
    final DataFlow proposedDataFlow = Mockito.mock(DataFlow.class);
    when(proposedDataFlow.getMissingComponents()).thenReturn(new HashSet<>());
    try {
        standardFlowSynchronizer.sync(mockFlowController, proposedDataFlow, stringEncryptor);
        Assert.fail("Should have thrown exception");
    } catch (UninheritableFlowException e) {
        assertTrue(e.getMessage(), e.getMessage().contains("Current flow has missing components that are not considered missing in the proposed flow (1,2,3)"));
    }
}
Also used : ControllerServiceNode(org.apache.nifi.controller.service.ControllerServiceNode) FlowSynchronizer(org.apache.nifi.controller.serialization.FlowSynchronizer) ProcessGroup(org.apache.nifi.groups.ProcessGroup) StringEncryptor(org.apache.nifi.encrypt.StringEncryptor) DataFlow(org.apache.nifi.cluster.protocol.DataFlow) Test(org.junit.Test)

Example 5 with FlowSynchronizer

use of org.apache.nifi.controller.serialization.FlowSynchronizer in project nifi by apache.

the class StandardXMLFlowConfigurationDAO method load.

@Override
public synchronized void load(final FlowController controller, final DataFlow dataFlow) throws IOException, FlowSerializationException, FlowSynchronizationException, UninheritableFlowException, MissingBundleException {
    final FlowSynchronizer flowSynchronizer = new StandardFlowSynchronizer(encryptor, nifiProperties);
    controller.synchronize(flowSynchronizer, dataFlow);
    if (StandardFlowSynchronizer.isEmpty(dataFlow)) {
        // If the dataflow is empty, we want to save it. We do this because when we start up a brand new cluster with no
        // dataflow, we need to ensure that the flow is consistent across all nodes in the cluster and that upon restart
        // of NiFi, the root group ID does not change. However, we don't always want to save it, because if the flow is
        // not empty, then we can get into a bad situation, since the Processors, etc. don't have the appropriate "Scheduled
        // State" yet (since they haven't yet been scheduled). So if there are components in the flow and we save it, we
        // may end up saving the flow in such a way that all components are stopped.
        // We save based on the controller, not the provided data flow because Process Groups may contain 'local' templates.
        save(controller);
    }
}
Also used : StandardFlowSynchronizer(org.apache.nifi.controller.StandardFlowSynchronizer) FlowSynchronizer(org.apache.nifi.controller.serialization.FlowSynchronizer) StandardFlowSynchronizer(org.apache.nifi.controller.StandardFlowSynchronizer)

Aggregations

FlowSynchronizer (org.apache.nifi.controller.serialization.FlowSynchronizer)11 Test (org.junit.Test)10 DataFlow (org.apache.nifi.cluster.protocol.DataFlow)8 LogRepository (org.apache.nifi.logging.LogRepository)4 HashSet (java.util.HashSet)3 LinkedHashSet (java.util.LinkedHashSet)3 MockPolicyBasedAuthorizer (org.apache.nifi.authorization.MockPolicyBasedAuthorizer)3 ControllerServiceNode (org.apache.nifi.controller.service.ControllerServiceNode)3 File (java.io.File)2 FileInputStream (java.io.FileInputStream)2 IOException (java.io.IOException)2 InputStream (java.io.InputStream)2 MalformedURLException (java.net.MalformedURLException)2 URL (java.net.URL)2 StandardCharsets (java.nio.charset.StandardCharsets)2 ArrayList (java.util.ArrayList)2 Arrays (java.util.Arrays)2 Collections (java.util.Collections)2 HashMap (java.util.HashMap)2 LinkedHashMap (java.util.LinkedHashMap)2