simonbence commented on code in PR #7661:
URL: https://github.com/apache/nifi/pull/7661#discussion_r1347743734


##########
nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/JoinClusterWithDifferentFlow.java:
##########
@@ -106,124 +94,72 @@ public void testStartupWithDifferentFlow() throws 
IOException, NiFiClientExcepti
         node2.stop();
 
         final File node2ConfDir = new File(node2.getInstanceDirectory(), 
"conf");
-        final File flowXmlFile = new File(node2ConfDir, "flow.xml.gz");
-        Files.deleteIfExists(flowXmlFile.toPath());
-        
Files.copy(Paths.get("src/test/resources/flows/mismatched-flows/flow2.xml.gz"), 
flowXmlFile.toPath());
+        final File flowJsonFile = new File(node2ConfDir, "flow.json.gz");
+        Files.deleteIfExists(flowJsonFile.toPath());
+        
Files.copy(Paths.get("src/test/resources/flows/mismatched-flows/flow2.json.gz"),
 flowJsonFile.toPath());
 
         node2.start(true);
 
-        final File backupFile = getBackupFile(node2ConfDir);
-        final NodeDTO node2Dto = getNodeDtoByApiPort(5672);
+        waitForAllNodesConnected();
+        switchClientToNode(2);
 
+        final File backupFile = getBackupFile(node2ConfDir);
         verifyFlowContentsOnDisk(backupFile);
-        disconnectNode(node2Dto);
         verifyInMemoryFlowContents();
-
-        // Reconnect the node so that we can properly shutdown
-        reconnectNode(node2Dto);
     }
 
-
-    private List<File> getFlowXmlFiles(final File confDir) {
-        final File[] flowXmlFileArray = confDir.listFiles(file -> 
file.getName().startsWith("flow") && file.getName().endsWith(".xml.gz"));
-        final List<File> flowXmlFiles = new 
ArrayList<>(Arrays.asList(flowXmlFileArray));
-        return flowXmlFiles;
+    private List<File> getFlowJsonFiles(final File confDir) {
+        final File[] flowJsonFileArray = confDir.listFiles(file -> 
file.getName().startsWith("flow") && file.getName().endsWith(".json.gz"));
+        final List<File> flowJsonFiles = new 
ArrayList<>(Arrays.asList(flowJsonFileArray));
+        return flowJsonFiles;
     }
 
     private File getBackupFile(final File confDir) throws InterruptedException 
{
-        waitFor(() -> getFlowXmlFiles(confDir).size() == 2);
-
-        final List<File> flowXmlFiles = getFlowXmlFiles(confDir);
-        assertEquals(2, flowXmlFiles.size());
+        waitFor(() -> getFlowJsonFiles(confDir).size() == 1);
 
-        flowXmlFiles.removeIf(file -> file.getName().equals("flow.xml.gz"));
+        final List<File> flowJsonFiles = getFlowJsonFiles(confDir);
+        assertEquals(1, flowJsonFiles.size());
 
-        assertEquals(1, flowXmlFiles.size());
-        final File backupFile = flowXmlFiles.get(0);
-        return backupFile;
+        return flowJsonFiles.iterator().next();
     }
 
     private void verifyFlowContentsOnDisk(final File backupFile) throws 
IOException {
-        // Read the flow and make sure that the backup looks the same as the 
original. We don't just do a byte comparison because the compression may result 
in different
-        // gzipped bytes and because if the two flows do differ, we want to 
have the String representation so that we can compare to see how they are 
different.
-        final String flowXml = readFlow(backupFile);
-        final String expectedFlow = readFlow(new 
File("src/test/resources/flows/mismatched-flows/flow1.xml.gz"));
-
-        assertEquals(expectedFlow, flowXml);
-
         // Verify some of the values that were persisted to disk
         final File confDir = backupFile.getParentFile();
-        final String loadedFlow = readFlow(new File(confDir, "flow.xml.gz"));
+        final String loadedFlow = readFlow(new File(confDir, "flow.json.gz"));

Review Comment:
   By some reason there is some misbehaviour with the id handling of the 
registry clients. At the time of implementation there was some necessary 
duplication of it, as we needed to support both the legacy solution (getId) and 
the solution derived from the component handling (getIdentifier). It looks 
like, in case of synchronization this might cause some issues as id is used for 
both instanceIdentifier and Identifier. That can couse the following error if 
we have different registry clients in the synchronized flows:
   
   `Proposed Flow is not inheritable by the flow controller because of 
differences in missing components: Current flow has missing components that are 
not considered missing in the proposed flow 
(65b71b80-016e-1000-7131-40b0976ac45966)`
   
   This is something was discovered within the effors led to this PR but not 
part of the scope or direct result of the changes. I will raise a separate 
apache ticket and PR for a fix on this.



##########
nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/JoinClusterWithDifferentFlow.java:
##########
@@ -236,20 +172,9 @@ private void verifyInMemoryFlowContents() throws 
NiFiClientException, IOExceptio
         assertEquals("65b8f293-016e-1000-7b8f-6c6752fa921b", 
affectedComponent.getId());
         assertEquals(AffectedComponentDTO.COMPONENT_TYPE_PROCESSOR, 
affectedComponent.getReferenceType());
 
-        // The original Controller Service, whose UUID ended with 00 should be 
removed and a new one inherited.
-        final ControllerServicesEntity controllerLevelServices = 
node2Client.getFlowClient().getControllerServices();
-        assertEquals(1, 
controllerLevelServices.getControllerServices().size());
-
-        final ControllerServiceEntity firstService = 
controllerLevelServices.getControllerServices().iterator().next();
-        assertFalse(firstService.getId().endsWith("00"));
-    }
-
-    private PropertyEncryptor createEncryptorFromProperties(Properties 
properties) {
-        final NiFiProperties niFiProperties = 
NiFiProperties.createBasicNiFiProperties(null, properties);
-
-        final String propertiesKey = 
niFiProperties.getProperty(NiFiProperties.SENSITIVE_PROPS_KEY);
-        final String propertiesAlgorithm = 
niFiProperties.getProperty(NiFiProperties.SENSITIVE_PROPS_ALGORITHM);
-        return new 
PropertyEncryptorBuilder(propertiesKey).setAlgorithm(propertiesAlgorithm).build();
+        final ControllerServicesEntity controllerLevelServices = 
getNifiClient().getFlowClient(DO_NOT_REPLICATE).getControllerServices();
+        final Set<ControllerServiceEntity> controllerServices = 
controllerLevelServices.getControllerServices();
+        assertEquals(2, controllerServices.size());

Review Comment:
   I had some troubles with this assertation as it did persistently behaved 
differently as in case of the XML based synchronization. I looked into the 
implementation and I found that, the JSON based synchronization behaves 
differently for the flow itself and the controller/management level parts of 
the flow definition. While the items part of the flow (root group) might be 
"replaced" (added and removed) when id is changed, and that part of the test 
still covers the behaviour correctly, the methods like 
`inheritControllerServices` within `VersionedFlowSynchronizer` seemingly work 
differently and does not remove items not appearant in the proposed flow. This 
is why in case of JSON sync, the resuolt contains the controller service from 
both flow1 and flow2. @markap14 could you please confirm this behaviour from 
the part of the `VersionedFlowSynchronizer` is deliberate? Thanks! (Also, thank 
you for highlighting that the original change sometimes checked on the flow of 
node 1)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@nifi.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to