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 <[email protected]>
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 <[email protected]>
---
.../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;
}