Today I tried to export a fairly complicated nifi template (several layers deep of process groups within process groups). I imported it on a different nifi host/instance, and encountered two issues. 1. When importing the template, no errors messages are encountered, however an entire subProcessGroup was missing from the flow. Also a connection was drawn to the wrong subProcessGroup. 2. I then made some modifications to the original flow, exported a new template, and this time during template import there was an error message pop-up: "Cannot add Connection to Process Group because its destination does not belong to this Process Group". After the error message pop-up, the root process group still shows up in the UI, however all connections (between all processors/groups, and within all process groups) are now missing.
I have encountered the problem(s) on both nifi 1.1.1 and 1.1.2 (on CentOS 6 and 7). The problem(s) may be related to: https://issues.apache.org/jira/browse/NIFI-3509 I was able to reproduce both of the issues above with a much simpler flow than my original flow. I would be able to share any of the xml files for this simpler flow upon request. Here are the steps to reproduce: 1. Create Process Group 'Test' 2. Within the 'Test' process group, define another process group 'InnerGroupA'. Within 'InnerGroupA', define a simple flow: 'Input' input port -> an UpdateAttribute processor -> and an 'Output' output port. 3. Within the 'Test' process group, define a simple flow such as GetFile -> InnerGroupA -> LogAttribute. 4. Select the 'InnerGroupA' process group. Create a Template using only the 'InnerGroupA' process group and name the template 'InnerGroupATemplate'. 5. Within the 'Test' process group, import the 'InnerGroupATemplate'. Notice how by default it is named 'Copy of InnerGroupA'. Rename it to 'InnerGroupB'. 6. Within the 'Test' process group, make sure that 'InnerGroupB' has its Output connected to LogAttribute. 7. Within the 'Test' process group, for GetFile, make sure that its output is MOVED/CHANGED to 'InnerGroupB'. After this, GetFile should be pointing to InnerGroupB only (instead of InnerGroupA). 8. Select the 'Test' process group. Create a template using only the 'Test' process group and name the template 'GetFileShouldPointToInnerGroupBTemplate'. 9. Now try to import the 'GetFileShouldPointToInnerGroupBTemplate' (on a different nifi instance, or the same nifi instance, it doesn't matter). Notice how there are no errors while importing this template. However, once you place the template on the canvas, notice how the InnerGroupB group has completely disappeared from within the Test process group. Moreover, the connection from GetFile is erroneously pointing to InnerGroupA (instead of InnerGroupB, which is missing anyway). 10. Now, return to the original 'Test' process group that you started with. Within 'InnerGroupB', import the 'InnerGroupATemplate' template. By default it will be called 'InnerGroupA', so rename it to 'SubInnerGroupC' just so we don't get it confused with the other process groups. 11. Within 'InnerGroupB', change UpdateAttribute's output to point to SubInnerGroupC. 12. Within 'InnerGroupB', make SubInnerGroupC's output point to the port called 'Output'. 13. Return to the original 'Test' process group, and delete the 'InnerGroupA' group (it will require you to delete the output connection to LogAttribute). 14. Select the original 'Test' process group. Create a template using only the 'Test' process group and name the template 'ReproducesErrorMessagePopupTemplate'. 15. Now try to import the 'ReproducesErrorMessagePopupTemplate' (on a different nifi instance, or the same nifi instance, it doesn't matter). There will be an error message pop-up: "Cannot add Connection to Process Group because its destination does not belong to this Process Group". In summary, you can encounter these erors if you have a parent/root process group that contains multiple subProcessGroups, and either: (1) some of those subProcessGroups were created via a template of a first subProcessGroup that still lives in the parent/root process group, or (2) there is a deep hierarchy of subProcessGroups within other subProcessGroups, and you created some of these from templates of a first subProcessGroup. Subsequently you delete that first subProcessGroup that was used as a basis of the template. Let me know if you need any further info. Thanks! Ben Garrett
