This is an automated email from the ASF dual-hosted git repository. joewitt 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 713be8b539 NIFI-12101: This closes #7768. Fixed bugs that caused StatelessBasicsIT.testChangeFlowVersion to fail. There were a couple of related issues. Firstly, for Stateless Groups we were not waiting for the group to fully stop before attempting to update the flow but were waiting only for child/descendant groups to stop. This was due to misleading naming in the ProcessGroupUpdateStrategy enum. Renamed enum values to more clearly convey what they mean. Additionally, renamed th [...] 713be8b539 is described below commit 713be8b539f93d1b998aa187cdba178a7c46f155 Author: Mark Payne <marka...@hotmail.com> AuthorDate: Thu Sep 21 10:02:41 2023 -0400 NIFI-12101: This closes #7768. Fixed bugs that caused StatelessBasicsIT.testChangeFlowVersion to fail. There were a couple of related issues. Firstly, for Stateless Groups we were not waiting for the group to fully stop before attempting to update the flow but were waiting only for child/descendant groups to stop. This was due to misleading naming in the ProcessGroupUpdateStrategy enum. Renamed enum values to more clearly convey what they mean. Additionally, renamed the enum to more c [...] Fixed issue in logic of LocalComponentLifecycle, which was waiting for all PGs to reach desired stateless run schedule, even when the group itself was not stateless Fixed JavaScript to specify correct value for recursivity when updating process group parameter context --- ...eStrategy.java => ProcessGroupRecursivity.java} | 6 ++--- .../org/apache/nifi/web/NiFiServiceFacade.java | 14 +++++----- .../apache/nifi/web/StandardNiFiServiceFacade.java | 30 +++++++++++++++++++--- .../apache/nifi/web/api/ProcessGroupResource.java | 17 ++++++------ .../org/apache/nifi/web/api/dto/DtoFactory.java | 9 ++++++- .../org/apache/nifi/web/dao/ProcessGroupDAO.java | 6 ++--- .../nifi/web/dao/impl/StandardProcessGroupDAO.java | 6 ++--- .../nifi/web/util/LocalComponentLifecycle.java | 28 +++++++++++++++++--- .../nifi/web/api/TestProcessGroupResource.java | 6 ++--- .../js/nf/canvas/nf-process-group-configuration.js | 4 +-- .../resources/conf/clustered/node1/nifi.properties | 4 ++- .../resources/conf/clustered/node2/nifi.properties | 4 ++- .../test/resources/conf/default/nifi.properties | 2 ++ 13 files changed, 96 insertions(+), 40 deletions(-) diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ProcessGroupUpdateStrategy.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ProcessGroupRecursivity.java similarity index 90% rename from nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ProcessGroupUpdateStrategy.java rename to nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ProcessGroupRecursivity.java index aea19be6ea..c6710b96f4 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ProcessGroupUpdateStrategy.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ProcessGroupRecursivity.java @@ -16,7 +16,7 @@ */ package org.apache.nifi.web.api.entity; -public enum ProcessGroupUpdateStrategy { - CURRENT_GROUP, - CURRENT_GROUP_WITH_CHILDREN +public enum ProcessGroupRecursivity { + DIRECT_CHILDREN, + ALL_DESCENDANTS } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java index 419488d134..9d58078183 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java @@ -90,8 +90,6 @@ import org.apache.nifi.web.api.entity.AccessPolicyEntity; import org.apache.nifi.web.api.entity.ActionEntity; import org.apache.nifi.web.api.entity.ActivateControllerServicesEntity; import org.apache.nifi.web.api.entity.AffectedComponentEntity; -import org.apache.nifi.web.api.entity.FlowAnalysisResultEntity; -import org.apache.nifi.web.api.entity.FlowRegistryBucketEntity; import org.apache.nifi.web.api.entity.BulletinEntity; import org.apache.nifi.web.api.entity.ComponentValidationResultEntity; import org.apache.nifi.web.api.entity.ConfigurationAnalysisEntity; @@ -103,10 +101,12 @@ import org.apache.nifi.web.api.entity.ControllerConfigurationEntity; import org.apache.nifi.web.api.entity.ControllerServiceEntity; import org.apache.nifi.web.api.entity.ControllerServiceReferencingComponentsEntity; import org.apache.nifi.web.api.entity.CurrentUserEntity; +import org.apache.nifi.web.api.entity.FlowAnalysisResultEntity; import org.apache.nifi.web.api.entity.FlowAnalysisRuleEntity; import org.apache.nifi.web.api.entity.FlowComparisonEntity; import org.apache.nifi.web.api.entity.FlowConfigurationEntity; import org.apache.nifi.web.api.entity.FlowEntity; +import org.apache.nifi.web.api.entity.FlowRegistryBucketEntity; import org.apache.nifi.web.api.entity.FlowRegistryClientEntity; import org.apache.nifi.web.api.entity.FunnelEntity; import org.apache.nifi.web.api.entity.LabelEntity; @@ -117,8 +117,8 @@ import org.apache.nifi.web.api.entity.PortEntity; import org.apache.nifi.web.api.entity.PortStatusEntity; import org.apache.nifi.web.api.entity.ProcessGroupEntity; import org.apache.nifi.web.api.entity.ProcessGroupFlowEntity; +import org.apache.nifi.web.api.entity.ProcessGroupRecursivity; import org.apache.nifi.web.api.entity.ProcessGroupStatusEntity; -import org.apache.nifi.web.api.entity.ProcessGroupUpdateStrategy; import org.apache.nifi.web.api.entity.ProcessorDiagnosticsEntity; import org.apache.nifi.web.api.entity.ProcessorEntity; import org.apache.nifi.web.api.entity.ProcessorStatusEntity; @@ -1121,13 +1121,13 @@ public interface NiFiServiceFacade { void verifyDeleteParameterContext(String parameterContextId); /** - * Gets all process groups in the specified parent group. + * Gets all child/descendant process groups in the specified parent group. * * @param parentGroupId The id of the parent group - * @param processGroupUpdateStrategy if process groups with its child groups should be included - * @return List of process groups + * @param processGroupRecursivity how far to recurse into child/descendant groups + * @return Set of all child or descendant process groups */ - Set<ProcessGroupEntity> getProcessGroups(String parentGroupId, ProcessGroupUpdateStrategy processGroupUpdateStrategy); + Set<ProcessGroupEntity> getProcessGroups(String parentGroupId, ProcessGroupRecursivity processGroupRecursivity); /** * Verifies the contents of the specified process group can be scheduled or unscheduled. 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 9204afcfc9..37c5f091ff 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 @@ -226,6 +226,7 @@ import org.apache.nifi.web.api.dto.PermissionsDTO; import org.apache.nifi.web.api.dto.PortDTO; import org.apache.nifi.web.api.dto.PreviousValueDTO; import org.apache.nifi.web.api.dto.ProcessGroupDTO; +import org.apache.nifi.web.api.dto.ProcessGroupNameDTO; import org.apache.nifi.web.api.dto.ProcessorConfigDTO; import org.apache.nifi.web.api.dto.ProcessorDTO; import org.apache.nifi.web.api.dto.ProcessorRunStatusDetailsDTO; @@ -305,9 +306,9 @@ import org.apache.nifi.web.api.entity.PortEntity; import org.apache.nifi.web.api.entity.PortStatusEntity; import org.apache.nifi.web.api.entity.ProcessGroupEntity; import org.apache.nifi.web.api.entity.ProcessGroupFlowEntity; +import org.apache.nifi.web.api.entity.ProcessGroupRecursivity; import org.apache.nifi.web.api.entity.ProcessGroupStatusEntity; import org.apache.nifi.web.api.entity.ProcessGroupStatusSnapshotEntity; -import org.apache.nifi.web.api.entity.ProcessGroupUpdateStrategy; import org.apache.nifi.web.api.entity.ProcessorDiagnosticsEntity; import org.apache.nifi.web.api.entity.ProcessorEntity; import org.apache.nifi.web.api.entity.ProcessorRunStatusDetailsEntity; @@ -4631,10 +4632,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public Set<ProcessGroupEntity> getProcessGroups(final String parentGroupId, final ProcessGroupUpdateStrategy processGroupUpdateStrategy) { - final Set<ProcessGroup> groups = processGroupDAO.getProcessGroups(parentGroupId, processGroupUpdateStrategy); + public Set<ProcessGroupEntity> getProcessGroups(final String parentGroupId, final ProcessGroupRecursivity processGroupRecursivity) { + final Set<ProcessGroup> groups = processGroupDAO.getProcessGroups(parentGroupId, processGroupRecursivity); return groups.stream() - .map(group -> createProcessGroupEntity(group)) + .map(this::createProcessGroupEntity) .collect(Collectors.toSet()); } @@ -5696,11 +5697,23 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } + private ProcessGroupNameDTO createProcessGroupNameDto(final ProcessGroup group) { + if (group == null) { + return null; + } + + final ProcessGroupNameDTO dto = new ProcessGroupNameDTO(); + dto.setId(group.getIdentifier()); + dto.setName(group.getName()); + return dto; + } + private AffectedComponentEntity createAffectedComponentEntity(final Connectable connectable) { final AffectedComponentEntity entity = new AffectedComponentEntity(); entity.setRevision(dtoFactory.createRevisionDTO(revisionManager.getRevision(connectable.getIdentifier()))); entity.setId(connectable.getIdentifier()); entity.setReferenceType(connectable.getConnectableType().name()); + entity.setProcessGroup(createProcessGroupNameDto(connectable.getProcessGroup())); final Authorizable authorizable = getAuthorizable(connectable); final PermissionsDTO permissionsDto = dtoFactory.createPermissionsDto(authorizable); @@ -5724,6 +5737,7 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { entity.setRevision(dtoFactory.createRevisionDTO(revisionManager.getRevision(serviceNode.getIdentifier()))); entity.setId(serviceNode.getIdentifier()); entity.setReferenceType(AffectedComponentDTO.COMPONENT_TYPE_CONTROLLER_SERVICE); + entity.setProcessGroup(createProcessGroupNameDto(serviceNode.getProcessGroup())); final Authorizable authorizable = authorizableLookup.getControllerService(serviceNode.getIdentifier()).getAuthorizable(); final PermissionsDTO permissionsDto = dtoFactory.createPermissionsDto(authorizable); @@ -5744,6 +5758,7 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { entity.setRevision(dtoFactory.createRevisionDTO(revisionManager.getRevision(group.getIdentifier()))); entity.setId(group.getIdentifier()); entity.setReferenceType(AffectedComponentDTO.COMPONENT_TYPE_STATELESS_GROUP); + entity.setProcessGroup(createProcessGroupNameDto(group.getParent())); final PermissionsDTO permissionsDto = dtoFactory.createPermissionsDto(group); entity.setPermissions(permissionsDto); @@ -5765,6 +5780,13 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { entity.setId(instance.getInstanceIdentifier()); entity.setReferenceType(componentTypeName); + final String groupId = instance.getInstanceGroupId(); + if (groupId != null) { + final ProcessGroupNameDTO groupNameDto = new ProcessGroupNameDTO(); + groupNameDto.setId(groupId); + entity.setProcessGroup(groupNameDto); + } + final Authorizable authorizable = getAuthorizable(componentTypeName, instance); final PermissionsDTO permissionsDto = dtoFactory.createPermissionsDto(authorizable); entity.setPermissions(permissionsDto); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java index 0617557638..73182979b2 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java @@ -30,10 +30,12 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -70,7 +72,6 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriBuilder; -import java.util.ArrayList; import org.apache.commons.lang3.StringUtils; import org.apache.nifi.authorization.AuthorizableLookup; import org.apache.nifi.authorization.AuthorizeAccess; @@ -154,8 +155,8 @@ import org.apache.nifi.web.api.entity.ParameterContextReferenceEntity; import org.apache.nifi.web.api.entity.PortEntity; import org.apache.nifi.web.api.entity.ProcessGroupEntity; import org.apache.nifi.web.api.entity.ProcessGroupImportEntity; +import org.apache.nifi.web.api.entity.ProcessGroupRecursivity; import org.apache.nifi.web.api.entity.ProcessGroupReplaceRequestEntity; -import org.apache.nifi.web.api.entity.ProcessGroupUpdateStrategy; import org.apache.nifi.web.api.entity.ProcessGroupUploadEntity; import org.apache.nifi.web.api.entity.ProcessGroupsEntity; import org.apache.nifi.web.api.entity.ProcessorEntity; @@ -176,8 +177,6 @@ import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import java.util.HashSet; - /** * RESTful endpoint for managing a Group. */ @@ -532,11 +531,11 @@ public class ProcessGroupResource extends FlowUpdateResource<ProcessGroupImportE } final String processGroupUpdateStrategy = requestProcessGroupEntity.getProcessGroupUpdateStrategy(); - final ProcessGroupUpdateStrategy updateStrategy; + final ProcessGroupRecursivity updateStrategy; if (processGroupUpdateStrategy == null) { - updateStrategy = ProcessGroupUpdateStrategy.CURRENT_GROUP; + updateStrategy = ProcessGroupRecursivity.DIRECT_CHILDREN; } else { - updateStrategy = ProcessGroupUpdateStrategy.valueOf(processGroupUpdateStrategy); + updateStrategy = ProcessGroupRecursivity.valueOf(processGroupUpdateStrategy); } final String executionEngine = requestProcessGroupDTO.getExecutionEngine(); @@ -575,7 +574,7 @@ public class ProcessGroupResource extends FlowUpdateResource<ProcessGroupImportE updatableProcessGroups.put(requestProcessGroupEntity, getRevision(requestProcessGroupEntity, requestGroupId)); - if (updateStrategy == ProcessGroupUpdateStrategy.CURRENT_GROUP_WITH_CHILDREN) { + if (updateStrategy == ProcessGroupRecursivity.ALL_DESCENDANTS) { for (ProcessGroupEntity processGroupEntity : serviceFacade.getProcessGroups(requestGroupId, updateStrategy)) { final ProcessGroupDTO processGroupDTO = processGroupEntity.getComponent(); final String processGroupId = processGroupDTO == null ? processGroupEntity.getId() : processGroupDTO.getId(); @@ -2242,7 +2241,7 @@ public class ProcessGroupResource extends FlowUpdateResource<ProcessGroupImportE }); // get the process groups - final Set<ProcessGroupEntity> entities = serviceFacade.getProcessGroups(groupId, ProcessGroupUpdateStrategy.CURRENT_GROUP); + final Set<ProcessGroupEntity> entities = serviceFacade.getProcessGroups(groupId, ProcessGroupRecursivity.DIRECT_CHILDREN); // always prune the contents for (final ProcessGroupEntity entity : entities) { 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 5712661287..2b11861c8b 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 @@ -118,9 +118,9 @@ import org.apache.nifi.diagnostics.GarbageCollection; import org.apache.nifi.diagnostics.StorageUsage; import org.apache.nifi.diagnostics.SystemDiagnostics; import org.apache.nifi.expression.ExpressionLanguageScope; -import org.apache.nifi.flowanalysis.FlowAnalysisRule; import org.apache.nifi.flow.VersionedComponent; import org.apache.nifi.flow.VersionedProcessGroup; +import org.apache.nifi.flowanalysis.FlowAnalysisRule; import org.apache.nifi.flowfile.FlowFilePrioritizer; import org.apache.nifi.flowfile.attributes.CoreAttributes; import org.apache.nifi.groups.ProcessGroup; @@ -2242,6 +2242,13 @@ public final class DtoFactory { component.setUri(groupEntity.getUri()); component.setReferenceType(AffectedComponentDTO.COMPONENT_TYPE_STATELESS_GROUP); + final String parentGroupId = groupEntity.getComponent().getParentGroupId(); + if (parentGroupId != null) { + final ProcessGroupNameDTO groupName = new ProcessGroupNameDTO(); + groupName.setId(parentGroupId); + component.setProcessGroup(groupName); + } + final ProcessGroupDTO groupDto = groupEntity.getComponent(); final AffectedComponentDTO componentDto = new AffectedComponentDTO(); if (groupDto == null) { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ProcessGroupDAO.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ProcessGroupDAO.java index ef3d0c4b45..9cf188f091 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ProcessGroupDAO.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ProcessGroupDAO.java @@ -24,7 +24,7 @@ import org.apache.nifi.groups.ProcessGroup; import org.apache.nifi.web.api.dto.ProcessGroupDTO; import org.apache.nifi.web.api.dto.VariableRegistryDTO; import org.apache.nifi.web.api.dto.VersionControlInformationDTO; -import org.apache.nifi.web.api.entity.ProcessGroupUpdateStrategy; +import org.apache.nifi.web.api.entity.ProcessGroupRecursivity; import java.util.Collection; import java.util.Map; @@ -60,10 +60,10 @@ public interface ProcessGroupDAO { * Gets all of the process groups. * * @param parentGroupId The parent group id - * @param processGroupUpdateStrategy if process groups with its child groups should be included + * @param processGroupRecursivity how far into child/descendant groups to recurse * @return The process groups */ - Set<ProcessGroup> getProcessGroups(String parentGroupId, ProcessGroupUpdateStrategy processGroupUpdateStrategy); + Set<ProcessGroup> getProcessGroups(String parentGroupId, ProcessGroupRecursivity processGroupRecursivity); /** * Gets all of the process groups. diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAO.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAO.java index 33abc5d91b..3f352f54a9 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAO.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAO.java @@ -46,7 +46,7 @@ import org.apache.nifi.web.api.dto.ProcessGroupDTO; import org.apache.nifi.web.api.dto.VariableRegistryDTO; import org.apache.nifi.web.api.dto.VersionControlInformationDTO; import org.apache.nifi.web.api.entity.ParameterContextReferenceEntity; -import org.apache.nifi.web.api.entity.ProcessGroupUpdateStrategy; +import org.apache.nifi.web.api.entity.ProcessGroupRecursivity; import org.apache.nifi.web.api.entity.VariableEntity; import org.apache.nifi.web.dao.ProcessGroupDAO; import org.slf4j.Logger; @@ -156,9 +156,9 @@ public class StandardProcessGroupDAO extends ComponentDAO implements ProcessGrou } @Override - public Set<ProcessGroup> getProcessGroups(final String parentGroupId, final ProcessGroupUpdateStrategy processGroupUpdateStrategy) { + public Set<ProcessGroup> getProcessGroups(final String parentGroupId, final ProcessGroupRecursivity processGroupRecursivity) { ProcessGroup group = locateProcessGroup(flowController, parentGroupId); - if (processGroupUpdateStrategy == ProcessGroupUpdateStrategy.CURRENT_GROUP_WITH_CHILDREN) { + if (processGroupRecursivity == ProcessGroupRecursivity.ALL_DESCENDANTS) { return new HashSet<>(group.findAllProcessGroups()); } else { return group.getProcessGroups(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/LocalComponentLifecycle.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/LocalComponentLifecycle.java index 88385fa92d..02e21ffa98 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/LocalComponentLifecycle.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/LocalComponentLifecycle.java @@ -21,6 +21,7 @@ import org.apache.nifi.components.PropertyDescriptor; import org.apache.nifi.controller.ScheduledState; import org.apache.nifi.controller.service.ControllerServiceNode; import org.apache.nifi.controller.service.ControllerServiceState; +import org.apache.nifi.flow.ExecutionEngine; import org.apache.nifi.web.NiFiServiceFacade; import org.apache.nifi.web.Revision; import org.apache.nifi.web.api.dto.AffectedComponentDTO; @@ -31,7 +32,7 @@ import org.apache.nifi.web.api.dto.ProcessorRunStatusDetailsDTO; import org.apache.nifi.web.api.entity.AffectedComponentEntity; import org.apache.nifi.web.api.entity.ControllerServiceEntity; import org.apache.nifi.web.api.entity.ProcessGroupEntity; -import org.apache.nifi.web.api.entity.ProcessGroupUpdateStrategy; +import org.apache.nifi.web.api.entity.ProcessGroupRecursivity; import org.apache.nifi.web.api.entity.ProcessorEntity; import org.apache.nifi.web.revision.RevisionManager; import org.slf4j.Logger; @@ -191,7 +192,14 @@ public class LocalComponentLifecycle implements ComponentLifecycle { final Set<ProcessorEntity> processorEntities = serviceFacade.getProcessors(groupId, true); final boolean processorsComplete = isProcessorActionComplete(processorEntities, affectedComponents, desiredState, invalidComponentAction); - final Set<ProcessGroupEntity> groupEntities = serviceFacade.getProcessGroups(groupId, ProcessGroupUpdateStrategy.CURRENT_GROUP_WITH_CHILDREN); + // Gather the Process Group in question and all of its descendants + final Set<ProcessGroupEntity> groupEntities = new HashSet<>(); + groupEntities.add(serviceFacade.getProcessGroup(groupId)); + + final Set<ProcessGroupEntity> descendantEntities = serviceFacade.getProcessGroups(groupId, ProcessGroupRecursivity.ALL_DESCENDANTS); + groupEntities.addAll(descendantEntities); + + // Wait until the stateless group has reached the desired state final boolean statelessGroupsComplete = isStatelessGroupActionComplete(groupEntities, affectedComponents, desiredState); if (processorsComplete && statelessGroupsComplete) { @@ -293,8 +301,16 @@ public class LocalComponentLifecycle implements ComponentLifecycle { updateAffectedGroupComponents(groupEntities, affectedComponents); + final Set<String> affectedGroupIds = affectedComponents.values().stream() + .map(entity -> { + final boolean isGroup = AffectedComponentDTO.COMPONENT_TYPE_STATELESS_GROUP.equals(entity.getReferenceType()); + return isGroup ? entity.getId() : entity.getComponent().getProcessGroupId(); + }) + .collect(Collectors.toSet()); + for (final ProcessGroupEntity entity : groupEntities) { - if (!affectedComponents.containsKey(entity.getId())) { + // Only account for groups that are in our affected component list + if (!affectedGroupIds.contains(entity.getId())) { continue; } @@ -326,6 +342,12 @@ public class LocalComponentLifecycle implements ComponentLifecycle { } private boolean isDesiredStatelessGroupStateReached(final ProcessGroupEntity groupEntity, final ScheduledState desiredState) { + // Only consider this case for stateless groups + final String executionEngine = groupEntity.getComponent().getExecutionEngine(); + if (!ExecutionEngine.STATELESS.name().equals(executionEngine)) { + return true; + } + final String runStatus = groupEntity.getComponent().getStatelessGroupScheduledState(); final boolean stateMatches = desiredState.name().equalsIgnoreCase(runStatus); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestProcessGroupResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestProcessGroupResource.java index 85e40a3ed5..f4f450d0bd 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestProcessGroupResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestProcessGroupResource.java @@ -25,7 +25,7 @@ import org.apache.nifi.web.NiFiServiceFacade; import org.apache.nifi.web.api.dto.ProcessGroupDTO; import org.apache.nifi.web.api.dto.RevisionDTO; import org.apache.nifi.web.api.entity.ProcessGroupEntity; -import org.apache.nifi.web.api.entity.ProcessGroupUpdateStrategy; +import org.apache.nifi.web.api.entity.ProcessGroupRecursivity; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -37,12 +37,12 @@ import javax.ws.rs.core.Response; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class TestProcessGroupResource { @@ -84,7 +84,7 @@ public class TestProcessGroupResource { revisionDTO.setVersion(1L); processGroupEntity.setRevision(revisionDTO); - processGroupEntity.setProcessGroupUpdateStrategy(ProcessGroupUpdateStrategy.CURRENT_GROUP.name()); + processGroupEntity.setProcessGroupUpdateStrategy(ProcessGroupRecursivity.DIRECT_CHILDREN.name()); processGroupEntity.setComponent(groupDTO); doThrow(AccessDeniedException.class).when(serviceFacade).authorizeAccess(any(AuthorizeAccess.class)); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-process-group-configuration.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-process-group-configuration.js index e5765f741e..0165017d27 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-process-group-configuration.js +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-process-group-configuration.js @@ -95,9 +95,9 @@ // build the entity var updateStrategy; if ($('#parameter-contexts-recursive').hasClass('checkbox-unchecked')) { - updateStrategy = 'CURRENT_GROUP'; + updateStrategy = 'DIRECT_CHILDREN'; } else { - updateStrategy = 'CURRENT_GROUP_WITH_CHILDREN'; + updateStrategy = 'ALL_DESCENDANTS'; }; var entity = { diff --git a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node1/nifi.properties b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node1/nifi.properties index ed83075ae5..695ed90033 100644 --- a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node1/nifi.properties +++ b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node1/nifi.properties @@ -258,4 +258,6 @@ nifi.kerberos.spnego.authentication.expiration=12 hours # external properties files for variable registry # supports a comma delimited list of file locations -nifi.variable.registry.properties= \ No newline at end of file +nifi.variable.registry.properties= + +nifi.flow.analysis.background.task.schedule=5 mins \ No newline at end of file diff --git a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node2/nifi.properties b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node2/nifi.properties index defa484d66..de98797fa0 100644 --- a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node2/nifi.properties +++ b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/clustered/node2/nifi.properties @@ -258,4 +258,6 @@ nifi.kerberos.spnego.authentication.expiration=12 hours # external properties files for variable registry # supports a comma delimited list of file locations -nifi.variable.registry.properties= \ No newline at end of file +nifi.variable.registry.properties= + +nifi.flow.analysis.background.task.schedule=5 mins \ No newline at end of file diff --git a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/default/nifi.properties b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/default/nifi.properties index 0df0a5bfff..577f0a6ba9 100644 --- a/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/default/nifi.properties +++ b/nifi-system-tests/nifi-system-test-suite/src/test/resources/conf/default/nifi.properties @@ -260,3 +260,5 @@ nifi.kerberos.spnego.authentication.expiration=12 hours # external properties files for variable registry # supports a comma delimited list of file locations nifi.variable.registry.properties= + +nifi.flow.analysis.background.task.schedule=5 mins \ No newline at end of file