This is an automated email from the ASF dual-hosted git repository. ijokarumawak pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/master by this push: new e7f4af6 NIFI-6315 Ensuring remote ports get tracked correctly when saving/retrieving versioned flows e7f4af6 is described below commit e7f4af68014ea99f1e351436d6a078ad4b3346a6 Author: Bryan Bende <bbe...@apache.org> AuthorDate: Thu May 23 14:18:37 2019 -0400 NIFI-6315 Ensuring remote ports get tracked correctly when saving/retrieving versioned flows NIFI-6315 Renaming public ports during import/change-version when name alreadye exists, and ignorning name change from flow diffs NIFI-6315 Ensuring public ports get renamed during copy/paste NIFI-6315 Set max concurrent tasks on Port based on value from VersionedPort This closes #3488. Signed-off-by: Koji Kawamura <ijokaruma...@apache.org> --- .../apache/nifi/controller/flow/FlowManager.java | 17 ++++ .../nifi/controller/StandardFlowSnippet.java | 25 +++++- .../nifi/controller/flow/StandardFlowManager.java | 21 +++++ .../apache/nifi/groups/StandardProcessGroup.java | 98 +++++++++++++++------- .../flow/mapping/NiFiRegistryFlowMapper.java | 8 ++ .../apache/nifi/util/FlowDifferenceFilters.java | 20 +++++ .../nifi/util/TestFlowDifferenceFilters.java | 45 ++++++++++ .../apache/nifi/web/StandardNiFiServiceFacade.java | 5 ++ .../org/apache/nifi/web/api/dto/DtoFactory.java | 5 ++ 9 files changed, 214 insertions(+), 30 deletions(-) diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java index c48c06f..f2a9cf9 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java @@ -33,6 +33,7 @@ import org.apache.nifi.web.api.dto.FlowSnippetDTO; import java.net.URL; import java.util.Collection; +import java.util.Optional; import java.util.Set; public interface FlowManager { @@ -76,6 +77,22 @@ public interface FlowManager { Set<Port> getPublicOutputPorts(); /** + * Gets the public input port with the given name. + * + * @param name the port name + * @return an optional containing the public input port with the given name, or empty if one does not exist + */ + Optional<Port> getPublicInputPort(String name); + + /** + * Gets the public output port with the given name. + * + * @param name the port name + * @return an optional containing the public output port with the given name, or empty if one does not exist + */ + Optional<Port> getPublicOutputPort(String name); + + /** * Creates a new Remote Process Group with the given ID that points to the given URI * * @param id Remote Process Group ID diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSnippet.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSnippet.java index 56622f8..d466c9c 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSnippet.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSnippet.java @@ -72,6 +72,7 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -284,7 +285,8 @@ public class StandardFlowSnippet implements FlowSnippet { for (final PortDTO portDTO : dto.getInputPorts()) { final Port inputPort; if (group.isRootGroup() || Boolean.TRUE.equals(portDTO.getAllowRemoteAccess())) { - inputPort = flowManager.createPublicInputPort(portDTO.getId(), portDTO.getName()); + final String portName = generatePublicInputPortName(flowManager, portDTO.getName()); + inputPort = flowManager.createPublicInputPort(portDTO.getId(), portName); if (portDTO.getGroupAccessControl() != null) { ((PublicPort) inputPort).setGroupAccessControl(portDTO.getGroupAccessControl()); } @@ -308,7 +310,8 @@ public class StandardFlowSnippet implements FlowSnippet { for (final PortDTO portDTO : dto.getOutputPorts()) { final Port outputPort; if (group.isRootGroup() || Boolean.TRUE.equals(portDTO.getAllowRemoteAccess())) { - outputPort = flowManager.createPublicOutputPort(portDTO.getId(), portDTO.getName()); + final String portName = generatePublicOutputPortName(flowManager, portDTO.getName()); + outputPort = flowManager.createPublicOutputPort(portDTO.getId(), portName); if (portDTO.getGroupAccessControl() != null) { ((PublicPort) outputPort).setGroupAccessControl(portDTO.getGroupAccessControl()); } @@ -570,6 +573,24 @@ public class StandardFlowSnippet implements FlowSnippet { } } + private String generatePublicInputPortName(final FlowManager flowManager, final String proposedName) { + final Optional<Port> existingPort = flowManager.getPublicInputPort(proposedName); + if (existingPort.isPresent()) { + return generatePublicInputPortName(flowManager, "Copy of " + proposedName); + } else { + return proposedName; + } + } + + private String generatePublicOutputPortName(final FlowManager flowManager, final String proposedName) { + final Optional<Port> existingPort = flowManager.getPublicOutputPort(proposedName); + if (existingPort.isPresent()) { + return generatePublicOutputPortName(flowManager, "Copy of " + proposedName); + } else { + return proposedName; + } + } + private ProcessGroup getConnectableParent(final ProcessGroup group, final String parentGroupId, final FlowManager flowManager) { if (flowManager.areGroupsSame(group.getIdentifier(), parentGroupId)) { return group; diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java index 6b9f558..0a31f11 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java @@ -82,6 +82,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -179,6 +180,26 @@ public class StandardFlowManager implements FlowManager { group.getProcessGroups().forEach(childGroup -> getPublicPorts(publicPorts, childGroup, getPorts)); } + @Override + public Optional<Port> getPublicInputPort(String name) { + return findPort(name, getPublicInputPorts()); + } + + @Override + public Optional<Port> getPublicOutputPort(String name) { + return findPort(name, getPublicOutputPorts()); + } + + private Optional<Port> findPort(final String portName, final Set<Port> ports) { + if (ports != null) { + for (final Port port : ports) { + if (portName.equals(port.getName())) { + return Optional.of(port); + } + } + } + return Optional.empty(); + } public RemoteProcessGroup createRemoteProcessGroup(final String id, final String uris) { return new StandardRemoteProcessGroup(requireNonNull(id), uris, null, processScheduler, bulletinRepository, sslContext, nifiProperties); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/groups/StandardProcessGroup.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/groups/StandardProcessGroup.java index 3f9014b..8679e3a 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/groups/StandardProcessGroup.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/groups/StandardProcessGroup.java @@ -16,31 +16,6 @@ */ package org.apache.nifi.groups; -import static java.util.Objects.requireNonNull; - -import java.io.IOException; -import java.net.ConnectException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.function.Function; -import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -136,6 +111,7 @@ import org.apache.nifi.registry.variable.MutableVariableRegistry; import org.apache.nifi.remote.PublicPort; import org.apache.nifi.remote.RemoteGroupPort; import org.apache.nifi.remote.StandardRemoteProcessGroupPortDescriptor; +import org.apache.nifi.remote.TransferDirection; import org.apache.nifi.remote.protocol.SiteToSiteTransportProtocol; import org.apache.nifi.scheduling.ExecutionNode; import org.apache.nifi.scheduling.SchedulingStrategy; @@ -148,6 +124,32 @@ import org.apache.nifi.web.api.dto.TemplateDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.net.ConnectException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static java.util.Objects.requireNonNull; + public final class StandardProcessGroup implements ProcessGroup { private final String id; @@ -3834,7 +3836,16 @@ public final class StandardProcessGroup implements ProcessGroup { final Port port = portAndFinalName.getKey(); final String finalName = portAndFinalName.getValue(); LOG.info("Updating {} to replace temporary name with final name", port); - updatePortToSetFinalName(port, finalName); + + // For public ports we need to consider if another public port exists somewhere else in the flow with the + // same name, and if so then rename the incoming port so the flow can still be imported + if (port instanceof PublicPort) { + final PublicPort publicPort = (PublicPort) port; + final String publicPortFinalName = getPublicPortFinalName(publicPort, finalName); + updatePortToSetFinalName(publicPort, publicPortFinalName); + } else { + updatePortToSetFinalName(port, finalName); + } } for (final String removedVersionedId : labelsRemoved) { @@ -3862,6 +3873,21 @@ public final class StandardProcessGroup implements ProcessGroup { } } + private String getPublicPortFinalName(final PublicPort publicPort, final String proposedFinalName) { + final Optional<Port> existingPublicPort; + if (TransferDirection.RECEIVE == publicPort.getDirection()) { + existingPublicPort = flowManager.getPublicInputPort(proposedFinalName); + } else { + existingPublicPort = flowManager.getPublicOutputPort(proposedFinalName); + } + + if (existingPublicPort.isPresent() && !existingPublicPort.get().getIdentifier().equals(publicPort.getIdentifier())) { + return getPublicPortFinalName(publicPort, "Copy of " + proposedFinalName); + } else { + return proposedFinalName; + } + } + private boolean isUpdateable(final Connection connection) { final Connectable source = connection.getSource(); if (source.getConnectableType() != ConnectableType.FUNNEL && source.isRunning()) { @@ -4204,11 +4230,19 @@ public final class StandardProcessGroup implements ProcessGroup { port.setComments(proposed.getComments()); port.setName(name); port.setPosition(new Position(proposed.getPosition().getX(), proposed.getPosition().getY())); + port.setMaxConcurrentTasks(proposed.getConcurrentlySchedulableTaskCount()); } private Port addInputPort(final ProcessGroup destination, final VersionedPort proposed, final String componentIdSeed, final String temporaryName) { final String name = temporaryName != null ? temporaryName : proposed.getName(); - final Port port = flowManager.createLocalInputPort(generateUuid(proposed.getIdentifier(), destination.getIdentifier(), componentIdSeed), name); + + final Port port; + if (proposed.isAllowRemoteAccess()) { + port = flowManager.createPublicInputPort(generateUuid(proposed.getIdentifier(), destination.getIdentifier(), componentIdSeed), name); + } else { + port = flowManager.createLocalInputPort(generateUuid(proposed.getIdentifier(), destination.getIdentifier(), componentIdSeed), name); + } + port.setVersionedComponentId(proposed.getIdentifier()); destination.addInputPort(port); updatePort(port, proposed, temporaryName); @@ -4218,7 +4252,14 @@ public final class StandardProcessGroup implements ProcessGroup { private Port addOutputPort(final ProcessGroup destination, final VersionedPort proposed, final String componentIdSeed, final String temporaryName) { final String name = temporaryName != null ? temporaryName : proposed.getName(); - final Port port = flowManager.createLocalOutputPort(generateUuid(proposed.getIdentifier(), destination.getIdentifier(), componentIdSeed), name); + + final Port port; + if (proposed.isAllowRemoteAccess()) { + port = flowManager.createPublicOutputPort(generateUuid(proposed.getIdentifier(), destination.getIdentifier(), componentIdSeed), name); + } else { + port = flowManager.createLocalOutputPort(generateUuid(proposed.getIdentifier(), destination.getIdentifier(), componentIdSeed), name); + } + port.setVersionedComponentId(proposed.getIdentifier()); destination.addOutputPort(port); updatePort(port, proposed, temporaryName); @@ -4431,6 +4472,7 @@ public final class StandardProcessGroup implements ProcessGroup { final Set<FlowDifference> differences = comparison.getDifferences().stream() .filter(difference -> difference.getDifferenceType() != DifferenceType.BUNDLE_CHANGED) .filter(FlowDifferenceFilters.FILTER_ADDED_REMOVED_REMOTE_PORTS) + .filter(FlowDifferenceFilters.FILTER_PUBLIC_PORT_NAME_CHANGES) .filter(FlowDifferenceFilters.FILTER_IGNORABLE_VERSIONED_FLOW_COORDINATE_CHANGES) .collect(Collectors.toCollection(HashSet::new)); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/registry/flow/mapping/NiFiRegistryFlowMapper.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/registry/flow/mapping/NiFiRegistryFlowMapper.java index c45d960..e3aba02 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/registry/flow/mapping/NiFiRegistryFlowMapper.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/registry/flow/mapping/NiFiRegistryFlowMapper.java @@ -58,6 +58,7 @@ import org.apache.nifi.registry.flow.VersionedProcessor; import org.apache.nifi.registry.flow.VersionedPropertyDescriptor; import org.apache.nifi.registry.flow.VersionedRemoteGroupPort; import org.apache.nifi.registry.flow.VersionedRemoteProcessGroup; +import org.apache.nifi.remote.PublicPort; import org.apache.nifi.remote.RemoteGroupPort; import java.nio.charset.StandardCharsets; @@ -434,6 +435,13 @@ public class NiFiRegistryFlowMapper { versionedPort.setName(port.getName()); versionedPort.setPosition(mapPosition(port.getPosition())); versionedPort.setType(PortType.valueOf(port.getConnectableType().name())); + + if (port instanceof PublicPort) { + versionedPort.setAllowRemoteAccess(true); + } else { + versionedPort.setAllowRemoteAccess(false); + } + return versionedPort; } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/util/FlowDifferenceFilters.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/util/FlowDifferenceFilters.java index 29c82fc..c4c7403 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/util/FlowDifferenceFilters.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/util/FlowDifferenceFilters.java @@ -19,6 +19,7 @@ package org.apache.nifi.util; import org.apache.nifi.registry.flow.ComponentType; import org.apache.nifi.registry.flow.VersionedComponent; import org.apache.nifi.registry.flow.VersionedFlowCoordinates; +import org.apache.nifi.registry.flow.VersionedPort; import org.apache.nifi.registry.flow.VersionedProcessGroup; import org.apache.nifi.registry.flow.diff.DifferenceType; import org.apache.nifi.registry.flow.diff.FlowDifference; @@ -29,6 +30,25 @@ import java.util.function.Predicate; public class FlowDifferenceFilters { /** + * Predicate that returns true if the difference is NOT a name change on a public port (i.e. VersionedPort that allows remote access). + */ + public static Predicate<FlowDifference> FILTER_PUBLIC_PORT_NAME_CHANGES = (fd) -> { + return !isPublicPortNameChange(fd); + }; + + public static boolean isPublicPortNameChange(final FlowDifference fd) { + final VersionedComponent versionedComponent = fd.getComponentA(); + if (fd.getDifferenceType() == DifferenceType.NAME_CHANGED && versionedComponent instanceof VersionedPort) { + final VersionedPort versionedPort = (VersionedPort) versionedComponent; + if (versionedPort.isAllowRemoteAccess()) { + return true; + } + } + + return false; + } + + /** * Predicate that returns true if the difference is NOT a remote port being added, and false if it is. */ public static Predicate<FlowDifference> FILTER_ADDED_REMOVED_REMOTE_PORTS = (fd) -> { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/util/TestFlowDifferenceFilters.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/util/TestFlowDifferenceFilters.java index 330dd33..a6be1fa 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/util/TestFlowDifferenceFilters.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/util/TestFlowDifferenceFilters.java @@ -18,6 +18,7 @@ package org.apache.nifi.util; import org.apache.nifi.registry.flow.ComponentType; import org.apache.nifi.registry.flow.VersionedFlowCoordinates; +import org.apache.nifi.registry.flow.VersionedPort; import org.apache.nifi.registry.flow.VersionedProcessGroup; import org.apache.nifi.registry.flow.VersionedProcessor; import org.apache.nifi.registry.flow.VersionedRemoteGroupPort; @@ -122,5 +123,49 @@ public class TestFlowDifferenceFilters { Assert.assertTrue(FlowDifferenceFilters.FILTER_IGNORABLE_VERSIONED_FLOW_COORDINATE_CHANGES.test(flowDifference)); } + @Test + public void testFilterPublicPortNameChangeWhenNotNameChange() { + final VersionedPort portA = new VersionedPort(); + final VersionedPort portB = new VersionedPort(); + + final StandardFlowDifference flowDifference = new StandardFlowDifference( + DifferenceType.VERSIONED_FLOW_COORDINATES_CHANGED, + portA, portB, + "http://localhost:18080", "http://localhost:17080", + ""); + + Assert.assertTrue(FlowDifferenceFilters.FILTER_PUBLIC_PORT_NAME_CHANGES.test(flowDifference)); + } + + @Test + public void testFilterPublicPortNameChangeWhenNotAllowRemoteAccess() { + final VersionedPort portA = new VersionedPort(); + final VersionedPort portB = new VersionedPort(); + + final StandardFlowDifference flowDifference = new StandardFlowDifference( + DifferenceType.NAME_CHANGED, + portA, portB, + "Port A", "Port B", + ""); + + Assert.assertTrue(FlowDifferenceFilters.FILTER_PUBLIC_PORT_NAME_CHANGES.test(flowDifference)); + } + + @Test + public void testFilterPublicPortNameChangeWhenAllowRemoteAccess() { + final VersionedPort portA = new VersionedPort(); + portA.setAllowRemoteAccess(true); + + final VersionedPort portB = new VersionedPort(); + portB.setAllowRemoteAccess(false); + + final StandardFlowDifference flowDifference = new StandardFlowDifference( + DifferenceType.NAME_CHANGED, + portA, portB, + "Port A", "Port B", + ""); + + Assert.assertFalse(FlowDifferenceFilters.FILTER_PUBLIC_PORT_NAME_CHANGES.test(flowDifference)); + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java index 7bd16b8..fa967bf 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java @@ -4096,6 +4096,11 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { continue; } + // Ignore name changes to public ports + if (FlowDifferenceFilters.isPublicPortNameChange(difference)) { + continue; + } + if (FlowDifferenceFilters.isIgnorableVersionedFlowCoordinateChange(difference)) { continue; } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java index 4804d5f..542ca6c 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java @@ -2324,6 +2324,11 @@ public final class DtoFactory { continue; } + // Ignore name changes to public ports + if (FlowDifferenceFilters.isPublicPortNameChange(difference)) { + continue; + } + if (FlowDifferenceFilters.isIgnorableVersionedFlowCoordinateChange(difference)) { continue; }