This is an automated email from the ASF dual-hosted git repository.

bejancsaba 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 6258f5fe04 NIFI-13831: Adding inheritance to versioned component 
synchronizer parameter context synchronization when considering referencing 
components to restart
6258f5fe04 is described below

commit 6258f5fe0497593e55498416eb27580f30ec693d
Author: Joe Gresock <[email protected]>
AuthorDate: Wed Oct 2 18:41:22 2024 -0400

    NIFI-13831: Adding inheritance to versioned component synchronizer 
parameter context synchronization when considering referencing components to 
restart
    
    Signed-off-by: Csaba Bejan <[email protected]>
    
    This closes #9338.
---
 .../StandardVersionedComponentSynchronizer.java    | 18 +++++++++++-
 ...StandardVersionedComponentSynchronizerTest.java | 34 ++++++++++++++++++----
 2 files changed, 45 insertions(+), 7 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizer.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizer.java
index 335762b448..712a6cefbb 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizer.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizer.java
@@ -1689,12 +1689,28 @@ public class StandardVersionedComponentSynchronizer 
implements VersionedComponen
         }
     }
 
+    private void collectValueAndReferences(final ParameterContext 
parameterContext, final Map<String, ParameterValueAndReferences> valueAndRef) {
+        parameterContext.getEffectiveParameters()
+                .forEach((pd, param) -> valueAndRef.put(pd.getName(), 
getValueAndReferences(param)));
+    }
+
     protected Set<String> getUpdatedParameterNames(final ParameterContext 
parameterContext, final VersionedParameterContext proposed) {
         final Map<String, ParameterValueAndReferences> originalValues = new 
HashMap<>();
-        parameterContext.getParameters().values().forEach(param -> 
originalValues.put(param.getDescriptor().getName(), 
getValueAndReferences(param)));
+        collectValueAndReferences(parameterContext, originalValues);
+        parameterContext.getEffectiveParameters().forEach((pd, param) -> 
originalValues.put(pd.getName(), getValueAndReferences(param)));
 
         final Map<String, ParameterValueAndReferences> proposedValues = new 
HashMap<>();
         if (proposed != null) {
+            if (proposed.getInheritedParameterContexts() != null) {
+                for (int i = proposed.getInheritedParameterContexts().size() - 
1; i >= 0; i--) {
+                    final String name = 
proposed.getInheritedParameterContexts().get(i);
+                    final ParameterContext inheritedContext = 
getParameterContextByName(name);
+                    if (inheritedContext != null) {
+                        collectValueAndReferences(inheritedContext, 
proposedValues);
+                        inheritedContext.getEffectiveParameters().forEach((pd, 
param) -> proposedValues.put(pd.getName(), getValueAndReferences(param)));
+                    }
+                }
+            }
             proposed.getParameters().forEach(versionedParam -> 
proposedValues.put(versionedParam.getName(), 
getValueAndReferences(versionedParam)));
         }
 
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizerTest.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizerTest.java
index f369290509..80f7673959 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizerTest.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizerTest.java
@@ -1165,30 +1165,30 @@ public class StandardVersionedComponentSynchronizerTest 
{
 
         // Test no changes
         Map<String, String> parameterMap = new HashMap<>(originalParams);
-        VersionedParameterContext proposed = 
createVersionedParameterContext("Context 2", parameterMap, 
Collections.singleton("secret"));
+        VersionedParameterContext proposed = 
createVersionedParameterContext("Context 1", parameterMap, 
Collections.singleton("secret"));
         assertEquals(Collections.emptySet(), 
synchronizer.getUpdatedParameterNames(existing, proposed));
 
         // Test non-sensitive param change
         parameterMap = new HashMap<>(originalParams);
         parameterMap.put("abc", "hello");
-        proposed = createVersionedParameterContext("Context 2", parameterMap, 
Collections.singleton("secret"));
+        proposed = createVersionedParameterContext("Context 1", parameterMap, 
Collections.singleton("secret"));
         assertEquals(Collections.singleton("abc"), 
synchronizer.getUpdatedParameterNames(existing, proposed));
 
         // Test sensitive param change
         parameterMap = new HashMap<>(originalParams);
         parameterMap.put("secret", "secret");
-        proposed = createVersionedParameterContext("Context 2", parameterMap, 
Collections.singleton("secret"));
+        proposed = createVersionedParameterContext("Context 1", parameterMap, 
Collections.singleton("secret"));
         assertEquals(Collections.singleton("secret"), 
synchronizer.getUpdatedParameterNames(existing, proposed));
 
         // Test removed parameters
         parameterMap.clear();
-        proposed = createVersionedParameterContext("Context 2", parameterMap, 
Collections.singleton("secret"));
+        proposed = createVersionedParameterContext("Context 1", parameterMap, 
Collections.singleton("secret"));
         assertEquals(new HashSet<>(Arrays.asList("abc", "secret")), 
synchronizer.getUpdatedParameterNames(existing, proposed));
 
         // Test added parameter
         parameterMap = new HashMap<>(originalParams);
         parameterMap.put("Added", "Added");
-        proposed = createVersionedParameterContext("Context 2", parameterMap, 
Collections.singleton("secret"));
+        proposed = createVersionedParameterContext("Context 1", parameterMap, 
Collections.singleton("secret"));
         assertEquals(Collections.singleton("Added"), 
synchronizer.getUpdatedParameterNames(existing, proposed));
 
         // Test added, removed, and updated parameters
@@ -1197,8 +1197,30 @@ public class StandardVersionedComponentSynchronizerTest {
         parameterMap.put("Added 2", "Added");
         parameterMap.remove("secret");
         parameterMap.put("abc", "hello");
-        proposed = createVersionedParameterContext("Context 2", parameterMap, 
Collections.singleton("secret"));
+        proposed = createVersionedParameterContext("Context 1", parameterMap, 
Collections.singleton("secret"));
         assertEquals(new HashSet<>(Arrays.asList("abc", "secret", "Added", 
"Added 2")), synchronizer.getUpdatedParameterNames(existing, proposed));
+
+        // Test change value due to inherited parameter context reordering
+        final Map<String, String> inheritedParameters = new HashMap<>();
+        // Context 1: abc = xyz
+        // Context 3: abc = def
+        inheritedParameters.put("abc", "def");
+        final VersionedParameterContext context3 = 
createVersionedParameterContext("Context 3", inheritedParameters, 
Collections.emptySet());
+
+        synchronizer.synchronize(null, context3, synchronizationOptions);
+
+        parameterMap = new HashMap<>();
+        proposed = createVersionedParameterContext("Context 2", parameterMap, 
Collections.emptySet());
+        synchronizer.synchronize(null, proposed, synchronizationOptions);
+
+        ParameterContext context2 = 
parameterContextManager.getParameterContextNameMapping().get("Context 2");
+        proposed.setInheritedParameterContexts(List.of("Context 1", "Context 
3"));
+        synchronizer.synchronize(context2, proposed, synchronizationOptions);
+
+        proposed.setInheritedParameterContexts(List.of("Context 3", "Context 
1"));
+        context2 = 
parameterContextManager.getParameterContextNameMapping().get("Context 2");
+        // The effective value of abc should change here due to the reordering
+        assertEquals(Collections.singleton("abc"), 
synchronizer.getUpdatedParameterNames(context2, proposed));
     }
 
     @Test

Reply via email to