Skip to content

NIFI-16058 - Treat external controller service reference changes in versioned flows as environment-specific#11383

Merged
exceptionfactory merged 2 commits into
apache:mainfrom
pvillard31:NIFI-16058
Jul 23, 2026
Merged

NIFI-16058 - Treat external controller service reference changes in versioned flows as environment-specific#11383
exceptionfactory merged 2 commits into
apache:mainfrom
pvillard31:NIFI-16058

Conversation

@pvillard31

Copy link
Copy Markdown
Contributor

Summary

NIFI-16058 - Treat external controller service reference changes in versioned flows as environment-specific

NIFI-15697 (PR #11006) fixed a badge/dialog inconsistency for external controller service references via three changes: (1) removed the comparator suppression of external CS reference diffs, (2) added name-based reconciliation of the snapshot, (3) added cache invalidation when an ancestor CS is removed. (3) was the real fix; (1)+(2) changed prior behavior and caused NIFI-16058: external CS references (e.g. a root SSL Context Service) now show as phantom local changes when the service differs by id, and name-based reconciliation can't help when the name differs across envs.

This keeps (3) and restores environment-specific treatment of external CS references, but in the flow-difference filter (FlowDifferenceFilters.isEnvironmentalChange) rather than the framework-agnostic comparator: a CS-reference change is environmental when the snapshot value isn't a locally-accessible ancestor service while the local value is. The filter runs on both the state and "Show Local Changes" paths, so they agree by construction. Name-based reconciliation is removed; StandardFlowComparator is unchanged.

Tracking

Please complete the following tracking steps prior to pull request creation.

Issue Tracking

Pull Request Tracking

  • Pull Request title starts with Apache NiFi Jira issue number, such as NIFI-00000
  • Pull Request commit message starts with Apache NiFi Jira issue number, as such NIFI-00000
  • Pull request contains commits signed with a registered key indicating Verified status

Pull Request Formatting

  • Pull Request based on current revision of the main branch
  • Pull Request refers to a feature branch with one commit containing changes

Verification

Please indicate the verification steps performed prior to pull request creation.

Build

  • Build completed using ./mvnw clean install -P contrib-check
    • JDK 21
    • JDK 25

Licensing

  • New dependencies are compatible with the Apache License 2.0 according to the License Policy
  • New dependencies are documented in applicable LICENSE and NOTICE files

Documentation

  • Documentation formatting appears as expected in rendered files

@exceptionfactory exceptionfactory left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @pvillard31, the general approach looks good. I noted one minor recommendation regarding test assertion comments

Comment on lines +432 to +447
// !accessibleA && accessibleB -> environmental: snapshot points at a service that does not exist locally
// (e.g. a dev-environment id), local points at an existing ancestor service.
assertExternalServiceChange(localGroup, flowManager, parentGroupId, propertyName, foreignServiceId, ancestorServiceX, true,
"Switching from an unavailable external service to a local ancestor service must be treated as environmental");

// accessibleA && accessibleB -> NOT environmental: a genuine switch between two services that both exist locally.
assertExternalServiceChange(localGroup, flowManager, parentGroupId, propertyName, ancestorServiceY, ancestorServiceX, false,
"Switching between two locally-accessible ancestor services must remain a reported change");

// accessibleA && !accessibleB -> NOT environmental: local points at a service that is not an accessible ancestor (e.g. one defined
// inside the versioned Process Group), so the change must surface.
assertExternalServiceChange(localGroup, flowManager, parentGroupId, propertyName, ancestorServiceX, internalServiceId, false,
"Switching to a service that is not an accessible ancestor (e.g. internal to the group) must remain a reported change");

// !accessibleA && !accessibleB -> NOT environmental.
assertExternalServiceChange(localGroup, flowManager, parentGroupId, propertyName, "foreign-1", "foreign-2", false,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comments above these assertions are duplicative of the messages and should be removed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, thanks

@exceptionfactory
exceptionfactory merged commit 5a6c472 into apache:main Jul 23, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants