From 6c950023c370457ac15403808a54a2522af75426 Mon Sep 17 00:00:00 2001 From: MatthewKnight-NG Date: Fri, 22 Nov 2019 15:14:22 -0500 Subject: [PATCH] NIFI-5924 Labels should be searchable Signed-off-by: Matthew Burgess This closes #4070 --- .../web/api/dto/search/SearchResultsDTO.java | 15 +++++++ .../controller/ControllerSearchService.java | 33 +++++++++++++- .../ControllerSearchServiceTest.java | 44 +++++++++++++++++++ .../nf-ng-canvas-flow-status-controller.js | 8 ++++ 4 files changed, 98 insertions(+), 2 deletions(-) diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/search/SearchResultsDTO.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/search/SearchResultsDTO.java index 5054c291332e..19462617c9ba 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/search/SearchResultsDTO.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/search/SearchResultsDTO.java @@ -35,6 +35,7 @@ public class SearchResultsDTO { private List outputPortResults = new ArrayList<>(); private List remoteProcessGroupResults = new ArrayList<>(); private List funnelResults = new ArrayList<>(); + private List labelResults = new ArrayList<>(); private List parameterContextResults = new ArrayList<>(); private List parameterResults = new ArrayList<>(); @@ -136,6 +137,20 @@ public void setFunnelResults(List funnelResults) { this.funnelResults = funnelResults; } + /** + * @return labels that matched the search + */ + @ApiModelProperty( + value = "The labels that matched the search." + ) + public List getLabelResults() { + return labelResults; + } + + public void setLabelResults(List labelResults) { + this.labelResults = labelResults; + } + /** * @return parameter contexts that matched the search. */ diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerSearchService.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerSearchService.java index 9bec4bb6e3e8..a41288e44ddb 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerSearchService.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerSearchService.java @@ -31,6 +31,7 @@ import org.apache.nifi.controller.FlowController; import org.apache.nifi.controller.ProcessorNode; import org.apache.nifi.controller.ScheduledState; +import org.apache.nifi.controller.label.Label; import org.apache.nifi.controller.queue.FlowFileQueue; import org.apache.nifi.flowfile.FlowFilePrioritizer; import org.apache.nifi.groups.ProcessGroup; @@ -74,8 +75,8 @@ public class ControllerSearchService { * Searches term in the controller beginning from a given process group. * * @param results Search results - * @param search The search term - * @param group The init process group + * @param search The search term + * @param group The init process group */ public void search(final SearchResultsDTO results, final String search, final ProcessGroup group) { final NiFiUser user = NiFiUserUtils.getNiFiUser(); @@ -162,6 +163,18 @@ public void search(final SearchResultsDTO results, final String search, final Pr } } + for (final Label label : group.getLabels()) { + if (label.isAuthorized(authorizer, RequestAction.READ, user)) { + final ComponentSearchResultDTO match = search(search, label); + if (match != null) { + match.setGroupId(group.getIdentifier()); + match.setParentGroup(buildResultGroup(group, user)); + match.setVersionedGroup(buildVersionedGroup(group, user)); + results.getLabelResults().add(match); + } + } + } + for (final ProcessGroup processGroup : group.getProcessGroups()) { search(results, search, processGroup); } @@ -511,6 +524,22 @@ private ComponentSearchResultDTO search(final String searchStr, final Funnel fun return dto; } + private ComponentSearchResultDTO search(final String searchStr, final Label label) { + final List matches = new ArrayList<>(); + addIfAppropriate(searchStr, label.getIdentifier(), "Id", matches); + addIfAppropriate(searchStr, label.getValue(), "Value", matches); + + if (matches.isEmpty()) { + return null; + } + + final ComponentSearchResultDTO dto = new ComponentSearchResultDTO(); + dto.setId(label.getIdentifier()); + dto.setName(label.getValue()); + dto.setMatches(matches); + return dto; + } + private ComponentSearchResultDTO search(final String searchString, final ParameterContext parameterContext) { final List matches = new ArrayList<>(); addIfAppropriate(searchString, parameterContext.getIdentifier(), "Id", matches); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerSearchServiceTest.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerSearchServiceTest.java index 939f8c6c32af..74ffc1c20cf6 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerSearchServiceTest.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerSearchServiceTest.java @@ -23,6 +23,7 @@ import org.apache.nifi.controller.ProcessorNode; import org.apache.nifi.controller.StandardProcessorNode; import org.apache.nifi.controller.flow.FlowManager; +import org.apache.nifi.controller.label.Label; import org.apache.nifi.groups.ProcessGroup; import org.apache.nifi.parameter.Parameter; import org.apache.nifi.parameter.ParameterContext; @@ -403,6 +404,49 @@ public void testSearchParameterContextNotAuthorized() { assertEquals(0, searchResultsDTO.getParameterResults().size()); } + @Test + public void testSearchLabels() { + // root level PG + final ProcessGroup rootProcessGroup = setupMockedProcessGroup("root", null, true, variableRegistry, null); + + // setup labels + setupMockedLabels(rootProcessGroup); + + // perform search for foo + service.search(searchResultsDTO, "FOO", rootProcessGroup); + + assertTrue(searchResultsDTO.getLabelResults().size() == 1); + assertTrue(searchResultsDTO.getLabelResults().get(0).getId().equals("foo")); + assertTrue(searchResultsDTO.getLabelResults().get(0).getName().equals("Value for label foo")); + } + + /** + * Mocks Labels including isAuthorized() and their identifier and value + * + * @param containingProcessGroup The process group + */ + private static void setupMockedLabels(final ProcessGroup containingProcessGroup) { + final Label label1 = mock(Label.class); + Mockito.doReturn(true).when(label1).isAuthorized(AdditionalMatchers.or(any(Authorizer.class), isNull()), eq(RequestAction.READ), + AdditionalMatchers.or(any(NiFiUser.class), isNull())); + Mockito.doReturn("foo").when(label1).getIdentifier(); + Mockito.doReturn("Value for label foo").when(label1).getValue(); + + final Label label2 = mock(Label.class); + Mockito.doReturn(false).when(label2).isAuthorized(AdditionalMatchers.or(any(Authorizer.class), isNull()), eq(RequestAction.READ), + AdditionalMatchers.or(any(NiFiUser.class), isNull())); + Mockito.doReturn("bar").when(label2).getIdentifier(); + Mockito.doReturn("Value for label bar, but FOO is in here too").when(label2).getValue(); + + // assign labels to the PG + Mockito.doReturn(new HashSet