ELM Association Migration – User Guide
Migrates ELM project-area associations, GCM global-configuration releases, and OSLC links from Jira Data Center to the OSLC Connect broker after a Jira DC → Cloud migration.
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.
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.
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.
The following OSLC link types are indexed and migrated:
| Source Type | OSLC Property | Label |
|---|---|---|
| EWM Work Item | oslc_cm:relatedChangeRequest | Related Change Request |
| EWM Work Item | oslc_cm:affectsPlanItem | Affects Plan Item |
| EWM Work Item | oslc_cm:affectedByDefect | Affected By Defect |
| EWM Work Item | oslc_cm:tracksWorkItem | Tracks |
| EWM Work Item | oslc_cm:trackedWorkItem | Contributes To |
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.
The process follows a fixed sequence of steps. index-elm and
update-elm are the two commands in this package.
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.
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.
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.
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.
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.
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.
| 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. |
config/elm.properties as
elm.app.<elmInstanceId>.consumerKey and
elm.app.<elmInstanceId>.consumerSecret.The functional user associated with the ELM OAuth consumer must have the following repository permissions:
JazzUsersJazzProjectAdminsAdditionally, 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.
Indexing GCM global configurations does not require any additional permissions. However, to update GCM global configurations containing release links, the functional user must also:
--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.The machine running this tool must be able to reach all of the following:
elm.properties)*.atlassian.net and/or api.atlassian.com)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.
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.
| Property | What 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 |
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=...
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.
| Property | What 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. |
update-elm (and optionally index-elm)
Configures access to Jira Cloud and the OSLC Connect broker.
| Property | What 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-jiraRequired for update-elm — the updater
builds broker URLs from this property. |
config/elm.properties and configure each ELM application instance
with its full URL and OAuth 1.0a consumer credentials.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).config/cloud.properties and fill in your Jira Cloud tenant URL, credentials,
and broker URL.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.
oslc:details URL starts with the Jira DC base URL are
indexed. Associations pointing to other servers are silently skipped.
.sh file for the first
time, grant the permission with:
chmod +x bin/index-elm.sh bin/update-elm.sh
bin\index-elm.bat --elm config\elm.properties --rest config\rest.properties --cloud config\cloud.properties --dir output\
bin/index-elm.sh --elm config/elm.properties --rest config/rest.properties --cloud config/cloud.properties --dir output/
bin\index-elm.bat --elm config\elm.properties --rest config\rest.properties --idmappings id-mappings_20260612_143052.csv --dir output\
bin/index-elm.sh --elm config/elm.properties --rest config/rest.properties --idmappings id-mappings_20260612_143052.csv --dir output/
bin\index-elm.bat --elm config\elm.properties --rest config\rest.properties --cloud config\cloud.properties --applications ccm,rm1 --dir output\
| Option | Description |
|---|---|
--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. |
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.
The scripts are pre-configured to load config/logback.xml. By
default that file sends log output to two destinations simultaneously:
~/oslc-connect-jira-cloud-migration/logs/migration.log and rotated daily.
Up to 10 compressed daily archives are kept (total cap 2 GB).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.
| 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
You can manually edit the status column of any row to control how the Updater
handles it:
OMIT to intentionally skip a record (e.g. an
association that should not be migrated).REPROCESS to force the Updater to re-post a record
even if it was previously completed successfully.old_id, new_id, resource data
columns) — those values are used by the Updater to construct the API calls and must
remain intact.
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.
chmod +x bin/index-elm.sh bin/update-elm.sh
bin\update-elm.bat --elm config\elm.properties --cloud config\cloud.properties --dir output\ --all-projects
bin/update-elm.sh --elm config/elm.properties --cloud config/cloud.properties --dir output/ --all-projects
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
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
| Option | Description |
|---|---|
--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. |
Updatable rows are grouped by project area. For each group, the Updater performs a two-phase cycle on the ELM server:
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.
When a global_configurations sheet is present (GCM applications), the Updater
processes each global configuration through a GET–replace–PUT cycle:
ETag header for optimistic concurrency
control.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.
When a links sheet is present, the Updater processes each link through a
GET–replace–PUT cycle on the ELM server:
ETag header.new_id and
broker.baseUrl. If the Cloud link is already present alongside
the DC link, the DC link is simply removed.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.
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.
After the Updater finishes, verify that the migration was successful:
UPDATED. Any rows still showing
FAILED_UPDATE indicate associations that could not be migrated — check the
status_detail column for the error and consider re-running the Updater after
resolving it.UPDATED are
skipped; rows marked FAILED_UPDATE are retried automatically.
project_associations SheetEach 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. |
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. |
links SheetFor 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. |
The Updater builds broker URLs at update time from the Excel data and
broker.baseUrl:
<broker.baseUrl>/process/project-area/<new_id><broker.baseUrl>/<dc_sp_domain>/provider/<new_id><broker.baseUrl>/cm/deliverable/<new_id><broker.baseUrl><new_id> — where new_id is the
broker-relative path from the links sheet (e.g. /cm/change-request/12345)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. |
| Purpose | Method | URL |
|---|---|---|
| List OSLC Service Providers | GET | <elmAppUrl>/rootservicesReturns 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:titleDiscovered 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).
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.
--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.
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.
index-elm and update-elm.
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:
ALPHA-5 →
BETA-20). The ELM resource still stores the old key ALPHA-5. If
Jira Cloud already has an active issue ALPHA-5 from a different project, the
migrated link silently points to the wrong issue.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.
index-elm)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.
update-elm)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.