This page explains how to prepare your cloud app for migration by processing events.
The Forge remote, endpoint, and trigger modules that you implement will allow the app migration platform to send information about specific migration events that take place on your server app.
Define a remote and trigger to process migration events.
1 2modules: trigger: - key: migration-trigger endpoint: remote-event events: - avi:ecosystem.migration:uploaded:app_data ... endpoint: - key: remote-event remote: remote-app route: path: /<relative-url-to-your-self-hosted-app> auth: appSystemToken: enabled: true remotes: - key: remote-app baseUrl: "${YOUR_SELF_HOSTED_APP_BASE_URL}" auth: appSystemToken: enabled: true operations: - compute
Refer to the events API for all the events that you can listen for and their associated payloads.
If your Forge remote returns an invalid response the migration event will be sent again with exponential backoff up to four times for a total of five attempts.
When processing events it is important to keep in mind the following:
avi:ecosystem.migration:uploaded:app_data events
within 15 minutes of processing the last event or uploading new data from the server app (whichever occurs later).avi:ecosystem.migration:uploaded:app_data
may appear before avi:ecosystem.migration:triggered:listener.You can add the following events to your Forge trigger.
| Event | Description |
|---|---|
avi:ecosystem.migration:triggered:listener | Your server app migration listener has been triggered. |
avi:ecosystem.migration:uploaded:app_data | Your server app uploaded app data. |
avi:ecosystem.migration:requested:transfer_cancellation | The user has cancelled a transfer. |
avi:ecosystem.migration:errored:listener | An unhandled exception occurred in your server app migration listener. |
avi:ecosystem.migration:completed:export_phase | completeExport() has been called in your server app to signal to your Forge app that all app data has been uploaded. |
avi:ecosystem.migration:settled:transfer | The app migration platform has settled the transfer. |
avi:ecosystem.migration:uploaded:key_value_pair | Your server app uploaded key value pair data. |
avi:ecosystem.migration:uploaded:entity_properties | Your server app uploaded entity properties data. |
avi:ecosystem.migration:uploaded:os_data | Your server app uploaded OS data data. |
avi:ecosystem.migration:uploaded:sql_data | Your server app uploaded SQL data data. |
This is the data that is passed to your Forge function when it is invoked.
| Attribute | Type | Description |
|---|---|---|
eventType | string | The migration event type. |
transferId | string | An ID (UUID) that the app migration platform uniquely generates per migration. |
migrationDetails.migrationId | string | An ID (UUID) that the app migration platform uses to uniquely identify a migration. |
migrationDetails.migrationScopeId | string | An ID that the app migration platform generates to uniquely determine a source (server) and destination (cloud-site) of migration. |
migrationDetails.createdAt | number | Timestamp of when the app migration was created. |
migrationDetails.cloudUrl | string | URL of the destination cloud site for the migration. |
migrationDetails.name | string | The name of the migration plan provided by the user who initiated the migration. |
key | string | An ID (UUID) to uniquely identify the data your server app uploads to cloud storage. This will only be present on avi:ecosystem.migration:uploaded:app_data events. |
label | string | undefined | Metadata that provides additional information about the data your server app uploads to cloud storage. This will only be present on avi:ecosystem.migration:uploaded:app_data events. |
messageId | string | An ID (UUID) that the app migration platform generates to uniquely recognise an event. |
transferError.exceptionType | string | undefined | Metadata that provides details of the exception type that occurs when executing server side listener method (onStartAppMigration). This will only be present on avi:ecosystem.migration:errored:listener events. |
transferError.safeStackTrace | string | undefined | Metadata that provides the stack trace of error that occurs when executing server side listener method (onStartAppMigration). This will only be present on avi:ecosystem.migration:errored:listener events. |
1 2{ "eventType": "avi:ecosystem.migration:uploaded:app_data", "transferId": "3f3a47f2-a6a2-4204-84bb-d0fc504c9dc6", "migrationDetails": { "migrationId": "403c4f71-a0d1-4a63-97a8-487d18691c46", "migrationScopeId": "0ba07dd9-3804-4600-9102-fa6e1efeab08", "createdAt": 1723111376499, "cloudUrl": "https://your-customer-cloud-site.atlassian.net", "name": "Migration Plan Name" }, "key": "e094ca53-3747-4541-b263-0bf7b56a5bca", "label": "file-label-you-used", "serverAppVersion": "1.0", "messageId": "53f88ea7-a2d2-4dd2-9f36-2d8c43401b11" }
Refer to the REST API documentation for the available endpoints and their usage.
The base url to call App migration platform is https://api.atlassian.com/app/migration/forge/v1.
For authentication refer to Calling Atlassian APIs from a Forge remote.
It is important to verify requests to your Forge remote.
Atlassian Connnect Spring Boot and Atlassian Connnect Express can handle request verification and authentication for you.
An example Forge remote may look like this:
1 2@ForgeRemote @RestController @RequestMapping("/api/forge") public class ForgeRemoteController { private static final Logger log = LoggerFactory.getLogger(ForgeRemoteController.class); private final AtlassianForgeRestClients atlassianForgeRestClients; public ForgeRemoteController(AtlassianForgeRestClients atlassianForgeRestClients) { this.atlassianForgeRestClients = atlassianForgeRestClients; } @RequestMapping(value = "/events", consumes = "application/json", produces = "application/json") public ResponseEntity<RemoteDto> postRemote(@RequestBody ForgeMigrationEventDto event) { MigrationStatusDto statusDto = MigrationStatusDto.builder().status("SUCCESS").messageIds(Collections.singletonList(event.getMessageId())).build(); atlassianForgeRestClients .asApp() .request() .exchange( "/app/migration/forge/v1/message/{transferId}/status", HttpMethod.POST, statusDto, String.class, event.getTransferId()); return ResponseEntity.ok(RemoteDto.builder().message("Successfully processed " + event.getMessageId()).build()); } }
It is important for building reliable migration paths to retry on 5xx and 429 errors for all API calls with exponential backoff and jitter.
Rate this page: