JCMA migration error: "CROSS-PROJECT-DATA project-export Plan <id> issue source with type Board has no value"
Platform notice: Server and Data Center only. This article only applies to Atlassian products on the Server and Data Center platforms.
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Except Fisheye and Crucible
Summary
The following documentation offers guidance on resolving the error Plan <plan id> issue source with type Board has no value during data migration, including Advanced Roadmaps (AR) plans from server to cloud using Jira Cloud Migration Assistant(JCMA).
Overview
As of version 1.6.6, the Jira Cloud Migration Assistant app supports the migration of Advanced Roadmaps (AR) Plans. AR Plans related errors might surface during a JCMA plan execution. This error is one of the potential ones an admin may face while migrating data from a Jira Server/DC instance along with AR Plans over to an Atlassian Jira Cloud site.
Environment
- JCMA 1.6.6 and higher
- Jira Server/Data Center 7.6.0 and higher
- Advanced Roadmaps
Error
This error message below will surface when an AR Plan has references (Issue sources) that point to an invalid Jira Board.
The Board may have been deleted or has an invalid Filter.
2022-07-01 20:34:15.297 ERROR CROSS-PROJECT-DATA project-export Plan <plan id> issue source with type Board has no value. Please specify an issue source value in the plan settings.
Solution
First, we must identify which invalid Board is being referenced in the AR Plan.
This SQL query will help with that. It'll bring all AR Plans and their Issue sources of the type Board.
You can filter out the Plan you're looking for in the query directly, but it's important to check them all to avoid multiple occurrences of the error for different Plans.
SELECT p."ID" AS "Plan ID"
, p."TITLE" AS "Plan Name"
, s."SOURCE_TYPE" AS "Issue Source Type"
, s."SOURCE_VALUE" AS "Issue Source Value"
, CASE WHEN s."SOURCE_TYPE" = 'Board' THEN COALESCE(rv."NAME", 'No Board defined') END AS "Board Name"
, s."ID" AS "Issue Source ID"
FROM "AO_D9132D_PLAN" p
JOIN "AO_D9132D_ISSUE_SOURCE" s ON (p."ID" = s."PLAN_ID")
LEFT JOIN "AO_60DB71_RAPIDVIEW" rv ON (cast(s."SOURCE_VALUE" as integer) = rv."ID")
WHERE s."SOURCE_TYPE" = 'Board'
ORDER BY p."ID", s."ID";
SELECT p.ID AS "Plan ID"
, p.TITLE AS "Plan Name"
, s.SOURCE_TYPE AS "Issue Source Type"
, s.SOURCE_VALUE AS "Issue Source Value"
, CASE WHEN s.SOURCE_TYPE = 'Board' THEN COALESCE(rv.NAME, 'No Board defined') END AS "Board Name"
, s.ID AS "Issue Source ID"
FROM AO_D9132D_PLAN p
JOIN AO_D9132D_ISSUE_SOURCE s ON (p.ID = s.PLAN_ID)
LEFT JOIN AO_60DB71_RAPIDVIEW rv ON (cast(to_char(s.SOURCE_VALUE) as INTEGER) = rv.ID)
WHERE s.SOURCE_TYPE = 'Board'
ORDER BY p.ID, s.ID;
SELECT p.ID AS "Plan ID"
, p.TITLE AS "Plan Name"
, s.SOURCE_TYPE AS "Issue Source Type"
, s.SOURCE_VALUE AS "Issue Source Value"
, CASE WHEN s.SOURCE_TYPE = 'Board' THEN COALESCE(rv.NAME, 'No Board defined') END AS "Board Name"
, s.ID AS "Issue Source ID"
FROM AO_D9132D_PLAN p
JOIN AO_D9132D_ISSUE_SOURCE s ON (p.ID = s.PLAN_ID)
LEFT JOIN AO_60DB71_RAPIDVIEW rv ON (cast(s.SOURCE_VALUE as UNSIGNED) = rv.ID)
WHERE s.SOURCE_TYPE = 'Board'
ORDER BY p.ID, s.ID;
SELECT p.ID AS "Plan ID"
, p.TITLE AS "Plan Name"
, s.SOURCE_TYPE AS "Issue Source Type"
, s.SOURCE_VALUE AS "Issue Source Value"
, CASE WHEN s.SOURCE_TYPE = 'Board' THEN COALESCE(rv.NAME, 'No Board defined') END AS "Board Name"
, s.ID AS "Issue Source ID"
FROM AO_D9132D_PLAN p
JOIN AO_D9132D_ISSUE_SOURCE s ON (p.ID = s.PLAN_ID)
LEFT JOIN AO_60DB71_RAPIDVIEW rv ON (cast(s.SOURCE_VALUE as NUMERIC) = rv.ID)
WHERE s.SOURCE_TYPE = 'Board'
ORDER BY p.ID, s.ID;
What you'll be looking for in the results of the query is any occurrences of No Board defined entries.
Those are the Plans you'll need to fix.
In the example above:
- Affected Plan name: in the example, Plan Name = NeverEnd
- Affected Plan ID: in the example - Plan ID = 1
- Issue Source Type: Board
- Issue Source Value (that's the ID of the invalid Board): in the example, invalid Board ID = 1000
- Board name: No Board defined - that's the invalid Board.
- The ID is present on the AR table but is not present on the Boards table anymore (Board was deleted)
- Issue Source ID: this is the ID we'll use for the update statement (section below), if needed. In the example, Issue Source ID = 9
Notice the empty Board value there - that's the invalid entry.
Fixing the AR Plans
UI only
To edit a Plan's issue source: go to Jira's top menu bar → Plans → Select the offending Plan from the list
Click on the cog icon on the left → Click Configure
Click issue sources on the left
Ideally, if you're able to select another Board from the dropdown menu (screenshot above), then it's all good.
Just select a new Board (the UI won't show any confirmation, just refresh it via CMD/CRTL+R to make sure the Issue Source was saved.
- That'll also allow you to remove the Board altogether from the Plan (since you added it to remove the reference to a deleted/invalid Board).
That's so it won't affect the data displayed on the Plan. - If you want to remove the Board after adding a valid one, just click the X on the dropdown menu alongside the Board entry.
DB + UI
If you can't fix the Plan on the UI only, then we'll need to run a database update statement.
SQL changes
Always back up your data before performing any modifications to the database. If possible, test any alter, insert, update, or delete SQL commands on a staging server first.
For each Plan where a fix for invalid Boards is needed (and you can't fix them directly on the UI), follow the steps below.
The steps involve editing the invalid database row and updating the AR Plan on the UI.
Choose one valid Board to use as a temporary replacement for the invalid one on the Plan.
Go to Jira top bar → Boards →
Select one valid Board from the list and get its ID → Select the Board → Open it →
Get the ID from the URL (rapidView=<this is id>) (ID = 4 in this example screenshot) →
Having the ID at hand, update the AR table AO_D9132D_ISSUE_SOURCE, switching the ID of the invalid Board with the ID of the Board you chose (a valid one).
Make sure to use the Issue Source ID value on the update statement below (column ID of the table AO_D9132D_ISSUE_SOURCE - get its value from the SELECT query above).
Each row on the table has a unique ID - so we'll be updating only the offending entry.PostgreSQLUPDATE "AO_D9132D_ISSUE_SOURCE" SET "SOURCE_VALUE" = '<ID of the valid Board you chose>' WHERE "ID" = <Issue Source ID - get from the SELECT query above>;
Oracle, MySQL, MSSQL ServerUPDATE AO_D9132D_ISSUE_SOURCE SET SOURCE_VALUE = '<id of the Board you choose>' WHERE ID = <Issue Source ID - get from the SELECT query above>;
Execute the update statement:
Confirm you now have a valid Board ID on the Plan's Issue Source:
And confirm on the UI also:
New JCMA plan
Once you've fixed all offending AR Plans, you should be good to create a new migration plan in JCMA.