Contents

1. Overview

When Jira DC is migrated to Jira Cloud using the Atlassian Migration Assistant, the IBM ELM (Engineering Lifecycle Management) server retains project-area associations that still point to the old DC instance. These associations define which OSLC link types can be created between ELM work items and Jira issues. After the migration, those associations are stale and must be replaced with broker-backed equivalents that point to the Cloud-side OSLC Connect broker.

This tool discovers those stale associations on the ELM server, resolves the corresponding Cloud project IDs via the Atlassian ID mapping service, and replaces each DC association with a new broker-backed association. For GCM (Global Configuration Management) applications, the tool also migrates the version references inside global configurations. Additionally, the tool discovers OSLC links on ELM resources that point to Jira DC issues and updates them to their Cloud equivalents.

Supported ELM applications

The tool supports the following ELM application: EWM (CCM), DNG (RM), ETM (QM) and GCM (GC). Instances are configured individually in elm.properties using a user-chosen instance ID. This allows multiple instances of the same application type (e.g. rm1, rm2) and arbitrary context paths.

Each configured instance produces one output file per project area, named elm$<elmInstanceId>$<projectAreaName>$<projectAreaId>$migration.xlsx. For example, an instance named ccm with a project area called “My Project Area” produces elm$ccm$My_Project_Area$_P4kL8DjdEfGzULwSWQuQaA$migration.xlsx. The project area name is sanitized for safe file-system usage (spaces become underscores, special characters are stripped).

Archived project areas are excluded from the migration.

GCM (Global Configuration Management) applications

When an ELM application is a GCM server (detected automatically via its OSLC publisher product abbreviation), the tool performs additional processing. In addition to the standard project_associations sheet, each project-area file includes a global_configurations sheet that lists the configuration-to-version associations found on the GCM server. During update-elm, those associations are replaced on the ELM GCM server via one PUT request per global configuration.

The following types of GCM global configurations are in scope for the migration and are all processed the same way, as long as permissions are assigned correctly (see Required permissions):

Archived configurations of any type are excluded from indexing and will not be processed.

OSLC link types

The following OSLC link types are indexed and migrated:

Source Type OSLC Property Label
EWM Work Itemoslc_cm:relatedChangeRequestRelated Change Request
EWM Work Itemoslc_cm:affectsPlanItemAffects Plan Item
EWM Work Itemoslc_cm:affectedByDefectAffected By Defect
EWM Work Itemoslc_cm:tracksWorkItemTracks
EWM Work Itemoslc_cm:trackedWorkItemContributes To
Companion guide: This document covers the ELM-side migration (index-elm and update-elm). For the Jira-side migration of remote links, GC version associations, and broker project associations, refer to the main Migration Helper User Guide.

2. How It Works

The process follows a fixed sequence of steps. index-elm and update-elm are the two commands in this package.

0
Jira DC → Cloud migration (Atlassian Migration Assistant)

Your Jira projects are migrated using Atlassian's tool. After the migration, the Atlassian mapping service holds a complete table of DC resource IDs mapped to their new Cloud IDs. This is the starting point.

1
Run index-elm

Connects to each configured ELM application instance via OAuth 1.0a, discovers project-area associations that point to the Jira DC instance, resolves the corresponding Cloud project IDs via the Atlassian mapping service, and writes one Excel file per project area to the working directory. For GCM applications, it also discovers global configurations whose release links point to the Jira DC instance and indexes them into an additional global_configurations sheet. It also discovers OSLC links on ELM resources that point to Jira DC issues and indexes them into a links sheet.

2
Review the Excel files

Open the generated Excel files and inspect the results. Each row represents one project-area association and shows its current status. You can optionally mark rows to be skipped or reprocessed before moving on.

3
Run update-elm

Reads the Excel files and, for each updatable row, adds a new broker-backed association on the ELM server and removes the old DC association. For GCM global configurations, it replaces DC version URLs with their Cloud release equivalents. For OSLC links, it replaces DC links with their Cloud equivalents on each ELM resource. The outcome of each row is written back into the same files.

4
Validate

Open the ELM application administration pages and confirm that project-area associations now point to the Cloud-side broker instead of the old DC instance.

Safe to re-run: Both commands can be run multiple times without side effects. index-elm appends newly discovered associations and refreshes existing rows only when properties or Cloud ID have changed; rows with no changes are left untouched. update-elm skips UPDATED, OMIT, and FAILED_INDEX rows, retries FAILED_UPDATE rows, and force-reposts REPROCESS rows.

3. Prerequisites

Software & environment
Component Requirement Notes
Java Version 21 or later The java executable must be available on the system PATH. Run java -version to check.
IBM ELM server Version 7.1.x The ELM server must be running and reachable from the machine executing this tool. Each application instance you intend to process must be accessible at the URL specified in elm.properties.
Jira Data Center Version 10 or 11. The Atlassian Cloud Migration Assistant must have been used to migrate at least one project. The ID mapping service endpoint (/rest/migration/latest/report/id-mappings) must be accessible.
OSLC Connect for Jira Cloud (broker) Any supported version The broker must be running and reachable. The broker.baseUrl is used by update-elm to construct broker URLs for new associations.
ELM OAuth 1.0a consumer registration
⚠ Required before running either command: Each ELM application instance you intend to process must have a registered OAuth 1.0a consumer. This is configured in the ELM administration pages under Communication → OAuth Consumers.

Requirements for each consumer:
  • The consumer must be trusted (two-legged OAuth, no access token).
  • A functional user must be set on the consumer. This is the user identity under which all API calls are made. Without a functional user, the consumer cannot authenticate and all requests will be rejected.
  • The functional user must have sufficient permissions to read and modify project-area associations on every project area being processed.
  • The consumer key and secret are entered in config/elm.properties as elm.app.<elmInstanceId>.consumerKey and elm.app.<elmInstanceId>.consumerSecret.
Required permissions

The functional user associated with the ELM OAuth consumer must have the following repository permissions:

Note: Repository permissions are configured per application (EWM, DNG, ETM, GCM) but apply server-wide across all ELM applications.

Additionally, the user must be assigned at least one of the following licenses (assigned by the server administrator):

License
IBM Engineering Lifecycle Management Base.Contributor
IBM Engineering Lifecycle Management Base.Practitioner
IBM Engineering Lifecycle Management Base.Stakeholder
IBM Engineering Workflow Management.Developer
IBM Engineering Workflow Management.Developer for IBM Enterprise Platforms
IBM Engineering Workflow Management.Contributor
IBM Engineering Workflow Management.Stakeholder
IBM Engineering Requirements Management DOORS Next.Contributor
IBM Engineering Requirements Management DOORS Next.Analyst
IBM Engineering Requirements Management DOORS Next.Analyst-Floating
IBM Engineering Test Management.Contributor
IBM Engineering Test Management.Quality Professional
IBM Engineering Test Management.Quality Professional-Floating
IBM Engineering Systems Design Rhapsody - Model Manager.Systems and Software Engineer
IBM Engineering Systems Design Rhapsody - Model Manager.Systems and Software Engineer-Floating
IBM Engineering Lifecycle Optimization - Engineering Insights.User
IBM Engineering Lifecycle Optimization - Engineering Insights.User-Floating

This is sufficient for both the indexing and updating phases to run on all project areas.

Additional requirements for updating GCM global configurations

Indexing GCM global configurations does not require any additional permissions. However, to update GCM global configurations containing release links, the functional user must also:

  1. Be a member of each project area that contains GCM global configurations with release links to migrate (these project areas are listed in the indexing output files).
  2. Have the Project Area Access Control scope set to at least: Members of the project area hierarchy.
  3. Hold at least one role with the following permissions:
    • Baselines > Add or remove links > Add or remove Release Links
    • Baseline staging streams > Add or remove links > Add or remove Release Links
    • Other user’s personal streams > Add or remove links > Add or Remove References Links
    • Streams > Add or remove links > Add or remove References Links
Note: All project areas are readable across ELM application instances as the migration relies on OAuth 2-legged authentication and the functional user configured as described above.
Jira DC: Basic authentication must be enabled
⚠ Required for the ID mapping service (unless --idmappings is used): The index-elm command calls the Jira DC REST API to fetch the DC→Cloud ID mappings. This requires HTTP Basic authentication, which is not enabled by default on all Jira DC installations.

Refer to the official Atlassian guide for instructions: Basic authentication – Jira Data Center (Atlassian Developer Docs).
Network connectivity

The machine running this tool must be able to reach all of the following:

4. Configuration Files

Three properties files control how the tool connects to each system. Template files for all three are included in this package. Edit them with a plain text editor before running anything.

Security notice: These files contain passwords, API tokens, and OAuth secrets. Store them in a secure location, restrict access to authorized personnel only, and never commit them to source control.
config/elm.properties Used by: index-elm & update-elm

Configures access to the IBM ELM server using OAuth 1.0a two-legged authentication.

Each ELM application instance is configured with a user-chosen instance ID. Instances are auto-discovered by scanning for elm.app.<elmInstanceId>.url property keys.

PropertyWhat to enter
elm.timeoutMs HTTP timeout in milliseconds. Default: 30000 (30 seconds).
elm.app.<elmInstanceId>.url Full base URL of the ELM application instance, including the context path.
Example: elm.app.rm1.url=https://elm-server.example.com/rm1
elm.app.<elmInstanceId>.consumerKey OAuth 1.0a consumer key for this instance.
Example: elm.app.rm1.consumerKey=MyConsumerKey
elm.app.<elmInstanceId>.consumerSecret OAuth 1.0a consumer secret for this instance.
Example: elm.app.rm1.consumerSecret=MyConsumerSecret
Example with multiple instances
elm.timeoutMs=30000

elm.app.ccm.url=https://elm-server.example.com/ccm
elm.app.ccm.consumerKey=...
elm.app.ccm.consumerSecret=...

elm.app.rm1.url=https://elm-server.example.com/rm1
elm.app.rm1.consumerKey=...
elm.app.rm1.consumerSecret=...

elm.app.rm2.url=https://elm-server.example.com/rm2
elm.app.rm2.consumerKey=...
elm.app.rm2.consumerSecret=...
Authentication: OAuth 1.0a two-legged authentication (consumer key and secret, no access token). Each ELM application instance needs its own consumer key/secret pair, registered as a trusted OAuth consumer in the ELM administration. The functional user associated with each consumer must have sufficient permissions to read and modify project-area associations.
config/rest.properties Used by: index-elm --rest

Configures access to the Jira DC instance. The base URL is used to identify which ELM associations point to Jira DC resources. Unless --idmappings is provided, the credentials are also used to call the Atlassian ID mapping service and obtain the DC→Cloud ID mappings.

PropertyWhat to enter
rest.baseUrl Base URL of the Jira DC instance, including any application context path, e.g. https://jira-dc.example.com/jira.
rest.username Jira DC username. Only needed when --idmappings is not provided (i.e. when the tool fetches mappings from the DC instance).
rest.password Password for the Jira DC user above. Only needed when --idmappings is not provided.
Authentication: Jira DC uses Basic authentication with a username and password. Basic auth must be explicitly enabled on your Jira DC instance — see the Atlassian documentation.
config/cloud.properties Used by: update-elm (and optionally index-elm)

Configures access to Jira Cloud and the OSLC Connect broker.

PropertyWhat to enter
rest.baseUrl Your Jira Cloud tenant URL, e.g. https://your-org.atlassian.net. Used as the cloudSiteUrl parameter when calling the DC mapping service.
rest.username Not used by index-elm or update-elm. Can be omitted.
rest.token Not used by index-elm or update-elm. Can be omitted.
broker.baseUrl The base URL of the OSLC Connect for Jira broker application, including the context path.
Example: https://broker.example.com/oslc-connect-jira
Required for update-elm — the updater builds broker URLs from this property.

Step-by-Step Guide

0 Meet the Prerequisites

1 Prepare Your Configuration Files

  1. Open config/elm.properties and configure each ELM application instance with its full URL and OAuth 1.0a consumer credentials.
  2. Open config/rest.properties and fill in your Jira DC base URL and credentials. The base URL is used to identify Jira DC resources among ELM resources, and to fetch the ID mapping service (unless --idmappings provides a CSV file).
  3. Open config/cloud.properties and fill in your Jira Cloud tenant URL, credentials, and broker URL.

2 Run the Indexer (index-elm)

Open a terminal in the folder where this package is installed and run one of the commands below. The Indexer will fetch the Atlassian ID mapping table first, then connect to the ELM server to discover project-area associations, and finally write one Excel file per project area into the output folder.

Only associations whose oslc:details URL starts with the Jira DC base URL are indexed. Associations pointing to other servers are silently skipped.
Linux — make scripts executable first: Shell scripts shipped in a zip archive lose their execute permission. Before running any .sh file for the first time, grant the permission with:
chmod +x bin/index-elm.sh bin/update-elm.sh
Index all configured ELM instances — Windows
bin\index-elm.bat --elm config\elm.properties --rest config\rest.properties --cloud config\cloud.properties --dir output\
Index all configured ELM instances — Linux
bin/index-elm.sh --elm config/elm.properties --rest config/rest.properties --cloud config/cloud.properties --dir output/
Index using a local CSV mapping file — Windows
bin\index-elm.bat --elm config\elm.properties --rest config\rest.properties --idmappings id-mappings_20260612_143052.csv --dir output\
Index using a local CSV mapping file — Linux
bin/index-elm.sh --elm config/elm.properties --rest config/rest.properties --idmappings id-mappings_20260612_143052.csv --dir output/
Index specific instances only
bin\index-elm.bat --elm config\elm.properties --rest config\rest.properties --cloud config\cloud.properties --applications ccm,rm1 --dir output\
All available options
OptionDescription
--elm <file> Path to config/elm.properties. Always required.
--rest <file> Path to config/rest.properties for REST API access to Jira DC. The base URL is used to identify Jira DC resources among ELM resources. Unless --idmappings is provided, the same configuration is also used to reach the DC→Cloud ID mapping service. Always required.
--idmappings <file> DC→Cloud ID mapping source: a CSV mapping file. When provided, the mapping is loaded from this file instead of fetching from Jira DC via --rest. Optional.
--cloud <file> Path to config/cloud.properties. Provides the Cloud tenant URL (rest.baseUrl) for ID mapping. Required unless --idmappings is provided.
--applications <ids> Comma-separated list of ELM instance IDs to index (as configured in elm.properties). If omitted, all configured instances are indexed.
--dir <path> Folder where Excel files are written. Defaults to the current directory.
Output

After the Indexer finishes, you will find one Excel file per project area in the output folder. For example, with instances ccm and rm1:

output/
  elm$ccm$My_Project_Area$_P4kL8DjdEfGzULwSWQuQaA$migration.xlsx
  elm$ccm$Another_PA$_R3nT5VkdEfJzWNxUYSuTcC$migration.xlsx
  elm$rm1$My_Project_Area$_P4kL8DjdEfGzULwSWQuQaA$migration.xlsx
  elm$rm1$Other_PA$_K7xM2QjdEfHzULwSWQuRbB$migration.xlsx

Each file contains a project_associations worksheet. For GCM applications, a global_configurations worksheet is also created, listing the configuration-to-version associations discovered on the GCM server. For applications with supported OSLC link types, a links worksheet is also created, listing the OSLC links pointing to Jira DC issues. See the Appendix for the full column reference.

Files are only created when at least one migratable association is found for the project area. Project areas with no associations produce no output file.

Logging

The scripts are pre-configured to load config/logback.xml. By default that file sends log output to two destinations simultaneously:

3 Review the Excel Files

Open the generated Excel files and review the results before running the Updater. Each row represents one project-area association and includes a status column that tells you the outcome of the indexing step.

Common status values after indexing
Status Meaning What to do
INDEXED Cloud project ID found. This association is ready to be migrated. Nothing — the Updater will process it automatically.
FAILED_INDEX The DC project ID could not be mapped to a Cloud ID. The project was likely created after the migration ran and is unknown to the mapping service, or an error occurred. Check the status_detail column. If the project was not migrated, set the status to OMIT. Otherwise, resolve the issue and re-run the Indexer.

→ Full list of all status values in the Appendix

Optional adjustments you can make

You can manually edit the status column of any row to control how the Updater handles it:

Do not edit any other columns (old_id, new_id, resource data columns) — those values are used by the Updater to construct the API calls and must remain intact.

4 Run the Updater (update-elm)

The Updater reads the Excel files produced by the Indexer and, for each project area, adds the new broker associations and removes the old DC associations on the ELM server in a single request. The outcome of each row is written back into the same files, so you always have a full audit trail.

Linux — make scripts executable first: If you have not done so already, grant execute permission with:
chmod +x bin/index-elm.sh bin/update-elm.sh
Run the Updater (all files) — Windows
bin\update-elm.bat --elm config\elm.properties --cloud config\cloud.properties --dir output\ --all-projects
Run the Updater (all files) — Linux
bin/update-elm.sh --elm config/elm.properties --cloud config/cloud.properties --dir output/ --all-projects
Verify without posting (dry run)

Use --verify to parse and validate all input files without making any ELM server calls. Useful to check the state of the working directory before committing updates.

bin\update-elm.bat --elm config\elm.properties --cloud config\cloud.properties --dir output\ --all-projects --verify
Update specific project-area files only
bin\update-elm.bat --elm config\elm.properties --cloud config\cloud.properties --dir output\ --projects elm$ccm$My_Project_Area$_P4kL8DjdEfGzULwSWQuQaA$migration.xlsx,elm$rm1$Other_PA$_K7xM2QjdEfHzULwSWQuRbB$migration.xlsx
All available options
OptionDescription
--elm <file> Path to config/elm.properties. Always required.
--cloud <file> Path to config/cloud.properties. Always required. Must include broker.baseUrl.
--dir <path> Folder containing the Excel files produced by index-elm. Defaults to the current directory.
--verify Dry-run mode: parses and validates all input files without making any ELM server calls.
--all-projects Process every elm$*$migration.xlsx file in the working directory. Mutually exclusive with --projects; exactly one must be specified.
--projects <files> Comma-separated list of specific file names to process (e.g. elm$ccm$My_PA$_P4kL8DjdEfGzULwSWQuQaA$migration.xlsx). Mutually exclusive with --all-projects; exactly one must be specified.
What the Updater does per project area

Updatable rows are grouped by project area. For each group, the Updater performs a two-phase cycle on the ELM server:

  1. GET stateId — fetches the current project area state ID. The ELM API uses the state ID as an optimistic-locking token: every write request must include it.
  2. POST add + remove — adds the new broker-backed associations and removes the old DC associations (identified by old_id) in a single request, using broker URLs built from new_id, dc_sp_domain, and broker.baseUrl.

If the POST fails, all rows in the group are marked as FAILED_UPDATE.

What the Updater does for GCM global configurations

When a global_configurations sheet is present (GCM applications), the Updater processes each global configuration through a GET–replace–PUT cycle:

  1. GET configuration — fetches the current XML representation of the global configuration and its ETag header for optimistic concurrency control.
  2. Replace releases — in the fetched XML, replaces each DC version URL with the corresponding Cloud release URL. If the Cloud URL is already present alongside the DC URL, the DC URL is simply removed.
  3. Skip or PUT — if no DC URL was found (the configuration is already up to date), the PUT is skipped entirely and the rows are marked as UPDATED. Otherwise, a PUT is sent with the modified XML body and an If-Match header carrying the ETag from the GET response.

All releases belonging to the same configuration are grouped and sent together in a single request. Authentication uses OAuth 1.0a, same as for project-area association updates.

What the Updater does for OSLC links

When a links sheet is present, the Updater processes each link through a GET–replace–PUT cycle on the ELM server:

  1. GET resource — fetches the current XML representation of the ELM resource and its ETag header.
  2. Replace links — in the fetched XML, replaces each DC link with the corresponding Cloud link built from new_id and broker.baseUrl. If the Cloud link is already present alongside the DC link, the DC link is simply removed.
  3. Skip or PUT — if no DC link was found (the resource is already up to date), the PUT is skipped entirely and the rows are marked as UPDATED. Otherwise, a PUT is sent with the modified XML body and an If-Match header carrying the ETag from the GET response.

Links targeting the same ELM resource are grouped and sent in a single request. Authentication uses OAuth 1.0a.

Safe to re-run: UPDATED, OMIT, and FAILED_INDEX rows are always skipped. FAILED_UPDATE rows are retried automatically with no data loss. No special flags are needed to resume after a partial failure.

5 Validate

After the Updater finishes, verify that the migration was successful:

The Updater can be safely re-run at any time. Rows already marked UPDATED are skipped; rows marked FAILED_UPDATE are retried automatically.

Appendix

A. Excel Columns — project_associations Sheet

Each Excel file (elm$<elmInstanceId>$<projectAreaName>$<projectAreaId>$migration.xlsx) contains a single project_associations worksheet with the following columns:

Column Written by Description
old_id index-elm ELM project association URL (the identifier of the DC association to remove).
new_id index-elm Cloud project ID resolved from the DC project ID via the Atlassian ID mapping service.
project_area_name index-elm Display name of the ELM project area.
project_area_url index-elm URL of the ELM project area.
link_type index-elm OSLC link type of the association (e.g. oslc_cm:cmServiceProviders).
remote_title index-elm Title of the remote service provider (Jira project).
dc_details_url index-elm Original DC oslc:details URL of the association target.
dc_services_url index-elm Original DC oslc:services URL of the association target.
dc_sp_domain index-elm OSLC domain extracted from the DC services URL during indexing (e.g. cm, rm, qm). Used by the Updater to build the broker services URL.
status Both Row status; see status values below.
status_detail Both Human-readable detail for the current status.

A2. Excel Columns — global_configurations Sheet (GCM only)

For GCM applications, each Excel file also contains a global_configurations worksheet with the following columns:

Column Written by Description
old_id index-elm Composite key: {configUri}|{dcDeliverableUrl}. Uniquely identifies the configuration-version pair.
new_id index-elm Cloud release ID resolved from the DC version ID via the Atlassian ID mapping.
config_uri index-elm URI of the global configuration on the ELM GCM server.
config_title index-elm Display title of the global configuration.
dc_deliverable_url index-elm Original DC version URL (Jira version) linked to the configuration.
status Both Row status; see status values below.
status_detail Both Human-readable detail for the current status.

A3. Excel Columns — links Sheet

For ELM applications with supported OSLC link types, each Excel file also contains a links worksheet with the following columns:

Column Written by Description
old_id index-elm Composite key: {sourceUrl}|{{linkTypeNs}{linkTypeLocal}}|{targetUrl}.
new_id index-elm Broker-relative path for the target issue (e.g. /cm/change-request/12345).
source_url index-elm URL of the ELM resource holding the link.
link_type_ns index-elm OSLC link property namespace (e.g. http://open-services.net/ns/cm#).
link_type_local index-elm OSLC link property local name (e.g. relatedChangeRequest).
target_url index-elm Jira DC OSLC resource URL (the link target).
status Both Row status; see status values below.
status_detail Both Human-readable detail for the current status.
Broker URL construction

The Updater builds broker URLs at update time from the Excel data and broker.baseUrl:

  • Broker details URL: <broker.baseUrl>/process/project-area/<new_id>
  • Broker services URL: <broker.baseUrl>/<dc_sp_domain>/provider/<new_id>
  • Broker release URL (GCM): <broker.baseUrl>/cm/deliverable/<new_id>
  • Broker link URL (OSLC links): <broker.baseUrl><new_id> — where new_id is the broker-relative path from the links sheet (e.g. /cm/change-request/12345)

B. Status Values

The status column can hold the following values:

Value Set by Meaning
INDEXED index-elm DC project ID successfully mapped to a Cloud ID. Ready for the update-elm step.
FAILED_INDEX index-elm Indexing failed — typically the DC project was not found in the mapping service (not yet migrated). See status_detail for the exact cause.
CHANGED index-elm Association properties or Cloud ID changed since the last Indexer run (e.g. after a Jira re-migration). The row will be re-posted on the next update-elm run.
UPDATED update-elm ELM association replaced successfully (broker association added, DC association removed).
FAILED_UPDATE update-elm The update on the ELM server failed. The row will be retried automatically on the next update-elm run.
OMIT User Intentionally skipped. The Updater will not process this row. Only set by the user editing the Excel file.
REPROCESS User Force the Updater to re-post this row even if it was previously UPDATED.

C. ELM Endpoints Used

Purpose Method URL
List OSLC Service Providers GET <elmAppUrl>/rootservices
Returns the root services document. Catalog URLs are extracted from elements such as oslc_cm:cmServiceProviders, oslc_rm:rmServiceProviders, oslc_qm:qmServiceProviders, or globalconfig:globalConfigServiceProviders.
List project areas GET <catalogUrl> (discovered from root services)
Lists service providers (one per project area). The tool reads dcterms:title and oslc:details from each entry to build the project area list.
List associations GET <elmAppUrl>/process/project-areas/<id>/links
Fetch state ID GET <elmAppUrl>/service/com.ibm.team.process.internal.service.web.IProcessWebUIServiceWithChecks/projectAreaByUUIDWithLimitedMembersWithChecks?processAreaItemId=<id>&maxMembers=25&checkProcessAuthoringLicenses=false
Add/remove associations POST <elmAppUrl>/service/com.ibm.team.process.internal.service.web.IProcessWebUIService/projectArea
Query global configurations (GCM) GET <queryBase>?oslc.select=rdf:type,rtc_cm:deliverable,dcterms:title
Discovered via OSLC QueryCapability on the service provider. Archived configurations are excluded. Results are returned in OSLC XML format; pagination is handled via oslc:nextPage.
Read/update GC releases (ELM GCM) GET+PUT {configUri}
GET retrieves the current configuration XML and its ETag. PUT sends the modified releases with an If-Match header for optimistic concurrency. If the configuration is already up to date, the PUT is skipped. Authentication uses OAuth 1.0a.
Query OSLC links GET <queryBase>?oslc.select=<linkProperties>
Discovered via OSLC QueryCapability. Selects configured link properties and filters those targeting Jira DC. Pagination is handled via oslc:nextPage.
Read/update ELM resource (OSLC links) GET+PUT {sourceUrl}
The ELM resource URL from the links sheet. GET retrieves the current XML and its ETag. PUT sends the modified links with an If-Match header. If the resource is already up to date, the PUT is skipped. Authentication uses OAuth 1.0a.

Where <elmAppUrl> is the full URL of the ELM application instance as configured in elm.app.<elmInstanceId>.url (e.g. https://elm-server.example.com/rm1).

D. Atlassian ID Mapping Service

Before any data is read from the ELM server, the Indexer fetches the complete DC→Cloud ID mapping table in a single call to the Atlassian mapping service. This service is part of the Atlassian Cloud Migration Assistant and runs on the Jira DC instance.

Endpoint called:

GET <dcBaseUrl>/rest/migration/latest/report/id-mappings
    ?cloudSiteUrl=<cloudBaseUrl>&invalidateCache=false

The response is a CSV file with this format:

entityType,serverId,cloudId
jira/classic:project,10100,10198
...

The following entity type is extracted and used by the ELM migration commands:

Entity type in CSV Used for
jira/classic:project Resolves DC project IDs to Cloud project IDs. This determines which DC projects have been migrated and provides the new_id used to build broker URLs for project-area associations.
jira/classic:version Resolves DC version (deliverable) IDs to Cloud release IDs. Used by GCM applications to map releases in the global_configurations sheet.

If the mapping report is not yet ready when the Indexer starts, the call is retried up to 5 times with delays between attempts. If the report is still unavailable after all retries, the run aborts with a clear message and no files are written.

On success, the fetched CSV is saved to the output directory as id-mappings_<timestamp>.csv (e.g. id-mappings_20260612_143052.csv) for traceability and later reuse.

Alternatively, a pre-downloaded CSV mapping file can be supplied via --idmappings to skip the REST call entirely.

Important: The --rest option is still required even when --idmappings is provided, because the Jira DC base URL from rest.properties is used to identify which ELM associations point to Jira DC resources.
Important: When using a local CSV file, make sure it is up to date with the current state of the Jira DC instance. A stale mapping file may produce incorrect Cloud IDs or miss newly migrated resources.

Known Limitations

OSLC links to unmigrated issues are not detected

Unlike project associations, which are validated against the Atlassian ID mapping payload and marked FAILED_INDEX when the DC project has not been migrated, OSLC links are not validated against any mapping. Every link targeting the Jira DC base URL receives INDEXED status regardless of whether the target issue actually exists in Jira Cloud.

The Atlassian ID mapping payload cannot be used for this validation because Jira DC OSLC resource URLs contain the issue key (e.g. ALPHA-1), not the numeric issue ID. The mapping payload only holds numeric ID pairs (serverId,cloudId), and resolving a key to its numeric ID would require querying the Jira DC instance, which may already be decommissioned by the time the migration tool runs.

If the target issue was not part of the Jira Cloud migration scope (e.g. its project was not selected for migration), update-elm will overwrite the original DC link in the ELM resource with a Cloud broker URL that does not resolve. The original working DC link is lost.

Recommendation: ensure that all Jira DC projects referenced by ELM OSLC links have been migrated to Cloud before running index-elm and update-elm.
OSLC links with historical issue keys may resolve to unintended issues

The indexer extracts the Jira issue key from the DC OSLC resource URL stored in the ELM resource (e.g. ALPHA-1 from .../cm/issue/ALPHA-1) and uses it verbatim in the Cloud broker URL (e.g. /cm/change-request/ALPHA-1). No DC-to-Cloud issue key resolution is performed, for the same reason described above: issue keys cannot be resolved to numeric IDs without the Jira DC instance.

The Cloud OSLC broker resolves issue keys by calling the Jira Cloud REST API (/rest/api/3/issue/{issueIdOrKey}), which handles historical keys transparently. In most cases this works correctly.

However, if a pre-existing Cloud issue has the same key as the one stored in the ELM resource, the Cloud API returns the pre-existing issue instead of the migrated one. This can happen when:

In both cases, Jira’s historical key conflict resolution rules (see Migration of Jira’s historical keys for issues and projects) cause the Cloud active key to take priority over the DC historical key. The link resolves without error but points to the wrong issue.

Recommendation: before running the migration, verify that no ELM OSLC link targets use historical Jira issue keys that conflict with active keys in the Cloud instance.

Troubleshooting

Indexing (index-elm)

Failed to index resource: no new_id found
Failed to index resource "<configTitle> <configUri> <dcVersionUrl>": no new_id found on mapping service response

This error means the ID mapping file does not contain an entry for the Jira DC version referenced by the global configuration’s release link. The ID mapping file is either fetched automatically from the Jira DC instance (using rest.properties) or provided manually via --idmappings. Verify that the corresponding Jira DC version has been migrated to a Cloud release and that the mapping file is up to date.

Updating (update-elm)

403 Forbidden when updating GCM global configurations

If update-elm writes 403 Forbidden errors when processing GCM global configurations, the functional user likely does not meet the permission requirements for GCM updates. See Additional requirements for updating GCM global configurations for the full checklist.