Files
nexus/knowledgebase/csd-wiki/ICSD/How-to-fix-Dev2Prod-failure_688988351.md
2026-04-18 17:09:43 +08:00

13 KiB
Raw Blame History

How-to-fix-Dev2Prod-failure_688988351

Symptom

If you have created two identical custom actions for the same record type in both source and target tenants, the Dev2Prod process fails. The error messages are as follows:

> Customization1 Metadata element <entity_type>.CustomActionName_c.Localized Label Key is invalid.
> Update of existing element descriptor's attributes is not available through customization. Refer to: Customization1.
>
> Customization1 Metadata element <entity_type>.CustomActionName_c.Tooltip Localized Label Key is invalid.
Update of existing element descriptor's attributes is not available through customization. Refer to: Customization1.
>
> Customization1 Metadata element <entity_type>.CustomActionName_c.Placeholder Localized Label Key is invalid.
> Update of existing element descriptor's attributes is not available through customization. Refer to: Customization1.
>
> Customization1 Metadata element EntityType.CustomActionCount_c.Localized Label Key is invalid.
> Update of existing element descriptor's attributes is not available through customization. Refer to: Customization1.
>
> Customization1 Metadata element <entity_type>.CustomActionCount_c.Tooltip Localized Label Key is invalid.
> Update of existing element descriptor's attributes is not available through customization. Refer to: Customization1.
>
> Customization1 Metadata element EntityType.CustomActionCount_c.Placeholder Localized Label Key is invalid.
> Update of existing element descriptor's attributes is not available through customization. Refer to: Customization1.

Resolution

This resolution applies to SMAX versions from 2023.05 to 24.1.

Note: For example, the verion number is **\<version\>**, export from **\<dev_tenant\>** and import into **\<prod_tenant\>**, the related entities are **\<entity_type1\>** and **\<entity_type2\>**.

Step 1. Choose **xservices-ems**, execute the following queries on both <dev_tenant> and <prod_tenant>, and keep the results for later steps.

Step 1.1. Run the following command:

\`\`\`SQL
SELECT
    ed.tenant_id AS "version",
    pd.tenant_id,
    pd.parent_descriptor_id AS entity_type_id,
    ed."name" AS entity_name,
    pd."name" AS field_name,
    pd.localization_key,
    ed."name" || '.' || pd."name" || '.localized-label-key' as localization_key_new
FROM
    property_descriptor pd
    LEFT JOIN entity_descriptor ed ON pd.parent_descriptor_id = ed.id
WHERE
    pd."name" IN ('CustomActionName_c', 'CustomActionCount_c')
    AND ed.tenant_id = '<version>'
    AND pd.tenant_id IN ('<dev_tenant>', '<prod_tenant>')
    AND ed."name" IN ('<entity_type1>', '<entity_type2>');
\`\`\`

For example, in the following case, \<version\> is "v26", <dev_tenant> is "100000001", <prod_tenant> is "100000002", <entity_type1> is "Request", <entity_type2> is "Incident". The script would be:

\`\`\`SQL
SELECT
    ed.tenant_id AS "version",
    pd.tenant_id,
    pd.parent_descriptor_id AS entity_type_id,
    ed."name" AS entity_name,
    pd."name" AS field_name,
    pd.localization_key,
    ed."name" || '.' || pd."name" || '.localized-label-key' as localization_key_new
FROM
    property_descriptor pd
    LEFT JOIN entity_descriptor ed ON pd.parent_descriptor_id = ed.id
WHERE
    pd."name" IN ('CustomActionName_c', 'CustomActionCount_c')
    AND ed.tenant_id = 'v26'
    AND pd.tenant_id IN ('100000001', '100000002')
    AND ed."name" IN ('Request', 'Incident');
\`\`\`

The output would be:

table1
| version | tenant_id | entity_type_id | entity_name | field_name          | localization_key                    | localization_key_new                             |
| ------- | --------- | -------------- | ----------- | ------------------- | ----------------------------------- | ------------------------------------------------ |
| v26     | 100000001 | 247            | Incident    | CustomActionCount_c | CustomActionCount_c_1710482969177_c | Incident.CustomActionCount_c.localized-label-key |
| v26     | 100000001 | 247            | Incident    | CustomActionName_c  | CustomActionName_c_1710482969053_c  | Incident.CustomActionName_c.localized-label-key  |
| v26     | 100000001 | 375            | Request     | CustomActionCount_c | CustomActionCount_c_1710482749123_c | Request.CustomActionCount_c.localized-label-key  |
| v26     | 100000001 | 375            | Request     | CustomActionName_c  | CustomActionName_c_1710482749001_c  | Request.CustomActionName_c.localized-label-key   |
| v26     | 100000002 | 247            | Incident    | CustomActionCount_c | CustomActionCount_c_1710482925908_c | Incident.CustomActionCount_c.localized-label-key |
| v26     | 100000002 | 247            | Incident    | CustomActionName_c  | CustomActionName_c_1710482925779_c  | Incident.CustomActionName_c.localized-label-key  |
| v26     | 100000002 | 375            | Request     | CustomActionCount_c | CustomActionCount_c_1710482721555_c | Request.CustomActionCount_c.localized-label-key  |
| v26     | 100000002 | 375            | Request     | CustomActionName_c  | CustomActionName_c_1710482721392_c  | Request.CustomActionName_c.localized-label-key   |

Step 1.2. Run the following command:

\`\`\`SQL
SELECT
    tenant_id,
    property_descriptor_name, 
    entity_descriptor_name, 
    placeholder_key,
    entity_descriptor_name || '.' || property_descriptor_name || '.placeholder' AS placeholder_key_new,
    tooltip_key,
    entity_descriptor_name || '.' || property_descriptor_name || '.tooltip' AS tooltip_key_new
FROM 
    property_descriptor_ui 
WHERE 
    property_descriptor_name IN ('CustomActionName_c', 'CustomActionCount_c')
    AND tenant_id IN ('<dev_tenant>', '<prod_tenant>')
    AND entity_descriptor_name IN ('<entity_type1>', '<entity_type2>');
\`\`\`

In our case, the script would be:

\`\`\`SQL
SELECT
    tenant_id,
    property_descriptor_name, 
    entity_descriptor_name, 
    placeholder_key,
    entity_descriptor_name || '.' || property_descriptor_name || '.placeholder' AS placeholder_key_new,
    tooltip_key,
    entity_descriptor_name || '.' || property_descriptor_name || '.tooltip' AS tooltip_key_new
FROM 
    property_descriptor_ui 
WHERE 
    property_descriptor_name IN ('CustomActionName_c', 'CustomActionCount_c')
    AND tenant_id IN ('100000001', '100000002')
    AND entity_descriptor_name IN ('Request', 'Incident');
\`\`\`
table2
| tenant_id | property_descriptor_name | entity_descriptor_name | placeholder_key                                 | placeholder_key_new                      | tooltip_key                                 | tooltip_key_new                      |
| --------- | ------------------------ | ---------------------- | ----------------------------------------------- | ---------------------------------------- | ------------------------------------------- | ------------------------------------ |
| 100000001 | CustomActionCount_c      | Incident               | CustomActionCount_c_PLACEHOLDER_1710482969177_c | Incident.CustomActionCount_c.placeholder | CustomActionCount_c_TOOLTIP_1710482969177_c | Incident.CustomActionCount_c.tooltip |
| 100000001 | CustomActionCount_c      | Request                | CustomActionCount_c_PLACEHOLDER_1710482749123_c | Request.CustomActionCount_c.placeholder  | CustomActionCount_c_TOOLTIP_1710482749123_c | Request.CustomActionCount_c.tooltip  |
| 100000001 | CustomActionName_c       | Incident               | CustomActionName_c_PLACEHOLDER_1710482969053_c  | Incident.CustomActionName_c.placeholder  | CustomActionName_c_TOOLTIP_1710482969053_c  | Incident.CustomActionName_c.tooltip  |
| 100000001 | CustomActionName_c       | Request                | CustomActionName_c_PLACEHOLDER_1710482749001_c  | Request.CustomActionName_c.placeholder   | CustomActionName_c_TOOLTIP_1710482749001_c  | Request.CustomActionName_c.tooltip   |
| 100000002 | CustomActionCount_c      | Incident               | CustomActionCount_c_PLACEHOLDER_1710482925908_c | Incident.CustomActionCount_c.placeholder | CustomActionCount_c_TOOLTIP_1710482925908_c | Incident.CustomActionCount_c.tooltip |
| 100000002 | CustomActionCount_c      | Request                | CustomActionCount_c_PLACEHOLDER_1710482721555_c | Request.CustomActionCount_c.placeholder  | CustomActionCount_c_TOOLTIP_1710482721555_c | Request.CustomActionCount_c.tooltip  |
| 100000002 | CustomActionName_c       | Incident               | CustomActionName_c_PLACEHOLDER_1710482925779_c  | Incident.CustomActionName_c.placeholder  | CustomActionName_c_TOOLTIP_1710482925779_c  | Incident.CustomActionName_c.tooltip  |
| 100000002 | CustomActionName_c       | Request                | CustomActionName_c_PLACEHOLDER_1710482721392_c  | Request.CustomActionName_c.placeholder   | CustomActionName_c_TOOLTIP_1710482721392_c  | Request.CustomActionName_c.tooltip   |

Step 2. Choose **xservices-rms**, update all <localization_key> with <localization_key_new>, all <placeholder_key> with <placeholder_key_new> and all <tooltip_key> with <tooltip_key_new> both on <dev_tenant> and <prod_tenant> based on **"table1"** and **"table2"**.

\`\`\`SQL
UPDATE 
    "ResourceBundle_<tenant>" 
SET 
    body = jsonb_set(body, '{Key}', '"<localization_key_new>"')
WHERE 
    body->>'Key' = '<localization_key>';

UPDATE 
    "ResourceBundle_<tenant>" 
SET 
    body = jsonb_set(body, '{Key}', '"<placeholder_key_new>"')
WHERE 
    body->>'Key' = '<placeholder_key>';

UPDATE 
    "ResourceBundle_<tenant>" 
SET 
    body = jsonb_set(body, '{Key}', '"<tooltip_key_new>"')
WHERE 
    body->>'Key' = '<tooltip_key>';
\`\`\`

In our case, it would be

\`\`\`SQL
UPDATE 
    "ResourceBundle_100000001" 
SET 
    body = jsonb_set(body, '{Key}', '"Incident.CustomActionCount_c.localized-label-key"')
WHERE 
    body->>'Key' = 'CustomActionCount_c_1710482969177_c';
......
UPDATE 
    "ResourceBundle_100000002" 
SET 
    body = jsonb_set(body, '{Key}', '"Request.CustomActionName_c.localized-label-key"')
WHERE 
    body->>'Key' = 'CustomActionName_c_1710482721392_c';

UPDATE 
    "ResourceBundle_100000001" 
SET 
    body = jsonb_set(body, '{Key}', '"Incident.CustomActionCount_c.placeholder"')
WHERE 
    body->>'Key' = 'CustomActionCount_c_PLACEHOLDER_1710482969177_c';

UPDATE 
    "ResourceBundle_100000001" 
SET 
    body = jsonb_set(body, '{Key}', '"Incident.CustomActionCount_c.tooltip"')
WHERE 
    body->>'Key' = 'CustomActionCount_c_TOOLTIP_1710482969177_c';
......

UPDATE 
    "ResourceBundle_100000002" 
SET 
    body = jsonb_set(body, '{Key}', '"Request.CustomActionName_c.placeholder"')
WHERE 
    body->>'Key' = 'CustomActionName_c_PLACEHOLDER_1710482721392_c';

UPDATE 
    "ResourceBundle_100000002" 
SET 
    body = jsonb_set(body, '{Key}', '"Request.CustomActionName_c.tooltip"')
WHERE 
    body->>'Key' = 'CustomActionName_c_TOOLTIP_1710482721392_c';
\`\`\`

Step 3. Choose **xservices-ems**, execute the following updates on both <dev_tenant> and <prod_tenant>.

\`\`\`SQL
UPDATE
    property_descriptor pd
SET
    localization_key = ed."name" || '.' || pd."name" || '.localized-label-key',
    flavors = 'EMS'
FROM
    entity_descriptor ed
WHERE
    pd.parent_descriptor_id = ed.id
    AND pd."name" IN ('CustomActionCount_c', 'CustomActionName_c')
    AND ed.tenant_id = '<version>'
    AND pd.tenant_id IN ('<dev_tenant>', '<prod_tenant>')
    AND ed."name" IN ('<entity_type1>', '<entity_type2>');

UPDATE
    property_descriptor_ui
SET
    placeholder_key = entity_descriptor_name || '.' || property_descriptor_name || '.placeholder',
    tooltip_key = entity_descriptor_name || '.' || property_descriptor_name || '.tooltip'
WHERE
    property_descriptor_name IN ('CustomActionCount_c', 'CustomActionName_c')
    AND tenant_id IN ('<dev_tenant>', '<prod_tenant>')
    AND entity_descriptor_name IN ('<entity_type1>', '<entity_type2>');
\`\`\`

In our case, it would be:

\`\`\`SQL
UPDATE
    property_descriptor pd
SET
    localization_key = ed."name" || '.' || pd."name" || '.localized-label-key',
    flavors = 'EMS'
FROM
    entity_descriptor ed
WHERE
    pd.parent_descriptor_id = ed.id
    AND pd."name" IN ('CustomActionCount_c', 'CustomActionName_c')
    AND ed.tenant_id = 'v26'
    AND pd.tenant_id IN ('100000001', '100000002')
    AND ed."name" IN ('Request', 'Incident');

UPDATE
    property_descriptor_ui
SET
    placeholder_key = entity_descriptor_name || '.' || property_descriptor_name || '.placeholder',
    tooltip_key = entity_descriptor_name || '.' || property_descriptor_name || '.tooltip'
WHERE
    property_descriptor_name IN ('CustomActionCount_c', 'CustomActionName_c')
    AND tenant_id IN ('100000001', '100000002')
    AND entity_descriptor_name IN ('Request', 'Incident');
\`\`\`

Step 4. It is recommended to restart the platform where the modified tenant is located:

\`\`\`sh
kubectl rollout restart deployment itom-xruntime-platform -n itsma-xxxxx
\`\`\`

Step 5. Redo the export and import operations.