[ 
https://issues.apache.org/jira/browse/NIFI-15988?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mark Payne updated NIFI-15988:
------------------------------
    Status: Patch Available  (was: Open)

> Split `MigratableConnector` into two separate migration phases
> --------------------------------------------------------------
>
>                 Key: NIFI-15988
>                 URL: https://issues.apache.org/jira/browse/NIFI-15988
>             Project: Apache NiFi
>          Issue Type: Improvement
>          Components: Core Framework, NiFi API
>            Reporter: Mark Payne
>            Assignee: Mark Payne
>            Priority: Major
>             Fix For: nifi-api-2.9.0
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> In NIP-29 we introduced the ability to migrate an existing Process Group's 
> assets, configuration, and state into a Connector.
> There was, however, a shortcoming in the interface that provided this 
> capability. It is an opt-in style interface named `MigratableConnector` with 
> two methods:
> {code}
> boolean isMigrationSupported(ConnectorMigrationContext context);
> void migrate(ConnectorMigrationContext context) throws FlowUpdateException;
> {code}
> The intent of `migrate` was to allow it to update the flow as appropriate to 
> mirror the configuration of the provided VersionedProcessGroup (available via 
> ConnectorMigrationContext).
> The shortcoming is that while this will update the flow, it does NOT properly 
> update the Connector's configuration. So after migrating, if a user were to 
> configure the Connector, they would not see the changes. And upon restart 
> we'd have lost those changes unless we built something into the framework to 
> explicitly handle this.
> So we should instead break up the `migrate` method into a two-phase approach:
> {code}
> void migrateConfiguration(ConnectorMigrationContext context) throws 
> FlowUpdateException;
> void migrateState(ConnectorMigrationContext context) throws 
> FlowUpdateException;
> {code}
> Where we introduce new methods to `ConnectorMigrationContext`:
> {code}
> void setProperties(String stepName, Map<String, String> propertyValues);
> void replaceProperties(String stepName, Map<String, String> propertyValues);
> void setComponentState(String managedComponentId, VersionedComponentState 
> state);
> {code}
> Both `setProperties` and `replaceProperties` would be usable during Phase 1 
> (`migrateConfiguration`). Then the framework will be responsible for calling 
> the existing `applyUpdate` method, which updates the Connector's flow. This 
> is much more consistent with the existing API.
> Once the flow has been updated and all necessary components created, the 
> framework will call `migrateState`, and the Connector will be able to call 
> `setComponentState` as appropriate to define the state for each component. It 
> is still up to the framework to actually apply the state via `StateManager`.
> This brings the migration API much more inline with the typical operating 
> mode for Connectors and ensures that we apply and persist the configuration 
> appropriately.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to