Search results for backward+compatibility

Handling component version migration  How to handle component version migration   tutorial migration component backward compatibility configuration option component-manager api

Talend Component Kit provides a migration mechanism between two versions of a component to let you ensure backward compatibility. For example, a new version of a component may have some new options that need to be remapped, set with a default value in the older versions, or disabled. This tutorial shows how to create a migration handler for a component that needs to be upgraded from a version 1 to a version 2. The upgrade to the newer version includes adding new options to the component. This tutorial assumes that you know the basics about component development and are familiar with component project generation and implementation. To follow this tutorial, you need: Java 8 A Talend component development environment using Talend Component Kit. Refer to this document. Have generated a project containing a simple processor component using the Talend Component Kit Starter. First, create a simple processor component configured as follows: Create a simple configuration class that represents a basic authentication and that can be used in any component requiring this kind of authentication. Create a simple output component that uses the configuration defined earlier. The component configuration is injected into the component constructor. The version of the configuration class corresponds to the component version. By configuring these two classes, the first version of the component is ready to use a simple authentication mechanism. Now, assuming that the component needs to support a new authentication mode following a new requirement, the next steps are: Creating a version 2 of the component that supports the new authentication mode. Handling migration from the first version to the new version. The second version of the component needs to support a new authentication method and let the user choose the authentication mode he wants to use using a dropdown list. Add an Oauth2 authentication mode to the component in addition to the basic mode. For example: The options of the new authentication mode are now defined. Wrap the configuration created above in a global configuration with the basic authentication mode and add an enumeration to let the user choose the mode to use. For example, create an AuthenticationConfiguration class as follows: Using the @ActiveIf annotation allows to activate the authentication type according to the selected authentication mode. Edit the component to use the new configuration that supports an additional authentication mode. Also upgrade the component version from 1 to 2 as its configuration has changed. The component now supports two authentication modes in its version 2. Once the new version is ready, you can implement the migration handler that will take care of adapting the old configuration to the new one. What can happen if an old configuration is passed to the new component version? It simply fails, as the version 2 does not recognize the old version anymore. For that reason, a migration handler that adapts the old configuration to the new one is required. It can be achieved by defining a migration handler class in the @Version annotation of the component class. An old configuration may already be persisted by an application that integrates the version 1 of the component (Studio or web application). Add a migration handler class to the component version. Create the migration handler class MyOutputMigrationHandler. the incoming version, which is the version of the configuration that we are migrating from a map (key, value) of the configuration, where the key is the configuration path and the value is the value of the configuration. You need to be familiar with the component configuration path construction to better understand this part. Refer to Defining component layout and configuration. As a reminder, the following changes were made since the version 1 of the component: The configuration BasicAuth from the version 1 is not the root configuration anymore, as it is under AuthenticationConfiguration. AuthenticationConfiguration is the new root configuration. The component supports a new authentication mode (Oauth2) which is the default mode in the version 2 of the component. To migrate the old component version to the new version and to keep backward compatibility, you need to: Remap the old configuration to the new one. Give the adequate default values to some options. In the case of this scenario, it means making all configurations based on the version 1 of the component have the authenticationMode set to basic by default and remapping the old basic authentication configuration to the new one. if a configuration has been renamed between 2 component versions, you can get the old configuration option from the configuration map by using its old path and set its value using its new path. You can now upgrade your component without losing backward compatibility.

Managing component versions and migration  How to handle component versions and migration   migrationHandler version migration backward compatibility configuration option api

If some changes impact the configuration, they can be managed through a migration handler at the component level (enabling trans-model migration support). The @Version annotation supports a migrationHandler method which migrates the incoming configuration to the current model. For example, if the filepath configuration entry from v1 changed to location in v2, you can remap the value in your MigrationHandler implementation. A best practice is to split migrations into services that you can inject in the migration handler (through constructor) rather than managing all migrations directly in the handler. For example: What is important to notice in this snippet is the fact that you can organize your migrations the way that best fits your component. If you need to apply migrations in a specific order, make sure that they are sorted. Consider this API as a migration callback rather than a migration API. Adjust the migration code structure you need behind the MigrationHandler, based on your component requirements, using service injection. A nested configuration always migrates itself with any root prefix, whereas a component configuration always roots the full configuration. For example, if your model is the following: Then the component will see the path configuration.datastore.url for the datastore url whereas the datastore will see the path url for the same property. You can see it as configuration types - @DataStore, @DataSet - being configured with an empty root path.