Polarion Migration – User Guide
Migrates the OSLC links held on Polarion workitems, and the projects’ Linked Data Associations, from Jira Data Center to the OSLC Connect broker after a Jira DC → Cloud migration.
When Jira Data Center is migrated to Jira Cloud, the Polarion server still addresses the old Data Center instance in two places: the OSLC links its workitems hold towards Jira issues, and the Linked Data Associations connecting each Polarion project to a Jira project. This tool finds both and rewrites them to their Cloud broker equivalents.
The migration runs in two steps, with an auditable Excel file in between. Nothing is written to Polarion until you have had the chance to review exactly what will change.
…/cm/change-request/PROJ-1 keeps its key and only changes host. Numeric
Jira project IDs, however, are reassigned: indexing associations needs the DC→Cloud ID
mapping, fetched with --cloud or read from a CSV file with
--idmappings.
index-polarion and update-polarion). For the Jira-side migration of
remote links, GC version associations and broker project associations, refer to the main
Migration Helper User Guide. For an IBM Engineering Lifecycle
Management server, refer to the ELM Migration Helper User Guide.
The process follows a fixed sequence of steps. index-polarion and
update-polarion are the two commands in this package.
Your Jira projects are migrated using Atlassian's tool. Jira issue keys survive the migration, so links need no ID mapping afterwards; associations do, because numeric project IDs are reassigned. This is the starting point.
index-polarion
Connects to Polarion, walks the OSLC service provider
catalog to find every project, then collects the workitem links (sheet
links) and the Linked Data Associations (sheet
associations) that point at the Jira DC instance. Writes one
Excel file per project to the working directory.
--resource-types selects links, associations
or both (the default).
Open the generated Excel files and inspect the results. Each row represents one link or association and shows its current status. You can optionally mark rows to be skipped or reprocessed before moving on.
update-polarion
Reads the Excel files and, for each workitem, fetches the current resource, replaces the Data Center link targets with their Cloud equivalents, and writes the resource back. For each project, repoints the associations to the Cloud service provider. The outcome of each row is written back into the same files.
Open the migrated workitems in Polarion and confirm that their links to Jira now point to the Cloud-side broker instead of the old DC instance. For associations, create a link to Jira Cloud from a workitem of each migrated project.
index-polarion appends newly discovered links and leaves existing rows untouched,
except that a row already marked UPDATED whose link is discovered again is reset
to INDEXED.
update-polarion skips UPDATED and OMIT rows, retries
FAILED_UPDATE rows, and processes REPROCESS rows again.
There is no fixed list of link types. Every link on a workitem is considered, and the target decides:
rest.properties.
| Component | Requirement | Notes |
|---|---|---|
| Java | Version 21 or later | The java executable must be available on the system PATH.
Run java -version to check. |
| Polarion server | OSLC API available | The Polarion server must be running and reachable from the machine executing this tool,
at the URL specified in polarion.properties. See
Polarion endpoints for the endpoints used. |
| Jira Data Center | Migrated to Jira Cloud | The Atlassian Cloud Migration Assistant must have been used to migrate the Jira projects
whose issues are linked from Polarion. Its base URL is used to recognise the links and
associations to migrate. Jira DC is contacted only when associations are indexed
without --idmappings, to fetch the DC→Cloud ID mapping. |
| OSLC Connect for Jira Cloud (broker) | Any supported version | The broker.baseUrl is used by update-polarion to construct the
new link and association targets. The broker is not contacted by this tool. |
The Polarion account configured in polarion.properties must be able to:
Associations also require a user name and password: a Personal Access Token alone is not enough. See Linked Data Associations.
The machine running this tool must be able to reach the Polarion server. When associations are
indexed without --idmappings, it must also reach Jira Data Center, to fetch the
DC→Cloud ID mapping. No connection to Jira Cloud or the OSLC Connect broker is made.
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-polarion & update-polarion
Configures access to the Polarion server. Polarion is a single application, so one file describes one server.
| Property | What to enter |
|---|---|
polarion.baseUrl |
Base URL of the Polarion server, including the context path. Example: polarion.baseUrl=https://polarion.example.com/polarion |
polarion.timeoutMs |
HTTP timeout in milliseconds. Default: 30000 (30 seconds). |
polarion.token |
Polarion Personal Access Token, sent as
Authorization: Bearer <token>. Preferred credential form
for links. |
polarion.username |
Polarion user name. Required for associations (form login).
For links, used as Basic authentication only when polarion.token
is absent. |
polarion.password |
Password for the Polarion user above. Required for
associations. For links, used only when polarion.token
is absent. |
polarion.baseUrl=https://polarion.example.com/polarion
polarion.timeoutMs=30000
# Personal Access Token, sent as: Authorization: Bearer <token>
polarion.token=...
# User name and password. Required for associations (form login).
# For links, used as Basic authentication only when polarion.token is absent.
#polarion.username=...
#polarion.password=...
index-polarion --rest
Describes the Jira DC instance. The base URL identifies which Polarion
links and associations point to Jira DC resources. When associations are indexed
without --idmappings, the file is also used to reach the DC→Cloud ID
mapping service on Jira DC; otherwise Jira DC is never contacted.
| 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 user name, used to fetch the ID mapping when associations are
indexed without --idmappings. Otherwise not used, but required
by the file validation: any non-empty value is accepted. |
rest.password |
Password or personal access token for the user above, used in the same case. Otherwise not used, but required by the file validation: any non-empty value is accepted. |
update-polarion --cloud & index-polarion --cloud
Describes the OSLC Connect broker and the Jira Cloud site.
update-polarion uses the broker URL to build the new link and association
targets. index-polarion uses the Cloud site URL to fetch the DC→Cloud
ID mapping, needed for associations unless --idmappings is given. Neither
Jira Cloud nor the broker is contacted.
| Property | What to enter |
|---|---|
rest.baseUrl |
The Jira Cloud site URL, e.g. https://your-org.atlassian.net.
Used by index-polarion to fetch the ID mapping for associations;
otherwise not used, but required by the file validation. |
rest.username |
Not used by the Polarion commands, but required by the file validation: any non-empty value is accepted. |
rest.token |
Not used by the Polarion commands, but required by the file validation: any non-empty value is accepted. |
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-polarion — the updater
builds the new link and association targets from this property. |
config/polarion.properties and fill in your Polarion base URL and
credentials (a Personal Access Token, or a user name and password; associations need the
user name and password).config/rest.properties and fill in your Jira DC base URL. It is used to
identify the links and associations that point at Jira DC. Fill in the user name and
password too if associations are indexed without --idmappings; otherwise they
are not used but must be set.config/cloud.properties and fill in the broker URL, used to build the new
link and association targets, and the Jira Cloud site URL (rest.baseUrl), used
to fetch the ID mapping for associations. The other properties are not used but must be
set.index-polarion)
Open a terminal in the folder where this package is installed and run one of the commands below. The Indexer connects to the Polarion server to discover the OSLC links held by the workitems of each project and the projects’ Linked Data Associations, and writes one Excel file per project into the output folder.
.sh file for the first
time, grant the permission with:
chmod +x bin/index-polarion.sh bin/update-polarion.sh
bin\index-polarion.bat --polarion config\polarion.properties --rest config\rest.properties --cloud config\cloud.properties --dir output\ --all-projects
bin/index-polarion.sh --polarion config/polarion.properties --rest config/rest.properties --cloud config/cloud.properties --dir output/ --all-projects
bin\index-polarion.bat --polarion config\polarion.properties --rest config\rest.properties --cloud config\cloud.properties --dir output\ --projects proj,demo
bin/index-polarion.sh --polarion config/polarion.properties --rest config/rest.properties --cloud config/cloud.properties --dir output/ --projects proj,demo
bin\index-polarion.bat --polarion config\polarion.properties --rest config\rest.properties --dir output\ --all-projects --resource-types links
bin/index-polarion.sh --polarion config/polarion.properties --rest config/rest.properties --dir output/ --all-projects --resource-types links
bin\index-polarion.bat --polarion config\polarion.properties --rest config\rest.properties --idmappings output\id-mappings.csv --dir output\ --all-projects --resource-types associations
bin/index-polarion.sh --polarion config/polarion.properties --rest config/rest.properties --idmappings output/id-mappings.csv --dir output/ --all-projects --resource-types associations
| Option | Description |
|---|---|
--polarion <file> |
Path to config/polarion.properties. Always required. |
--rest <file> |
Path to config/rest.properties. Its base URL identifies the links and
associations that point at Jira DC; unless --idmappings is given, it is
also used to reach the DC→Cloud ID mapping service. Always
required. |
--cloud <file> |
Path to config/cloud.properties, used to fetch the DC→Cloud ID
mapping. Required for associations unless --idmappings is given. |
--idmappings <file> |
A DC→Cloud ID mapping CSV file, used instead of fetching the mapping through
--rest and --cloud. Associations only. |
--resource-types <types> |
Comma-separated list of resource types to index: links,
associations. Defaults to both. Associations require
polarion.username and polarion.password. |
--dir <path> |
Folder where Excel files are written. Defaults to the current directory. |
--all-projects |
Index every project advertised by the Polarion OSLC service provider catalog.
Mutually exclusive with --projects; exactly one must be specified. |
--projects <ids> |
Comma-separated list of Polarion project IDs to index (e.g. proj,demo).
Mutually exclusive with --all-projects; exactly one must be specified. |
--cloud on index-polarion is used only to fetch the
DC→Cloud ID mapping for associations. Links need no mapping; the Cloud broker URL is
applied by update-polarion.
After the Indexer finishes, you will find one Excel file per project in the output folder,
named polarion_<projectId>_migration.xlsx. For example, with projects
proj and demo:
output/ polarion_proj_migration.xlsx polarion_demo_migration.xlsx
Each file contains a links worksheet listing the OSLC links pointing to Jira DC
issues, and an associations worksheet listing the Linked Data Associations
pointing to Jira DC projects. See the Appendix for the full
column reference.
Files are only created when at least one link or association to migrate is found for the project. Projects with nothing to migrate produce no output file.
Open the generated Excel files and review the results before running the Updater. Each row
represents one link or association and includes a status column that tells you
the outcome of the indexing step.
| Status | Meaning | What to do |
|---|---|---|
INDEXED |
The link or association points at Jira DC. It is ready to be migrated. | Nothing — the Updater will process it automatically. |
FAILED_INDEX |
Associations only: the Jira DC project is absent from the ID mapping. | Re-index once the project is migrated, or set to OMIT. |
UPDATED |
On a re-run of the Indexer: the link was migrated by a previous Updater run and has not been discovered again. | Nothing — the Updater will skip it. |
→ 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. a link
that should not be migrated).REPROCESS to force the Updater to process a record
again 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-polarion)
The Updater reads the Excel files produced by the Indexer and, for each workitem, replaces the Jira DC link targets with their Cloud equivalents on the Polarion 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-polarion.sh bin/update-polarion.sh
bin\update-polarion.bat --polarion config\polarion.properties --cloud config\cloud.properties --dir output\ --all-projects
bin/update-polarion.sh --polarion config/polarion.properties --cloud config/cloud.properties --dir output/ --all-projects
bin\update-polarion.bat --polarion config\polarion.properties --cloud config\cloud.properties --dir output\ --projects proj,demo
bin/update-polarion.sh --polarion config/polarion.properties --cloud config/cloud.properties --dir output/ --projects proj,demo
Use --verify to parse and validate all input files without writing anything to
Polarion. Associations are still loaded, so the Polarion user name and password are needed:
for each project, the list that would be saved is written next to its workbook, as
polarion_<project>_serviceproviders.xml. It has the format of the file
Polarion keeps the associations in, <project>/.polarion/oslc/serviceproviders.xml,
and holds the whole list: review it, or put it in place of that file to apply the change
yourself. Useful to check the state of the working directory before committing updates.
bin\update-polarion.bat --polarion config\polarion.properties --cloud config\cloud.properties --dir output\ --all-projects --verify
bin/update-polarion.sh --polarion config/polarion.properties --cloud config/cloud.properties --dir output/ --all-projects --verify
| Option | Description |
|---|---|
--polarion <file> |
Path to config/polarion.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-polarion. Defaults to
the current directory. |
--verify |
Validation mode: parses and validates all input files without writing anything to Polarion, and writes the associations that would be saved next to each workbook. |
--all-projects |
Process every polarion_*_migration.xlsx file in the working directory.
Mutually exclusive with --projects; exactly one must be specified. |
--projects <ids> |
Comma-separated list of Polarion project IDs (e.g. proj,demo); the
matching migration files are resolved in the working directory.
Mutually exclusive with --all-projects; exactly one must be specified. |
The Updater processes each workitem through a GET–replace–PUT cycle on the Polarion 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 RDF/XML body and an
If-Match header carrying the ETag from the GET response.All the links of one workitem are grouped and sent in a single request, whatever their types.
Because of the If-Match header, a workitem someone else changed in the meantime
fails with 412 instead of silently overwriting their edit; the rows of that
workitem are marked FAILED_UPDATE.
UPDATED and OMIT 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.
For each project, the Updater loads the project’s Linked Data Associations, repoints the
ones the associations sheet names to the Cloud service provider, and saves the list
back. See Linked Data Associations for how the project is protected
along the way.
--projects <one project> --verify, then without --verify, then
create a link to Jira Cloud from a workitem of that project in the Polarion UI. Migrate the
other projects once that works.
After the Updater finishes, verify that the migration was successful:
UPDATED. Any rows still showing
FAILED_UPDATE indicate links 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.
A Linked Data Association connects a Polarion project to a remote OSLC service provider — here, a Jira project — and is what the Polarion UI offers when a user creates a new link to Jira. After the migration it still names the Jira DC service provider, so new links would be created against the old instance.
An association is migrated when its URL starts with the Jira DC base URL configured in
rest.properties, the same rule as for links. Associations to another Jira
instance, or already on the Cloud broker, are left as they are. As for ELM, every domain is
migrated: Jira DC publishes a service provider per domain, so a project associated in both CM
and QM has two associations, each repointed to the Cloud service provider of its domain.
Only the URL changes; the friend name, provider, domain and any other field are carried
through. The new URL is:
<broker.baseUrl>/<domain>/provider/<Cloud project ID>
where <domain> is the short name of the association’s OSLC domain
(cm for http://open-services.net/ns/cm#). The Cloud project ID comes
from the DC→Cloud ID mapping; a DC project absent from it is marked
FAILED_INDEX.
polarion.username and polarion.password; the run stops at startup,
naming the missing properties, rather than half-way.
Polarion saves a project’s associations as a whole: the list sent replaces the project’s entire configuration, and an association missing from it is deleted. The updater is built around that fact:
UPDATED only when re-loading the list returns exactly what was
sent — an accepted request alone is not taken as proof;Associations are migrated on Polarion 2310.
links sheet| Column | Content |
|---|---|
old_id | Composite key: source URL, link type and target URL joined by a pipe. |
new_id | /cm/change-request/ followed by the Jira issue key. |
source_url | URL of the Polarion workitem holding the link. |
link_type | The link property URI exactly as Polarion advertised it, e.g. http://open-services.net/ns/cm#relatedChangeRequest. |
target_url | The Jira Data Center URL being replaced. |
status | See below. Editable. |
status_detail | Human-readable outcome, including the server’s message on failure. |
associations sheet| Column | Content |
|---|---|
old_id | The Jira Data Center service provider URL the association holds. |
new_id | The Jira Cloud project ID, from the ID mapping. |
friend_name | The OSLC friend (remote server) the association goes through. |
provider | The service provider name, as shown in Polarion. |
domain | The OSLC domain URI. |
extra | Any additional value Polarion stores; usually empty. |
status | See below. Editable. |
status_detail | Human-readable outcome, including the reason on failure. |
The status column can hold the following values:
| Value | Set by | Meaning |
|---|---|---|
INDEXED |
index-polarion |
The link or association points at Jira DC. Ready for the
update-polarion step. |
FAILED_INDEX |
index-polarion |
Associations only: the Jira DC project is absent from the ID mapping. The Updater skips the row; re-index once the project is migrated. |
UPDATED |
update-polarion |
Polarion link or association rewritten successfully (the DC target replaced with its Cloud equivalent). |
FAILED_UPDATE |
update-polarion |
The update on the Polarion server failed. See status_detail for the
exact cause. The row will be retried automatically on the next
update-polarion run. |
OMIT |
User | Intentionally skipped. The Updater will not process this row, and re-indexing leaves it alone. Only set by the user editing the Excel file. |
REPROCESS |
User | Force the Updater to process this row again even if it was previously
UPDATED. If the workitem or association already holds its Cloud URL,
no write is sent and the row is marked UPDATED again. |
Re-running index-polarion is safe. One behavior is worth knowing: a row
already marked UPDATED that is discovered again is reset to
INDEXED. The indexer only ever finds links that still point at Jira
Data Center, so rediscovery means the link came back and needs migrating again.
| Purpose | Request |
|---|---|
| Project discovery | GET {polarion.baseUrl}/oslc/services/catalog |
| Workitem query capability | GET each project service provider, taking the unfiltered .../workitems/oslc.query/ base |
| Workitem query | GET {queryBase}?oslc.select=*, following oslc:nextPage while present |
| Read a workitem | GET {workitem} |
| Rewrite a workitem | PUT {workitem} with If-Match |
| Load / save associations | GWT-RPC POST to the Polarion UI’s UniversalService, after a form login |
All OSLC requests carry OSLC-Core-Version: 2.0 and the configured
Authorization header. GET requests are made with
Accept: application/rdf+xml; the PUT request sends the RDF/XML
document as application/xml, with Accept: application/xml.
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-polarion will overwrite the original DC link in the
Polarion workitem with a Cloud broker URL that does not resolve. The original working DC link is
lost.
index-polarion and
update-polarion. Rows whose target belongs to an unmigrated project can be set to
OMIT.
The indexer extracts the Jira issue key from the DC OSLC resource URL stored in the Polarion
workitem (e.g. ALPHA-1 from .../cm/change-request/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 Polarion workitem, the Cloud API returns the pre-existing issue instead of the migrated one. This can happen when:
ALPHA-5 →
BETA-20). The Polarion workitem 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.
Missing required property: rest.username
The named property is missing or empty in rest.properties or
cloud.properties. Some properties are not used by the Polarion commands but are still
required when the file is loaded; any non-empty value is accepted. See
Configuration Files.
No credentials configured: set polarion.token, or polarion.username + polarion.password polarion.username and polarion.password must be configured together
At least one credential form must be configured in polarion.properties: a
Personal Access Token, or both a user name and a password.
Linked Data Association work needs polarion.username and polarion.password: ...
Associations are indexed or updated, but polarion.properties holds only a token.
Add polarion.username and polarion.password, or index links only with
--resource-types links. See Linked Data Associations.
index-polarion)Indexing associations needs the DC->Cloud ID mapping: provide --cloud, or --idmappings.
Associations are indexed (the default) but neither --cloud nor
--idmappings was given. Add one of them, or index links only with
--resource-types links.
Unknown Polarion project(s): Proj. Available: demo, proj
A project ID given with --projects is not advertised by the Polarion OSLC catalog,
and the run is aborted. Project IDs are case-sensitive: use them exactly as listed after
Available:.
index-polarion failed: HTTP 401 from https://polarion.example.com/polarion/oslc/services/catalog: ...
The OSLC catalog could not be read, so no project can be indexed and the run is aborted. A
401 or 403 means the Polarion credentials are invalid or not allowed; a
404 usually means polarion.baseUrl is missing the context path (e.g.
/polarion).
The OSLC catalog was read but advertised no project. Check that the Polarion account can see the projects to migrate (see Required permissions).
[proj] No workitem query capability found, skipping
The project’s service provider does not advertise the unfiltered workitem query capability
(a query base ending in /workitems/oslc.query/), so its links cannot be read. The
project is skipped and no file is written for it.
Skipping link with no trailing ID in target URL: https://jira-dc.example.com/...
The link points at Jira DC but its target URL does not end with an issue key, so it cannot be rewritten. The link is not written to the Excel file and stays unchanged in Polarion.
[proj] Failed to index project, skipping
A Polarion request failed while reading this project; the logged exception carries the HTTP status
and response body. The other projects are still indexed. An HTTP 401 or
403 means the Polarion credentials are invalid or lack read access to the project.
update-polarion)broker.baseUrl is required in cloud.properties for the update-polarion step.
Set broker.baseUrl in cloud.properties, including the context path
(e.g. https://broker.example.com/oslc-connect-jira).
No Polarion migration files found in /path/to/output File not found: output/polarion_proj_migration.xlsx
Check that --dir points to the folder written by index-polarion, and that
the IDs given with --projects match the project IDs in the file names. A project
with no migratable links has no file.
FAILED_UPDATE with status 412The workitem was modified in Polarion between the Updater’s read and its write, so the write
was refused rather than overwriting the other change. Re-run update-polarion: the
workitem is read again and the rows are retried.
FAILED_UPDATE with status 401 or 403The Polarion account cannot modify the workitem. Check that it has write access to the workitems
carrying the links (see Required permissions), then re-run
update-polarion.