This is an automated email from the ASF dual-hosted git repository.
markap14 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 87cfd43 NIFI-9233 - Improve reliability of system integration tests
(#5749)
87cfd43 is described below
commit 87cfd43f6f872e14e904d63fe74645d41aaa8a02
Author: greyp9 <[email protected]>
AuthorDate: Tue Feb 15 13:14:01 2022 -0500
NIFI-9233 - Improve reliability of system integration tests (#5749)
* NIFI-9233 - Improve reliability of system integration tests
---
.../service/StandardControllerServiceNode.java | 16 ++++++++++------
.../apache/nifi/controller/AbstractComponentNode.java | 19 +++++++++++++++++++
.../org/apache/nifi/controller/ComponentNode.java | 2 ++
.../clustered/server/ConnectionLoadBalanceServer.java | 5 ++++-
.../org/apache/nifi/tests/system/NiFiSystemIT.java | 19 +++++++++++++++++++
.../system/clustering/FlowSynchronizationIT.java | 7 +++++--
.../nifi/tests/system/clustering/OffloadIT.java | 3 ++-
.../nifi/tests/system/loadbalance/LoadBalanceIT.java | 4 ++--
8 files changed, 63 insertions(+), 12 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
index 8593201..f767bfc 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java
@@ -339,17 +339,21 @@ public class StandardControllerServiceNode extends
AbstractComponentNode impleme
@Override
public void verifyCanEnable() {
final ControllerServiceState state = getState();
- if (state != ControllerServiceState.DISABLED) {
- throw new
IllegalStateException(getControllerServiceImplementation().getIdentifier() + "
cannot be enabled because it is not disabled - it has a state of " + state);
+ switch (state) {
+ case DISABLED:
+ return;
+ case DISABLING:
+ throw new
IllegalStateException(getControllerServiceImplementation().getIdentifier() + "
cannot be enabled because it is not disabled - it has a state of " + state);
+ default:
+ if (isReloadAdditionalResourcesNecessary()) {
+ throw new
IllegalStateException(getControllerServiceImplementation().getIdentifier() + "
cannot be enabled because additional resources are needed - it has a state of "
+ state);
+ }
}
}
@Override
public void verifyCanEnable(final Set<ControllerServiceNode>
ignoredReferences) {
- final ControllerServiceState state = getState();
- if (state != ControllerServiceState.DISABLED) {
- throw new
IllegalStateException(getControllerServiceImplementation().getIdentifier() + "
cannot be enabled because it is not disabled - it has a state of " + state);
- }
+ verifyCanEnable();
}
@Override
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
index 24be80e..943a3d3 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
@@ -627,6 +627,25 @@ public abstract class AbstractComponentNode implements
ComponentNode {
/**
* Generates fingerprint for the additional urls and compares it with the
previous
+ * fingerprint value.
+ */
+ @Override
+ public synchronized boolean isReloadAdditionalResourcesNecessary() {
+ // Components that don't have any PropertyDescriptors marked
`dynamicallyModifiesClasspath`
+ // won't have the fingerprint i.e. will be null, in such cases do
nothing
+ if (additionalResourcesFingerprint == null) {
+ return false;
+ }
+
+ final Set<PropertyDescriptor> descriptors =
this.getProperties().keySet();
+ final Set<URL> additionalUrls =
this.getAdditionalClasspathResources(descriptors);
+
+ final String newFingerprint =
ClassLoaderUtils.generateAdditionalUrlsFingerprint(additionalUrls,
determineClasloaderIsolationKey());
+ return (!StringUtils.equals(additionalResourcesFingerprint,
newFingerprint));
+ }
+
+ /**
+ * Generates fingerprint for the additional urls and compares it with the
previous
* fingerprint value. If the fingerprint values don't match, the function
calls the
* component's reload() to load the newly found resources.
*/
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ComponentNode.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ComponentNode.java
index 875f877..5316c1c 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ComponentNode.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/ComponentNode.java
@@ -147,6 +147,8 @@ public interface ComponentNode extends
ComponentAuthorizable {
void verifyCanUpdateBundle(BundleCoordinate bundleCoordinate) throws
IllegalStateException;
+ boolean isReloadAdditionalResourcesNecessary();
+
void reloadAdditionalResourcesIfNecessary();
void resetValidationState();
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/clustered/server/ConnectionLoadBalanceServer.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/clustered/server/ConnectionLoadBalanceServer.java
index 97b08cd..3083a3b 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/clustered/server/ConnectionLoadBalanceServer.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/queue/clustered/server/ConnectionLoadBalanceServer.java
@@ -34,6 +34,8 @@ import java.util.concurrent.atomic.AtomicLong;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLServerSocket;
+
+import org.apache.commons.io.IOUtils;
import org.apache.nifi.events.EventReporter;
import org.apache.nifi.reporting.Severity;
import org.apache.nifi.security.util.CertificateUtils;
@@ -96,7 +98,7 @@ public class ConnectionLoadBalanceServer {
}
public void stop() {
- stopped = false;
+ stopped = true;
if (acceptConnection != null) {
acceptConnection.stop();
@@ -148,6 +150,7 @@ public class ConnectionLoadBalanceServer {
public void stop() {
this.stopped = true;
+ IOUtils.closeQuietly(socket);
}
@Override
diff --git
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/NiFiSystemIT.java
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/NiFiSystemIT.java
index 159d7ec..3e6248c 100644
---
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/NiFiSystemIT.java
+++
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/NiFiSystemIT.java
@@ -20,7 +20,9 @@ import
org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClient;
import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientConfig;
import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException;
import org.apache.nifi.toolkit.cli.impl.client.nifi.impl.JerseyNiFiClient;
+import org.apache.nifi.web.api.dto.NodeDTO;
import org.apache.nifi.web.api.entity.ClusteSummaryEntity;
+import org.apache.nifi.web.api.entity.ClusterEntity;
import org.apache.nifi.web.api.entity.ConnectionStatusEntity;
import org.junit.After;
import org.junit.AfterClass;
@@ -36,6 +38,7 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
+import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -192,6 +195,7 @@ public abstract class NiFiSystemIT {
final ClusteSummaryEntity clusterSummary =
client.getFlowClient().getClusterSummary();
final int connectedNodeCount =
clusterSummary.getClusterSummary().getConnectedNodeCount();
if (connectedNodeCount == expectedNumberOfNodes) {
+ logger.info("Wait successful, {} nodes connected",
expectedNumberOfNodes);
return;
}
@@ -326,6 +330,21 @@ public abstract class NiFiSystemIT {
}
}
+ protected void waitForNodeStatus(final NodeDTO nodeDto, final String
status) throws InterruptedException {
+ waitFor(() -> {
+ try {
+ final ClusterEntity clusterEntity =
getNifiClient().getControllerClient().getNodes();
+ final Collection<NodeDTO> nodes =
clusterEntity.getCluster().getNodes();
+ final NodeDTO nodeDtoMatch = nodes.stream()
+ .filter(n ->
n.getApiPort().equals(nodeDto.getApiPort())).findFirst().get();
+ return nodeDtoMatch.getStatus().equals(status);
+ } catch (final Exception e) {
+ logger.error("Failed to determine node status", e);
+ }
+ return false;
+ });
+ }
+
protected void waitForQueueNotEmpty(final String connectionId) throws
InterruptedException {
logger.info("Waiting for Queue on Connection {} to not be empty",
connectionId);
diff --git
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/FlowSynchronizationIT.java
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/FlowSynchronizationIT.java
index 417047e..b7dcad1 100644
---
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/FlowSynchronizationIT.java
+++
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/FlowSynchronizationIT.java
@@ -303,7 +303,10 @@ public class FlowSynchronizationIT extends NiFiSystemIT {
final ControllerServiceEntity node2SleepService =
getNifiClient().getControllerServicesClient(DO_NOT_REPLICATE).getControllerService(sleepService.getId());
assertEquals(sleepService.getId(), node2SleepService.getId());
- waitFor(() ->
node2SleepService.getComponent().getState().equals(ENABLED_STATE));
+ waitFor(() -> {
+ final ControllerServiceEntity updatedNode2SleepService =
getNifiClient().getControllerServicesClient(DO_NOT_REPLICATE).getControllerService(sleepService.getId());
+ return
updatedNode2SleepService.getComponent().getState().equals(ENABLED_STATE);
+ });
final ReportingTaskEntity node2ReportingTask =
getNifiClient().getReportingTasksClient(DO_NOT_REPLICATE).getReportingTask(reportingTask.getId());
waitFor(() ->
node2ReportingTask.getComponent().getState().equals(RUNNING_STATE));
@@ -683,7 +686,7 @@ public class FlowSynchronizationIT extends NiFiSystemIT {
connection.setDisconnectedNodeAcknowledged(true);
// Delete the CountFlowFiles processor, and countB and countC
services, disable A.
- getNifiClient().getProcessorClient().stopProcessor(countFlowFiles);
+ getClientUtil().stopProcessor(countFlowFiles);
getNifiClient().getConnectionClient().deleteConnection(connection);
getNifiClient().getProcessorClient().deleteProcessor(countFlowFiles);
getClientUtil().disableControllerServices("root", true);
diff --git
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/OffloadIT.java
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/OffloadIT.java
index 1e66fc3..9553892 100644
---
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/OffloadIT.java
+++
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/clustering/OffloadIT.java
@@ -75,10 +75,11 @@ public class OffloadIT extends NiFiSystemIT {
final NodeDTO node2Dto = getNodeDTO(5672);
disconnectNode(node2Dto);
+ waitForNodeStatus(node2Dto, "DISCONNECTED");
final String nodeId = node2Dto.getNodeId();
getClientUtil().offloadNode(nodeId);
- waitFor(this::isNodeOffloaded);
+ waitForNodeStatus(node2Dto, "OFFLOADED");
getClientUtil().connectNode(nodeId);
waitForAllNodesConnected();
diff --git
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/loadbalance/LoadBalanceIT.java
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/loadbalance/LoadBalanceIT.java
index 04716b9..b35d0b8 100644
---
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/loadbalance/LoadBalanceIT.java
+++
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/loadbalance/LoadBalanceIT.java
@@ -254,9 +254,9 @@ public class LoadBalanceIT extends NiFiSystemIT {
final String nodeId = firstNodeDto.getNodeId();
getClientUtil().disconnectNode(nodeId);
+ waitForNodeStatus(firstNodeDto, "DISCONNECTED");
getClientUtil().offloadNode(nodeId);
-
- waitFor(this::isNodeOffloaded);
+ waitForNodeStatus(firstNodeDto, "OFFLOADED");
assertEquals(20, getQueueSize(connection.getId()));
assertEquals(20 * 1024 * 1024, getQueueBytes(connection.getId()));