# Welcome

<table data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><h4>Get Started</h4></td><td><a href="/files/y7aQMTlbxJK4O104PHib">/files/y7aQMTlbxJK4O104PHib</a></td><td><a href="/pages/ZphRGusRXV43vOIeRO3m">/pages/ZphRGusRXV43vOIeRO3m</a></td></tr><tr><td align="center"><h4>Integrate</h4></td><td><a href="/files/BuBVeGnO4hLkmRQsjOOp">/files/BuBVeGnO4hLkmRQsjOOp</a></td><td><a href="/pages/F7FGQct9jTAX2nDFZRZw">/pages/F7FGQct9jTAX2nDFZRZw</a></td></tr><tr><td align="center"><h4>Manage</h4></td><td><a href="/files/cuN3vJh3omam6EF4F3p3">/files/cuN3vJh3omam6EF4F3p3</a></td><td><a href="/pages/yEYK7EU1BDXDgIuwm14A">/pages/yEYK7EU1BDXDgIuwm14A</a></td></tr><tr><td align="center"><h4>Supported Connectors</h4></td><td><a href="/files/WLvyZwgiDZltB3p85yib">/files/WLvyZwgiDZltB3p85yib</a></td><td><a href="/pages/rwR5O4WJfe6XQSQFmmIQ">/pages/rwR5O4WJfe6XQSQFmmIQ</a></td></tr><tr><td align="center"><h4>Connector Documentation</h4></td><td><a href="/files/sqbt93lRuAWQ05lYMDkT">/files/sqbt93lRuAWQ05lYMDkT</a></td><td><a href="/pages/GpStZAd7BukxuHWlMNUQ">/pages/GpStZAd7BukxuHWlMNUQ</a></td></tr><tr><td align="center"><h4>Connector SDK</h4></td><td><a href="/files/8BoLdstTAhLLrikrxaqY">/files/8BoLdstTAhLLrikrxaqY</a></td><td><a href="/pages/es3tesY8hIdhg8YozuKZ">/pages/es3tesY8hIdhg8YozuKZ</a></td></tr><tr><td align="center"><h4>Release Notes</h4></td><td><a href="/files/Ij56PNPmgj7QuDlWYzUa">/files/Ij56PNPmgj7QuDlWYzUa</a></td><td><a href="/pages/iWyBBVO7l5bupYcLTH2b">/pages/iWyBBVO7l5bupYcLTH2b</a></td></tr><tr><td align="center"><h4>Knowledge Resources</h4></td><td><a href="/files/PA3o8otD57ylcfFfc8gV">/files/PA3o8otD57ylcfFfc8gV</a></td><td><a href="/pages/APWJoSHdGTrMt4rs7DA3">/pages/APWJoSHdGTrMt4rs7DA3</a></td></tr><tr><td align="center"><h4>Help Center</h4></td><td><a href="/files/hI6Hy9y1SkqQJhMnQW90">/files/hI6Hy9y1SkqQJhMnQW90</a></td><td><a href="/pages/IffcVgiiaUmFUHfXNjFr">/pages/IffcVgiiaUmFUHfXNjFr</a></td></tr></tbody></table>


# Get Started

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>📦 Getting</strong> <code class="expression">space.vars.OIM</code></td><td><a href="/pages/GVSjR9ioLj1wzRxK7Y9j">/pages/GVSjR9ioLj1wzRxK7Y9j</a></td></tr><tr><td align="center"><strong>⚙️ Prerequisites</strong></td><td><a href="/pages/TAj01LzSNJn84O5G6FXd">/pages/TAj01LzSNJn84O5G6FXd</a></td></tr><tr><td align="center"><strong>💻 Installation</strong></td><td><a href="/pages/ueMlkAAm1geNl5dPVEza">/pages/ueMlkAAm1geNl5dPVEza</a></td></tr><tr><td align="center"><strong>🔐 Logging In</strong></td><td><a href="/pages/YDxYsaiZX5r2EtTFy6pi">/pages/YDxYsaiZX5r2EtTFy6pi</a></td></tr><tr><td align="center"><strong>🟢 Start/Stop</strong> <code class="expression">space.vars.OIM</code></td><td><a href="/pages/J4NU94c9GBC08ijCfZRk">/pages/J4NU94c9GBC08ijCfZRk</a></td></tr></tbody></table>
{% endif %}

{% if "OM4ADO" === visitor.claims.unsigned.product %}

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>📦 Getting</strong> <code class="expression">space.vars.OM4ADO</code></td><td><a href="/pages/cgBsiNMm8GA7rRE4tAeR">/pages/cgBsiNMm8GA7rRE4tAeR</a></td></tr><tr><td align="center"><strong>⚙️ Prerequisites</strong></td><td><a href="/pages/JlQzPdTaKH3nQ3FRqqrm">/pages/JlQzPdTaKH3nQ3FRqqrm</a></td></tr><tr><td align="center"><strong>💻 Installation</strong></td><td><a href="/pages/AVoFXJD1RJqGK8bXFSZM">/pages/AVoFXJD1RJqGK8bXFSZM</a></td></tr><tr><td align="center"><strong>🟢 Launching</strong> <code class="expression">space.vars.OM4ADO</code></td><td><a href="/pages/DCOnfY7gZuH91O9JQOLi">/pages/DCOnfY7gZuH91O9JQOLi</a></td></tr></tbody></table>
{% endif %}


# Getting OpsHub Integration Manager

* For Community edition, Installers are available at [Community](https://community.opshub.com/download-free).
* For Professional or Ultimate editions, installers are only available on request. Please contact your sales/support representative.


# Prerequisites

## Deployment Options

* **On Premise**: Can be deployed on local virtual machine or local server
* **On OpsHub Cloud**: Can be deployed on Azure environment provided by OpsHub. This will come at an additional cost, which can be discussed with your point of contact in the support or sales team.
* **On Customer Cloud**: Can be deployed on cloud service hosted by customer. Supported cloud service on which it can be deployed are:
  * Amazon EC2
  * Azure

Following are the Operating System (OS) and hardware pre-requisites for server or VM where <code class="expression">space.vars.OIM</code> is installed.

## Supported Operating Systems

### Windows

* Windows 11 and Windows Server 2016 and above (64 bit)
* For Windows specific configuration, refer [Windows specific configuration](#windows-specific-configuration)

### Linux

* RHEL 5.2 and above (64 bit)
  * RHEL includes Cent OS and Fedora
* Ubuntu 22.04 and above

## Hardware Prerequisites

1. RAM - 8 GB & above
2. Disk space - 50 GB (Recommended)
3. Database Disk Space - 15 GB (Recommended)
4. Cores - Quadcore (Recommended)

## Database Prerequisites

<code class="expression">space.vars.OIM</code> can be deployed with an embedded database; however, for production deployment or anything other than functional testing, our experts highly recommend using an external database. <code class="expression">space.vars.OIM</code> supports the following database. Note: If the database is hosted on a separate Windows machine, the operating system must be Windows 11 or Windows Server 2016 and later.

### 1. MySQL Server

* **Supported versions:** From 5.7.18 or above
* **Wait time for connection pool** should be set to 8 hours.

**User permission pre-requisites list:**

| **Privileges**          | **Context**                           | **Installation** | **Upgradation** | **Running** |
| ----------------------- | ------------------------------------- | ---------------- | --------------- | ----------- |
| Alter                   | Tables                                | Yes              | Yes             |             |
| Alter Routine           | Stored routines                       | Yes              | Yes             |             |
| Create                  | Databases, tables, or indexes         | Yes              | Yes             |             |
| Create routine          | Stored routines                       | Yes              | Yes             |             |
| Create tablespace       | Server administration                 | Yes              | Yes             |             |
| Create temporary tables | Tables                                | Yes              | Yes             |             |
| Create view             | Views                                 | Yes              | Yes             |             |
| Delete                  | Tables                                | Yes              | Yes             | Yes         |
| Drop                    | Databases, tables, or views           | Yes              | Yes             |             |
| Execute                 | Stored routines                       | Yes              | Yes             | Yes         |
| File                    | File access on server host            | Yes              | Yes             |             |
| Grant option            | Databases, tables, or stored routines | Yes              | Yes             |             |
| Index                   | Tables                                | Yes              | Yes             |             |
| Insert                  | Tables or columns                     | Yes              | Yes             | Yes         |
| Lock tables             | Databases                             | Yes              | Yes             | Yes         |
| References              | Databases or tables                   | Yes              | Yes             |             |
| Select                  | Tables or columns                     | Yes              | Yes             | Yes         |
| Show view               | Views                                 | Yes              | Yes             | Yes         |
| Update                  | Tables or columns                     | Yes              | Yes             | Yes         |

Once the installation/up-gradation is complete for normal running of OIM, permissions required only for installation and upgradation can be revoked.

**SQL script to grant/validate/revoke User permission:**

| **Operation** | **When OIM installation/upgaradation is responsible for database creation**                                                                                                                                                                                                                                                                                         | **When database is created manually**                                                                                                                                                                                                                                                                                                                    |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Grant         | <p><code>GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES ,CREATE TABLESPACE, FILE, CREATE VIEW, DELETE, DROP, EXECUTE, GRANT OPTION, INDEX, INSERT, LOCK TABLES, REFERENCES, SELECT, SHOW VIEW, UPDATE ON *.* TO 'username'@'localhost';</code><br><br><code>GRANT CREATE TABLESPACE, FILE ON *.* TO 'username'@'localhost';</code></p> | <p><code>GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EXECUTE, GRANT OPTION, INDEX, INSERT, LOCK TABLES, REFERENCES, SELECT, SHOW VIEW, UPDATE ON database\_name.\* TO 'username'@'localhost';</code><br><br><code>GRANT CREATE TABLESPACE, FILE ON *.* TO 'username'@'localhost';</code></p> |
| Validate      | `SHOW GRANTS FOR 'username'@'localhost';`                                                                                                                                                                                                                                                                                                                           | `SHOW GRANTS FOR 'username'@'localhost';`                                                                                                                                                                                                                                                                                                                |
| Revoke        | `REVOKE ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE TABLESPACE, FILE, CREATE VIEW, DROP, GRANT OPTION, INDEX, REFERENCES ON *.* FROM 'username'@'localhost';`                                                                                                                                                                     | <p><code>REVOKE ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DROP, GRANT OPTION, INDEX, REFERENCES ON database\_name.\* FROM 'username'@'localhost';</code><br><br><code>REVOKE CREATE TABLESPACE, FILE ON *.* FROM 'username'@'localhost';</code></p>                                                            |

### 2. MS SQL/Azure SQL Server

> **Note**: Azure SQL is an alias for MS SQL on cloud.

* **Supported versions:** 2012 or above
* MS SQL version should support TLS v1.2 protocol or above, as it is recommended to use MS SQL with TLSv1.2 enabled. Refer [this link](https://support.microsoft.com/en-us/topic/kb3135244-tls-1-2-support-for-microsoft-sql-server-e4472ef8-90a9-13c1-e4d8-44aad198cdbe) to upgrade MS SQL server to enable support for TLSv1.2 or above.
* Enable Client protocols **TCP/IP** and **Named pipes** on MSSQLSERVER instance

**User permission pre-requisites list:**

| **Db operation**       | **Privilege**                         | **Installation** | **Upgradation** | **Running** |
| ---------------------- | ------------------------------------- | ---------------- | --------------- | ----------- |
| Create Database/Schema | Create Database, Create Schema        | Yes              |                 |             |
| Update Database/Schema | Alter Database, Alter Schema or Alter | Yes              | Yes             | Yes         |
| Create Table           | CREATE TABLE                          | Yes              | Yes             |             |
| Select in Table        | SELECT                                | Yes              | Yes             | Yes         |
| Insert in Table        | INSERT                                | Yes              | Yes             | Yes         |
| Update table data      | UPDATE                                | Yes              | Yes             | Yes         |
| Delete table data      | DELETE                                | Yes              | Yes             | Yes         |
| Alter Table            | ALTER                                 | Yes              | Yes             | Yes         |
| Drop Table             | ALTER                                 | Yes              | Yes             |             |
| Create View            | CREATE VIEW                           | Yes              | Yes             |             |
| Read View              | SELECT                                | Yes              | Yes             | Yes         |
| Alter View             | ALTER                                 | Yes              | Yes             |             |
| Drop View              | ALTER                                 | Yes              | Yes             |             |
| Create References      | REFERENCES                            | Yes              | Yes             |             |
| Update References      | REFERENCES                            | Yes              | Yes             |             |
| Drop References        | REFERENCES                            | Yes              | Yes             |             |
| Create Procedure       | CREATE PROCEDURE                      | Yes              | Yes             |             |
| Update/Alter Procedure | ALTER                                 | Yes              | Yes             |             |
| Execute Procedure      | EXECUTE                               | Yes              | Yes             | Yes         |
| Drop Procedure         | ALTER                                 | Yes              | Yes             |             |

> **Note**: **ALTER** privilege also required along with other privileges for operation such as create table, create view, drop table/view/procedure, references, etc.

Once the installation/up-gradation is complete for normal running of OIM, permissions required only for installation and upgradation can be revoked.

**SQL script to grant/validate/revoke User permission:**

| **Operation** | **When OIM installation/upgaradation is responsible for database creation**                                                                                                                                                                                                              | **When database is created manually**                                                                                                                                                                                                                                                            |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Grant         | <p><code>USE master;</code><br><code>grant Create Database, Create Schema, ALTER, CREATE TABLE, SELECT, INSERT, UPDATE, DELETE, CREATE VIEW, REFERENCES, CREATE PROCEDURE, EXECUTE to username;</code></p>                                                                               | <p><code>USE database\_name;</code><br><code>GRANT Create Schema, ALTER, CREATE TABLE, SELECT, INSERT, UPDATE, DELETE, CREATE VIEW, REFERENCES, CREATE PROCEDURE, EXECUTE TO username;</code></p>                                                                                                |
| Validate      | <p><code>USE master;</code><br><code>SELECT pr.principal\_id, pr.name , pr.type\_desc, pe.state\_desc, pe.permission\_name FROM sys.database\_principals AS pr JOIN sys.database\_permissions AS pe ON pe.grantee\_principal\_id = pr.principal\_id WHERE pr.name='username';</code></p> | <p><code>USE database\_name;</code><br><code>SELECT pr.principal\_id, pr.name , pr.type\_desc, pe.state\_desc, pe.permission\_name FROM sys.database\_principals AS pr JOIN sys.database\_permissions AS pe ON pe.grantee\_principal\_id = pr.principal\_id WHERE pr.name='username';</code></p> |
| Revoke        | <p><code>USE master;</code><br><code>REVOKE Create Database, Create Schema, CREATE TABLE, CREATE VIEW, REFERENCES, CREATE PROCEDURE FROM username;</code></p>                                                                                                                            | <p><code>USE database\_name;</code><br><code>REVOKE Create Schema, CREATE TABLE, CREATE VIEW, REFERENCES, CREATE PROCEDURE FROM username;</code></p>                                                                                                                                             |

### 3. Oracle

* **Supported versions:** 11g (Release 2), 12c and 19c

**User permission pre-requisites list:**

**System Privilege**

| **Privilege**        | **Installation**         | **Upgrading** | **Running** |
| -------------------- | ------------------------ | ------------- | ----------- |
| CREATE SESSION       | Yes \[WITH ADMIN OPTION] | Yes           | Yes         |
| EXECUTE ANY TYPE     | Yes \[WITH ADMIN OPTION] | Yes           | Yes         |
| CREATE ANY PROCEDURE | Yes \[WITH ADMIN OPTION] | Yes           |             |
| CREATE USER          | Yes                      |               |             |
| CREATE ANY TABLE     | Yes \[WITH ADMIN OPTION] | Yes           |             |
| CREATE ANY VIEW      | Yes \[WITH ADMIN OPTION] | Yes           |             |
| QUERY REWRITE        | Yes \[WITH ADMIN OPTION] | Yes           | Yes         |
| SELECT ANY TABLE     | Yes \[WITH ADMIN OPTION] | Yes           | Yes         |
| GLOBAL QUERY REWRITE | Yes \[WITH ADMIN OPTION] | Yes           | Yes         |
| ALTER ANY TABLE      | Yes \[WITH ADMIN OPTION] | Yes           |             |
| DROP ANY TABLE       | Yes \[WITH ADMIN OPTION] | Yes           |             |
| CREATE ANY INDEX     | Yes                      | Yes           |             |
| INSERT ANY TABLE     | Yes                      | Yes           | Yes         |
| UPDATE ANY TABLE     | Yes                      | Yes           | Yes         |
| DELETE ANY TABLE     | Yes                      | Yes           | Yes         |
| DROP ANY VIEW        | Yes \[WITH ADMIN OPTION] | Yes           |             |
| ALTER ANY PROCEDURE  | Yes \[WITH ADMIN OPTION] | Yes           |             |
| LOCK ANY TABLE       |                          | Yes           |             |
| DROP ANY INDEX       |                          | Yes           |             |
| DROP ANY PROCEDURE   | Yes \[WITH ADMIN OPTION] | Yes           |             |
| CREATE ANY DIRECTORY | Yes \[WITH ADMIN OPTION] | Yes           |             |

* For seamless running of <code class="expression">visitor.claims.unsigned.product</code>, the permissions mentioned for installation and upgrade only can be revoked.
* The default installation of <code class="expression">visitor.claims.unsigned.product</code> with Oracle:
  * Two users are created by <code class="expression">visitor.claims.unsigned.product</code>: `opshub` and `reportsdb`.
  * The user through which the database is connected will perform the following:
    * Create these users. Hence, `CREATE USER` permission is required at the installation time.
    * Grant certain permissions to these users (`opshub` and `reportsdb`) to connect with their database and create the required data in their database. Hence, `WITH ADMIN OPTION` is required.
    * Perform certain operations on the resources of these two users. Hence, it requires `ANY*` permissions.
* In the advanced installation, if <code class="expression">visitor.claims.unsigned.product</code> is going to be installed with the option of the [manual creation of the database](/getting-started/installation#manual-creation-of-the-databases), then:
  * One of the users (`opshub` or `reportsdb`) can be used to connect with the Oracle database and perform all the operations.
  * In this case, `CREATE USER` privilege can be omitted, and only `SELECT ANY TABLE` privilege would require `WITH ADMIN OPTION` during installation.
* It is recommended to create a database manually for a high-security environment. The credentials are used as input to create two new users during the installation, so `CREATE USER` permission is required.\
  If any permission regarding creating a user is missing, then <code class="expression">visitor.claims.unsigned.product</code> will print the password through SQL query.\
  'Create schema' approach was considered, but as Oracle doesn't allow creating schemas alone, we have to go with the 'Create User' approach.
* If installation is to be done in the **cdb$root container of CDB instance**, then the connection user should have the commonly granted `CREATE USER` permission.\
  To achieve this, the `container=ALL` clause needs to be used while granting the permission.\
  The sample query for creating the user:

  `CREATE USER c##username IDENTIFIED BY password container=ALL;`
* After the user is created, the permission should be verified with the following query:\
  `SELECT * FROM USER_SYS_PRIVS;`
* Find the below screenshot which shows correct permission for CREATE USER privilege:

  <div align="center"><img src="/files/mSyr80P7uLFRoIwdA9Fp" alt="" width="900"></div>

***

#### **SQL script to grant/validate/revoke User permission:**

| **Operation** | **SQL Queries**                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Grant**     | <p><code>GRANT CREATE SESSION, EXECUTE ANY TYPE, CREATE ANY PROCEDURE, CREATE ANY TABLE, CREATE ANY VIEW, QUERY REWRITE, SELECT ANY TABLE, GLOBAL QUERY REWRITE, ALTER ANY TABLE, DROP ANY TABLE, DROP ANY VIEW, ALTER ANY PROCEDURE, DROP ANY PROCEDURE, CREATE ANY DIRECTORY TO username WITH ADMIN OPTION;</code><br><br><code>GRANT CREATE USER, CREATE ANY INDEX, INSERT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE, LOCK ANY TABLE, DROP ANY INDEX TO username;</code></p> |
| **Validate**  | `SELECT * FROM USER_SYS_PRIVS;`                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| **Revoke**    | `REVOKE CREATE ANY PROCEDURE, CREATE USER, CREATE ANY TABLE, CREATE ANY VIEW, ALTER ANY TABLE, DROP ANY TABLE, CREATE ANY INDEX, DROP ANY VIEW, ALTER ANY PROCEDURE, LOCK ANY TABLE, DROP ANY INDEX, DROP ANY PROCEDURE, CREATE ANY DIRECTORY FROM username;`                                                                                                                                                                                                                       |

### 4. PostgreSQL Server

* **Supported versions:** From 15 or above
* The user must have **CREATEDB** permission for creating database.

In the advanced installation, if <code class="expression">visitor.claims.unsigned.product</code> is installed with the option of the [manual creation of the database](/getting-started/installation#manual-creation-of-the-databases), then:

* The user must have permission for **CREATE ON SCHEMA** for both the schemas (`opshub` and `reportsdb`) for creating tables, index, references, and views.
* The manually created database and schema should only contain **lowercase alphanumeric characters**, with `$`, `_` and **no spaces**.

> **Note**: If default connection timeout parameter is changed for any database server, then it must be confirmed that sufficient connection timeout has been set. For example, for MySQL the default server-side connection timeout is 8 hours. If it is changed and set to, say, 5 minutes, then the default server-side connection timeout must be updated accordingly. <code class="expression">space.vars.OIM</code> maintains connection pools that keep connections alive for 8 hours. Based on the need, this parameter can be tuned at both the application and database-server levels.**Generally, the recommended timeout is between 6-8 hours.**

## Download Database Connector jar

| Database Type  | Database Version | Download Link                                                                                                               |
| -------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **MySQL**      | All              | [MySQL Connector/J](https://dev.mysql.com/downloads/connector/j)                                                            |
| **MSSQL**      | 2012 and lower   | [Download Link](https://www.microsoft.com/en-in/download/details.aspx?id=11774)                                             |
|                | 2014 onward      | [Release Notes](https://learn.microsoft.com/en-us/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver16) |
| **Oracle**     | 11g              | [Oracle JDBC 11g](https://www.oracle.com/jp/technical-resources/articles/features/jdbc/jdbc.html)                           |
|                | 12c              | [Oracle JDBC 12c](https://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html)         |
|                | 19c              | [Oracle JDBC 19c](https://www.oracle.com/database/technologies/appdev/jdbc-ucp-19c-downloads.html)                          |
| **PostgreSQL** | All              | [PostgreSQL JDBC](https://jdbc.postgresql.org/download/)                                                                    |

## HostName for <code class="expression">space.vars.OIM</code>

* If machine/instance where <code class="expression">space.vars.OIM</code> deployed is binded with any hostname (Net, Host, Gateway, or Domain name) then please make sure the hostname (Net, Host, Gateway, or Domain name) is a text string up to 24 characters drawn from the alphabet (A-Z), digits (0-9), minus sign (-), and period (.). Note that periods are only allowed when they serve to delimit components of "domain style names". For more details, read the memo [RFC-921](https://tools.ietf.org/html/rfc921) and [RFC-952](https://tools.ietf.org/html/rfc952).

Once you have downloaded the application and configured the pre-requisite, click [Installation Steps](/getting-started/installation) to see how to get started.

## Port Prerequisites

For successful installation/upgradation of <code class="expression">space.vars.OIM</code>, following ports are required to be available as per the chosen configuration and database.

### Connection Protocol Selection

Choosing the right protocol depends on your network environment and security needs.

1. **HTTP (Port 8989)**
   * **Usage:** Supported mainly for on-premise deployments where the <code class="expression">space.vars.OIM</code> is hosted within a trusted, customer-controlled network and protected by internal firewall rules or a reverse proxy.
   * **Security Consideration:** Network isolation, firewall enforcement, and controlled access are expected to be in place to mitigate exposure risks and vulnerable attacks.
2. **HTTPS (Port 8443) – Recommended**
   * **Usage:** Required for cloud-based, or internet-facing public deployments of <code class="expression">space.vars.OIM</code>.
   * **Security Benefit:** HTTPS provides encrypted communication, ensuring data confidentiality, integrity, and authenticity.

### Database Port

* **9001**: If you are installing <code class="expression">space.vars.OIM</code> with HSQL database.

> **Note**: Apart from the above ports, some connectors require certain ports to be available. Please refer the [Connectors](/connectors) section to check ports used by specific connectors.

## Appendix

### Windows specific configuration

During the installation of <code class="expression">visitor.claims.unsigned.product</code>, few temporary files are placed/copied in the TEMP directory \[i.e., the path which is specified in TEMP environment variable]. This directory path should not contain ";" as well as none of the directory/folder names should end with "!" in this path.

* Example: "C:\Users\xyz!\AppData\Local\Temp" or "C:\Users\xy;z\AppData\Local\Temp" as Temp environment variable value/path is not allowed.
* In such case, the installation will fail with error. Please refer [here](/help-center-index/troubleshooting-index/errors-index/installer-error-solutions/ops-005) for more details on this error and steps for its resolution. To check how to set TEMP environment variable, please refer below.

### Setup environment variable

* Open "Edit the system environment variables" from Start.
* Click the "Environment Variables" button.
* Click on environment variable required to be edited.
* Click on Edit button and change the path.


# Installation

## Launching Installer

The first screen when you launch the application will be this:

<div align="center"><img src="/files/hi4eg8mvwQ3PM13FByPV" alt="" width="820"></div>

### Launch the installer in different Operating Systems

* Unzip the OIM installer folder to find the executable(.exe) file.
* The steps to launch the installer in different Operating Systems (OS) are given below. Follow the steps given for the OS that you are using.

| **Windows**                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | **Linux**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p>\* Double click the executable <em>.exe file given in the application folder (It is advisable to run .exe file by right-clicking <strong>Run as administrator</strong> where \* is replaced with the application version).</em><br>If one instance of this release is already installed, then the user will be notified.<br>\* Click <strong>yes</strong> to continue with the installation. It will then display the uninstallation key for the current installation.</p> | <p><strong>Before Installation</strong><br>\* Extract the zip file. Make sure user who will run installer owns the files and has full access to extracted files.<br>\* Create empty directory with full access(it should not be inside installation directory) and export it's path to OPSHUB\_TEMP\_DATA variable as shown in below example:<br><strong>export OPSHUB\_TEMP\_DATA=/home/setup/temp</strong><br>\* If you are doing a silent installation, make sure you have provided the same path for OPSHUB\_TEMP\_DATA as provided during <a href="/pages/kfGp5UAiq2DbiH4Mmvrk#silent-registration-for-linux">Silent Registration for Linux</a>.<br>\* If Linux has NFS (Network File System) based file system, please add the following line in OIM user's '.bashrc' file:<br><strong>In /home/{OIM user}/.bashrc file, add the following line at the end:</strong><br><em><strong><code>export JAVA\_OPTS="$JAVA\_OPTS -XX:+StartAttachListener"</code></strong></em><br><strong>Without the Java option, the server start up will fail. The error details are available</strong> <a href="/pages/0zulHk9fLFnK7nXQmZPn"><strong>here</strong></a><strong>.</strong><br>\* See minimal access required to install OpsHub Integration Manager <a href="#minimal-access-required-to-run-linux-installer-using-external-file">here</a>, when you do not have root access.<br><br><strong>To Run sh file</strong><br>\* Open terminal window and go to the folder containing the install.sh file.<br>\* Execute the following command: <strong>sudo -E sh install.sh</strong>.<br>\* To run the sh File, you need to have access to Linux UI. This is because the installation process requires user inputs through UI. Installation won't get completed through remote terminal connection (i.e. Putty).<br><br><strong>To Run sh File from External File (Silent Installation)</strong><br>To install OpsHub Integration Manager through terminal connection (i.e. Putty), follow the steps given below:<br>\* Complete user registration as described <a href="/pages/kfGp5UAiq2DbiH4Mmvrk#silent-registration-for-linux">here</a>.<br>\* Download and modify OpsHubAutoInstall.xml file as per your requirement by click <a href="/pages/t0Hi1FSNcNBlAFP9cWwn">here</a>.<br>\* Make sure, you will transfer the modified file on the instance where you want to install OpsHub Integration Manager.<br>\* Set an environment variable OPSHUB\_AUTO\_INSTALL on the installation instance, the value of variable is the path to the OpsHubAutoInstall.xml file. File name can be different.<br><strong>For example, export OPSHUB\_AUTO\_INSTALL=/home/Downloads/OpsHubAutoInstall.xml.</strong><br>\* After setting environment variable, run the installer with command <strong>sudo -E sh install.sh</strong>.<br>\* Please refer <a href="#possible-error-during-silent-installation-upgradation">Possible Error</a> section for trouble shooting error(s) occurred during Installation.</p> |

#### Recommended Installation Path for <code class="expression">space.vars.OIM</code> Installer for Linux

* It is recommended to install or perform migration of the <code class="expression">space.vars.OIM</code> in the /opt folder or /user/local folder.
  * For <code class="expression">space.vars.OIM</code> migration, if the <code class="expression">space.vars.OIM</code> is not installed at the above places, then follow the steps mentioned here.
  * Reason: SELinux prevents Linux users from running a <code class="expression">space.vars.OIM</code> service in the user's home directory. Hence, the user needs to avoid installing <code class="expression">space.vars.OIM</code> in the home directory.

#### Minimal access required to run linux installer using external file

* <code class="expression">space.vars.OIM</code> Installation Directory should be owned by user who run installer/migrator and has following permissions.

Here are the required permissions:

| **Permission** | **Directory**                                                                                              |
| -------------- | ---------------------------------------------------------------------------------------------------------- |
| --x            | /usr                                                                                                       |
| --x            | /proc                                                                                                      |
| r-x            | /usr/bin                                                                                                   |
| r-x            | /usr/bin/\*                                                                                                |
| --x            | /usr/lib64                                                                                                 |
| r-x            | /usr/lib64/\*                                                                                              |
| --x            | /usr/share (if user edits file using nano)                                                                 |
| r-x            | /usr/share/\*                                                                                              |
| rw-            | /etc/systemd/system (if user needs <code class="expression">space.vars.OIM</code> as a service for Ubuntu) |

* During <code class="expression">space.vars.OIM</code> installation or upgrade, a dedicated linux user named opshub is created (if it does not already exist), and the required permissions are assigned to this user.
* It is recommended to run opshubserviced.service using the dedicated opshub user only.
* If additional system-level configurations are required, for example, if the service needs to bind to a reserved port, it must be explicitly configured at the OS level, since on Linux, non root users, including the opshub user, are not permitted to bind to privileged ports below 1024.
* Note: For HSQLDB, root access is required when user needs to install/migrate <code class="expression">space.vars.OIM</code>.

#### Possible error during Silent Installation/Upgradation

\[ Starting automated installation ]

\[Timestamp] java.util.prefs.FileSystemPreferences$2 run

INFO: Created system preferences directory in java.home.

com.izforge.izpack.installer.InstallerException: Validating data for panel UserInputPanel.EmailIdVerificationForExistingCode was not successfull

com.izforge.izpack.installer.InstallerException: Validating data for panel UserInputPanel.EmailIdVerificationForExistingCode was not successfull

at com.izforge.izpack.installer.AutomatedInstaller.validatePanel(Unknown Source)

at com.izforge.izpack.installer.AutomatedInstaller.installPanel(Unknown Source)

at com.izforge.izpack.installer.AutomatedInstaller.doInstall(Unknown Source)

at com.izforge.izpack.installer.Installer.main(Unknown Source)

\[ Automated installation FAILED! ]

**Solution**

Make sure you have performed the following steps correctly:

* You have registered as described [Registration - Silent Registration for Linux](/getting-started/installation/registration#silent-registration-for-linux) before Installation/Upgradation.
* You have registered using the same path for which you install/upgrade <code class="expression">space.vars.OIM</code>.
* You have used the correct verification code.
  * Verification Code is unique for each machine and installation path. The code generated on a different machine and for different path won't work.
* You have export same value for OPSHUB\_TEMP\_DATA during Registration and Installation/Upgradation.

### License Information

On launching the installer, you will see the license agreement window that contains all license-related terms and conditions.

If you agree with the license details, then only you can move to the next step i.e. Installation.

<div align="center"><img src="/files/FoVsGm2yoDbQfCKRHnvB" alt="" width="820"></div>

License Information window has the details of the trial license and the contact information to purchase the license.

<div align="center"><img src="/files/dliEiFrpi94iG4lSYcGG" alt="" width="820"></div>

#### Possible exceptions

While uploading the license from license management tab, <code class="expression">space.vars.OIM</code> throws exceptions as below:

* **Unable to install license** `com.opshub.license.exception.LicenseException`: Failed to get license content because of If you are accessing OpsHub from different machine then change localhost to ip address of the machine where OpsHub installed.
* **The filename, directory name, or volume label syntax is incorrect**

com.opshub.license.install.OpsHubLicenseManager.getLicenseContent(OpsHubLicenseManager.java:60) at com.opshub.license.install.OpsHubLicenseOperationManager.getLicenseContent(OpsHubLicenseOperationManager.java:34) at com.opshub.license.install.LicenseInstaller.getOHLicenseContent(LicenseInstaller.java:128) at com.opshub.license.install.LicenseInstaller.installLicense(LicenseInstaller.java:57) at com.opshub.license.install.LicenseInstaller.installLicense(LicenseInstaller.java:51) at com.opshub.license.server.LicenseBO.validateAndInstallLicense(LicenseBO.java:329) at com.opshub.license.server.LicenseServer.validateAndInstallLicense(LicenseServer.java:96) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.metaparadigm.jsonrpc.JSONRPCBridge.call(JSONRPCBridge.java:1122) at com.opshub.JSON.JSONRPCServlet.service(JSONRPCServlet.java:349) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:120) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at com.opshub.JSON.CacheControlFilter.doFilter(CacheControlFilter.java:27) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:495) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:767) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1347) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.FileNotFoundException: If you are accessing OpsHub from different machine then change localhost to ip address of the machine where OpsHub installed.

* **The filename, directory name, or volume label syntax is incorrect**

at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.(FileInputStream.java:138) at de.schlichtherle.license.LicenseManager.loadLicenseKey(LicenseManager.java:741) at com.opshub.license.install.OpsHubLicenseManager.getLicenseContent(OpsHubLicenseManager.java:55)

## Installation

Here is a video on how to install <code class="expression">space.vars.OIM</code> on the Windows machine:

{% embed url="<https://youtu.be/Is5sDKV01P0>" %}

### Select Installation Path

* You now have to select the installation directory. Before you select a directory, make sure the directory is empty. All the log files, configuration files, and servers are placed in this directory. If the directory is not available, you can create a directory as per your own specifications.

<div align="center"><img src="/files/TX8M9Jutp9h5j04dgInU" alt="" width="820"></div>

### Registration

* Each installation must be registered with OpsHub. Registration can be done either in Online or Offline mode. Please refer [Registration](/getting-started/installation/registration) section for more details.

### Database Selection

The user should select the Database type for installation from the dropdown list. Database connector jar is required to connect to the database. Refer [Download Database Connector jar](/getting-started/prerequisites#download-database-connector-jar) to get the download link of the database connector jar.

<div align="center"><img src="/files/EpgwCI3QF5mmb8o7ua4F" alt="" width="900"></div>

Click the checkbox adjacent to **Advance configuration** option if you have one of the following requirements:

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

* Install <code class="expression">visitor.claims.unsigned.product</code> in https
  {% endif %}

* Install multiple instances of <code class="expression">visitor.claims.unsigned.product</code> on a single instance

* Need to create database manually

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

* Need to change encryption algorithm (by default, it is AES 256)
  {% endif %}

Now, select **one of the five types of database selection for installation** as mentioned below.

The installer progresses to next panel in accordance with the user selection.

| **Database Type**             | **Installation Details**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Embedded HSQL**             | <p>This type of installation starts from the next panel. No more inputs from the user are required. It installs <code class="expression">visitor.claims.unsigned.product</code> on HSQL database packaged along with <code class="expression">visitor.claims.unsigned.product</code> installer.<br>> <strong>Note</strong>: This installation is not recommended for production.<br>Read more: <a href="#installation-with-embedded-hsql-default">Installation with embedded HSQL (Default)</a></p>                                               |
| **MySQL Server**              | <p>This type of installation further asks for MySQL Server database parameters. You need to specify connection parameters to connect to MySQL and the path of the connector jar, which is required for database transaction done by <code class="expression">visitor.claims.unsigned.product</code>.<br>Read more: <a href="#installation-with-mysql-server">Installation with MySQL Server</a><br>> <strong>Note</strong>: Here for the Connector Jar, select the path of the executable Jar file named mysql-connector-java-5.1.35-bin.jar.</p> |
| **Oracle**                    | <p>This type of installation further asks for Oracle Server database parameters. You need to specify connection parameters to connect to Oracle and the path of the connector jar, which is required for database transaction done by <code class="expression">visitor.claims.unsigned.product</code>.<br>Read more: <a href="#installation-with-oracle">Installation with Oracle</a></p>                                                                                                                                                         |
| **MS SQL / Azure SQL Server** | <p>The input form allows you to select Authentication mode.<br>Read more: <a href="#installation-with-ms-sqlazure-sql-server">Installation with MS SQL/Azure SQL Server</a></p>                                                                                                                                                                                                                                                                                                                                                                   |
| **PostgreSQL**                | <p>This type of installation further asks for PostgreSQL database parameters. You need to specify connection parameters to connect to PostgreSQL and the path of the connector jar, which is required for database transaction done by <code class="expression">visitor.claims.unsigned.product</code>.<br>Read more: <a href="#installation-with-postgresql">Installation with PostgreSQL</a></p>                                                                                                                                                |

Notes:

* For MS SQL/Azure SQL Server and MySQL Server, **Database User Name**

  can contain:

  * Alphabets (a-z,A-Z)
  * Numbers (0-9)
  * Special characters from the list:

    !@#$^&\*()\_+|\[];:'><,.?/\`\~-=
* For Oracle, **Database User Name** can contain:
  * Alphabets (a-z,A-Z)
  * Numbers (0-9)
  * Special characters from the list: !@#$^&\*()\_+|:'><,.?\`\~-=
* **Database User Password** can contain:
  * Alphabets (a-z,A-Z)
  * Numbers (0-9)
  * Special characters from the list:

    !@#$^&\*()\_+|\[];:'><,.?/\`\~-=

Given below are further details associated with each installation selection.

### Installation with embedded HSQL (Default)

<div align="center"><img src="/files/QUUmb71xV1cRPvVldtk2" alt=""></div>

### Installation with MySQL Server

<div align="center"><img src="/files/7Ys9E7ptSbWyivc092tR" alt="" width="900"></div>

Notes : For this application, the default database name will be `opshub` and `reportsdb`.

### Installation with Oracle

Select Oracle Database Type

* CDB or Container Database refers to the multitenant architecture in Oracle. CDB type was introduced with Oracle 12c version. User can use the instructions given in the following screenshot to find out whether your Oracle database type is CDB or not.
* The user must select the connection type based on the oracle configuration used to connect the above selected database type. It can be either **SID** or **Service name**.

<div align="center"><img src="/files/BKlEkv2mF3TyNNYgi50b" alt="" width="900"></div>

Follow the instructions shown in installer for downloading connector jar.

<div align="center"><img src="/files/Xk4B7Zw1C2id2FhPkuDX" alt="" width="900"></div>

Notes:

* The default user name will be 'C##opshub' and 'C##reportsdb' for Oracle CDB instance with CDB$ROOT container.
* The default user name will be 'opshub' and 'reportsdb' for Oracle Non-CDB instance or CDB instance with container other than CDB$ROOT.

For the **Oracle cluster** instance, to get the instance name for <code class="expression">visitor.claims.unsigned.product</code> installation, please check the below SQL to get the

currently logged in instance name.

* Log in to the oracle instance \[Cluster] using SQL plus with username, password and service name:**sqlplus username/password\@connect\_identifier**
* Run the below SQL:
  * If service name is configured for the oracle instance:

    `SELECT sys_context('USERENV','SERVICE_NAME') AS Instance FROM dual;`
  * If SID is configured for the oracle instance:

    `select instance_name from v$instance;`

The output value is the instance name that will be used in installation process.

> **Note**: All these operations must be allowed with ADMIN OPTION.

If you have to install the pre-requisite for Oracle with **version 11g (Release 2)/12c**, follow the instructions below:

* **Pre-requisite for Oracle with version 11g**:

For Oracle 11g version, ojdbc6.jar or ojdbc5.jar is required. The path for ojdbc6.jar or ojdbc5.jar is required while installing <code class="expression">visitor.claims.unsigned.product</code> with Oracle database.

* **Pre-requisite for Oracle with version 12c**':

For Oracle 12c version, ojdbc7.jar or ojdbc6.jar is required. The path of the executable jar files (such as ojdbc7.jar or ojdbc6.jar)is required while installing <code class="expression">visitor.claims.unsigned.product</code> with Oracle database.

* **Pre-requisite for Oracle with version 19c**:

For Oracle 19c version, ojdbc8.jar or ojdbc10.jar is required. The path of the executable jar files (such as ojdbc8.jar or ojdbc10.jar is required while installing <code class="expression">visitor.claims.unsigned.product</code> with Oracle database.

**Known Limitations**

* Currently SSL\_CLIENT\_AUTHENTICATION is not supported for Oracle database.

**Default quota size setting**

* Default tablespace quota size of user for the opshub database is 2000M

  ( which is equal to 2GB) .
* If you encountered with following error "ORA-01536: space quota exceeded for tablespace 'USERS'" in <code class="expression">visitor.claims.unsigned.product</code>, then

  it is requires to increase the default quota size for opshub database.

  * Query To change the tablespace quota for opshub database is :

    **ALTER USER \<opshub\_dbname> QUOTA \<size\_of\_tablespace> ON users;**
  * For example, to increase the quota size from to 10GB for opshub database "opshub", then execute command as **ALTER USER opshub QUOTA 10000M ON users;**

### Installation with MS SQL/Azure SQL Server

> **Note** :Azure SQL is an alias for MS SQL on cloud.

**Character Encoding Considerations**:

* If the end systems to be configured in the <code class="expression">visitor.claims.unsigned.product</code> include characters beyond standard English or ASCII and are incompatible

with the Latin1\_General\_CS\_AS collation (default collation), consider [Advance Installation](/getting-started/installation#advance-installation) option.

* Mark the checkbox, "Check this if you will be creating databases manually" option during installation. The instructions to create databases are mentioned in the section [Manual creation of databases](/getting-started/installation#manual-creation-of-databases)

<div align="center"><img src="/files/pMm1cIrpvW2DGgbxJEXJ" alt="" width="900"></div>

* For using Named Instance of MS SQL Server, append the Instance Name to the Database Host Name, separated by %. For e.g.,

  localhost%SQLExpress. In the case of name Instance, port is optional.
* **MS SQL/Azure SQL Server Database Name Input:**
* The database name given in input 'Database Name' will be used to test the connection with the database server. The input needs\
  to be given when your database user doesn't have access to the 'master' database. If the database user has access to the\
  'master' database, then the input can be left blank.
* If the database is to be created by <code class="expression">visitor.claims.unsigned.product</code>, then the database user must have 'master' database access.\
  In that case, the 'Database Name' input is not required and can be set to empty or 'master'.
* If the installation is to be done with an already created database, then the database user must have access on that database.\
  In that case, the 'Database Name' input needs to be set to the name of the already created database.
* For this application, the default database name will be 'opshub'.

**Prerequisites for MSSQL:**

* MSSQL with version 2012 :
  * sqljdbc\_10.2.0.0\_enu.tar.gz databse connector driver.
  * The path to sqljdbc\_10.2.0.0\_enu.tar.gz is required while installing <code class="expression">visitor.claims.unsigned.product</code> with MSSQL database.
* MSSQL with version 2014 onwards:
  * sqljdbc\_12.2.0.0\_enu.tar.gz databse connector driver.
  * The path to sqljdbc\_12.2.0.0\_enu.tar.gz is required while installing <code class="expression">visitor.claims.unsigned.product</code> with MSSQL database.

**a) SQL Authentication Mode**

<div align="center"><img src="/files/dNlSjTXtaHV6QKZCCgOQ" alt=""></div>

**b) Windows Authentication Mode**

<div align="center"><img src="/files/pIItokbiUwfCZP5vpwHn" alt="" width="900"></div>

* The option to set logon user for the OpsHub Server Service appears in either of the two cases: When you have not selected advance configuration option, or when you have selected "Install OpsHub as a service" option in the advance installation screen.

Enter the required details to set logon user for the OpsHub Server Service.

<div align="center"><img src="/files/pBnFcznIpK4C40HVyMP3" alt="" width="900"></div>

If Windows credentials are not added correctly during installation, the OpsHub Server service will not be started. To avoid such an occurrence, the user will have to manually set the service log-on credentials for OpsHub Server Service in case wrong Windows credentials are added at the installation time.

* Follow the below mentioned steps to set the credentials in the OpsHub Server Services:

1. Open the services application and search for OpsHub Server Service.
2. Right-click on the service, select properties and go to the **Log On** Tab.
3. Enter Windows credentials in **This account**.

* If the user is registered with a domain, the username format will be "{username}@{domain}" or "{domain}\username}". Otherwise, the username format will be ".\username".

**Windows Username should have the following pre-requisites met:**

* If the user is being registered with a domain, the format of the username will be "{username}@{domain}" or "{domain}\username}". Otherwise, the format of the username will be ".\username".
* This user can be of two types:

1. Admin user - Having all the admin privileges.
2. Basic user with at least "read & execute", "list folder contents", "Read" and "write" permissions on the installation folder.

* This user should be present in the MS SQL Server and must have **public** & **sysadmin** Server Roles in MS SQL Server.
* Ensure that the user has **Log on as a service** privilege on the machine on which <code class="expression">visitor.claims.unsigned.product</code> will be installed.

### Installation with PostgreSQL

<div align="center"><img src="/files/ZJeu4wLA17vs8msHZKl6" alt="" width="900"></div>

Notes : For this application, the default database name will be 'opshub' and 'reportsdb'.

## Advance Installation

* Go through this section if you want to configure Advance Installation. Else, proceed to the [Installation Progress](#installation-progress) section.

<div align="center"><img src="/files/qt3qlSQw90tJwtM7RNXU" alt="" width="820"></div>

Let's now learn about the steps for advance installation.

### Connection Mode Configuration

* Select the type of connection protocol you want to use for running the server. If HTTPS is selected, you need to follow one more step [SSL Certificate Configuration](#ssl-certificate-configuration) for advance installation.

### OpsHub Database Custom Configuration

* If you want to create databases manually, mark the checkbox "Check this if you will be creating databases manually". The instructions to create databases have been mentioned in the section [Manual creation of databases](#manual-creation-of-databases).
* If the checkbox "check this if you are creating databases manually" is unchecked then enter the names of the databases that you want to configure and according to the database selection in the previous stage (MySql, MS SQL/Azure SQL, PostgreSQL or Oracle) databases/schemas will get created.
* Database name can contain $, \_, #, alphabets, and numbers without any space.
* If there are more than one database, give different names for each one.

### Install OpsHub server as a service

* If the application is installed as a service, the server will automatically start on system boot. You need not to start and stop the server explicitly. In case, you want to stop the services, you can go to Services, find the service and stop it manually from there.

### Data Encryption Configuration

* Advanced Data Encryption: Enables user to generate a secret key and store it in a secured location, or select an existing secret key if available. This configuration also allows the user to select the desired encryption algorithm for ensuring security of the application.

**a) Configuration for secret key location** User can select either of two options:

* Generate a secret key: With this option, a secret key would be automatically generated, and user needs to select location, where he/she desires to store this key.

<div align="center"><img src="/files/Q5emsxBbThurQcSakBhG" alt="" width="820"></div>

* Use the existing secret key: If user already has secret key available,then user should select this option. User needs to select path where "opshub.key" file is available to use that key.

<div align="center"><img src="/files/J5lRYXc5AMbXa8II3bvR" alt="" width="820"></div>

**b) Configuration for algorithm to encrypt data** User can select his desired algorithm from the available list to ensure security of data in application.

<div align="center"><img src="/files/y2ZFMs2Hnv4dmHrF8NZ0" alt="" width="820"></div>

### Installation Progress

The image below shows the overall progress of installation.

<div align="center"><img src="/files/Sn6VWj4DmFLJpGS5zpvj" alt="" width="820"></div>

* Setup Shortcuts: It will add the application to the Windows program list if the operating system is Windows and will add the application to the Linux program list if the operating system is Linux. It will also create the <code class="expression">space.vars.OIM</code> launcher.

<div align="center"><img src="/files/9Qjytv8uLu5cIgm8y8PA" alt="" width="800"></div>

### Installation Success

The image below shows a successful installation.

<div align="center"><img src="/files/pOZ8lF1HvAhnvwvDn32U" alt="" width="800"></div>

Once you have installed the application, click [Get Started With the Application](/getting-started/logging-in) to see how to get started.

**Appendix**

## SSL Certificate Configuration

<div align="center"><img src="/files/k6mqel8KzbW1JwaEwDlz" alt="" width="820"></div>

It is advisable to enter the server-host name in the given field, it might create problem with IP address in some cases. Alias of the certificate should be unique.

* Enter the name of your Organizational unit.
* Enter the Organization name.
* Enter the current City or Locality.
* Enter the current Country Code. It should be alphabetic code. For e.g., "IN" for India, "US" for America, "AU" for Australia, etc.
* Select the number of days till when the certificate should be valid.

> **Note** : Please note with the above steps <code class="expression">space.vars.OIM</code> will be installed with SSL configuration. But the corresponding SSL certificate imported will be self-signed. In case you want to install certificate signed by your CA authority then follow the steps given in this section [How To Import a Certificate](/getting-started/installation/how-to-import-a-certificate) in appendix.

## Manual creation of databases

For manual creation of databases, you can use the following queries:

### Queries for MySQL database

Let's name the database as `db1`:

```sql
DROP DATABASE IF EXISTS db1;
CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
```

Let's name the reports database as reportsdb:

```sql
DROP DATABASE IF EXISTS reportsdb;
CREATE DATABASE reportsdb CHARACTER SET latin1 COLLATE latin1_general_cs; 
```

### Queries for MS SQL/Azure SQL Database

**Collation Considerations**

* For Multiple Language Systems:
  * If your end systems support multiple language characters, it's essential to choose a collation that supports **UTF** characters.
  * To enable UTF character support in <code class="expression">visitor.claims.unsigned.product</code>, install it on **Microsoft SQL Server 2019 or above**.
  * Select a collation with a `UTF` postfix, for example: `Latin1_General_100_CS_AS_SC_UTF8`
* For Single Language Systems:
  * If your end systems utilize a single language and your selected collation includes all the necessary characters and is supported in SQL Server versions below 2019, you can proceed with the installation on SQL Server version below 2019. Select an appropriate collation that suits your end systems \[which are going to be configured in <code class="expression">visitor.claims.unsigned.product</code>].
  * Select an appropriate collation that suits your end systems (which will be configured in <code class="expression">visitor.claims.unsigned.product</code>).
  * Here is [guide](https://learn.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16) that may help you decide the right collation for your database.

> **Note:**\
> We need **1 database** and **2 schemas** to be created manually, out of which The **database and schema name must be the same** for the OpsHub database, and another schema should be created for **reportsdb**.

```sql
drop database IF EXISTS db1
db1 database: create database db1 COLLATE Latin1_General_CS_AS;
db1 schema: create schema db1;
Reports schema: create schema reportsdb;
```

### Queries for Oracle Database

> **Note:** Replace `<<SERVER_PASSWORD>>` with the actual password.

Let's name the database as `db1`:

```sql
drop user db1 CASCADE;
CREATE USER db1 IDENTIFIED BY <<SERVER_PASSWORD>> DEFAULT TABLESPACE users QUOTA 500M ON users TEMPORARY TABLESPACE temp PROFILE DEFAULT ACCOUNT UNLOCK
```

Let's name the reports database as reportsdb:

```sql
drop user reportsdb CASCADE;
CREATE USER reportsdb IDENTIFIED BY <<SERVER_PASSWORD>> DEFAULT TABLESPACE users QUOTA 2048M ON users TEMPORARY TABLESPACE temp PROFILE DEFAULT ACCOUNT UNLOCK
```

> **Note**: Ensure both `db1` and `reportsdb` users have the required privileges. For system and object privileges, refer to [Database Prerequisites](/getting-started/prerequisites#database-prerequisites).

* Note, in case of manual database creation with Oracle database, OpsHub database user ("db1") and OpsHub reports database user ("reportsdb") shall be created on the same server. At the time of installation, you need to provide the username and password for the database server.
* In case of Oracle database, passwords for the database users ("db1" and "reportsdb") shall be the same as the password of the server on which they are created.
* If you want to change the tablespace quota for OpsHub database "db1", following query can be used:

```sql
ALTER USER db1 QUOTA <size_of_tablespace> ON users;
```

> **Note:** `"db1"` and `"reportsdb"` are the database/schema/database user names used in the above queries. You can name them differently as per your requirements.

### Queries for PostgreSQL Database

* In case of manual database creation for PostgreSQL Server database, database and schema should be in lowercase only.
  * We need 1 database and 2 schemas to be created manually, out of which database and schema's names must be same for opshub database. The other schema will be created for reportsdb.

Let's say the name of the database is `db1`:

```sql
drop database IF EXISTS db1
db1 database: CREATE DATABASE db1
WITH
ENCODING = 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
TEMPLATE = template0;
```

> **Note**: The above query will create database with Collate United States, UTF-8. For creating database with desired collate, update `LC_COLLATE` and `LC_CTYPE` as per the requirement.

```sql
db1 schema: create schema db1;
Reports schema: create schema <schema_name>;
```

Here \<schema\_name> will be the schema name of reportsdb.

## Collation change of MS SQL/Azure SQL Databases

If the user needs to change the collation of <code class="expression">visitor.claims.unsigned.product</code>'s database, follow the below-mentioned steps:

**Important Note**

* When changing the collation, compare the code pages of the old and new collations to ensure that character representations are consistent and prevent data conversion issues. For example, changing Turkish\_CS\_AS collation to Latin1\_General\_CS\_AS will convert "ı"(dott-less i) to "i".
* When considering a collation change, it's important to be aware about variations in character encoding and sorting rules between the old and new collation settings. Character conversion will occur during the process of collation change as mentioned in the above example. This conversion can lead to the irreversible loss of the original data.

**Procedure:**

1. **Stop the** <code class="expression">visitor.claims.unsigned.product</code> **Server**: Ensure the <code class="expression">visitor.claims.unsigned.product</code> server is not running.
2. **Database Backup**: Take a backup of the database.
3. **Download Scripts**: Download the provided script by clicking [here](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/EeqVoEYk3gVHsQT8Y4_CrRsB_SkllsEiDWv1YrEbLEfbDw?e=VLcoFu).
4. **SQL Editor**: Open the SQL editor.
5. **Changing the columns collation**: Open the **Migration Script** file and replace `YOUR_COLLATION_NAME` with the collation name you would like to migrate to as the new collation. Execute the **Migration Script** and copy the generated SQL statements. Open a new window in SQL editor, paste those statements and execute them.
6. **Database collation change**: Open the **Database Collation Change Script** file and replace `YOUR_COLLATION_NAME` with the collation name you would like to migrate to as the new collation. Also, replace `YOUR_DATABASE_NAME` with the name of the database on which <code class="expression">visitor.claims.unsigned.product</code> is installed. Execute the script file.
7. **Start** <code class="expression">visitor.claims.unsigned.product</code> **Server**: Restart the <code class="expression">visitor.claims.unsigned.product</code> server.


# Registration

## Registration Mode

When you have provided installation directory during installing/upgrading <code class="expression">space.vars.OIM</code>, you will be redirected to the Registration screen. In the Registration screen, you need to register yourself before installation/upgradation:

<code class="expression">space.vars.OIM</code> requires one-time registration.

* Please select **New registration** if you are installing/upgrading <code class="expression">space.vars.OIM</code> for the first time.
* If you already have a verification code, select **Use an Existing Verification Code** option.
* If you want to register after installation, select **Registration After Installation** option.

<div align="center"><img src="/files/SemHIuIJo1L8reih0eoc" alt="" width="800"></div>

### New Registration

Once you select **New registration**, you will see the screen shown below. Fill all required data and click Next.

<div align="center"><img src="/files/U2XtYME3zMUfq47vVHsw" alt="" width="800"></div>

When you select **Next**, installer/migrator will register yourself with the registration server.\
On successful registration, you will get a verification code on your registered business email address. Please enter the verification code in the screen shown below and continue installation/upgradation.

<div align="center"><img src="/files/ULXMmyHSj4zb8J0oT4yo" alt="" width="780"></div>

If the installer/migrator is not able to connect to the registration server, you will get an option to register yourself using **Offline Registration** option as shown below. Click **OK** to continue the Offline Registration.

<div align="center"><img src="/files/JAFNDiauaurctgIqtk1P" alt="" width="780"></div>

> 📌 Installer/Migrator may not connect to registration server when you do not have Internet connectivity, or you are working behind a Proxy or when the Registration Server is down. Please proceed with **Offline Registration** in any of these cases.

See [Offline Registration](#offline-registration) for offline registration process.

## Offline Registration

Once you select **OK** in the screen shown above, installer/migrator will prepare `RegistrationDetails.zip` file at the installation directory.

<div align="center"><img src="/files/JAFNDiauaurctgIqtk1P" alt="" width="780"></div>

When you are using Offline Registration option, user can either send the user detials in encrypted format or in decrypted manner. To send the data in encrypted manner, refer to [Get Verification Code using Encrypted User Details](#get-verification-code-using-encrypted-details). If the user wants to know the exact details they are sending to <code class="expression">space.vars.OIM</code>, they can use the decrypted registered details. Refer to [Get Verification Code using Decrypted User Details](#get-verification-code-using-decrypted-user-details).

### Get Verification Code using Encrypted Details

Send `RegistrationDetails.zip` on <CommunityManagers@opshub.com>. Verification Code will be then shared with you on your registered business email address.\
Once you get the verification code, enter the code in the screen shown below and continue with the installation/upgrade.

<div align="center"><img src="/files/8XoebjGUctWkDQI9kvHj" alt="" width="780"></div>

### Get Verification Code using Decrypted User Details

* A zip file containing the decryption utility is copied to the <code class="expression">space.vars.OIM</code> installation folder. Follow the below steps to get the decrypted user data for the verification code generation:
  * Unzip the zip `DecryptionUtility.zip` and extract DecryptionUtility from it. \[In the extracted folder, the `DecryptionUtility.jar` will be available].
  * In the extracted folder, the `details.properties` is available. Mention the below details in that file:
    * Specify the `zipFilePath` where `RegistrationDetails.zip` is present (Do not change the name of the `RegistrationDetials.zip`)
    * Specify the `destDirectory`, the directory where you want to store the Decrypted UserDetails output file.

> 📌 Use forward slash ("/") in the paths specified in the `details.properties` file.

* Open the Command Prompt at the location where `DecryptionUtility.jar` is placed.
  * **For Windows OS:**
    * Type the command: `start <path to jre>\bin\javaw -jar DecryptionUtility.jar`\
      For example:\
      `C:\Users\Admin\AppData\Local\Temp\CBA6.tmp\jre\bin\javaw -jar DecryptionUtility.jar`
    * To reach to `<path to jre>`, follow the below steps:
      * Open Run dialog box, write `%temp%` and hit Enter.
      * Go to the latest created Temp folder. This folder will contain `jre` folder. Use this path as `<path to jre>` in the above mentioned command.
  * **For Linux OS:**
    * Type the command: `<path to jre>/bin/java -DOPSHUB_TEMP_DATA=$OPSHUB_TEMP_DATA -jar DecryptionUtility.jar`\
      For example:\
      `/home/administrator/Downloads/OIMV7_130_Linux_OpsHub/jre/bin/java -DOPSHUB_TEMP_DATA=$OPSHUB_TEMP_DATA -jar DecryptionUtility.jar`
    * To reach to `<path to jre>`, follow the below steps:
      * Go to <code class="expression">space.vars.OIM</code> installation folder. This folder will contain a jre zip. Unzip the jre and use this as `<path to jre>` in the above mentioned command.
* The decrypted UserDetails will be stored in file named `DecryptedRegistrationDetails.txt`.

> 📌 The output file will contain the decrypted userdetails and encrypted Key and Salt value \[due to security purpose]. Here, mail `DecryptedRegistrationDetails.txt` file on <CommunityManagers@opshub.com>. The verification code will be then shared with you on your registered business email address.

Once you get the verification code, enter the code in the screen shown below and continue with the installation/upgrade.

<div align="center"><img src="/files/8XoebjGUctWkDQI9kvHj" alt="" width="780"></div>

You can close the installer/migrator and can register using the same existing code as described in [Registration using Existing Verification Code](#use-an-existing-verification-code).

<div align="center"><img src="/files/8XoebjGUctWkDQI9kvHj" alt="" width="780"></div>

### Use an Existing Verification Code

When you have valid verification code with you, You can proceed registration using an existing verification code as described below.

Select **Use an Existing Verification Code** option as shown in below screen.

<div align="center"><img src="/files/nxqTRfTlnULhzQtPHl4O" alt="" width="780"></div>

> 📌 When you are using this option for upgrading <code class="expression">space.vars.OIM</code>, You should have the latest Application Backup as described [here](/manage/upgrade-index/taking-application-backup).

Once you select **Use an Existing Verification Code** option, you will see the screen shown below. Enter the Verification code and continue installation/upgradation.

<div align="center"><img src="/files/sUGzA2ByvKw13eCCzTUj" alt="" width="780"></div>

### Registration After Installation

Once you select **Registration After Installation**, the following screen will appear after installation:

<div align="center"><img src="/files/HZQXU1thBOcYinPCsuR8" alt="" width="1000"></div>

On selecting **Next**, <code class="expression">space.vars.OIM</code> will have you register with the registration server. On successful registration, you will get a verification code on your registered email id. Enter the verification code as shown in the screenshot below:

<div align="center"><img src="/files/P0Zz2Cdr1TCWAhQUZNfI" alt="" width="1000"></div>

If the <code class="expression">space.vars.OIM</code> is not able to connect to the registration server, you will get an option to register yourself using Offline mode by downloading `RegistrationDetails.zip` as shown below:

<div align="center"><img src="/files/wNXgPMnrjMJrwQo7Udi6" alt="" width="1000"></div>

### Known Behavior

* In the case of OpsHub Migrator for Microsoft Azure DevOps (OM4ADO) and <code class="expression">space.vars.OIM</code> (OIM) with community edition, the **Registration After Installation** feature is not available.

## Silent Registration for Linux

Here is a video on the silent registration of OIM on the Linux machine:

{% embed url="<https://youtu.be/geegozffGtg>" %}

When you want to install/upgrade <code class="expression">space.vars.OIM</code> on a Linux machine as described [here](/getting-started/installation#launch-the-installer-in-different-operating-systems), you need to register yourself by following the steps listed below before you proceed with the installation/upgradation.

* Please download offline registration utility from [here](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/IQAWogdFMMRoRYXC95T2UfqMAVD0RDitlSq7VsvLXZjeSMI?e=1V5O5i).
* You will get the files as shown below:

<div align="center"><img src="/files/6Cmae1hNTTdeG2TxIH0B" alt="" width="550"></div>

* Fill the registration data in `Registration_Input.properties`:
  * FirstName
  * LastName
  * CompanyName
  * EmailId: You will receive verification code on this Email Id.
  * ContactNumber: Optional
  * Consent
    * Yes, if you want the latest updates from OpsHub.
    * No, if you do not want the latest updates from OpsHub.
  * FileName: Filename of installer/migrator zip without extension such as `OIMV7.10-HF2_Linux_OpsHub` for `OIMV7.10-HF2_Linux_OpsHub.zip`
  * InstallationDirectory: Directory on which you want to install/upgrade <code class="expression">space.vars.OIM</code>
* Run registration utility as below:
  * Open the terminal window and go to the folder containing offline registration utility.
  * Create empty directory with full access (it should not be inside installation directory) and export its path to `OPSHUB_TEMP_DATA` variable as shown in the example below:
    * `export OPSHUB_TEMP_DATA=/home/setup/temp`\
      Please take a note of the variable, You need to export the same variable with the same value during installation/migration.
  * Execute the following command: `chmod 755 *` to give execute permission to all files.
  * Execute the following command: `sh registration.sh`
* On successful execution, utility will prepare `RegistrationDetails.zip` file at installation directory.

Please send this file to <CommunityManagers@opshub.com>. Verification Code will be then shared with you at your registered business email address.\
Once you receive the verification code, continue installation as described [here](/getting-started/installation#launch-the-installer-in-different-operating-systems)


# Prepare XML for Auto Installation & Upgradation for Linux-Based Deployment

Here is the process of getting and customizing OpsHubAutoInstall/OpsHubAutoMigrator XML file.

## 1 - Download XML file

Below are the sample templates for OpsHubAutoInstall/OpsHubAutoMigrator XML. You need to customize the template downloaded as described below for configuring your own file for installing or migrating <code class="expression">space.vars.OIM</code>.

* If you are installing <code class="expression">space.vars.OIM</code> then download file [here](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/EdwkmbjVf5RNpjHmsqi8dE4BaSfch1pFlGQhPsixpGnHEw?e=VJclvQ)
  * To customize the file as per your configuration, follow steps from section [step 3 - Configure Installation path](#id-3-configure-installation-path).
* If you are upgrading the existing <code class="expression">space.vars.OIM</code> then download file [OpsHubAutoMigrator.xml](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/EW_r0v_m5RtPoQp-jGLitoMBfWzZDdB0zdpJxflswG4a2Q).
  * To customize the file as per your configuration, follow steps **step 3 and step 4**.

> **Note**: Refer to [step 2](#id-2-customized-example-of-xml-file-with-mysql-database) for example of an already customized file for **installation with MySQL database**.

> **Note**: It is always recommended to have a secured environment for OIM installation. The purpose of Silent installation is to have no manual intervention, and so the user needs to have a secured VM installation as the autoinstall.xml file contains the password in plain text.

## 2 - Customized example of xml file with MySQL database

* Here are the examples of XML file after all modifications.
  * Installation with MySQL Database : [Installer Example file](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/ETH4fCuE0VBBvBucTLI8DtIBl9MlETKWMF3Y1eup2XjuGQ?e=c9TvS4)
  * Upgrade : [Migrator example file](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/EY22j0v_TdFGsCLzrxWEy1IBb8mZXapO2a8po-mPix1R8A?e=N8oyFe)

## 3 - Configure Installation Path

* Find `com.izforge.izpack.panels.TargetPanel` and replace the input mentioned below:
  * Replace **@INSTALLATION\_PATH@** with actual installation directory which you mentioned in **Registration\_Input.properties** during [Silent Registration](/getting-started/installation/registration#silent-registration-for-linux).

## 4 - Configure Registration Type & Verification Code

For the next panel:

```xml
<com.izforge.izpack.panels.UserInputPanel id="UserInputPanel.RegistrationTypeSelection">
```

There are two possible Registration Types, and the required input for the verification code will differ based on your choice. We have listed both scenarios below, along with the inputs you need to provide:

1. Existing Registration (during installation) By default, OpsHub uses Existing Registration as the registration type. If you want to continue with this option, you need to provide the following inputs:

```xml
<com.izforge.izpack.panels.UserInputPanel id="UserInputPanel.RegistrationTypeSelection">
<userInput> <entry key="RegistrationType" value="ExistingRegistration"/>
</userInput> </com.izforge.izpack.panels.UserInputPanel>

<com.izforge.izpack.panels.UserInputPanel id="UserInputPanel.EmailIdVerificationForExistingCode">
<userInput> <entry key="VerificationCode" value="@VERIFICATION_CODE@"/>
</userInput> </com.izforge.izpack.panels.UserInputPanel>
```

> **Note**: Replace @VERIFICATION\_CODE@ with the verification code that you received on your registered business email address

2. Post Registration (after installation) For Post-Installation Registration, set the input value of "RegistrationType" to PostInstallRegistration.

```xml
 <com.izforge.izpack.panels.UserInputPanel id="UserInputPanel.RegistrationTypeSelection">
<userInput> <entry key="RegistrationType" value="PostInstallRegistration"/> </userInput>
</com.izforge.izpack.panels.UserInputPanel>
```

> **Note**: Complete the installation first, and after the server starts, you will be prompted to fill out the registration form. You will receive the verification code only after completing the registration form.

## 5 - Configure Base Parameter

Find all parameters below under panel `id="UserInputPanel.installationflow"`.

1. Find **@COMPANY\_NAME@** parameter in the OpsHubAutoInstall.xml file and replace with your company name.
2. Find **@DB\_TYPE@** and replace database type as below:
   * Replace with "MySQL" for configuring MySQL database. Refer to [MySQL Database configuration](#mysql-database-configuration) for detailed steps.
   * Replace with "MS SQL Server" for configuring MS SQL database. Refer to [MSSQL Database configuration](#mssql-database-configuration) for detailed steps.
   * Replace with "ORACLE" for configuring Oracle database. Refer to [Oracle Database configuration](#oracle-database-configuration) for detailed steps.
   * Replace with "HSQLDB" for configuring HSQL database. Refer to [HSQL Database configuration](#hsql-database-configuration) for detailed steps.
   * Replace with "PostgreSQL" for configuring PostgreSQL database. Refer to [PostgreSQL Database configuration](#postgresql-database-configuration) for detailed steps.
3. Find **@ADVANCE\_CONFIG\_FLAG@** and replace with either "1" if you want to configure advance parameter or "0" if you don't want to configure advance parameters.

   > **Note**: Advance configuration allows to change default database name, Http/Https configuration, Advanced Security Options.

   * If you are setting above flag as "0" then advance configuration parameters will be set with default values.

## 6 - Database configuration

### MySQL Database configuration

1. Find panel with id **"UserInputPanel.mysqldb"**.
2. Remove comment from parameters.
3. Go to [Common Database configuration parameters](#common-database-configuration-parameters) and follow the steps.

### Common Database Configuration Parameters

1. Find and replace **@DB\_HOST@** with the host name of your database.
2. Find and replace **@DB\_PORT@** with the port of your database.
3. Find and replace **@DB\_USER@** with the username of your database.
4. Find and replace **@DB\_PASSWORD@** with the password of your database.
5. Find and replace **@DB\_CONNECTOR\_JAR\_PATH@** with the jar file path of your database connector. Find the jar file name according to the database you are using.

   * For MySQL, refer section [Installation with MySQL Server](/getting-started/installation#installation-with-mysql-server)

   * For MS SQL, refer section [Installation with MSSQL Server](/getting-started/installation#installation-with-ms-sql-azure-sql-server)

   * For ORACLE, refer section [Installation with Oracle](/getting-started/installation#installation-with-oracle)

   * For HSQL, no external connector jar file is required.

   * For PostgreSQL, refer section [Installation with PostgreSQL](/getting-started/installation#installation-with-postgresql)

   > **Note**: The user who is running the installer should have 'Read' access to the jar file of your database connector.

### MSSQL Database configuration

#### Installation on Windows

**With Windows authentication**

1. Find panel with id **"UserInputPanel.mssqlAuthModeOnWindows"**.
2. Remove comment from parameters.
3. Find **@DB\_AUTH\_TYPE@** in the same panel.
4. Replace variable value with "Windows Authentication" if you are configuring MSSQL with Windows Authentication.
5. Find panel with id **"UserInputPanel.mssqldbOnWindowsAuth"**.
6. Remove comment from parameters.
7. Go to [Common Database configuration parameters](#common-database-configuration-parameters) and follow the steps to replace **@DB\_HOST@, @DB\_PORT@, @DB\_CONNECTOR\_JAR\_PATH@** with your input.
8. Find and replace **@DB\_NAME\_TO\_TEST\_CONNECT@** with the database name to which database user has access to.

   > **Note**: Go to [MS SQL/Azure SQL Server Database Name Input](/getting-started/installation#installation-with-ms-sql-azure-sql-server) to find the usage.

**With SQL authentication**

1. Find panel with id **"UserInputPanel.mssqlAuthModeOnWindows"**.
2. Remove comment from parameters.
3. Find **@DB\_AUTH\_TYPE@** in the same panel.
4. Replace variable value with "SQL Authentication" if you are configuring MSSQL with SQL Authentication.
5. Find panel with id **"UserInputPanel.mssqldbOnSQLAuth"**.
6. Go to [Common Database configuration parameters](#common-database-configuration-parameters) and follow the steps.
7. Find and replace **@DB\_NAME\_TO\_TEST\_CONNECT@** with the database name to which database user has access to.

   > **Note**: Go to [MS SQL/Azure SQL Server Database Name Input](/getting-started/installation#installation-with-ms-sql-azure-sql-server) to find the usage.

**Installation on Linux**

1. Find panel with id **"UserInputPanel.mssqlAuthModeOnLinux"**.
2. Remove comment from parameters.
3. Find **@DB\_AUTH\_TYPE@** in the same panel.
4. Replace variable value with "SQL Authentication" if you are configuring MSSQL with SQL Authentication.
5. Find panel with id **"UserInputPanel.mssqldbOnSQLAuth"**.
6. Go to [Common Database configuration parameters](#common-database-configuration-parameters) and follow the steps.
7. Find and replace **@DB\_NAME\_TO\_TEST\_CONNECT@** with the database name to which database user has access to.

   > **Note**: Go to [MS SQL/Azure SQL Server Database Name Input](/getting-started/installation#installation-with-ms-sql-azure-sql-server) to find the usage.

### Oracle Database configuration

1. Remove comment from panel id **"UserInputPanel.oracleDatabaseType"**.
2. Find and replace **@ORACLE\_DB\_TYPE@** from the same panel with CDB or Non CDB depending upon your oracle database type. For reference follow section[Installation with Oracle](/getting-started/installation#installation-with-oracle).
3. Find and replace **@ORACLE\_CONNECTION\_TYPE@** from the same panel with Service or SID depending upon your oracle configuration. For reference follow section [Installation with Oracle](/getting-started/installation#installation-with-oracle).
4. Now, remove comment from panel id "UserInputPanel.oracledb".
5. Find and replace **@ORC\_INSTANCE@** with oracle database instance name from the same panel.
6. Go to [Common Database configuration parameters](#common-database-configuration-parameters) and follow the steps.

### HSQL Database configuration

For HSQL you can move to next step for further configuration.

### PostgreSQL Database configuration

1. Find panel with id **"UserInputPanel.postgresqldb"**.
2. Remove comment from parameters.
3. Go to [Common Database configuration parameters](#common-database-configuration-parameters) and follow the steps.

## 7 - Enable Advance Configuration

If you are doing advance configuration then only follow the below step.

* Make sure you have **@ADVANCE\_CONFIG\_FLAG@** flag is 1 as specified [here](#id-5-configure-base-parameter).

### Enabling advance configuration with HSQL, then follow below steps

1. Remove comment from panel id "UserInputPanel.advancedOptionsHSQL" and add comment in panel id **"UserInputPanel.advancedOptions"**.
2. Find **@ADV\_HTTP\_CONFIG@** and replace it with "HTTP" if you want to configure <code class="expression">space.vars.OIM</code> with HTTP or replace it with "HTTPS" if you want to configure <code class="expression">space.vars.OIM</code> with https.
   * Make sure you are following step no 8 if you configure <code class="expression">space.vars.OIM</code> with https.
3. Find **@ADV\_ISSERVICE@** and replace with 1 if you want to configure <code class="expression">space.vars.OIM</code> as a service else replace it with 0.
4. Find **@ADV\_SEC\_CONFIG@** and replace with 1 if you want to configure advance Security configuration else replace it with 0.

### Enabling advance configuration other than HSQL, then follow below steps

1. Remove comment from id "UserInputPanel.advancedOptions".
2. Find **@ADV\_HTTP\_CONFIG@** and replace it with "HTTP" if you want to configure <code class="expression">space.vars.OIM</code> with HTTP or replace it with "HTTPS" if you want to configure <code class="expression">space.vars.OIM</code> with https.
   * Make sure you are following step no 8 if you configure <code class="expression">space.vars.OIM</code> with https.
3. Find **@ADV\_ISDBFLAG@** and replace with 1 if you will create <code class="expression">space.vars.OIM</code> database manually else set it as 0.
4. Find **@ADV\_OPSHUBDBMAME@** and replace it with your <code class="expression">space.vars.OIM</code> database name else remove that entry from the panel.
5. Find **@ADV\_REPORT\_DBNAME@** and replace it with your <code class="expression">space.vars.OIM</code> report database name else remove that entry from the panel.
6. Find **@ADV\_ISSERVICE@** and replace with 1 if you want to configure <code class="expression">space.vars.OIM</code> as a service else replace it with 0.
7. Find **@ADV\_SEC\_CONFIG@** and replace with 1 if you want to configure advance Security configuration else replace it with 0.

## 8 - HTTPS configuration

1. Make sure you have configure **@ADV\_HTTP\_CONFIG@** with "HTTPS" value.
2. Find panel with id "UserInputPanel.certInfo" remove comment from parameters.
3. Find **@CERT\_SERVER\_HOST@** and replace it with IP Address/hostname of Machine on which you install <code class="expression">space.vars.OIM</code>.
4. Find **@CERT\_COMP\_UNIT@** and replace it with your Organization's Unit like Manufacturing, Sales etc.
5. Find **@CERT\_COMP\_NAME@** and replace it with your Organization Name.
6. Find **@CERT\_COMP\_CITY@** and replace it with your Organization's City.
7. Find **@CERT\_COMP\_STATE@** and replace it with your Organization's State or Province.
8. Find **@CERT\_COMP\_COUNTRY@** and replace it with your Organization's Country.
9. Find **@CERT\_VALIDITY@** and replace it with number of days for which the certificate should be considered valid.

## 9 - Advance Security Configuration

1. Make sure you have configure ADV\_SEC\_CONFIG with "1" value in step 5.
2. Find panel with id "UserInputPanel.securityConfig" remove comment from parameters.
3. Find **@SEC\_KEYMODE@** replace with "newSecretKey".
4. Find **@SEC\_KEY\_PATH@** and replace with your secret key installation path.
5. Find **@SEC\_ALGO@** and replace with either "AES-256" or "DES-56 or "DESede-168" as per your need.
6. Note do not copy your secret file once its generated after <code class="expression">space.vars.OIM</code> installation process.


# SSL Certificate Configuration

<code class="expression">space.vars.OIM</code> will automatically import the certificate if you create or edit a system.\
If the certificate does not import automatically during project or entity selection, you may see error messages like:

* `Peer is not authenticated`
* `Peer's identity has not been verified`
* `Handshake failure` or `Handshake exception`

If the certificate is not imported, follow the steps below.

***

## Download HTTPS Certificate

To access systems deployed on HTTPS from <code class="expression">space.vars.OIM</code>, download the HTTPS certificate on the machine where OIM is deployed.

## Mozilla Firefox

<div align="center"><img src="/files/wAvALdLel0EQd2yVis5b" alt="" width="550"></div>

1. Open the system URL in Firefox using HTTPS protocol.
2. Click the lock icon on the upper-left side of the address bar.
3. Click **"More Information"** in the pop-up.
4. In the new window, click **"View Certificate"**.
5. Go to the **"Details"** tab.
6. Click the **"Export"** button.
7. Save the certificate on your local drive.

**Note**: If a certificate hierarchy is present, all certificates must be exported.

***

## Internet Explorer

<div align="center"><img src="/files/4umV9EGIyvlNqrApQhgh" alt="" width="550"></div>

1. Open the system URL in Internet Explorer using HTTPS.
2. Click the lock icon on the right side of the address bar.
3. A pop-up will show **"Website Identification"**.
4. Click **"View Certificates"**.
5. Go to the **"Details"** tab and click **"Copy to File"**.
6. A wizard for copying certificates will appear.
7. Select the **DER encoded binary** option and click **Next**.
8. Click **Browse**, provide a filename, and save it to a local drive.

**Note**: Export all certificates in the chain if a hierarchy is present.

***

## Google Chrome

<div align="center"><img src="/files/Asq3vb5ngiIMRUOaYawU" alt="" width="550"></div>

1. Open the system URL in Chrome using HTTPS protocol.
2. Click the lock icon on the upper-left of the address bar.
3. A pop-up will state **"Identity Verified"**.
4. Go to the **"Connection"** tab and click **"Certificate Information"**.
5. In the **"Details"** tab, click **"Copy to File"**.
6. A certificate export wizard will appear.
7. Select the **DER encoded binary** option and click **Next**.
8. Click **Browse**, set a filename, and save to a local drive.

**Note**: Export all certificates in the hierarchy if present.

***

## Import SSL Certificate through Console

Follow the steps below to import the downloaded certificate into <code class="expression">space.vars.OIM</code>:

1. Open **Command Prompt** with Administrator privileges (right-click `cmd.exe` → **Run as Administrator**).
2. Navigate to the folder:\
   `<<OpsHub_Installation_Directory>>\AppData\OpsHubData`
3. Run the following command:

   ```sh
   keytool -importcert -alias <<certificate alias>> -keystore <<path>> -file "Certificate_Location\Certificate filename.extension"
   ```

   **Example**:

   ```sh
   keytool -importcert -alias httpscertifcate -keystore "C:\Program Files\OpsHub\AppData\OpsHubData\cacerts" -file "C:\Users\Administrator\Desktop\certificate.crt"
   ```
4. When prompted, enter the keystore password.\
   **Note**: The default keystore password is `changeit`.
5. Type `yes` when asked: **Trust this certificate?**
6. Restart the OpsHub Server.

***

**Important Notes**:

* If any hierarchy is present in the certificate, all certificates must be imported.
* If multiple end system certificates are configured in <code class="expression">space.vars.OIM</code> and these certificates have different private key passwords, use the [**Certificate Password Encryptor Utility**](/manage/advanced-utilities/certificate-private-key-password-encryptor-utility) to encrypt and store the passwords.
  * This utility creates a `cacert_config.properties` file containing all alias names and their encrypted passwords.
  * You can use this file to load the certificates from the keystore in <code class="expression">space.vars.OIM</code>.


# How to Import a Certificate

## Import the Certificate Generated by Certification Authority (CA)

There are different ways to generate a Certificate Signing Request (CSR), depending on whether user securing a single domain or multiple domains.\
Here's an overview of the two types and how you can generate them:

### **Multi-Domain CSR (SAN - Subject Alternative Name)**

* To secure multiple domains with a single SSL/TLS certificate, user will need to use SAN (Subject Alternative Name) in certificate configuration. SAN allows to include multiple domains in one certificate, which is ideal for scenarios where user needs to configure HTTPS for various subdomains or entirely different domain names. Refer to [Configuration Using SAN and DNS](#configuration-using-san-and-dns) section to know how to configure multiple domains for HTTPS.

### **Single Domain CSR**

* A Single Domain CSR is used when you want to secure just one domain with an SSL/TLS certificate. It contains only one Common Name (CN), which corresponds to the domain you want to secure. Refer to [Steps to Generate Key and CSR](#steps-to-generate-key-and-csr) section to generate the CSR file.

After generating the CSR, you need to provide the resulting file to your Certificate Authority (CA) to obtain the corresponding certificate file (.cer).

> **Note:** If you're setting up a <code class="expression">space.vars.OIM</code> and configuring the [connection with endpoints over mutual TLS (mTLS)](#configuration-for-the-connection-with-endpoints-over-mtls), the CA that issues your certificate must be trusted by the endpoint. Alternatively, it should be the same CA that signed the endpoint's certificate.

Once the certificate file (e.g., opshub.cer) is generated by your CA, follow the import steps provided below.

> **Note:** If your CA delivers the certificate in .PEM format instead, refer to the [PEM Configuration](#pem-configuration) section for instructions.

### Steps to Import Certificate File

#### **Dynamic parameters to update in the commands:**

* When executing the following commands, you need to replace the dynamic parameters with values specific to your setup:
  * `<OpsHub Installation Path>`:
    * Replace this with the actual path where your OpsHub is installed. For example: `C:\Program Files\OpsHub`
  * `<myalias>`:
    * Replace this with the alias you want to assign to the certificate. This alias helps you reference the certificate in the keystore. For example, use something like: opshub-cert, root
  * `<your-keystore-password>`:
    * The default password for the keystore is changeit. If you've changed the keystore password, use the updated password. For example, if you updated the password to newpassword, replace it like this: `-storepass newpassword`

#### **Follow these commands based on the certificate provided by your CA:**

**Command to import .csr file:**

* If your certificates are in Root certificates or Chain certificates, first import root certificate and then the actual certificate. Otherwise import your certificate file only.

**Importing root certificate:**

```sh
keytool -importcert -alias <root> -keystore <OpsHub Installation path>\AppData\OpsHubData\cacerts -trustcacerts -file <Path of your Root CER file>
```

**Importing normal certificate:**

```sh
keytool -importcert -alias <opshub.com> -keystore <OpsHub Installation Path>\AppData\OpsHubData\cacerts -file <Path of your CER file>
```

**Command to import .pem file:**

* Importing .pem file with only a certificate:
* If your `.pem` file contains only the certificate (not the full chain), you can import it directly into the keystore

```sh
keytool -importcert -file <certificate.pem> -keystore "<OpsHub Installation Directory>/AppData/OpsHubData/cacerts" -alias <myalias>
```

* Import the PKCS#12 file into a Java keystore:
* Once you have the '.p12' file, you can import it into a Java keystore using the 'keytool' command

```sh
keytool -importkeystore -destkeystore "<OpsHub Installation Path>/AppData/OpsHubData/cacerts" -srckeystore <keystore.p12> -srcstoretype PKCS12 -alias <myalias>
```

> **Note:** Replace `keystore.p12` with the path to your PKCS#12 file.

* Import the Chain certificate using keytool:
* Use the following keytool command to import the chain certificate into the Java keystore:

```sh
keytool -importcert -trustcacerts -alias <myalias> -file <chain.pem> -keystore "<OpsHub Installation Path>/AppData/OpsHubData/cacerts" -storepass <your-keystore-password>
```

> **Note:** Here, replace chain.pem with the name of the .pem file given by the CA. If you’ve changed it, use the updated password.

**Command to import SAN Certificate:**

```sh
keytool -importcert -alias <myalias> -keystore <your-keystore-location> -file <path-to-certificate-file> -storepass <your-keystore-password>
```

#### **After successfully importing the certificate into the keystore, update the server.xml file to use the correct key alias.**

* The server.xml file is located at `<OpsHub Installation Path>\OpsHub Server\conf`
* Change the keyAlias to match the alias you used during the import process.

#### **Restart the Server:**

* After making the changes, restart the server to apply the new configuration.

> **Note:** To change and encrypt the keystore and private key passwords, refer to the section [Change Keystore and Private Key passwords](/manage/advanced-utilities/change-keystore-and-private-key-passwords) for instructions on how to encrypt and update the passwords in server.xml.

## Appendix

### Renew the Certificate

If certificates in the keystore have expired, you need to reimport them in the keystore. Refer to import commands in [Import the Certificate Generated by Certificate Authority](#import-the-certificate-generated-by-certification-authority-ca) section.

### Steps to Generate Key and CSR

Following are steps to import the <code class="expression">space.vars.OIM</code> SSL certificate which is generated by third party Certificate authority (CA).

> **Note**\
> Following steps can be performed once <code class="expression">space.vars.OIM</code> installation is completed successfully with the self-signed SSL configuration.

* Stop the running OpsHub Server/OpsHub Server Service.
* Take the backup of OpsHubData folder in /AppData/OpsHubData.
* Open the command prompt with the administrative privileges & within command prompt, go to the /AppData/OpsHubData directory.

Following are set of commands that should be performed in the given sequence within command prompt.\
Commands will respectively create a CSR & Cers certificate (generated by your CA) & import the certificate on the machine where <code class="expression">space.vars.OIM</code> is installed.

```sh
keytool -genkeypair -keyalg RSA -alias opshub.com -keysize 2048 -keystore <OpsHub Installation Directory>\AppData\OpsHubData\cacerts
```

Upon successful execution of above command, it will prompt you to enter the password for AppData/OpsHubData/cacerts, i.e., keystore password. Enter the password for the same. The default password for the keystore is 'changeit'.

> **Note**\
> After entering the password, you will be prompted to fill information about certificate details, out of which for the first name and last name value it is mandatory to provide the host name of the machine where your <code class="expression">space.vars.OIM</code> is installed otherwise you will not able to see the signed certificate even after the succefully import of certificate.

```sh
keytool -certreq -keyalg RSA -alias tomcat -file <path of new CSR file> -keystore <OpsHub Installation Path\AppData\OpsHubData\cacerts>
```

Example of the above command:

```sh
keytool -certreq -keyalg RSA -alias opshub.com -file <Installation Dir>\OpsHub_Resources\jre\lib\security\opshub.csr -keystore <OpsHub Installation Dir>\AppData\OpsHubData\cacerts
```

### PEM Configuration

A .pem file is a Base64-encoded format used for cryptographic keys and certificates. It contains private keys, public keys, SSL/TLS certificates, and certificate chains. PEM files are human-readable and are enclosed with markers like "-----BEGIN ...-----" and "-----END ...-----."

* Open the .pem file in any text editor to determine the next steps.\
  **Option 1: When you have a private key and certificate:**

  * If the file contains a private key (denoted by -----BEGIN RSA PRIVATE KEY-----) and a certificate (denoted by -----BEGIN CERTIFICATE-----), refer to the section on [Generate .p12 File](#generate-p12-file) for further steps.

  **Option 2: If you only have a `chain of certificates` (and no private key):**

  * In this case, the .pem file will typically contain a series of certificates in the chain, including the server certificate and intermediate certificates, but no private key. Simply follow the import instructions for handling [Importing Certificates](#steps-to-import-certificate-file) in the next steps.

#### Generate .p12 File

The prerequisite is you should have OpenSSL installed on your device.

* If the .pem file provided by your Certificate Authority (CA) contains both a private key and a corresponding certificate in a single file, follow these steps to extract private key and certificate.

  **Extract the private key from the .pem file:**\
  To extract the private key from the .pem file, use the following OpenSSL command:

  ```sh
  openssl rsa -in full.pem -out private-key.pem
  ```

  **Extract the certificate from the .pem file:**\
  To extract the certificate from the .pem file, use this command:

  ```sh
  openssl x509 -in full.pem -out certificate.pem
  ```
* Combine your private key and certificate into a single PKCS#12 (.p12) file, you can use the OpenSSL command. This file format is commonly used for storing both the private key and the certificate together in one file.

  **Steps to combine private key and certificate:**

  1. Ensure you have two separate files:
     * `privatekey.pem` (Your private key file)
     * `certificate.pem` (Your certificate file)
  2. Use the following OpenSSL command to create the .p12 file:

     > **Note**\
     > Replace 'certificate.pem' with your certificate file and 'privatekey.pem' with your private key file.

     ```sh
     openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out keystore.p12
     ```
* The output file `keystore.p12` is the combined PKCS#12 file. Use this file to [import certificate](#steps-to-import-certificate-file) using commands for .pem file.

### Configuration Using SAN and DNS

**Generating a Key Pair**\
To generate a key pair with RSA algorithm and a keystore:

```sh
keytool -genkeypair -alias <your-alias> -keyalg RSA -keysize 2048 -dname "CN=<your-domain>, OU=<your-department>, O=<your-organization>, L=<your-city>, ST=<your-state>, C=<your-country>, emailAddress=<your-email>" -ext "SAN=dns:<your-domain>" -keypass <your-key-password> -keystore <your-keystore-location> -storepass <your-keystore-password>
```

**Parameters:**

* `-alias <your-alias>`: The alias for the key pair in the keystore. Choose a descriptive alias to identify the key pair.
* `-keyalg RSA`: Specifies the key algorithm to use. RSA is commonly used for SSL keys.
* `-keysize 2048`: Defines the key size. A key size of 2048 bits is a typical and secure size.
* `-dname`: The Distinguished Name (DN) fields describe the identity associated with the certificate.
  * `CN`: Common Name (Domain name).
  * `OU`: Organizational Unit (E.g., department name).
  * `O`: Organization (Your company or organization).
  * `L`: Locality (City).
  * `ST`: State.
  * `C`: Country (Use the two-letter country code).
  * `emailAddress`: Your email address.
* `-ext "SAN=dns:<your-domain>"`: Adds the Subject Alternative Name (SAN) extension to include additional domain names or IP addresses in the certificate.
* `-keypass <your-key-password>`: Password for the private key (used to encrypt the key).
* `-keystore <your-keystore-location>`: Path to the keystore file where the private key and certificate will be stored.
* `-storepass <your-keystore-password>`: Password for the keystore.

**Generating a Certificate Signing Request (CSR)**\
To generate a CSR after creating the key pair:

```sh
keytool -certreq -keyalg RSA -alias <your-alias> -file <path-to-output-csr-file> -keystore <your-keystore-location> -ext "SAN=dns:<your-domain>"
```

**Parameters:**

* `-certreq`: Specifies that a Certificate Signing Request (CSR) will be generated. This command is used to generate the CSR after the keystore and key pair have been created.
* `-keyalg RSA`: Defines the key algorithm to use. In this case, it is RSA, which is commonly used for SSL/TLS certificates.
* `-alias <your-alias>`: The alias for the key pair in the keystore. The alias is used to identify the key pair in the keystore. Replace `<your-alias>` with the alias that was used when generating the key pair.
* `-file <path-to-output-csr-file>`: The path and file name where the output CSR will be saved. The CSR file will be submitted to a Certificate Authority (CA) to obtain the SSL certificate.
* `-keystore <your-keystore-location>`: The location of the keystore that contains the private key for which the CSR is being generated.
* `-ext "SAN=dns:<your-domain>"`: Specifies the Subject Alternative Name (SAN) extension for the certificate. SAN is used to add additional domain names (e.g., `www.example.com`) or IP addresses that will be included in the SSL certificate.

For steps to importing the certificate, refer to [Importing Certificates](#steps-to-import-certificate-file) section.

### Configuration for the connection with endpoints over mTLS

* mTLS is a method of mutual authentication, ensuring that the parties at each end of a network connection are authenticated by digital certificates.
* To authenticate itself, <code class="expression">space.vars.OIM</code> will send the certificate signed by the Certificate authorities(CA). This CA would either be trusted by the endpoint or have signed the endpoint certificate configured over mTLS.
  * Hence, this certificate shall be stored in the truststore of <code class="expression">space.vars.OIM</code> located at `<OpsHub Installation Directory>\AppData\OpsHubData\cacerts`.


# Docker Deployment

## Prerequisites

* Refer to [Installation Prerequisites](/getting-started/prerequisites#installation-prerequisites) page for Docker-based deployment.
* Docker daemon should be up and running (by default, daemon comes up with Docker Desktop app). Refer [here](https://docs.docker.com/engine/install/) for the installation steps.
  * To validate the daemon running process, you can create dummy volume with the command [Docker Volume Creation](/getting-started/installation/docker#docker-volume-creation-optional).
* Docker Compose should be installed (by default, Docker Compose comes up with Docker Desktop app). Refer [here](https://docs.docker.com/compose/install/) for the installation steps.
* Docker should be able to run Linux-based container in Windows. For more details around the configuration in the Windows, refer to [this](https://docs.docker.com/desktop/install/windows-install/) page.

## Steps to Run <code class="expression">space.vars.OIM</code>

### Docker Volume Creation (Optional)

* It is optional to create docker volume. By default, docker volume will be created by `<Installer_Folder_Name>_opshubData` name.
* If user wants to create docker volume with customized name, it can be created using the following command:

  ```
  docker volume create <Volume_Name>
  ```

### Input Variables

The variable values need to be added in `Input.json` to configure OIM as Docker.

**Common input variables for all supported databases \[MYSQL, Oracle, MSSQL, PostgreSQL]:**

| Variable Name              | Description                                                                                                                                                                                    | Possible Value                                                                                                    |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `OIM_DB_TYPE`              | Used for configuring OIM with given database type.                                                                                                                                             | Provide 'MySQL' or 'MS SQL Server' or 'ORACLE' or 'PostgreSQL' based on database type.                            |
| `OIM_DB_CNNECTOR_JAR_PATH` | Path of connector jar present on the host instance. As per database type and version, connector jar needs to be downloaded. Refer here to get the download link of the database connector jar. |                                                                                                                   |
| `OIM_ADV_CONFIG_FLAG`      | Used for performing the advance configuration in OIM.                                                                                                                                          | Provide either '0' if you don't want to configure advance configuration or '1' to configure advance configuration |
| `OIM_ADV_ISDBFLAG`         | Flag for advance database configuration. Default value: 0                                                                                                                                      | 0(false) or 1(true)                                                                                               |
| `OIM_ADV_SEC_CONFIG`       | Flag for advance Security configuration. Default value: 0                                                                                                                                      | 0(false) or 1(true)                                                                                               |
| `OIM_ADV_HTTP_CONFIG`      | Provide 'HTTP' or 'HTTPS' as per configuration requirement. Default value: HTTP                                                                                                                | 'HTTP' or 'HTTPS'                                                                                                 |
| `OIM_ADV_OPSHUBDBMAME`     | Opshub db name for advance database configuration. This is mandatory when OIM\_ADV\_ISDBFLAG is 1.                                                                                             |                                                                                                                   |
| `OIM_ADV_REPORT_DBNAME`    | Reports db name for advance database configuration. This is mandatory when OIM\_ADV\_ISDBFLAG is 1.                                                                                            |                                                                                                                   |

**When `OIM_DB_TYPE` is MYSQL, following are mandatory options:**

| Variable Name     | Description                                                   |
| ----------------- | ------------------------------------------------------------- |
| `OIM_DB_USER`     | Valid username for database connection.                       |
| `OIM_DB_PASSWORD` | Valid password of the given username for database connection. |
| `OIM_DB_HOST`     | Hostname for database connection.                             |
| `OIM_DB_PORT`     | Port number for database connection.                          |

* Sample `Input.json` for MySQL database is mentioned [here](#).

**When `OIM_DB_TYPE` is MS SQL Server, following are mandatory options:**

| Variable Name                 | Description                                                                    |
| ----------------------------- | ------------------------------------------------------------------------------ |
| `OIM_DB_USER`                 | Valid username for database connection.                                        |
| `OIM_DB_PASSWORD`             | Valid password of the given username for database connection.                  |
| `OIM_DB_HOST`                 | Hostname for database connection.                                              |
| `OIM_DB_PORT`                 | Port number for database connection.                                           |
| `OIM_DB_NAME_TO_TEST_CONNECT` | Provide the database name for testing the connection with the database server. |

**When `OIM_DB_TYPE` is ORACLE, following are mandatory options:**

| Variable Name                | Description                                                             |
| ---------------------------- | ----------------------------------------------------------------------- |
| `OIM_DB_USER`                | Valid username for database connection.                                 |
| `OIM_DB_PASSWORD`            | Valid password of the given username for database connection.           |
| `OIM_DB_HOST`                | Hostname for database connection.                                       |
| `OIM_DB_PORT`                | Port number for database connection.                                    |
| `OIM_ORACLE_DB_TYPE`         | Provide 'CDB' or 'Non CDB' as per the configuration of oracle database. |
| `OIM_ORACLE_CONNECTION_TYPE` | Provide 'Service' or 'SID' as per the configuration of oracle database. |
| `OIM_ORC_INSTANCE`           | Provide oracle database instance name.                                  |

**Following points must be considered while adding inputs:**

* If the database is hosted on the same machine where docker is installed, then the `OIM_DB_HOST` must be `host.docker.internal`. It allows us to communicate with the localhost.
* If `OIM_ADV_CONFIG_FLAG` set to 1, the other inputs like `OIM_ADV_ISDBFLAG`, `OIM_ADV_SEC_CONFIG`, `OIM_ADV_HTTP_CONFIG` should be assigned with valid values.
* If `OIM_ADV_ISDBFLAG` flag is set to 1, it indicates the Database Names given in the ADV\_ISDBFLAG section should be created before the actual run.
* If `OIM_ADV_SEC_CONFIG` is set to 1, the inputs in the SECURITY\_CONFIG section should be added with valid values.
* If `OIM_ADV_HTTP_CONFIG` is set to `HTTPS`, the inputs in the ADV\_HTTP\_CONFIG section should be added with valid values.

***

### YAML Inputs

* `docker-compose-OIM.yml` file is used to get required inputs and starts the docker container using docker-compose.
* The path of updated `Input.json` file in [Input Variables](#input-variables) needs to be mentioned before the colon(:) in `volumes` section of `oim` service in the `services` section. Keep this as it is if YAML file and `Input.json` are in same directory:

  ```
  - "./Input.json:/home/OpsHub_OIM/Input.json"
  ```
* User needs to provide the local path of database connector jar in place of `@PATH_TO_LOCAL_CONNECTOR_JAR_FILE@` and replace `@CONNECTOR_JAR_IN_DOCKER@` by name of the jar file according to database type. Options for jar file names are given in YAML file.

  ```
  - "@PATH_TO_LOCAL_CONNECTOR_JAR_FILE@:/home/OpsHub_OIM/@CONNECTOR_JAR_IN_DOCKER@"
  ```
* An example of MySQL database connector jar:

  ```
  - "C:/download/mysql_Connector_5_0_8.jar:/home/OpsHub_OIM/mysql_connector.jar"
  ```
* If docker volume is created in [Docker Volume Creation](#docker-volume-creation-optional) section:
  * User needs to update the volume name by docker volume (already created) and set the external flag to `true` in volumes section of YAML file:

    ```yaml
    - <Volume_Name>:/home/OpsHub_OIM/OIM

    volumes:
      <Volume_Name>:
        external: true
    ```

### Run Docker Container

* An image name is required to run docker container. Docker images need to be downloaded from the shared installer link.
* Pull/Load the image into local docker environment:

  ```bash
  docker load --input <Image_tar_filename>
  ```
* After updating Input.json and docker-compose-OIM.yml, run following command to start (up) the container:

  ```bash
  docker-compose -f docker-compose-OIM.yml up
  ```
* `-d` can also be added as an option to start docker container in detached mode.

## Known Limitations

* Docker-based deployment for <code class="expression">visitor.claims.unsigned.product</code> is not supported with HSQL database.
* End systems where other services or external tools dependency would be needed, then those services need to be deployed separately on another machine, as it can not be deployed in the Docker container. E.g., TFS Service.
* Docker-based deployment should not be used, if IBM Rational DOORS is one of the end points in the sync.
  * **Reason:** DOORS requires a Windows host.

## Upgrade Application Version

* Pull the image into local docker environment:

  ```bash
  docker load --input <Image_tar_filename>
  ```
* Stop the existing container, if running:\
  `docker stop CONTAINER <CONTAINER_NAME>`
* Remove the container using the following command:\
  `docker rm -f CONTAINER <CONTAINER_NAME>`
* Take the backup of the database. For more details, refer to [DataBase Backup](/manage/upgrade-index/taking-application-backup#database-backup) section.
* Take the backup of the docker volume:\
  `docker volume create <BackUp_VolumeName>`\
  `docker run --rm -t -v <Base_VolumeName>:/from -v <BackUp_VolumeName>:/to alpine ash -c "cd /from ; cp -av . /to"`
* Ensure that the backup has been taken correctly.
* Ensure that the OIM\_DB\_TYPE in Input.json is empty.
* Comment out the line mounting the database connector jar by adding `#` symbol before the line in `docker-compose-OIM.yml` file:\
  `# - "@PATH_TO_LOCAL_CONNECTOR_JAR_FILE@:/home/OpsHub_OIM/@CONNECTOR_JAR_IN_DOCKER@"`
* Update volume name in `docker-compose-OIM.yml` file by `<Base_VolumeName>` and change the value of the external flag to **true**:

  ```
  - <Base_VolumeName>:/home/OpsHub_OIM/OIM

  volumes:
    <Base_VolumeName>:
      external: true
  ```
* To upgrade the application version, run the following command:

  ```bash
  docker-compose -f docker-compose-OIM.yml up
  ```


# Logging In

Let's see how you can get started with <code class="expression">space.vars.OIM</code>.

## Windows

* On Logging in page: Once the installation is complete, <code class="expression">space.vars.OIM</code> will be started automatically if you are doing installation on windows machine and you will be re-directed to the Getting started page in the default web browser. If the <code class="expression">space.vars.OIM</code> is not started, you can start it manually as described [here](/getting-started/start-or-stop-service).
* For launching the application, click on the link **Launch** <code class="expression">space.vars.OIM</code>. It will redirect to the login page.
* Log in with the following credentials:
  * username: admin
  * password: password

<div align="center"><img src="/files/qaEjcpK2GOcmyjYaBmfI" alt="" width="680"></div>

## Linux

* For Linux, once the installation is done, enter the URL as <http://localhost:8989/OIM/> in browser.
* Log in as username **admin** and password **password**.
* If you have configured <code class="expression">space.vars.OIM</code> for HTTPS, then enter the URL as <https://localhost:8443/OIM/> in browser.

## Set a New Password on First Login

* When a newly created user logs in for the first time, or when the default **admin** user logs in after installation, you will be prompted to update your password and will be automatically redirected to the password update screen.
* Please update your password in accordance with the defined password policy. For more details about password policy, refer to [Default Password Policy](/manage/administrator/login-server-management#password-policy-configuration).
* This step is enforced to enhance the security of <code class="expression">space.vars.OIM</code> user accounts, as default passwords may be vulnerable to unauthorized access. Setting a strong, unique password ensures that only the intended user can access the account.

<div align="center"><img src="/files/p7UiikfkAJk4RZwB3TQc" alt="" width="680"></div>

* Once the password is successfully updated, you will be redirected back to the Login page, where you can log in using your updated credentials.

## Forgot Password

If you have forgotten your password, <code class="expression">space.vars.OIM</code> provides a secure way to reset it.

* On the Login page, click the **Forgot Password** link in the login form, as shown below.

<div align="center"><img src="/files/qaEjcpK2GOcmyjYaBmfI" alt="" width="680"></div>

* You will be redirected to the Forgot Password page. Enter your **username** associated with your account and click on **Reset Password** to proceed.

<div align="center"><img src="/files/Dd9KjUZumYijMnfXtQc2" alt="" width="680"></div>

Upon clicking **Reset Password**, a reset link will be sent to the registered email address associated with the provided username.

* If OpsHub system is configured with SMTP system, the email is sent using the **Sender Email-id** configured in the SMTP system. For more details about SMTP system, refer to [SMTP Configuration](/help-center-index/troubleshooting-index/configure-post-failure-notification#smtp-configuration).
* If OpsHub system is not configured with SMTP system or the configuration is invalid, the email is sent using the default <code class="expression">space.vars.OIM</code> user.

<div align="center"><img src="/files/kiN7dF94R4DMA53m6h1N" alt="" width="680"></div>

* Open your registered email inbox, locate the password reset email, and click on the **Reset Password** link provided. This will redirect you to the Reset Password page.

<div align="center"><img src="/files/MS2ZhOxsdolkA6wUuGgj" alt="" width="680"></div>

* Enter a new password, confirm it and click on **Change Password** to save your new password. Ensure that it adheres to the default password policy configured in the system. To know more, refer to [Default Password Policy](/manage/administrator/login-server-management#password-policy-configuration).
* Once the password is successfully reset, you will be redirected back to the Login page, where you can log in using your updated credentials.

<div align="center"><img src="/files/0UrdBsKz75cpGHQ8alPC" alt="" width="680"></div>

Once you have logged in the application, you are ready to start integration configuration. Click [Overview of Integration](/integrate/overview-of-integration) to understand how to start using <code class="expression">space.vars.OIM</code> for integration.


# Start/Stop OpsHub Integration Manager

Let's see how to start and stop the service.

## Windows

If you are using a Windows machine, there are two ways to start and stop the service:

**Using Windows Services**

* Open Windows Services with Administrator rights (By typing Services in Start-up menu or services.msc in Windows->Run option)
* Find OpsHub Server Service in the list of services
* Start/Stop service either by right clicking on service or option available in left panel

**Using Windows Command Prompt**

* Open Windows command prompt with administrator rights
* Type in following commands to start/stop OpsHub service:
  * To start service: `net start "OpsHub Server Service"`
  * To stop service: `net stop "OpsHub Server Service"`

If you don't have requisite permission for accessing OpsHub Server Services in Windows, you will get an error while trying to execute OpsHub from the above commands from command prompt. Command prompt will show the error: **Access is denied**.

This section is useful in case user is not able to access the service as user doesn't have enough permisisons.

To provide the rights to a particular user, admin just needs to follow the steps given below.

> **Note**: **To open Group Policy Management, Press Windows Logo Key + R to open RUN dialog box. Type gpmc.msc and click Ok.**

* Step 1: Edit default policy used by organization

<div align="center"><img src="/files/HQtiWXePhXHHaPk4QfYF" alt="" width="800"></div>

* Step 2: Open OpsHub Server Service properties window

<div align="center"><img src="/files/j4sZ849jLNOcPL1dnbvG" alt="" width="800"></div>

* Step 3: Define the policy setting for OpsHub Server Service

<div align="center"><img src="/files/orUjPyaIlFcW338W5kug" alt="" width="800"></div>

* Step 4: Add User or Group so that they can access OpsHub Server Service

<div align="center"><img src="/files/3xwcZYi5GjUNFlEJprak" alt="" width="800"></div>

* Step 5: Allow required permission to User or Group

<div align="center"><img src="/files/FZEH9MemwD1rRLKB2Gzs" alt="" width="670"></div>

## Linux

If the application is installed on a Linux machine, here is the way to start and stop OpsHub service.

**Linux Terminal**

* Open Linux Terminal with su/sudo user
* Type in following commands to start/stop OpsHub service.
* Linux:
  * To start service: `systemctl start opshubserviced.service`
  * To stop service: `systemctl stop opshubserviced.service`

If you don't have requisite permission for accessing OpsHub Server Services in Linux, you will get an error while trying to execute OpsHub from the above commands from Terminal. Terminal will show the error: **Permission denied.**

Note: **To access OpsHub Server Services navigate to \etc\systemd\system**

This section is useful in case user is not able to access the service as users does not have enough permissions.\
To give permission to users follow the steps given below:

Step 1: Access properties of OpsHub service

<div align="center"><img src="/files/vISr7CHtUVN0yPljH16U" alt="" width="900"></div>

Step 2: Assign appropriate access to group

<div align="center"><img src="/files/0pruXxqhwpG4D7iONcXA" alt="" width="670"></div>

Required commands:

* Identify user's group: `groups <<username>>`
* Add a user in group: `usermod -a -G <<Group Name>> <<User Name>>`


# Integrate

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>⚙️ Prerequisites</strong></td><td><a href="/pages/hDiFE7eseqqkfOW1six2">/pages/hDiFE7eseqqkfOW1six2</a></td></tr><tr><td align="center"><strong>🔍 Overview</strong></td><td><a href="/pages/DhTFBGtrEpYEn0niC0fC">/pages/DhTFBGtrEpYEn0niC0fC</a></td></tr><tr><td align="center"><strong>🔧 Integration Setup</strong></td><td><a href="/pages/CwR4Kl5AxZnXUdrjz36B">/pages/CwR4Kl5AxZnXUdrjz36B</a></td></tr><tr><td align="center"><strong>🧩 Advanced Synchronization Scenarios</strong></td><td><a href="/pages/SlwfrbEHKfvosn3ijj3B">/pages/SlwfrbEHKfvosn3ijj3B</a></td></tr><tr><td align="center"><strong>🧭 Integration Reconciliation</strong></td><td><a href="/pages/dBT9NkkaVu8PMT2r9sUl">/pages/dBT9NkkaVu8PMT2r9sUl</a></td></tr><tr><td align="center"><strong>📊 Monitoring and Organization</strong></td><td><a href="/pages/CpGhtafPqNc6cJfYlKdD">/pages/CpGhtafPqNc6cJfYlKdD</a></td></tr><tr><td align="center"><strong>💡 Best Practices</strong></td><td><a href="/pages/ZPq457mjId1WYGL3bVhC">/pages/ZPq457mjId1WYGL3bVhC</a></td></tr><tr><td align="center"><strong>🚫 Known Behaviours and Limitations</strong></td><td><a href="/pages/bZoVNmzA4mZ2mjx7MtSa">/pages/bZoVNmzA4mZ2mjx7MtSa</a></td></tr></tbody></table>


# Prerequisites

Each system has a set of pre-requisites that should be fulfilled before an integration is configured using that system. Please check out the prerequisites for the systems you want to integrate [**here**](/connectors).

Here is a video on how to navigate through the prerequisites section of the end systems that you want to integrate:

{% embed url="<https://youtu.be/4Yk94De8A-0>" %}

In case you are already aware of the pre-requisites for systems that you plan to configure, refer to the [**How to Configure an Integration**](/integrate/configure-integrations) page.


# Overview

* Each system has its own set of prerequisites for successful configuration. Please refer to the system-specific pre-requisite section in the [Connectors](/connectors) section before you proceed.
* Create one user dedicated to integration. User should not be used to do any operations from the system's user interface.

***

## Integration Overview

Integration is the process of connecting two or more systems in order to enable a seamless exchange of information between the system users.

To configure an integration, you should go to the integration page from the homepage as shown in the image below and fill the requested details in the integration form.

<div align="center"><img src="/files/sR1RjIZYPKpDn1qNmI1n" alt=""></div>

If you are creating an integration for the first time, you need to follow the steps given below:

* Start creating an integration.
* Choose the two systems you want to integrate.

  <div align="center"><img src="/files/8qhNF6k7BXyBWxpkksy0" alt=""></div>
* Go to the System Configuration screen and configure the systems that you want to integrate. The details of how to configure a system can be accessed on the [System Configuration](/integrate/configure-integrations/system-configuration) page.
* Then, select the project and entities that you want to synchronize between the systems. You will be prompted to create a mapping for the integration. The details of how to create a mapping can be accessed on the [Mapping Configuration](/integrate/configure-integrations/mapping-configuration) page.

<div align="center"><img src="/files/TfYRuc0hZHr6n7OugH2a" alt=""></div>

* You can then proceed with integration and set the polling time and define other advanced settings. Click [Integration Configuration](/integrate/configure-integrations/integration-configuration) to learn more.

***

## Sync Limitations

Each system has its own set of synchronization limitations. Please refer to the system-specific known limitations section on the [Connectors](/connectors) page before you proceed.

Additionally, there are a few limitations that are common across all connectors. Those limitations are listed below:

* Inline image from an entity of the source system synchronizes as broken image to the target system, given that the embedded inline image URL in the source system is not accessible/reachable from the machine on which <code class="expression">space.vars.OIM</code> is installed while the entity is being synchronized. In this case, the inline image synchronized to the target system without transformation to URL corresponds to the target system and as a result, the synchronized image is broken.

### User mention synchronization limitations

* If both the source and the target system support synchronization of User mentions and the user which is being synchronized from the source system does not exist in the target system, then that user's display name as seen in the source system will synchronize to the target system as literal text.
* If the source system supports synchronization of User mentions but the target system does not, then there are two scenarios:
  * If the user *exists in both the source and the target system*, then the target system's user's display name will synchronize to the target system as literal text.
  * If the source user *does not exist in the target system*, then the source system's user's display name as seen in the source system will synchronize to the target system as literal text.
* In both the above-mentioned cases, once the literal text for the user's display name is synchronized to the target system, and when this data is synchronized back to the other system, the actual User mention will be overwritten with the literal text as displayed in the target system.


# Integration Setup

Integration is the process of connecting two or more systems in order to enable a seamless exchange of information between the system users. Each system has its own set of prerequisites for successful configuration.\
Please refer to [Integration Prerequisites](/integrate/integration-prerequisites) page to check the pre-requisites of the systems you want to integrate before you proceed.

## Steps to Configure an Integration

### Configure System (s)

* In this video, we will learn how to configure a system onto and how to update the system details after configuration, if required

> **Note**: Jira is the system that has been used for this video demonstration. The steps may vary slightly from one system to another.

{% embed url="<https://youtu.be/Po6K9_UXrfM>" %}

> **Note**: During configuration or synchronization, connection-related errors might occur. There are couple of reasons for connection-related errors. Checkout the details [Common Error Solutions](/help-center-index/troubleshooting-index/errors-index/common-error-solutions).\
> **Note**: If the system is behind a proxy server, then set up [Proxy Setting](/manage/administrator/proxy-setting) in <code class="expression">space.vars.OIM</code>.\
> **Note**: For details on how to configure systems, refer [System Configuration](/integrate/configure-integrations/system-configuration)

### Select Projects and Entities

The next step is to define entities and fields to be integrated and fields that need to be integrated for every entity mapped. But before that, check whether the system is behind proxy or not.\
If the system is on HTTPS, then [Import SSL Certificates](/getting-started/installation/ssl-certificate-configuration) onto <code class="expression">space.vars.OIM</code>'s Java KeyStore.\ <code class="expression">space.vars.OIM</code> fetches entities available in both systems and shows them in the entities list for both systems.\
From the Select Entities to Sync section, select the relevant entities for both systems.\
In this video, we learn to integrate Bug entities between Jira and Azure DevOps Services (VSTS):

{% embed url="<https://youtu.be/HMbMW_t5v5w>" %}

### Mapping Fields

Mapping is the process of defining the fields that are to be integrated between the given projects and entities of two systems. It is during the mapping stage that the flow of data (From System 1 to System 2, From System 2 to System 1 or bi-directional flow between System 1 and System 2) is also defined.\
In this video, we will see how to map fields between Jira and Azure DevOps Services (VSTS).

{% embed url="<https://youtu.be/vbnw92pPLFM>" %}

#### Value Mapping for Look-Up Type Fields

Look-up type fields are multi-valued fields.\
During mapping the fields for integration, the values of Look-up fields must be mapped for the mapped entities.\
In this case, for example, we choose Priority and Status as the Look-up type fields to be mapped. We map Priority to Priority and Status to State.

#### Default Mapping

Default Mapping is used to write default value to target field in case there is no value coming from mapped source fields.\
Shown below is the Default Mapping pop-up, which opens on clicking the ![](/files/6v9qfTXkEbEAgGK8Dxaz) icon.

> **Note**: The default flow is bi-directional. None is generally used to put default values for fields on target side, which do not have relevant source field to be mapped.

1. For user mapping, default value should be configured in form of user name or email as user name as expected by target end-point.
2. For user mapping, the default value will be written to target if
   * The source value is missing or
   * A matching user is not found in the target.

> **Note**: For details on how to configure mappings, refer [Mapping Configuration](/integrate/configure-integrations/mapping-configuration)

### Configure Filter(s) (Optional)

Criteria Filter/Configuration helps in integration of subset of entities based on some conditions.\
For example, user can specify that bugs with high priority only are to be synchronized or tickets that are closed should be synchronized.\
Even after the entities are integrated, this synchronization based on defined criteria is retained. It is not mandatory to configure a filter/criterion for each integration.

{% embed url="<https://youtu.be/44prb4ssjTY>" %}

> **Note**: The format in which you enter condition in the Query field will vary from one system to another.

> **Note**: For details on how to configure integrations, refer [Integration Configuration](/integrate/configure-integrations/integration-configuration)

### Save and Activate Integration

You can now save and activate the integration.

{% embed url="<https://youtu.be/5bcgNpsfGGU>" %}

> **Note**:The Polling time is automatically set for the integration based on the system used for integration.

* For Build systems and Source Control Management systems, last updated created changeset/revision will be set as start polling time. If source system does not have any data created, then by default, it will be set to **0**.
* For Application Lifecycle Management (ALM), Product Lifecycle Management (PLM), and Test Management systems, polling time is set to the last updated time on the selected source projects. If the project does not have data then polling time is set to the CurrentTime -26 hours.
* If user wants to change the default polling time, then click the **Entity Level Mandatory Settings** button given beside entity mapping option.

### Troubleshooting

Create/Update event in the source system and check whether the event synchronizes to the target system.\
If you face any issue, please refer to the General FAQs

You can also see the steps to manage an integration from this page [Managing Integrations](/integrate/configure-integrations/integration-configuration#managing-integration)

### Additional Configuration

> **Note**: Please de-activate the integration to make these changes. You can save and activate the integration again after you have made the changes.

* Mapping more fields: Now that you have set the basic integration in place and checked that it is working as expected, you can edit the integration to add more fields.\
  User fields are mapped by email id. If e-mail ids of the users are same in both the systems, it will be mapped automatically, but if the email ids are not same, you will have to update the [Value Mapping using Excel sheet](/integrate/configure-integrations/mapping-configuration#value-mapping-using-excel-sheet) for user fields mapping.

> **Note**: For user mapping, the default value should be configured in form of user name or email as user name as expected by target end-point.\
> **Note**: For user mapping, the default value will not be written to target even if the matching user is not found in the target.\
> This will be done only if nothing is coming from the mapped source field.

* At this stage, test the integration by trying to synchronize data between the specified System 1 and System 2 projects.

You should not be using the integration user credentials to create entities in the systems as in this case the integration will not work.\
Create/Update event in the source system and check whether the event synchronizes to the target system.\
Wait for one minute for the data to synchronize.\
If you face any issue, please refer to [Possible Reasons and Fixes](/help-center-index/faqs/general-faqs)


# Integration Configuration (Advanced Settings)

Systems here refer to the applications such as Team Foundation Server (TFS) and JIRA that you are using in your Application Lifecycle Management (ALM) ecosystem.

In this section, you will learn how to configure a system onto <code class="expression">space.vars.OIM</code> and how to update the system details after configuration, if required.

## Basic Integration

* The dashboard, by default, shows all integrations created so far on the selected instance.

<div align="center"><img src="/files/Kq4iqc8Tyfdcp9muMJqc" alt="" width="700"></div>

* If the integration you want to use is not present in the list, follow the steps here:
  * Click the **Integrate** button on the screen.

    <div align="center"><img src="/files/abd1tn630NJvSXtaMIzb" alt="" width="700"></div>
  * Click the plus icon **\[+]** on the top right corner of the screen. You will be prompted to enter the **Integration Name** and names of the systems you want to integrate.

<div align="center"><img src="/files/vjXn5K7uekW81tAaV7jR" alt="" width="300"></div>

> **Note**: You are free to choose any name for the integration; however, we advise you to choose a name that helps identify the systems involved in the integration.

<div align="center"><img src="/files/FzQH1jQuXdyjlXGB4WkQ" alt="" width="900"></div>

* Click the plus sign \[+] adjacent to the System 1 and System 2 fields. You will be navigated to the System Configuration screen. Check the [System Configuration](/integrate/configure-integrations/system-configuration) steps here.
* In the **Select Project to Sync** section, select the projects you want to synchronize between the systems by clicking them. For example, in this case, we select Demo Project from TFS and OpsHub project from JIRA.
* Click the forward arrow (>), bi-directional arrow (<-->), or backward arrow (<) depending upon whether you want to integrate projects from System 1 and System 2, or do a bi-directional synchronization.
* In the **Select Entities to Sync** section, select the entities (issue types) you want to synchronize between the systems. A list of entities that are common for both projects would appear for both systems. Click the ones you want to synchronize. You can synchronize multiple entities in one integration. To add more entities, click the plus sign \[+] adjacent to **Select Entities to Sync**.

> **Note** : Some systems will have entities that require special settings. These entities would appear on the right side of the screen.

* If the required mapping doesn't exist, click the the plus button \[+] adjacent to **Select fields to be synced** (In one of the screenshots above, select fields to be synced section is populated with TFS-JIRA map). You will be navigated to Mapping Configuration screen.

Click [Mapping Configuration](/integrate/configure-integrations/mapping-configuration) to learn the steps to create a new mapping.

* You can configure some global settings for the integration using the option shown in the image below. The Global Settings allows you define: Entity Id Field Name, Entity Link Name i.e. [Tracking Id and Link of Entities Across Systems](#tracking-id-and-link-of-entities-across-systems) for both systems, [Maximum Retry Count](#maximum-retry-count) and [Associate Schedule](#associate-schedule) for integration.

<div align="center"><img src="/files/eEPCG4uMVWYju34pDOei" alt="" width="900"></div>

* Polling time automatically set for the integration based on the system used for integration.
  * For Build systems and Source Control Management systems, last updated|created changeset/revision will be set as start polling time. If source does not have any data created then by default, it will be set to **0**.
  * For ALM (Application Lifecycle Management), PLM (Product Lifecycle Management), and Test Management systems, polling time is set to the last updated time on the selected source projects. If the project does not have data then polling time is set to the CurrentTime - 24 Hours.
* If you want to change the default polling time, then click the **Entity Level Mandatory Settings** button given beside entity mapping option.

<div align="center"><img src="/files/89OcpX2yI0BM4b4WaXvj" alt="" width="900"></div>

* To save the integration in active mode, slide the **Activate Integration** button to the right. Select **Yes** in the **Are you sure?** pop-up.

<div align="center"><img src="/files/Q2F27cj7eUpoOceiNTu4" alt="" width="900"></div>

* Click **Save** to save the integration.

## Child Project Synchronization

There are few connectors who support child project synchronization. Enabling this feature will synchronize entities from selected projects and their child projects to other system.

If you have created integration with parent project mapping and later if a child project is added to that parent project in the end system, then such child projects will be automatically polled and no manual configuration changes will be required in the <code class="expression">space.vars.OIM</code> integration.

### Setting up child project sync

If the systems that you have mapped support child project polling, then you'll see a checkbox called **'Sync child projects'** below the name of that system in 'Synced projects' section. By default, this checkbox will be unchecked, which means it won’t poll child project's data. If you check the checkbox then <code class="expression">space.vars.OIM</code> will read events from the parent project including all child projects, and will sync them to the target project as per the project mapping.

If the checkbox is checked, this feature will be enabled for every project mapping in that integration and will be applicable to all the configured issue types.

### Scenarios

**Scenario 1:** Now in this example if “Sync child projects” is selected for Rally (which support child project polling) then integration will read events from the *Rally R1* including its child projects & *Rally R2* including its child projects. After sync, entities will be synchronized to related target project(s). This means event from *Rally R1.1* project (a child project under R1) will go to *Jira J1* project and event from *Rally R2.1* project (a child project under R2) will go to *Jira J2* project.

**Scenario 2:** If we consider the case of bidirectional sync, in our example, the events generated by *Jira J1* will be synced to relevant projects in target. i.e.

* New entities created in *Jira J1* will synced to *Rally R1*.
* Any updates in already synchronized entities in *Jira J1* will be synchronized to relevant target project i.e. if the entity updated is of parent project *Rally R1*, updates will be synced in *Rally R1*. If the entity updated is of child project *Rally R1.1*, its update will be synced to *Rally R1.1*.

**Scenario 3:** If you need a specific child project to be synchronized to a specific target project then you can map that child project separately. So in our example, if you don't want *Rally R1.1* to be synced with *Jira J1* and want it to be synced with *Jira J2* instead, you can simply map *Rally R1.1* to *Jira J2* separately. So after doing this, events from *Rally R1* and all of its child projects except *Rally R1.1* will sync to *Jira J1* and events from *Rally R1.1* will sync to *Jira J2*.

**Scenario 4:** If you don't want certain project’s child project to be polled, then you can configure separate integration for it in which the 'Sync child project' checkbox is not selected. Also ensure that this project or any of its parent (predecessor) projects are not a part of any other integration where 'sync child project' feature is turned on.

**Scenario 5:** If project mapping is done at mapping level, it will be prioritized over integration-level mapping.

> **Note** : For this feature to work properly, all the child projects must have the same permission as the parent project. i.e. all the prerequisites that are applicable for parent projects will also be applicable to child projects.

## Criteria Configuration

Criteria Configuration helps in integration of subset of entities based on some conditions. For example, you can specify that only bugs with high priority are to be synchronized or tickets that are closed should be synchronized. Even after the entities are integrated, this synchronization based on defined criteria is retained.

* Click the icon shown in the image below for enabling **Criteria Configuration**.

<div align="center"><img src="/files/LHnIehiy7GswxtUxAvGt" alt="" width="900"></div>

2. A pop-up window - **Criteria Configuration** appears on the right. In this window, for a bidirectional mapping, sections specific to both systems involved in the integration will appear in backward and forward criteria configuration tabs. Fill the requisite details.

<div align="center"><img src="/files/0hlLR6Q6IQtlqR5hz6QH" alt="" width="700"></div>

3. First, select **Yes** in the Configure Criteria drop-down list. Once you select **Yes** in the Configure Criteria drop-down list, two more fields, **Query** and **Select criteria storage type field**, appear. Note that it is mandatory to select values for these three fields.

* In the **Query** field, enter the condition that you want <code class="expression">space.vars.OIM</code> to consider when it synchronizes the selected entity between the source system and the destination system. For example, if you enter `PRIORITY='High'` in the Query field for this integration, it means you are instructing to synchronize only those entities that are high priority.

> **Note** : The format in which you enter condition in the Query field will vary from one system to another. Refer the [Connectors](/connectors) section to learn more.

* From the **Select criteria storage type** drop-down list, select whether you want to store the entities from the source system in the database, directly in the end system or select **No Storage** option. The default behavior is to store the data in the database.
  * When you select **In Database**, the selected entities synchronize between both systems even when the conditions defined in the **Query** field has been updated.
  * When you select **In End System**, the selected entities synchronize between both systems only when the current conditions in the **Query** field are met. When you select this option, you also need to specify the field of the source system where the criteria need to be stored in the **Select where criteria info is to be stored** field.
  * When you select **No Storage**, the selected entities synchronize between both the systems only when the current conditions in the **Query** field are met. If the **Query** field is updated (in such a way that the entity is not meeting criteria), then updates to the entity won't get synchronized further. This option can be used if you want to stop the synchronization of the entity as soon as the conditions in the **Query** field stop meeting the criteria. For the other two options, once the entity is synchronized, it will always be in a synchronization state, even if the entity is not meeting the criteria anymore.
    * *This option is available only for Intland software's codebeamer, codebeamer X and Jira as of now.*
    * The synchronization performance will get improved if you select this option.
      * Reason: This option will save time by not loading all the entities. Also, it will not go to the end system to update the criteria's results in the field.

To read in detail about Criteria information storage in end system, click [here](/integrate/configure-integrations/integration-configuration/criteria-information-storage).

> **Note** : **Hierarchy Synchronization behavior when criteria is Configured in integration**: When criteria is configured, the position/order of the entity for hierarchy synchronization will be considered for the entities which are meeting the criteria at the time of synchronization. For example if some of the entities in the source end system view do not meet the criteria, then, in such cases, the target system view may be different in terms of position/order of the entities. Please check the below scenario for better understanding:

**Example**

Consider the following view of the end system for entities:

**P1**

* **C1**
* **C2 (Non-meeting criteria)**
  * **CC1**
  * **CC2**

**P2** **P3**

The entity **CC1** and **CC2** are sibling to each other. In this case, **CC1** entity placed before **CC2** entity position/order, and both entities added on first level as entity **C2** is not meeting criteria. After synchronization, then the expected view in the target end system will be:

**P1**

* **C1** **P2** **P3** **CC1** **CC2**

The scenario mentioned above will be the expected behavior as entity **C2** does not exist in the target end system. The entity view in the target system will get corrected once the source entity **C2** fulfills the criteria, and is synchronized to the target end system.

> **Note** : **To keep entities 'once in sync always in sync', bidirectional integration should be configured in the same base integration.**
>
> * With two different unidirectional integrations, you will not be able to sync the updates for non-criteria meeting entities synced by other way integration.

> **Note** : **If integration gets deleted and created with the same configuration, the older criteria data synced by deleted integration will not remain in sync.**

## Rule-Based Routing

**Overview**

In real-world integrations, a single source entity type may need to sync with different target types based on a classification field (like Request Type or Category). When this field’s value changes, the target entity type updates automatically to maintain consistency without creating duplicates.

Example: If all source items are created as a Request and requestType=Bug, it syncs as a Bug in the target. Changing it to a Feature Request converts the synced item to a Feature — keeping both systems aligned bidirectionally.

**Feature: Rule-Based Routing**

This feature allows seamless conversion when the routing field value changes and automatically updates the corresponding target entity type. It also ensures that when updates flow in the reverse direction, the source field value is adjusted accordingly—maintaining complete bidirectional consistency.

### Configuration

**Step 1:** Go to the **Create Integration** screen. Under the **Select Entities To Sync** section, click the ![Plus Icon](/files/QjowgGMcNoeVmL375auw) icon next to the selected entity type.

* You can click the plus icon (+) on either side (source or target) to set up a one-side rule-based mapping.\*

<div align="center"><img src="/files/E0rw2QjEFBP3NXLWuEPc" alt="" width="900"></div>

**Step 2:** Define the 1-to-N entity types configuration

* Clicking the plus icon (+) opens the 1-to-many configuration view.
* Select the required entity types on the N side configuration and provide their respective mappings.

<div align="center"><img src="/files/r2wxSVaY6ECfEl1QETq6" alt="" width="900"></div>

**Step 3:** Click on the ![Tick Icon](/files/zzsWblsT1lTv746V6sML) icon.

* Each row in the configuration defines a distinct routing rule that links the source entity to a specific target entity type based on the routing criteria provided.

<div align="center"><img src="/files/Mb7hk0CUWO1kO19FRC0A" alt="" width="900"></div>

**Step 4:** Configure Routing Rules for Each Row in the rule-based configuration

* Click on the ![Routing Rules Icon](/files/HSlulhW6jLveyjKOA26o) icon to open the Routing Criteria Settings screen.
* For more guidelines, refer to the [Routing Rules Configuration Guidelines](/integrate/advanced-sync-scenario/rule-based-routing#routing-rules-configuration-guidelines) section.

<div align="center"><img src="/files/6y3cahm5ynsYyi9jwPnp" alt="" width="900"></div>

**Step 5:** Select Default Route \[Optional]

* Click on the ![Default Route Icon](/files/t0lMZdNnpGWmxeEpLbRH) icon to designate the route as default route.
* For more guidelines, refer to the [Default Route Configuration Guidelines](/integrate/advanced-sync-scenario/rule-based-routing#default-route-configuration-guidelines) section.

**Step 6:** Save the Integration

<div align="center"><img src="/files/DkuDWgjyOSwSx7oBsApR" alt="" width="900"></div>

* Changing the direction for one row applies to all rows in the same rule-based configuration.
  * In the image below, if the direction is changed for the Bug-Bug config row, it will also change the direction of Bug-Epic row.

<div align="center"><img src="/files/grdq3OOIiyms6mzfiqWE" alt="" width="900"></div>

* Actions like Activate, Deactivate, Execute Integration, or Delete Job affect all rows in that direction.
  * All rows share the same source entity type and are treated as a single logical configuration.
  * In the image below, if Bug-Bug config row is activated in the forward direction, then Bug-Epic row will also be activated in forward direction.

<div align="center"><img src="/files/NybCFBiPMY1D7adJUwl2" alt="" width="900"></div>

* Enabling reconciliation for any row enables it for all rows in that configuration.
  * Since one entity is common across all routing rules, <code class="expression">space.vars.OIM</code> manages them together to maintain data consistency and prevent partial updates.
  * In the below image, if reconciliation is enabled for the Bug-Bug config row, then the Bug-Epic row reconciliation will be enabled.

<div align="center"><img src="/files/E4FFeRNbuEzJlzEkYipq" alt="" width="900"></div>

* During reconciliation, you must wait for all rows to complete before switching to Integrate Mode.

## Advance Settings

Here is the video on Advanced Configuration settings:

{% embed url="<https://youtu.be/hHtNEqbQ7DU>" %}

These features help the user specify custom conditions during integration configuration.

1. Click the **Configure Advance** icon to define custom configuration settings. A pop-up window appears on the right.
2. Within the pop-up window, there are two tabs: **Forward Advance Settings** and **Backward Advance Settings**. When you select the **Forward Advance Settings** tab, you specify configuration settings for System 1. When you select the **Backward Advance Settings** tab, you specify configuration settings for System 2. Here you can define the following key parameters:

<div align="center"><img src="/files/7fPYVXFIgqqYE84bzrPG" alt="" width="900"></div>

<div align="center"><img src="/files/zIxA6RrKJ5hYdX9x5BxY" alt="" width="900"></div>

### Global Settings

The Global level settings allow customizing default behaviour of integration for all mapped entity types. When the Global level setting button is clicked, the **Global level advance configurations pop-up** opens on the right.

In the given pop-up, the **Entity Id Field Name**, the **Link Field Name**, and the **Sync Field Name** for the integrated systems can be selected and common parameters such as **Max Retry Count** and **Associate Schedule** can be set at once.

* **Entity ID Field Name:** Set this to a custom text property available in the end system. Ensure the field is available in all entity types in a given integration. If set, this will sync Entity ID of the other system in the system for which it is set. example: If Entity ID Field Name is set for Jira, then once an entity is created in VSTS or Jira, the integration will set the VSTS Entity ID (bug ID, requirement ID, etc.) in this field.
* **Link Field Name:** Set this to a custom text property available in the end system. Make sure the field is available in all entity types in a given integration. If set, this will sync the entity web URL of the other system in the system for which it is set. example: If Link Field Name is set for Jira, then once an entity is created in VSTS or Jira, the integration will set the VSTS entity URL (e.g., `https://<companyname>.visualstudio.com/project/_workitems/edit/84701`) in this field.
* **Sync Field Name:** Set this to a custom text property in the end system. Ensure it is available in all entity types in the integration. If set, the integration will maintain the time of the last successful sync for every entity in the selected text field. The time represents the audit time until which changes have been successfully synced to the target.
* Applicable when <code class="expression">space.vars.OIM</code> supports writing multiple changes together:
  * **Batch Update Size:** This input defines the number of changes that will be written together in a single batch to the target system. When the target system supports batch writing, <code class="expression">space.vars.OIM</code> temporarily stores the changes read from the source system in its database. Once the number of stored changes becomes greater than or equal to the value specified in this field, it processes the changes one by one to determine the required updates for the target system. After processing, all derived updates are written together to the target system in a single batch. For example, if 100 changes are made in the source system and the **Batch Update Size** is set to 50, then <code class="expression">space.vars.OIM</code> will write 50 changes together in one batch to the target system. This field is optional. By default, all changes read during one cycle are processed and written together in a single batch.
* Applicable when <code class="expression">space.vars.OIM</code> supports reading multiple entity types together:
  * **Sync only current state:** Set this value to true to synchronize only the current state of the entity. This field is optional. By default, the complete audit history is synchronized to the target system.

### Common Sections

* **Max Retry Count:** Set the maximum number of times the failed events should be retried. The default value is 3.
* **Associate Schedule:** Set an interval at which the data between the source and the target systems should be synchronized. The default schedule is 1 Minute Schedule.
* **Delete Events Sync Schedule:** Set the interval at which the ['Delete Sync'](#Enable-Delete-Sync) configuration looks for sync-abandoned source entities and updates the corresponding target entities.

  <div align="center"><img src="/files/5IapRofi9l20yVqE4dLy" alt="" width="600"></div>

Once the Global level settings are configured, continue with other configurations.

### Maximum Retry Count

Click the **Configure Advance** icon > Go to Advance Configuration pop-up > Select **Override parameters for read operations** > Go to **Maximum Retry Count**.

### Sync Only Current State

This configuration is useful to switch 'History'-based (each change performed on bug will be considered for synchronization) processing to 'Current State'-based (only the state of the entity at the time of synchronization is considered) processing.

Click the **Configure Advance** icon > Go to Advance Configuration pop-up > Select **Override parameters for read operations** > **Sync Only Current State**.

From the **Sync only current state** drop-down list, select:

* **No** – if you want to synchronize the selected entity along with its history.
* **Yes** – if you only want to synchronize the current state.

> **Note**: This feature is available only for selected connectors. If you want to request this feature, please contact your sales/support point of contact.

These fields are shown in the image below:

<div align="center"><img src="/files/M6ldNPhKqgw80rpK9swY" alt="" width="600"></div>

### Behavior for Absent Fields

Click the **Configure Advance** icon > Go to Advance Configuration pop-up > Select **Other configurations** > Go to **Behavior for Absent Fields**.

From the **Behavior for absent fields** drop-down list, select one of the following:

* **Skip** – Fields not present in the target system are skipped without failure. Other fields are synchronized.
* **Sync** – All fields, including those not in the target system metadata, are sent to the target API. This might result in failure if the field is invalid.
* **Validate** – A failure will occur if any field not present in the target system's metadata is added in mapping.

### Action on Entity Deleted in Target

Click the **Configure Advance** icon > Go to Advance Configuration pop-up > Select Other configurations > Go to Action on Entity Deleted in Target.

From the **Action on entity deleted in target** drop-down list, select **Create Failure**, **Recreate** or **Skip Update** depending on the action you want to take when the synchronized entity is deleted from the target system.

* When you select **Create Failure**, failure is created when the selected entity has been deleted from the target system.
* When you select **Recreate**, entity is recreated in the target system when the selected entity has been deleted from the target system.
* When you select **Skip Update**, no action is taken when the selected entity has been deleted from the target system.

### Associate Schedule

Click the **Configure Advance** icon > Go to Advance Configuration pop-up > Select Other configurations > Go to Associate Schedule.

From the **Associate Schedule** drop-down list, select an interval at which you want to synchronize the data between the source and the target systems. The default schedule is 1 Minute Schedule.

### Enable Delete Sync

To update the target entity for the corresponding sync-abandoned source entity, which are no longer a part of the synchronization, follow these steps:

1. Click the **Configure Advance** icon;
2. Go to **Advance Configuration** pop-up;
3. Select **Other configurations**;
4. Select **Yes** in the **Enable Delete Sync**;
5. This configuration can be completed by providing the value for the below configurations:
   * **Delete Events Sync Schedule**:
     * This configuration determines the interval at which delete events will be synchronized from the source to the target system.
     * The dropdown will show all the available schedules which can be configured for the delete event synchronization. Select the preferable schedule.
   * **Delete Events Polling Type**:
     * Two types of polling are supported for synchronization:
       * **Complete Polling**:
         * This polling type will synchronize the delete events for all the deleted entities, which are synchronized through the given integration.
       * **Polling From Date**:
         * This polling type will synchronize the delete events for all the deleted entities, which are synchronized to the target after the time specified in **Delete Events Polling Time** configuration through the given integration.
         * The time at which the entity is synchronized to the target system can be determined from the value of **Last Processed Time** column in the "Sync Report".
   * **Synchronize Not Applicable Entities** (Optional Input):
     * The default value for this input will be **No**.
     * To update the target entity when the source entity is not applicable for the synchronization, this input can be configured with the **Yes** value:
       * When the entity type and/or project of an entity is modified in the source system, the entity might no longer be included in synchronization due to the following reasons:
         * The integration configuration associated with the updated entity type and/or project is not available in <code class="expression">space.vars.OIM</code>.
         * The integration configuration linked to the updated entity type and/or project exists with the criteria that the entity no longer satisfies.

> 💡 There are certain known behaviors associated with this configuration, please refer to [Known Behaviors in Source Delete Synchronization](/integrate/advanced-sync-scenario/source-delete-synchronization#known-behavior) for further details.

### Sync New, Failed, or Both Events

Click the **Configure Advance** icon > Go to Advance Configuration pop-up > Select Other configurations > Go to Sync.

* Select 'New Event' when you only want to synchronize events that are new.
* Select 'Failed Event' when you only want to synchronize events that are failed.
* Select 'Both (Failed and New Events)' when you only want to synchronize failed as well as new events.

  <div align="center"><img src="/files/QEdDSIacF1wUro7bbbG1" alt="" width="800"></div>

### Tracking Id and Link of Entities Across Systems

<code class="expression">space.vars.OIM</code> provides Remote Entity Id and Link settings that help in tracing synchronized entities across systems using their unique Ids and navigation URLs. You need to provide the names of fields in which you want to save this information.

**Remote Entity Id Field Name** will store the unique id and **Remote Entity Link Field Name** will store the navigation URL of the corresponding entity in the other system.

Suppose, a "Defect" with Id "D123" and navigation URL `systemA_url/project1/defect/D123` from System A is synchronized to System B as a "Problem" with Id "P12345" and navigation URL `systemB_url/project2/problem/P12345`, then:

* In System A:
  * **Remote Entity Id Field** of the **Defect** will store value **P12345**.
  * **Remote Entity Link Field** of the **Defect** will store value **systemB \_url/project2/problem/P12345**.
* In System B:
  * **Remote Entity Id Field** of the **Problem** will store value **D123**.
  * **Remote Entity Link Field** of the **Problem** will store value **systemA \_url/project1/defect/D123**.

If a Wiki or HTML field is selected for **Remote Entity Link Field Name**, Remote Entity Link will be added as a hyperlink of Remote Entity Id.

* Consider the following image where **Notes** (HTML field) is selected for **Remote Entity Link Field Name**:

  <div align="center"><img src="/files/LyIAGuqPaXNWQzRAbjE1" alt="" width="1000"></div>
* Here, **ABC-123** is the Remote Entity Id. The Remote Entity Link (`http://www.jira.com/project/ABC-123`) is added as a hyperlink of Remote Entity Id.
* On clicking **ABC-123**, you will be redirected to the Remote Entity having Id **ABC-123**.

#### To store the Id and link of the target entity in the source entity:

Click the **Configure Advance** icon > Go to Advance Configuration pop-up > Select **Override parameters for write operations (Source)** > Go to **Remote Entity Id Field Name** and **Remote Entity Link Field Name** > Select field name from the drop-down list.

#### To store the Id and link of the source entity in the target entity:

Click the **Configure Advance** icon > Go to Advance Configuration pop-up > Select **Override parameters for write operations (Destination)** > Go to **Remote Entity Id Field Name** and **Remote Entity Link Field Name** > Select field name from the drop-down list.

> 💡 Consider whether you are making this configuration for forward or backward settings. Source and Target will change accordingly.

<div align="center"><img src="/files/TR4oN95ijlJ6fQ0c8yF4" alt="" width="700"></div>

### Search in Target Before Sync

Click the **Configure Advance** icon > Go to **Advance Configuration** pop-up > Select **Override parameters for write operations (Destination)** > Go to **Search in Target Before Sync**.

<div align="center"><img src="/files/OPDEogIJY9ku9GaoQ0bp" alt="" width="600"></div>

**The Search In Target Before Sync** feature allows <code class="expression">space.vars.OIM</code> to search whether the selected entities from the source system already exist in the target system, and if yes, then what is the course of action that should be followed.

This feature is generally recommended when synchronization between systems being integrated was tried earlier either manually or by any other tool and user still wants to keep those synchronized entities in the integration with <code class="expression">space.vars.OIM</code> without creating their duplicate entries. Search can be configured to be done on any target system field which holds values similar to any one source system field or transformed fields from mapping. For example, entity id of source system is stored in **Original Entity ID** field in the target system, search can be configured on **Original Entity ID** field.

> **Note** : The priority will be given to the source system field value. If the field is not found in the source system, then the transformed fields from mapping will be used.

If you select **No** from the **Search In Target Before Sync** drop-down field, then <code class="expression">space.vars.OIM</code> will synchronize entities normally and create them on target if it was not already synchronized. If you select **Yes**, you will have to define the course of action that <code class="expression">space.vars.OIM</code> should take when matching entities are found in the source and the target systems.

Once you select **Yes**, the following fields will appear. You need to enter appropriate data in these fields as described below.

#### **Target Search Query**

1. Provide query to be used for search entity in the target system in native target system format. For example, `Title=@Name@ and CustomId=@ID@`. Here **Name** and **ID** are the field names of source system. 2. Fields of the target system's entity can also be used in the Target Search Query in case the source system and target system's field values format are different.
   * For example, if the source and target system have a different entity ID format or entity display name, the target search query on the source entity fields may not be useful. In such case, a user can convert the source entity ID to the target entity Id format using the mapped target system's field; that target system field can be used in the target search query.
   * Source entity ID: `XYZ-50` and Target entity ID: `50`, then the user can do the advanced mapping to convert the source ID format to Target entity ID format under the target field named **"ID converter."**
     * In such case, the target look-up query can be: `Entity ID = @ID converter@`. \&#xNAN;\_ \[Where **Entity ID** and **ID converter** both are target system fields]\_
     * **Note**: Here, instead of the target field **"ID converter,"** the user can utilize the pseudo/virtual field in the mapping to have source-to-target format conversion, and then the pseudo/virtual field can be used in the target look-up, too \[as per the use case].
   * **Using Target Internal ID from Source**
     * If the source system stores the target entity's internal ID, the following query can be used:

       `{"condition":"EQUALS","field":"oh_internal_id","value":"@source_field_name@"}`

       * `oh_internal_id`: Virtual field representing the target system entity's internal ID
       * `source_field_name`: Source field that contains the target entity's internal ID
     * **Note**: In the query, replace `source_field_name` with the actual source field that stores the target entity's internal ID.
2. For native form of end system query to be given for your system, you can refer **Target LookUp Configuration** section in the specific connector document.
3. **What if multiple entities found in Target System matching above Query?** Here you can define the action to be taken when there are multiple entities found in the target system matching query provided above in **Target Search Query**. Select appropriate options from the drop-down list.
   * **Continue with the first entity found**: Select **Continue with the first entity found** if you want to update the first entity from the multiple matching entities found in the target system.
   * **Fail the sync**: Select **Fail the sync** if you want <code class="expression">space.vars.OIM</code> to notify that multiple entities exist in target system and fail the sync in this case.
4. **Continue sync to the entity matching above query**: Here you can define the behavior you want for the matching entity found in the target system. Select appropriate options from the drop-down list.
   * **Yes**: Select **Yes** if you want <code class="expression">space.vars.OIM</code> to update the existing entity in the target system.
   * **No**: Select **No** if you want <code class="expression">space.vars.OIM</code> to skip the source event to be synchronized to the target system.
5. **If no entity found matching above query**: Here you can define the behavior that you want when there is no matching entity found in target system. Select appropriate options from the drop-down list.
   * **Create new entity in the target**: Select this option if you want to create a new entity in the target field if the search query doesn't yield any matching results.
   * **Skip the event**: Select this option if you want <code class="expression">space.vars.OIM</code> to ignore the search information and not take any action.

### Attachment Size Limit Configuration

Click the **Configure Advance** icon > Go to **Advance Configuration** pop-up > Select **Override parameters for write operations (Destination)**.

<div align="center"><img src="/files/LTiGIYkAg5sWS2lb1IM1" alt="" width="500"></div>

This configuration defines how attachment size limits are managed for the target system to ensure compatibility and prevent processing issues. It establishes rules for handling attachments that exceed supported size thresholds.

Based on the values given in these inputs, the system determines whether to process or skip oversized attachments, ensuring consistent and controlled behavior across all scenarios, including attachments, inline images and field-level attachments and inline images.

#### Attachment size limit (MB)

* Defines the maximum allowed attachment size for the target system.
* This limit ensures that any attachments exceeding the threshold are managed appropriately. Use the “Skip attachment if size exceeds limit” option to determine behavior.

#### Skip attachment if size exceeds limit

* This option determines the behavior when an attachment exceeds the size limit defined for the target system.
* If an attachment surpasses the allowed size during synchronization, following will be the behavior based on option selected:
  * If **Yes** is selected: The attachment will be skipped, and the remaining data will continue to be processed successfully.
  * If **No** is selected or **Default Behavior**: The attachment will not be skipped, and the synchronization will fail.

### Workflow Association

Click the **Configure Advance** icon > Go to **Advance Configuration** pop-up > Select **Workflow Association**.

<div align="center"><img src="/files/iWQlt9ACq6a4oWXaxAF3" alt="" width="600"></div>

<code class="expression">space.vars.OIM</code> provides default workflow, which comes with default installation. provides default workflows as part of the installation. These include the Sync, Post Sync, and Reconcile workflows.

#### Sync Workflow:

* Handles synchronization of changes from the source system to the target system.

#### Post Sync Workflow:

* Handles updating the 'Remote Entity ID' and 'Remote Entity Link' to the source entity after it has been synchronized to the target system.
* A default value for the post-sync workflow is automatically populated at the time of integration creation.
* Unsetting this input has the following behavior:
  * When the integration is configured using the default sync workflow, this input cannot be unset.
  * When the integration is configured using a custom sync workflow, this input can be unset during update. However, during creation, unsetting is restricted because the default sync workflow does not include a post-sync step. As a result, any workflows derived from it also require a separate post-sync workflow to be configured.
* If the customized sync workflow does not include handling for the post-synchronization step. In this case, updates of 'Remote Entity ID' and 'Remote Entity Link' on the source entity will not be performed.

#### Skip Synchronization of Events:

* Select **Create** option if you don't want to synchronize new entities created in the source system.
* Select **Update** option if you don't want to synchronize those entities that are updated in the source system.

If you want a customized workflow, please contact your sales/support point of contact.

Click the **Integrate** button to complete the integration process.

### Event Detection & Generation

* The **Event Detection & Generation** feature is used to generate the events for the attributes/fields, which do not generate any history on entity updates.
* Many systems have the calculated attributes/fields, which are calculated at runtime.
  * For example, few systems have entity/artifact's placement data, which can be calculated at the runtime. Such field data can be changed due to reordering of entity/artifact (However, such reordering does not change the Last Modified Time in the system). Hence, by enabling this feature, <code class="expression">space.vars.OIM</code> can keep track of such attributes/fields and update entity in source system to generate the events for synchronization purpose.

**Supported Connectors**

1. [**IBM Rational DOORS**](/connectors/doors#event-detection-generation)

> **Note** :The feature will be visible only when DOORS is the source system in the integration.

Click the **Configure Advance** icon > Go to **Advance Configuration** pop-up > Select **Override parameters for read operations**. In that screen, the below options will appear.

| Input Name                  | Visible when                                          | Description                                                                                                                                                              |
| --------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Configure Event Detection   | Source system supports the feature.                   | Select Yes if you want to enable the event detection of the events, which do not generate history on update; otherwise, select No.                                       |
| Event Detection Field Name  | Yes is selected for 'Configure Event Detection' input | Select a field for event detection. If this field is modified, <code class="expression">space.vars.OIM</code> will generate additional update on the entity.             |
| Event Generation Field Name | Yes is selected for 'Configure Event Detection' input | Select a field to perform an update. <code class="expression">space.vars.OIM</code> will update this field to generate the history for data sync. OIM will overwrite it. |

> **Note** : Additional user credentials are required if the integration runs on the **history based synchronization**. Please check the respective connectors' documentation to check the user inputs.

### Fetch Mapped Data Only

By default, OIM fetches complete entity details from the end system. When **Fetch Mapped Data Only** is enabled, only mapped data (including fields, comments, attachments, links) will be fetched from end system.

**Note:** Enable this feature only when end system has 1000+ fields, and it slows down the end system when loading single entity.

> **Note** : Given feature is available only for selected connectors (Currently supported for [Jira](/connectors/jira#integration-configuration)) under additional license add-on. If you want to request for this feature, please contact your sales/support.

**Enable Fetch Mapped Data Only**

* For source end point: Click the **Configure Advance** icon > Go to **Advance Configuration** pop-up > Select **Override parameters for read operations** > Fetch Mapped Data Only.
* For target end point: Click the **Configure Advance** icon > Go to **Advance Configuration** pop-up > Select **Override parameters for write operations** > Fetch Mapped Data Only.

**Known behaviors due to inconsistency caused by the functionality**

* It is recommended not to use this feature when number of fields mapped are too high, as this can cause error in end system API invocation because of URL length limit.
* For failed events, newly added fields will not be retrieved if mapped data retrieval is enabled. One can fetch the missing data using reconciliation.
* If the end system does not support history or if current state sync is enabled, then data will be overwritten in the target end system upon adding a new field in the mapping configuration.
* If inline files added on an entity are stored as attachments in the end system, attachment sync is enabled, and the field having inline files is not mapped, then those inline files will be synced as attachments in target.
  * Later on, if the field containing inline image is mapped, then same attachment will be referred as inline file or attachment will be removed and added based on the end system attachment storage level.
* Conflict detection will not work as expected in the following scenario:
  * A field was initially mapped and field data was synced using OIM. Now that field is removed from the mapping and updates are synced. Later on, if that same field is mapped again, conflict detection will not work as expected and false conflict might be detected.

### Suppress End System Notification

This feature allows you to stop notifications from being sent to the target system (such as Jira) when records are created or updated through synchronization.

If the target system supports this option, you can choose:

* **True** – Notifications (emails, alerts, etc.) will not be sent for create/update events.
* **False** – Notifications will be sent as usual.

This is useful when you want to avoid triggering unnecessary emails or alerts during automated sync operations.

<div align="center"><img src="/files/WCv6aepGPZX7YNv3Yhgp" alt="" width="300"></div>

Given feature is available only for selected connectors:

| Systems Supported                                  | Supported Actions |
| -------------------------------------------------- | ----------------- |
| [Jira](/connectors/jira#integration-configuration) | Issue Updates     |

> **Note** : If you want to request for this feature, please contact your sales/support.

## Managing Integrations

Select a single integration, then click the **Options** button to perform the following actions on the integration:

<div align="center"><img src="/files/1YYwubCaBH2roIYYbwwS" alt="" width="600"></div>

* **Dump Integration Data**: You will get a zip file named **IntegrationDetails.zip**. The zip file will contain the integration configurations, synchronization logs, mappings, and failure details. It will not include any sensitive data related to the integration user.
* **Delete Integration**: Delete the selected integration
* **Configure** [**Reconciliation**](/integrate/reconcile): Set reconciliation rules
* **Clone Integration**: Create a copy of the selected integration
* **Failure Notification**: Allow <code class="expression">space.vars.OIM</code> to send failure notifications after the integration is active
* **Activate/Inactivate Integration**: Activate or Inactivate the selected integration
* **Execute Integration**: Click this to trigger the sync job for the selected integration manually
* **Execute Delete Integration**: Click this to trigger the delete job for selected integration manually

  > **Note**: This button will only be visible when the integration is configured with delete sync.

<div align="center"><img src="/files/vrjdHl1wRRwbpbQfkp0h" alt="" width="600"></div>

* **Action Buttons**
  * **Hover behavior:**
    * When you hover over the Activate, Inactivate, Execute, or Execute Delete buttons, two directional buttons (Forward / Backward) appear.
  * **Forward / Backward buttons:**
    * Apply the action in the selected direction only.
  * **Available actions:**
    * **Activate / Inactivate:** Activate or inactivate the integration in the selected direction.
    * **Execute:** Trigger a sync job for the selected direction.
    * **Execute Delete:** Trigger a delete job for the selected direction.

### How to edit Integration

**Edit Integration**: Open the integration in a view mode and get an option to edit it

> **Note** : Always inactivate an integration to be able to edit it.

<div align="center"><img src="/files/sPFzSMnUb1NU8gNbsbri" alt="" width="400"></div>

Some of these actions: Activate/Inactivate, Execute, Execute Delete, Merge Integration and Failure Notification can be performed as a bulk operation for multiple integrations. You can also select multiple integrations and move them to another folder.

## Bulk Edit Integration Groups

On the Integrations page, select multiple integration groups and hover on the **Actions** button to open the action bar as seen in the image below:

<div align="center"><img src="/files/WHHcX5iRLtLDHpFdCTEg" alt="" width="1200"></div>

You will see a **Bulk Edit** button on the right side of the action bar. Hovering over the Bulk Edit button will provide you with three options as seen in the image below:

<div align="center"><img src="/files/eEVgylgM6vdjlbjbSDt8" alt="" width="600"></div>

* **Bulk Edit Backward**: Configure the bulk edit settings in backward direction for the selected integration groups.
* **Bulk Edit Forward**: Configure the bulk edit settings in forward direction for the selected integration groups.
* **Bulk Edit**: Configure the bulk edit settings in bidirectional mode (Forward & backward directions) for the selected integration groups.
* **Action Bifurcations**: We can also now Activate/Inactivate/Execute/Execute Delete the integrations in Forward/Backward/Bidirectional direction for the selected integration groups.

Clicking the first three options will open the Bulk Edit Sidebar with your preferred direction selected for Bulk Edit operations.

<div align="center"><img src="/files/hQkOMhVnpGq0iXQH0WJE" alt=""></div>

On top of the sidebar, you can see the count of selected integration groups. You can click the ![infoButton.png](/files/ZgkQW0PXuADNHVmtO0pz) button to open a dialog box displaying the names of selected integration groups. Click the 'close' button to close the dialog box.

<div align="center"><img src="/files/ZZ9WNXYYzGV4Ybn15lqH" alt="" width="600"></div>

The Bulk Edit supports the following settings:

* [Associate Schedule](#associate-schedule)
* [Sync Only Current State](#sync-only-current-state)
* [Max Retry Count](#maximum-retry-count)
* [Enable Delete Sync](#enable-delete-sync)
* [Action on Entity Deleted in Target](#action-on-entity-deleted-in-target)
* [Workflow](#workflow-association)
* [Sync](#sync-new-failed-or-both-events)
* [Behaviour for absent fields](#behavior-for-absent-fields)

> **Note** : Only the settings that you change for the selected groups are committed.


# Criteria Storage Information

* Integration throughput can be improved by choosing to store criteria information in the end system instead of the database. This feature is, however, supported on only some systems.
* In the **Criteria Configuration** pop-up, in the **'Select criteria storage type'** field, choose the **'In End System'** from the drop-down list. Once you choose this option, enter the name of the field in the end system to store this information. Please note, only Text, Hyperlink, HTML, RTF, Wiki and Boolean fields can support this storage.
* By choosing to store the criteria information in the end system, OpsHub is allowed to use the existing criteria query as provided and store relevant information in the selected field in the end system as it processes the entities. In case the entity is no longer required to be stored (but still meeting the set criteria), manually set the value of the field in the end system to “False”.
* This criteria storage feature, however, has some limitations that are listed below.
  * In case multiple integrations exist with different criteria for the same project and same entity, then each criterion will require a different field to allow OpsHub to store the information.
  * In case an entity meeting a criterion was synchronized by OpsHub to the target system and then deleted in the target system, on the next update over that entity in the source system, OpsHub will process the change as per the **''Action on Entity Deleted in Target''** configuration (recreate or ignore), provided the entity still meets the given criteria query.
  * When Rally is the source system, the field selected to store criteria information should have the same *Internal Name* and *Display Name*. No mismatch even in its type casing is acceptable.
  * When Rally is one of the systems in a bidirectional integration, it is mandatory to set the criteria storage field in Rally to ‘True’ from the other system during the ‘create event’ activity. This enables OpsHub to keep that entity in synchronization with the other system in the integration as per OpsHub’s model of integration.


# OpsHub Query Format

## Overview

<code class="expression">space.vars.OIM</code> has defined a specific query format which can be used in place of native query of end system. The query can be used for doing criteria-based synchronization and target lookup synchronization if the connector supports this format of querying. Kindly visit the connector page to know whether it supports this format of querying in end system for criteria-based polling and target lookup instead of native query format.

The query format is a JSON format. The JSON has pre-defined keys and input formats which needs to be followed for steady synchronization of data.

## Query Format

The JSON query syntax has following keys: **field**, **condition**, **value**, **values**, **criterias**. Any key input other than these will result in wrong syntax error.

The query can be applied only on the conditions that are supported by connector. For knowing the supported conditions for querying, kindly refer to the connector documentation.

Below is the JSON syntax for the criteria query.

The JSON query syntax can accommodate simple queries as well as complex queries using nested JSON criterias. In the above JSON query, the **Leaf Criteria Sections** denotes the simple queries that can be grouped together into complex queries (nested queries). The **Criteria Section 1** groups together the criterias denoted by **Criteria sub section 1**.

A query can be a **simple query** or a **complex query**. A simple query has only a single criteria on one field. A complex query has multiple criterias over same field or different fields grouped together.

## Query Format breakdown

### Key - field

* The **field** key represents the name of the field or attribute in end system for which the criteria needs to be specified.
* The field name can be display name or internal name. Refer to connector document to know whether connector supports query on internal name or display name.
* The **field** key is mandatory when doing simple queries. With respect to the above image, the Leaf criteria section must contain the field name (simple queries).

```json
{
  "field": "<field name>"
}
```

* For example - Considering an example query **Severity=Low** that needs to be formed using JSON query, then in the JSON query, the field key will be equal to **Severity**.

```json
{
  "field": "Severity"
}
```

> **Note** : For valid usages of **field** key with other keys, refer to section [Valid Query Usages](#valid-query-usages).

### Key - condition

* The **condition** key represents the criteria operator which should be met by entities. It defines the operator which needs to be evaluated while searching for value(s) in the field.
* This key only takes the conditions that are supported by the connector.
* The **condition** key is mandatory when doing simple queries or complex queries.

```json
{
  "condition": "<operator>"
}
```

* Example: **Severity=Low**

```json
{
  "condition": "="
}
```

* Example: complex query **Severity=Low and Sync=True**

```json
{
  "condition": "and"
}
```

> **Note** : For valid usages of **condition** key with other keys, refer to section [Valid Query Usages](#valid-query-usages).

### Key - value

* The **value** key represents the static value or name of the lookup value in end system which is matched with the field value on the basis of the criteria given.
* The **value** key is mandatory when single value needs to be checked against a field.

```json
{
  "value": "<value>"
}
```

* Example: **Severity=Low**

```json
{
  "value": "Low"
}
```

> **Note**: For valid usages of **value** key with other keys, refer to section [Valid Query Usages](#valid-query-usages).

### Key - values

* The **values** key represents the multiple static values or display name of multiple lookup values in end system which are to be matched with the field value.
* The **values** key is mandatory when multiple values needs to be checked against a single field.

```json
{
  "values": [<value1>, <value2>...<value n>]
}
```

* Example: **Severity=Low or Medium**

```json
{
  "values": ["Low", "Medium"]
}
```

> **Note** : For valid usages of **values** key with other keys, refer to section [Valid Query Usages](#valid-query-usages).

### Key - criterias

* The **criterias** key takes multiple criterias which needs to be applied in end system.
* This key can only be used along with key **condition**.
* The **criterias** key is mandatory when simple queries need to be combined (nested queries).

```json
{
  "criterias": [<criteria1>, <criteria2>,..<criteria n>]
}
```

* Example: **Severity=Low and Sync=True**

```json
{
  "criterias": [
    {
      "field": "Severity",
      "condition": "=",
      "value": "Low"
    },
    {
      "field": "Sync",
      "condition": "=",
      "value": "True"
    }
  ]
}
```

> **Note** : For valid usages of **criterias** key with other keys, refer to section [Valid Query Usages](#valid-query-usages).

## Valid Query Usages

### Simple Queries

```json
{
  "field": "<field name>",
  "condition": "<operator>",
  "value": "<value>"
}
```

```json
{
  "field": "<field name>",
  "condition": "<operator>",
  "values": ["<value1>", "<value2>"]
}
```

### Complex Queries

```json
{
  "condition": "<operator>",
  "criterias": [<criteria1>, <criteria2>]
}
```

## Sample Queries

### Simple Queries with single value search

```json
{
  "field": "Severity",
  "condition": "=",
  "value": "Major"
}
```

```json
{
  "field": "Title",
  "condition": "contains",
  "value": "Test"
}
```

### Simple Queries with multiple values search

```json
{
  "field": "Priority",
  "condition": "in",
  "values": ["Low", "High"]
}
```

```json
{
  "field": "Severity",
  "condition": "in",
  "values": ["Major", "Blocker"]
}
```

### Complex Queries with multiple criterias

```json
{
  "condition": ";",
  "criterias": [
    {
      "field": "Severity",
      "condition": "is",
      "value": "Major"
    },
    {
      "field": "Title",
      "condition": "contains",
      "value": "Test"
    }
  ]
}
```

```json
{
  "condition": ";",
  "criterias": [
    {
      "condition": ",",
      "criterias": [
        {
          "field": "Severity",
          "condition": "is",
          "value": "Major"
        },
        {
          "field": "Severity",
          "condition": "is",
          "value": "Minor"
        }
      ]
    },
    {
      "field": "Title",
      "condition": "contains",
      "value": "Test"
    }
  ]
}
```

```json
{
  "condition": ";",
  "criterias": [
    {
      "field": "Severity",
      "condition": "is",
      "value": "Major"
    },
    {
      "field": "Title",
      "condition": "contains",
      "value": "Test"
    },
    {
      "field": "SyncField",
      "condition": "=",
      "value": true
    }
  ]
}
```

```json
{
  "condition": ";",
  "criterias": [
    {
      "condition": ",",
      "criterias": [
        {
          "field": "Test Case Count",
          "condition": ">",
          "value": 10
        },
        {
          "field": "Test Case Count",
          "condition": "<",
          "value": 20
        }
      ]
    },
    {
      "field": "Title",
      "condition": "contains",
      "value": "Test"
    }
  ]
}
```


# Mapping Configuration

## Mapping Overview

Mapping is the process of defining the fields that are to be integrated between the given projects and entities of two systems. It is during the mapping stage that the flow of data (From System 1 to System 2, From System 2 to System 1 or bi-directional flow between System 1 and System 2) is also defined.

In this section, you will learn how to configure a mapping between two systems and how to update or edit the mapping after configuration, if required.

If the systems you want to map are not configured onto <code class="expression">space.vars.OIM</code>, click the plus buttons \[+] adjacent to System 1 and System 2 fields to configure the systems. Follow the steps given on [System Configuration](/integrate/configure-integrations/system-configuration) page to learn the steps to configure a system.

In the image below, we show TFS and JIRA selected as the two systems.

<div align="center"><img src="/files/Bhn23tIAtFTnh1hYyV6K" alt="" width="900"></div>

## Create a Mapping

* Once the systems are selected, on the Integration Configuration screen, click the the plus button \[+] adjacent to **Select fields to be synced**.
* The Mapping Configuration form will open. You will be prompted to enter the **Mapping Name** and name of systems you want to map.
  * **Name:** Enter the name you want to assign to the mapping you are configuring
  * **System 1:** From the drop-down list, select the name of the first system you want to integrate
  * **System 2:** From the drop-down list, select the name of the second system you want to integrate

<div align="center"><img src="/files/Rsn4fcFqH952cZrD3MBY" alt="" width="1500"></div>

If you are coming from the integration page to the mapping page, the systems will be already selected.

Once you select the systems involved in integration, other relevant fields such as **Project** and **Entity Type** (Issue Type) appear. These fields might differ from one system to another.

## Mapping the Fields

* From the **Project** drop-down lists, select the project that you want to integrate. For example, we select DemoProject in JIRA.
* From the **Issue/Entity Type** drop-down lists, select the relevant entity within the project that you want to integrate. For example, we select Bug in both the systems.
* Click the **Auto Map** button if you want <code class="expression">space.vars.OIM</code> to automatically map the system fields with similar names. You can also additionally map more fields once Auto Mapping is completed.

<div align="center"><img src="/files/JBFt9LKzj6xMjNw5JZr7" alt="" width="1500"></div>

* Click **Create from Scratch** button to define the mapping from scratch. Search the fields from System 1 and System 2 that you want to map. Click them to select them.

## Define the Mode for Mapping Fields

Fields can be mapped for two different modes using the toggle button.

<div align="center"><img src="/files/yMhoO60ST9YTOzKkWGlX" alt="" width="600"></div>

### Create-Update Mode

* This mode will be selected by default.
* The fields configured in this mode will be used for the synchronization of Create/Update type of events

### **Delete Mode**

* The fields configured in this mode will be used for the synchronization of Delete type of events
* <code class="expression">space.vars.OIM</code> cannot fetch any data from the end system for the entity which is deleted in the source system. Hence, [Default Target Field Mapping](#default-target-field-mapping) shall be done for each of the target fields to be mapped.
  * For more insights on the state of the source entity regarding Delete configuration, a read-only field named "OH Deletion Type" will be available:
    * This field will be of Lookup type.
    * Possible values for this field are as follows:
      * **NOT\_ACCESSIBLE:**
        * An entity will be tagged as "NOT\_ACCESSIBLE" if it is deleted or <code class="expression">space.vars.OIM</code> is unable to access it due to insufficient permissions.
      * **NOT\_APPLICABLE:**
        * An entity will be tagged as "NOT\_APPLICABLE" if it has been moved to a project or entity type, whose configuration does not exist either in <code class="expression">space.vars.OIM</code> or has certain criteria enabled. Moreover, that entity no longer meets the criteria.
* Three types of fields can be mapped to perform **Logical**, **Soft Delete**, and/or **Archive Operations** in this mode:
  1. The fields of the target entity to be updated to represent the **Logical Delete**
  2. The field to perform **Soft Delete** of the target entity
  3. The field to perform **Archive operation** on the target entity
* Soft Delete or Archive operations will be performed by default in the synchronization of the [Source Delete event](/integrate/advanced-sync-scenario/source-delete-synchronization) based on target system behavior.
  * From **version 7.181** onward, the **Archive Entity** feature is enabled by default in new installations.
  * However, when upgrading to **7.181 or later**, the functionality remains **disabled by default** to prevent unintended archival actions during the migration.
    * Follow these steps to activate the Archive Entity functionality post-upgrade:
      * Go to the **Mappings** page.
      * Remove the mapping from **None** to **OH\_ARCHIVE**.
* To perform only the Logical Delete in target, the field corresponding to the Soft Delete or Archive operation should be mapped with default value 'No'. For systems that support both Soft Delete and Archive operations, both corresponding fields must be mapped with the default value 'No'. Example, for details on how to perform the logical delete operation in "Rally" endpoint, please refer to [Soft Delete Configuration](/connectors/rally#mapping-for-soft-delete-configuration).
* In [Entity Move Synchronization → Overview](/integrate/advanced-sync-scenario/entity-move-synchronization#overview), Deprecation will be performed in the target entity if the field corresponding to the Soft Delete or Archive operation are mapped with default value 'Yes'. If the field corresponding to Soft Delete or Archive operation is not mapped/mapped with default value "No", then the Logical delete will be performed based on the configured fields.

> **Note** : In both modes, you can also filter the fields as "All Fields", "Mandatory Fields", "Read Only Fields", "Custom Fields", and "System Fields".

<div align="center"><img src="/files/KylPPDItAGlkhdnAW9bD" alt="" width="900"></div>

Here is how the mapping will look like:

<div align="center"><img src="/files/gMa8kGovaqDExb8omQ1n" alt="" width="900"></div>

## Define the Flow of Data and Conditions to Synchronize It

* The mapped fields appear on the sliding pop-up on the right.
* In the pop-up, click the arrows under the **Flow** column to define the flow of data. Selecting both arrows signifies that the flow is bi-directional. The default flow is bi-directional.
* **None** is generally used to put default values for fields on target side, which do not have relevant source field to be mapped. Click ![defaultemapping](/files/MlrCDDKWbhz64r6sPupp) to define the default value.

<div align="center"><img src="/files/7BZxvsXorBv2Z6p8ok6f" alt="" width="700"></div>

## Default Mapping

* There are two types of Default Mapping:
  1. [Default Value Mapping](#default-value-mapping)
  2. [Default Target Field Mapping](#default-target-field-mapping)

### Default Value Mapping

* Default Value Mapping is used to write default value to target field in case if there is no value coming from mapped source fields. Click ![defaultemapping](/files/MlrCDDKWbhz64r6sPupp) to define the default mapping. The Default Mapping pop-up opens.
* For user mapping, default value should be configured in form of user name or email as user name as expected by target end-point.
* For user mapping, default value will not be written to target even if matching user not found in target. Defaulting will be done only if nothing coming from mapped source field.
* For lookup value mapping, the default value is written to the target if the matching value is not found in the target.

<div align="center"><img src="/files/fRMBlLL2PQFIbI6V5uVJ" alt="" width="700"></div>

* Click **Save** button to save default value mapping.

### Default Target Field Mapping

* Default Target Field Mapping is used to write the default value to the target field in case there is no relevant source field to map
* For Default Target Field Mapping, "None" is used from the source endpoint.
  * After mapping "None" with the target field, the default value must be provided for that pair for field mapping using [Default Value Mapping](#default-value-mapping)
  * As the value remains constant during the synchronization, it is recommended to enable the "Overwrite" option when such default target field mapping is done with the [Sync When?](#sync-when) setting options, i.e., "Update"/"Both" or "Soft Delete" in [Create-Update Mode](#create-update-mode) or [Delete Mode](#delete-mode) respectively.

## Value Mapping

* Value Mapping is used to map the values for the Lookup Type fields. Click ![valuemapping](/files/1xt8bebwbWL0GJAEWsoA) to define the value mapping for all **Lookup Type** fields. The Value Mapping pop-up opens.
* A lookup field displays a list of values from which the user can choose.
* In the Value Mapping pop-up, select the relevant values for both the systems. Other actions that can be performed within Value Mapping tab are also listed in the image.

<div align="center"><img src="/files/RcoKW54j7Rt6HaKDPnDu" alt="" width="700"></div>

* Click **Save** button to save your selection.

### Quick Search for Lookup Values

Lookup Type fields can contain a large number of values. To ensure faster performance and a smooth user experience, **OpsHub Integration Manager** efficiently displays up to the first 5,000 values and allows you to quickly search for additional values when needed.

***

#### Viewing Lookup Values

When the **Value Mapping** pop-up opens:

* The **first 5,000 values** are displayed by default.
* Values are listed in **alphabetical order** for easy browsing.
* An informational message appears at the bottom of the list:

> **Showing the initial 5,000 values.**\
> **If you don’t see what you’re looking for, click the Search icon to find more results.**\
> **Still can’t find it? Try refining your search with a more specific keyword.**

<div align="center"><img src="/files/4n8dnkHs5Ya6ygbzWJ24" alt="" width="700"></div>

***

#### Searching for a Lookup Value

* Start typing in the search box to **filter the initially loaded values**.
* If the required value appears in the filtered list, select it directly.
* If the value is not found, click the **Search icon** to retrieve additional values beyond the initial list.

> 💡 **Tip:** Using more specific keywords helps narrow down results and improves search accuracy.

<div align="center"><img src="/files/PpfuZIgYHpUILThtYSWu" alt="" width="700"></div>

***

#### Search Results

* The search retrieves values beyond the initially displayed **5,000 values**.
* If the expected value is still not found, refine the search using a more specific keyword.

***

#### Clearing the Search

When the search text is cleared:

* The list resets and displays the **initial 5,000 values** again.

***

#### Notes

> * This feature is available for all **Lookup Type** fields and works consistently across all supported systems.

### Value mapping using the Same As Integration option

* This option is available only for the "Projects" field.
* The project mapping is defined at the integration level in <code class="expression">space.vars.OIM</code>. If there are no intended modifications in the project field's value mapping, the "Same as Integration" option within the value mapping can be used. This will avoid redundant project value mappings for the "Projects" field.

<div align="center"><img src="/files/5fTq4vG6UZCvH6sTJ92K" alt="" width="600"></div>

> **Note** : This option becomes available only if there is no default value configuration, one-to-one value mapping configuration, and advanced mapping configuration applied to the Projects field in the specified direction. Similarly, enabling this option in a specific direction will disable the default value configuration, one-to-one value mapping configuration, and advanced mapping configuration for that direction.

### Value Mapping using Excel sheet

* **There is a limitation in value mapping in lookup type of fields, i.e., a maximum of 100 values can be mapped.**
* If the user wants to map more than 100 values in lookup value mapping, then an Excel sheet can be used for this purpose.
* If there are a large number of values in a field to be mapped, then an Excel sheet is easier to use.
* Please refer to page [Excel Upload](/integrate/configure-integrations/excel-upload) for uploading excel sheet.

#### Associate Excel File with Field Mapping

* The user can associate the excel file with the following field types:
  * Lookup, reference, and user fields.
* To associate excel file with the field mapping, user can select the excel icon as highlighted in the below screenshot:

<div align="center"><img src="/files/00u36Hdjd3ZDZL6zRGRh" alt="" width="1200"></div>

* On clicking the excel icon, the following form will appear:

<div align="center"><img src="/files/8eGeqjxlmHiQFiocl2Wd" alt="" width="1200"></div>

* An excel file can be selected from the drop-down menu:

<div align="center"><img src="/files/5L0kKwhSg5LpFxgtKH48" alt="" width="1200"></div>

* In the sheet name, write the sheet name of the excel file containing the values.
* In system1 column, mention the column of the sheet which should be considered as source value.
* In system2 column, mention the column of the sheet which should be considered as target value.

#### Configure Excel Mapping for Backward Direction

* If the fields are mapped bidirectionally, the checkbox for the same setting for backward direction will be there in the form:

![ExcelMapping3](/files/kXso8DD7OBowwSsPZIrv)

* If the checkbox option is selected, the same excel file and the same sheet will be used for the synchronization. The only difference is that the source column will be treated as the target column, and vice versa for backward direction sync.
* To configure different excels or different sheets in the backward direction, the user can uncheck the "same as backward direction" checkbox and configure different settings for the backward direction sync.
* It will open the the backward direction configuration form for the excel settings as shown in the screenshot below:

![ExcelMapping4](/files/bEI9qb49mrEfTmsSg4Pj)

## View/Edit XSLT Configurations options

* Any field mapping created is saved in the XSLT language.
* View/Edit XSLT Configurations can be used to change the default mapping XSLT. Click ![XSLT Icon](/files/GB5HgB4em10SJkhxiByb) to change the default behaviour of a particular field mapping.
* User can customize default mapping XSLT using Advance mapping. For Advance mapping, <code class="expression">space.vars.OIM</code> has some Utilities available. Refer to [Advance Mapping Utility](/integrate/configure-integrations/mapping-configuration/advance-mapping-utility) for Utilities.

### Defining Unicode for Element names

* The field names are normalized to be valid element names in XML. Some of the characters such as \~, @, #, ©, $, etc. are invalid XML characters and therefore, these characters are normalized when stored as XML.
* By default, when the 'View/Edit XSLT Configurations' is selected, then for a field name its element name is loaded in normalized format. So, if you want to perform customization on an element name that has invalid unicode character then first map the field and then from 'View/Edit XSLT Configurations' and then copy the field name. (You can remove this field mapping if it is not needed, as it was needed to get the field name.)
* If the field that you are using in advanced XSLT configuration is not available as a field in the available fields section, and if it contains invalid characters for element names, then you can add such invalid character in this format: \&#xNAN;**`Ust__<<Unicode character Code>>__Uend`** where `<<Unicode character Code>>` is character code in UTF-16.

**For example:**

* "Product©version" is the name of the field.
* **©** is an invalid character for element name.
* Now if this field is available as a part of list of fields, then you can get the element name by mapping the field and clicking ![](/files/GB5HgB4em10SJkhxiByb). Copy this field name and it would not be an invalid character for element name as it will be in normalized format. (You can remove this field mapping if it is not needed, as it was only needed get the field name.)
* If this field containing character © is part of field name for which the advanced XSLT has to be configured and this field is not present in the field mapping, then the normalization of the © has to be done manually.
* For this, find the decimal Unicode for © which is 169. And now replace the place where © occurs with `Ust__169__Uend`.
* The final field name will be: **`ProductUst__169__Uendversion`**

You can map attachments, comments and relationships between System 1 and System 2. You can also configure Transitions & Dependencies between System 1 and System 2.

### Specifying Unicode for values in lookup fields

* Lookup field values containing special characters such as tab space (`\t`) are normalized for XML compatibility, as these characters are not directly supported in XML.
* By default, when 'View/Edit XSLT Configurations' option is selected, the fields values for a lookup field are loaded in normalized format.
* For advanced XSLT configuration of field values, if the value includes any of the aforementioned characters, you can manage them using the following format: **`Ust_<<Unicode character Code>>_Uend`** Here, `<<Unicode character Code>>` is the character code in UTF-16 decimal value.

**Examples of values normalization:**

* The source and target system contains value with a tab character. These values are mapped as follows:

<div align="center"><img src="/files/5YpscUVezCbkaiEqnpRQ" alt="" width="700"></div>

* Following is the advanced XSLT for the above mapped field values:

```xml
<xsl:when test="$xPathVariable='tab spaceUst_0009_Uend'">
  <xsl:value-of select="'tab spaceUst_0009_Uend'"/>
</xsl:when>
```

* Unicode character code of tab is **0009**

## Reference Field

### Synchronization behavior of reference field(s) <a href="#synchronization-behavior-of-reference-fields" id="synchronization-behavior-of-reference-fields"></a>

* The first synchronization will be performed based on the ID of the target entity synced by <code class="expression">space.vars.OIM</code>.
* If no matching entity is found in the above step, then the synchronization will be performed based on the name of the entity.

### Synchronize default target value for reference field

* To synchronize "default target value" (irrespective of source field value) for the reference field, the advance mapping can be configured in <code class="expression">space.vars.OIM</code> mapping.
* To perform this, `defaultTargetId` element needs to be mentioned in the advanced mapping of reference field.
* If the user has mentioned target internal id in the advance mapping and no entity match is found based on id and name based lookup, then this default value will be synchronized to the target end-system.

**XSLT snippet for single value reference field:**

```xml
<xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="name">
  <xsl:value-of select="SourceXML/updatedFields/Property/SourceReferenceField/name"/>
</xsl:element>
<xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="id">
  <xsl:value-of select="SourceXML/updatedFields/Property/SourceReferenceField/id"/>
</xsl:element>
<xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="entityType">
  <xsl:value-of select="SourceXML/updatedFields/Property/SourceReferenceField/entityType"/>
</xsl:element>
<xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="scope">
  <xsl:value-of select="SourceXML/updatedFields/Property/SourceReferenceField/scope"/>
</xsl:element>
<xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="defaultlTargetId">
  <xsl:value-of select="123"/>
</xsl:element>
```

**XSLT snippet for multi valued reference field:**(if decision to sync the entity is taken based on name)

```xml
<xsl:for-each xmlns:xsl="http://www.w3.org/1999/XSL/Transform" select="SourceXML/updatedFields/Property/SourceReferenceField/com.opshub.eai.ReferenceValue">
  <fieldvalue op_type="Reference">
    <xsl:variable name="xPathVariable" select="./name"/>
    <xsl:choose>
      <xsl:when test="$xPathVariable='abc'">
        <xsl:element name="defaultTargetId">
          <xsl:value-of select="123"/>
        </xsl:element>
      </xsl:when>
      <xsl:when test="$xPathVariable='xyz'">
        <xsl:element name="defaultTargetId">
          <xsl:value-of select="456"/>
        </xsl:element>
      </xsl:when>
    </xsl:choose>
  </fieldvalue>
</xsl:for-each>
```

* Change the behavior of reference field synchronization:
  * If synchronization of the reference field needs to be done based on the default target ID only, then in that case all elements other than the default target ID should be removed.

***

### Synchronize reference field in case end system does not provide name of the referenced entity in Entity API and History API for base entity

* Following XSLT snippet can be used if name based synchronization is to be performed for reference field

```xml
<{fieldvalue} op_type="Reference">
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="entityId" select="SourceXML/updatedFields/Property/fieldvalue/id"/>
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="projectId" select="SourceXML/opshubProjectKey"/>
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="entityTypeId" select={referencedentitytypeid}/>
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="versionname" select="utils:getEntityFieldValue($workflowId,$sourceSystemId,$projectId, $entityTypeId, $entityId,{entityNameFieldName})"/>
  <xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="name">
    <xsl:value-of select="$versionname"/>
  </xsl:element>
  <xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="id">
    <xsl:value-of select="SourceXML/updatedFields/Property/{fieldvalue}/id"/>
  </xsl:element>
  <xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="entityType">
    <xsl:value-of select="SourceXML/updatedFields/Property/{fieldvalue}/entityType"/>
  </xsl:element>
  <xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="scope">
    <xsl:value-of select="SourceXML/updatedFields/Property/{fieldvalue}/scope"/>
  </xsl:element>
</{fieldvalue}>
```

**For example**, if in a entity if referenced entity type is **Sprint** and the field id of the reference field is **customfield\_10103** and name field of the referenced entity is **Name**, the XSLT would be as follows:

```xml
<customfield_10103 op_type="Reference">
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="entityId" select="SourceXML/updatedFields/Property/customfield__10103/id"/>
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="projectId" select="SourceXML/opshubProjectKey"/>
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="entityTypeId" select="'Sprint'"/>
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="versionname" select="utils:getEntityFieldValue($workflowId,$sourceSystemId,$projectId, $entityTypeId, $entityId,'Name')"/>
  <xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="name">
    <xsl:value-of select="$versionname"/>
  </xsl:element>
  <xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="id">
    <xsl:value-of select="SourceXML/updatedFields/Property/customfield__10103/id"/>
  </xsl:element>
  <xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="entityType">
    <xsl:value-of select="SourceXML/updatedFields/Property/customfield__10103/entityType"/>
  </xsl:element>
  <xsl:element xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="scope">
    <xsl:value-of select="SourceXML/updatedFields/Property/customfield__10103/scope"/>
  </xsl:element>
</customfield_10103>
```

## Comments

The following video shows how to configure comments synchronization during integration configuration:

{% embed url="<https://youtu.be/LVAceV7yV5U>" %}

* Slide the button adjacent to **Comments** to the right to map comments.
* The comments mapping will automatically enable comment author impersonation for supported systems. For more details, refer to Read the [Comment Author Impersonation](/integrate/advanced-sync-scenario/comment-author-impersonation) section.
* Comment time impersonation is not supported by <code class="expression">space.vars.OIM</code> via comment mapping.

<div align="center"><img src="/files/cWEaxAzUPRMZkPQDOxJy" alt="" width="700"></div>

* Click the (\</>) icon to define comments mapping.
* Map the correct fields and define the flow by selecting backward (<), forward (>), or bi-directional (<-->) arrows.
* As you can see in the screenshot below, you can map public reply and internal notes as well. You can also include author details and/or comment-time in the comment.

<div align="center"><img src="/files/U9kiVSlPJAgf20vLu8n3" alt="" width="500"></div>

* Click the edit icon (right icon) to edit comments XSLT.

<div align="center"><img src="/files/GdVvxe1zaw5T40u4PxnY" alt="" width="500"></div>

## Attachments

The following video shows how to configure attachments synchronization during integration configuration:

{% embed url="<https://youtu.be/vnvQbUux_kw>" %}

* Slide the button adjacent to **Attachments** to the right to map attachments.

<div align="center"><img src="/files/ZgK2TcJUk32et32S4Xm9" alt="" width="500"></div>

* Click the (\</>) icon to define mapping.
* Map the correct fields and define the flow by selecting backward (<), forward (>), or bi-directional (<-->) arrows.
* As you can see in the screenshot below, you can map status, projects, and priority for the attachments.

<div align="center"><img src="/files/VhZwh4yTeFfLgykyyLDp" alt="" width="800"></div>

* Click the edit icon (right icon) to edit attachments XSLT.

## Relationships

Watch the following video to learn more about Relationships Mapping from one system to another:

{% embed url="<https://youtu.be/tDd5JRUwpqQ>" %}

Relationship synchronizes the relationship between the selected entities.

* Slide the button adjacent to **Relationships** to the right.
* Click the edit icon. The **Relationships** form opens on the right.
* Link Type mapping will be displayed by default.

<div align="center"><img src="/files/6xqvzzVvDQNxlZhudJCS" alt="" width="700"></div>

* Select the link types from the corresponding boxes in both systems by clicking them. For example, in the link type tab, we select Duplicates from System 1 and Affected from System 2. The arrows between the link types define the flow. If you want to enable a bi-directional flow, click both the arrows.

Click the edit icon against the link type for which you need to set default link. The 'Default Link Settings' option is applicable to any link type, not necessary to only mandatory link.

<div align="center"><img src="/files/mPJtdxKOKCVjMPAEkmIy" alt=""></div>

Read in detail about [Default Link Settings](/integrate/configure-integrations/mapping-configuration/default-link-settings) here.

* Enable the **Overwrite links** option when you want to replace the links in one system from the links coming from the other system. Select the arrow to define which system should be allowed to overwrite the links.
* Enable the **Detect conflicts in links** option to diagnose any discrepancies between the links in the integrated system. If you want to enable a bi-directional conflict detection, click both the arrows.
* Select the **Fail event if linked entity doesn't exist** option to fail the event when the linked entity doesn't exist in the target system. If you want to enable this feature bidirectionally, click both the arrows.
* Select the **Poll archived links** option to retrieve archived links from end system. If you want to enable this feature bidirectionally, click both the arrows.

### Entity Type Mapping

* OIM automatically identifies the target linked entity type in most cases. However, if you need to configure entity type mapping manually, follow the steps below.
* Click on **Manual Entity Type Mapping** to manually configure or adjust the mappings.
  * This opens a new window where you can map entity types from both systems, similar to how link types are mapped.
  * For example, you can map an entity like **Bug** in System 1 to **Defect** in System 2.

**When manual entity type mapping may be required:**

* In a **one-to-many mapping** scenario — for example, one integration maps **Bug** to **Defect**, and another maps **Bug** to **Case**.
* In such cases, OIM must know which target linked entity type to use (e.g., **Defect** or **Case**), and manual mapping is necessary to specify the intended target.

**Note:** The **Bypass Link Entity Type Mapping** add-on is required in your license to enable manual entity type mapping.

<div align="center"><img src="/files/ff7Cdreavop0wnCzbMhs" alt="" width="800"></div>

## Transitions & Dependencies

**Transitions & Dependencies** is a feature supported by <code class="expression">space.vars.OIM</code> wherein the user can configure <code class="expression">space.vars.OIM</code> to automatically handle Transitions & Dependencies of an entity as per requirement.

For example, consider a system in which Transition Workflow exists, a certain state is only accessible from a certain specific state or a new item can only exist in a new default state. Another example can be a requirement in which a state a field has to be assigned a value. If the value for that field is not assigned in that specific state, then it will result into error. In such circumstances, synchronizing entities from a system that does not enforce Transition Workflow to the target system is cumbersome.

To solve this problem, <code class="expression">space.vars.OIM</code> allows the user to configure Transitions & Dependencies Handling. Some systems provide Transitions information through API. For these systems, the transition information is picked from the API by default. Irrespective of the availability of the transitions through API, user can configure Transitions & Dependencies by providing the information through XSL.

* Slide the button adjacent to **Transitions & Dependencies** to the right.
* Click the (\</>) icon to edit the Transitions & Dependencies XSL. A default sample XSL is loaded using which a user can build his own XSL as per his requirement.

**Workflow Behaviour for Transitions & Dependencies when the reference field is added as a dependent field:**

* If the dependent field added in the Transitions & Dependencies is the reference field type, then by default, the lookup for the target entity will be done based on a name basis.
* If the user wants to perform target lookup based on the target entity id, they can achieve this by specifying the attribute `"lookupBy"` in the dependent field. For more details, refer to [Reference Field Working](#reference-field).

<div align="center"><img src="/files/f7MWr55UQc46QoRZyZyy" alt="" width="900"></div>

* Given below is the template for Advance Transition XSL.

```xml
<FieldTransitions>
  <Transitions>
    <FieldTransition>
      <transitionName>transitionName 1</transitionName>
      <fromField>field1</fromField>
      <toField>field1</toField>
      <sourceValue/>
      <targetValue>value1</targetValue>
      <defaultTransition>true</defaultTransition>
    </FieldTransition>
    <FieldTransition>
      <transitionName>transitionName 2</transitionName>
      <fromField>field1</fromField>
      <toField>field2</toField>
      <sourceValue>value1</sourceValue>
      <targetValue>value2</targetValue>
      <dependentFields>
        <dependentField>
          <fieldName>dependent field 1</fieldName>
          <executionOrder>BEFORE</executionOrder>
          <possibleTargetValues>
            <possibleValue>value A1</possibleValue>
            <possibleValue>value B1</possibleValue>
            <possibleValue>value C1</possibleValue>
          </possibleTargetValues>
          <defaultValue>value A1</defaultValue>
          <alwaysUpdate>false</alwaysUpdate>
        </dependentField>
        <dependentField lookupBy="defaultTargetId">
          <fieldName>dependent field 2</fieldName>
          <possibleTargetValues>
            <possibleValue>Id 1</possibleValue>
            <possibleValue>Id 2</possibleValue>
            <possibleValue>Id 3</possibleValue>
          </possibleTargetValues>
          <defaultValue>Id 1</defaultValue>
          <alwaysUpdate>false</alwaysUpdate>
        </dependentField>
      </dependentFields>
    </FieldTransition>
  </Transitions>
  <DependencyMap>
    <Group>
      <primaryField>dependent field 1</primaryField>
      <dependentFields>
        <dependentField>
          <fieldName>dependent field 2</fieldName>
        </dependentField>
        <dependentField>
          <fieldName>dependent field 3</fieldName>
        </dependentField>
      </dependentFields>
    </Group>
    <Group>
      <primaryField>dependent field 3</primaryField>
      <dependentFields>
        <dependentField>
          <fieldName>dependent field 1</fieldName>
        </dependentField>
        <dependentField>
          <fieldName>dependent field 2</fieldName>
        </dependentField>
      </dependentFields>
    </Group>
  </DependencyMap>
</FieldTransitions>
```

* The tags shown in the image are explained below:
  * `<FieldTransition>` : Contains the information regarding a field transition
    * `<transitionName>` : Transition name for the individual transition
    * `<fromField>` : Field internal name from which transition is made
    * `<toField>` : Field internal name to which transition is made
    * `<sourceValue>` : Value from which the transition is made
    * `<targetValue>` : Value to which transition is made
    * `<defaultTransition type="string">` : When `true`: The field transition under which this is defined is set as the default transition. The attribute `type` is optional. In case of multi-valued fields, provide `type="string-array"`.
    * `<dependentField>` : These fields have to be changed when the `<toField>` is changed to a particular value.
      * `lookupBy="defaultTargetId"` : This attribute is used to perform lookup by using Id of the target entity.
      * `<fieldName>` : field internal name that is a dependent field.
        * If Comment is mandatory for the transition, user can mention `OH_Dependent_Comments` as a dependent field in XML.
      * `<possibleTargetValues>` : These values are the values that are available after the field is transformed to `<targetValue>`.
        * `<possibleValue>` : Used for pre-validation of the possible values available in the target end system. Optional. If specified, <code class="expression">space.vars.OIM</code> will validate and fail if incoming value is not in this list.
      * `<defaultValue>` : Default value that is to be selected from the list of possible values. If this is not defined then the first `<possibleValue>` is selected.
      * `<defaultValues>` : Default values that are to be selected when the field type is multi-valued.
        * `<string>` : When your field type is multi-valued, provide multiple values as: `<string>value</string>`
      * `<executionOrder>` : The `<executionOrder>` attribute determines the execution sequence of dependent field operations during workflow state transition. It specifies when dependent field updates are applied relative to the transition.
        * Possible Values for the `<executionOrder>` attribute are:
          * BEFORE : Dependent fields with this value are updated before the state transition occurs.
          * WITH : Dependent fields with this value are updated as part of the state transition.
          * AFTER : Dependent fields with this value are updated after the state transition is completed.
        * If the `<executionOrder>` attribute is not specified for a dependent field, the execution order defaults to WITH.

### Dependency Groups

Dependency Groups are used to define relationships between fields that should be processed together during synchronization.

This configuration is useful when updating one field also requires other related fields to be sent to the target system, even if those dependent fields themselves are not changed in source/target.

#### Use cases

Dependency Groups are useful in scenarios such as:

* Target system validators require multiple fields together.
* APIs fail if related fields are not explicitly sent in the update payload.
* Workflow validators or post-functions depend on related fields being part of the update request.

#### XML Structure

```xml
<DependencyMap>
  <Group>
    <primaryField>Documentation</primaryField>
    <dependentFields>
      <dependentField>
        <fieldName>environment</fieldName>
      </dependentField>
      <dependentField>
        <fieldName>labels</fieldName>
      </dependentField>
    </dependentFields>
  </Group>

  <Group>
    <primaryField>environment</primaryField>
    <dependentFields>
      <dependentField>
        <fieldName>Documentation</fieldName>
      </dependentField>
      <dependentField>
        <fieldName>labels</fieldName>
      </dependentField>
    </dependentFields>
  </Group>
</DependencyMap>
```

#### Behavior

When a field configured as a `<primaryField>` is changed in the source system, all fields configured under its `<dependentFields>` are automatically included in synchronization.

These dependent fields are included in synchronization even if:

* The dependent fields themselves are not changed in the source system.
* The dependent field values in the target system are already the same as the source values.

For example:

```xml
<DependencyMap>
  <Group>
    <primaryField>Documentation</primaryField>
    <dependentFields>
      <dependentField>
        <fieldName>environment</fieldName>
      </dependentField>
      <dependentField>
        <fieldName>labels</fieldName>
      </dependentField>
    </dependentFields>
  </Group>
</DependencyMap>
```

In the above example:

* If `Documentation` changes in the source system,
* then 'environment' and 'labels' are automatically included in synchronization,
  * even if 'environment' and 'labels' themselves are not changed in the source system,
  * even if their values in the target system are already the same as the values in the source system.

#### Tags Explained

| Tag                 | Description                                     |
| ------------------- | ----------------------------------------------- |
| `<DependencyMap>`   | Root node that contains all dependency groups   |
| `<Group>`           | Represents one dependency relationship group    |
| `<primaryField>`    | Main field on which other fields depend         |
| `<dependentFields>` | Container for all dependent fields              |
| `<dependentField>`  | Configuration for an individual dependent field |
| `<fieldName>`       | Internal name of the dependent field            |

#### Notes

* Dependency Groups are configured under the `<DependencyMap>` node inside `<FieldTransitions>`.
* Multiple `<Group>` entries can be added.
* A field can act as both:
  * a `<primaryField>` in one group, and
  * a `<dependentField>` in another group.
* Dependency groups work independently of workflow transitions.
* for dependent fields added through `<DependencyMap>`, the values for `<possibleTargetValues>`, `<defaultValue>`, and `lookupBy` are not applicable, as these fields are included in synchronization regardless of their value changes.

### Additional Configuration Examples for FieldTransitions

**Example of multi-valued type field:**

```xml
<dependentField type="string-array">
  <fieldName>Countries</fieldName>
  <defaultValues>
    <string>IN</string>
    <string>UK</string>
  </defaultValues>
</dependentField>
```

**Example of OH\_Dependent\_Comments field:**

```xml
<dependentField>
  <fieldName>OH_Dependent_Comments</fieldName>
  <defaultValue>Default comment for Transition</defaultValue>
</dependentField>
```

**Example of lookupBy="defaultTargetId":**

```xml
<dependentField type="string-array" lookupBy="defaultTargetId">
  <fieldName>Multi Select Version2</fieldName>
  <defaultValues>
    <string>10908</string>
    <string>10909</string>
  </defaultValues>
</dependentField>
```

> **Note** : All the values provided for Advance Transition XSL are related to the target system. **Note** : `<fromField>` and `<toField>` refer to the same field, provided end system's transition flow is configured on a single transition field. Otherwise, they refer to different fields as per the end system's transition flow.

* If the Transitions & Dependencies is configured, then during the integration, the transition of entities based on incoming values is done automatically by <code class="expression">space.vars.OIM</code>. This makes it easier to synchronize such systems.
* Now, click **Create Mapping** button to create the mapping.

### Transitions & Dependencies Example

Suppose the possible status transition(s) of Jira system is:

* Open
* Open → Active
* Active → Resolved
* Resolved → Closed

Below is Transitions & Dependencies XML configuration sample for <code class="expression">space.vars.OIM</code> for above possible end system transitions.

```xml
<FieldTransitions>
  <FieldTransition>
    <transitionName>transitionName 1</transitionName>
    <fromField>status</fromField>
    <toField>status</toField>
    <sourceValue/>
    <targetValue>Open</targetValue>
    <defaultTransition>true</defaultTransition>
  </FieldTransition>
  <FieldTransition>
    <transitionName>transitionName 2</transitionName>
    <fromField>status</fromField>
    <toField>status</toField>
    <sourceValue>Open</sourceValue>
    <targetValue>Active</targetValue>
  </FieldTransition>
  <FieldTransition>
    <transitionName>transitionName 3</transitionName>
    <fromField>status</fromField>
    <toField>status</toField>
    <sourceValue>Active</sourceValue>
    <targetValue>Resolved</targetValue>
  </FieldTransition>
  <FieldTransition>
    <transitionName>transitionName 4</transitionName>
    <fromField>status</fromField>
    <toField>status</toField>
    <sourceValue>Resolved</sourceValue>
    <targetValue>Closed</targetValue>
  </FieldTransition>
</FieldTransitions>
```

### Known Behavior and Limitations

* If comment is mandatory on state/status transitions and user has configured the `OH_Dependent_Comments` in transition XML, the N number of comment from source will be processed with N number of transition in target. If there is no comment coming from the source, default comment \[mentioned in the Transitions & Dependencies XML] will be synced to the target system.
* `OH_Dependent_Comments` in Transitions & Dependencies XML will work for `WITH` execution order because of API limitations.

**E.g.,**

* Source system: State changed new => close.
* Source comments:
  * Comment 1: "Comment added for testing1"
  * Comment 2: "Comment added for testing2"
* Target system: New => Close is not allowed. Transition needs to be performed as New => Active => Close. For New => Active and Active => Close transitions the comments are mandatory, hence, the `OH_Dependent_Comments` is configured in <code class="expression">space.vars.OIM</code>.

**--- After the sync ---**

* Target system:
  * New => Active, and comment added: "Comment added for testing1"
  * Active => Close, and comment added: "Comment added for testing2"

**Note:** Currently, only Jira and Windchill RV\&S as the target systems support using such dependent `OH_Dependent_Comments` along with the transitions.

## Mention Setting

### Overview

**Mention Synchronization** is a feature supported by <code class="expression">space.vars.OIM</code> which allows users to synchronize the entity mentioned and user mentioned data from source end system to target end system.

End user can edit this **Mention Setting** in <code class="expression">space.vars.OIM</code> to configure the mention sync option. This configuration is applicable to synchronization of entity mentioned. <code class="expression">space.vars.OIM</code> supports three ways to synchronize the entity mentioned data to target end system.

### Mention Configuration

**Mention Sync Option**

* **Option1: Source entity id** This option will synchronize the source id corresponding to source's mentioned entity in the target end system.
* **Option2: Source entity url** If none of the options is configured, then this will be the default selected option. This option will synchronize the source entity URL corresponding to source's mentioned entity in the target end system.
* **Option3: Mentioned target entity (if found) else redirection via opshub** This option will synchronize the entity mentioned in the target system if the target system supports the entity mention. Otherwise, this option will synchronize the target entity link. If the mentioned entity is not synchronized to the target system, then this option will synchronize the OpsHub redirection URL to redirect to the desired (source or target) entity whenever the user clicks on this URL. For this option, it is mandatory to provide the **OpsHub Base URI** against OpsHub system, otherwise sync error will be encountered.

> **Note** : In case the redirection via OpsHub option is set in the Mention Setting of the <code class="expression">space.vars.OIM</code> mapping, then if the requests by a particular client (host) exceed the threshold request count within threshold time, then further requests from same client will result in HTTP error "429 Too many requests". This error indicates that further requests from this client will be blocked for a predefined interval. Refer to the response header(s) for more details or contact OpsHub support in case any configuration changes are required for this setting.

**Mention Prefix Text**

* This is a non-mandatory input. If any prefix text is configured, then the prefix will be added before the mention value getting synced to the target end system for entity mention. The given prefix text will not be considered when the mention value written in the target is an OpsHub redirection URL.

#### How to Enable Entity Mention Sync for Existing Mapping

* Applicable when source system is any of the [**supported connector(s)**](#supported-connectors):
  * Edit <code class="expression">space.vars.OIM</code> mapping and remap the field(s) where the source field type is Rich Text (HTML or Wiki) and remap comments.
  * Edit <code class="expression">space.vars.OIM</code> mapping and remap comments.

> **Note** : To enable entity mention synchronization for supported systems, it is required to remap applicable field(s) and comments after upgrading <code class="expression">space.vars.OIM</code> to version 7.146 or above. Otherwise, mentioned entity ID of source will sync to the target system. Additionally, further updates from corresponding target field will overwrite the source mentioned entity with source mentioned ID.

### Mention Sync Setting View

<div align="center"><img src="/files/5P4hX2ecLTvOnFBBaj56" alt=""></div>

<div align="center"><img src="/files/GCT42dAD39AY7sg4ELNf" alt=""></div>

#### Entity Mention Sync Example

Say, for example, if the rich text field **description** of the source end system is mapped to target **repo-steps** field, and the source end system supports entity mention.

> **Note** : **Defect101** is a mentioned entity in source end system with internal id 101 and display id Defect101. **Note** : **DefectT101** is the target entity corresponding to source mentioned entity Defect101.

**When entity mention is supported for both mapped field of source and target end system**

| Description value | Is mentioned entity synchronized to target? | Target field type | Repo-Steps with Option1 | Repo-Steps with Option2                                                                                                                                                                         | Repo-Steps with Option3                                                                                                                                                                                     |
| ----------------- | ------------------------------------------- | ----------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `#Defect101`      | Yes                                         | HTML              | Defect101               | Defect101                                                                                                                                                                                       | #DefectT101                                                                                                                                                                                                 |
| `#Defect101`      | No                                          | HTML              | Defect101               | Defect101                                                                                                                                                                                       | [OHDefect101](https://oim-host:8989/OpsHubWS/mentionsync?src_mention_sync_id={no}\&tgt_host_entity_info_id={no})                                                                                            |
| `#Defect101`      | Yes                                         | WIKI              | Defect101               | Defect101                                                                                                                                                                                       | #DefectT101                                                                                                                                                                                                 |
| `#Defect101`      | No                                          | WIKI              | Defect101               | Defect101                                                                                                                                                                                       | [OHDefect101](https://oim-host:8989/OpsHubWS/mentionsync?src_mention_sync_id={no}\&tgt_host_entity_info_id={no})                                                                                            |
| `#Defect101`      | Yes                                         | Text              | Defect101               | [https://source-end-host:port/SourceProject1/\\\_workitems/edit/101](https://docs.opshub.com/integrate/configure-integrations/https:/source-end-host:port/SourceProject1/\\_workitems/edit/101) | [https://target-endpoint-host:port/TargetProject1/\\\_workitems/edit/T101](https://docs.opshub.com/integrate/configure-integrations/https:/target-endpoint-host:port/TargetProject1/\\_workitems/edit/T101) |
| `#Defect101`      | No                                          | Text              | Defect101               | [https://source-end-host:port/SourceProject1/\\\_workitems/edit/101](https://docs.opshub.com/integrate/configure-integrations/https:/source-end-host:port/SourceProject1/\\_workitems/edit/101) | <https://oim-host:8989/OpsHubWS/mentionsync?src\\_mention\\_sync\\_id={no}\\&tgt\\_host\\_entity\\_info\\_id={no}>                                                                                          |

**When entity mention is supported for target end system but not for target mapped field**

| Description value | Is mentioned entity synchronized to target? | Target field type | Repo-Steps with Option1 | Repo-Steps with Option2 | Repo-Steps with Option3                                                                                          |
| ----------------- | ------------------------------------------- | ----------------- | ----------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `#Defect101`      | Yes                                         | HTML              | Defect101               | Defect101               | DefectT101                                                                                                       |
| `#Defect101`      | No                                          | HTML              | Defect101               | Defect101               | [OHDefect101](https://oim-host:8989/OpsHubWS/mentionsync?src_mention_sync_id={no}\&tgt_host_entity_info_id={no}) |
| `#Defect101`      | Yes                                         | WIKI              | Defect101               | Defect101               | DefectT101                                                                                                       |
| `#Defect101`      | No                                          | WIKI              | Defect101               | Defect101               | [OHDefect101](https://oim-host:8989/OpsHubWS/mentionsync?src_mention_sync_id={no}\&tgt_host_entity_info_id={no}) |

### Entity Mention Sync Behaviour

* If source system supports entity mention, but the target system does not support it:
  * Mentioned entity from the source system will sync to the target system, as per the mention sync option configured in <code class="expression">space.vars.OIM</code>.
  * It is recommended to configure either Option 1 or Option 2. Otherwise, the following sync failure will occur: `"entity mention synchronization with opshub redirection url is not supported for the target end system, so to retry this failure edit the mapping to change the mention sync setting to other than opshub redirection url."`
* If source mapped field supports entity mention, but target mapped field does not:
  * Mentioned entity from source rich text field will synchronize to target system as per the mention sync option configured and target data type.
* If default mapping generated for entity mention for field/comment is removed:
  * Source entity ID of mentioned entity will synchronize to target field irrespective of the mention sync option configured.
  * Further, any updates from target field will overwrite the mentioned entity tag in source system with mentioned entity ID of source.

> **Note** : It is not recommended to alter or edit the default generated entity mentioned mapping for fields/comments other than removing whole mapping or setting empty tag.

### Entity Mention Sync Limitation

* Bidirectional sync of the Entity Mention is **not supported** in the below-mentioned cases:
  * If "sync Source Id" option is configured in the mention setting in <code class="expression">space.vars.OIM</code>.
    * In this case, any updates from the target field will overwrite the source mentioned entity tag with source mentioned entity ID.
  * If source system rich-text field is mapped with text type field of the target system in <code class="expression">space.vars.OIM</code>.
    * In this case, updates from target field will overwrite the source mentioned entity tag with value from target irrespective of mention sync option configured.
  * When integration is running in reconciliation mode then entity mention synchronization is supported only for the [**supported connector(s)**](#supported-connectors).

#### Supported Connector(s)

Entity mention sync is supported only when the following systems are configured as the source in <code class="expression">space.vars.OIM</code>:

1. [**Team Foundation Server ALM and Azure DevOps Services**](/connectors/azure-devops#mapping-for-entity-mention-field)
2. [**Codebeamer**](/connectors/codebeamer#mapping-for-entity-mention-field)
3. [**CodebeamerX**](/connectors/codebeamer#mapping-for-entity-mention-field)
4. [**Rally**](/connectors/rally#mapping-for-entity-mention-field)
5. [**Jira**](/connectors/jira#mapping-for-entity-mention-field)
6. [**GitHub**](/connectors/github#entity-mention)

#### User Mention Configuration When User Search On Email Not Supported

*If source system or target system doesn't support user search on Email API then the default XSLT needs to be changed.*

**Sample 1** – If the username in both source and target end systems are same.

```xml
<{fieldvalue}-dot-ohusermention>
  <xsl:for-each xmlns:xsl="http://www.w3.org/1999/XSL/Transform" select="SourceXML/updatedFields/Property/{fieldvalue}-dot-ohusermention/com.opshub.eai.metadata.UserMeta">
    <xsl:element name="{concat('UserMention_',position())}">
      <uuid>
        <xsl:value-of select="uuid"/>
      </uuid>
      <xsl:choose>
        <xsl:when test="userName">
          <xsl:variable name="userNameTarget" select="userName"/>
          <xsl:choose>
            <xsl:when test="$userNameTarget!=''">
              <userFound>
                <xsl:value-of select="'yes'"/>
              </userFound>
              <userName>
                <xsl:value-of select="$userNameTarget"/>
              </userName>
            </xsl:when>
          </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
          <userFound>
            <xsl:value-of select="'no'"/>
          </userFound>
          <userName>
            <xsl:value-of select="userDisplayName"/>
          </userName>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:for-each>
</{fieldvalue}-dot-ohusermention>
```

**The `{fieldvalue}` should be replaced with the corresponding mapped field.**

**Sample 2** – This is an Excel mapping example where we need to have an Excel file which will have one-to-one user mapping. This will get the username of a user in target end system corresponding to the source system user's username from Excel sheet.

```xml
<{fieldvalue}-dot-ohusermention>
  <xsl:for-each xmlns:xsl="http://www.w3.org/1999/XSL/Transform" select="SourceXML/updatedFields/Property/{fieldvalue}-dot-ohusermention/com.opshub.eai.metadata.UserMeta">
    <xsl:element name="{concat('UserMention_',position())}">
      <uuid>
        <xsl:value-of select="uuid"/>
      </uuid>
      <xsl:choose>
        <xsl:when test="userName">
          <xsl:variable name="userNameTarget" select="excel:lookup({Excel Id},'{Sheet Name}','{System1 Column}','{System2 Column}',userName)"/>
          <xsl:choose>
            <xsl:when test="$userNameTarget!=''">
              <userFound>
                <xsl:value-of select="'yes'"/>
              </userFound>
              <userName>
                <xsl:value-of select="$userNameTarget"/>
              </userName>
            </xsl:when>
          </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
          <userFound>
            <xsl:value-of select="'no'"/>
          </userFound>
          <userName>
            <xsl:value-of select="userDisplayName"/>
          </userName>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:for-each>
</{fieldvalue}-dot-ohusermention>
```

In given excel mapping, in Sheet1 the column A will contain username of source system and column B will contain the username target system corresponding to source username for which user mention needs to be done.

The `{fieldvalue}`, `{Excel Id}`, `{Sheet Name}`, `{System1 Column}`, `{System2 Column}` should be replaced with the corresponding mapped field and excel upload details. Example for excel mapping: `excel:lookup(1,'Sheet1','A','B',userName)`

**Sample 3** – This is excel mapping example where we need to have an excel file which will have one-to-one user mapping. This will get the username of a user in target end system corresponding to the source system user email address from excel sheet.

```xml
<{fieldvalue}-dot-ohusermention>
  <xsl:for-each xmlns:xsl="http://www.w3.org/1999/XSL/Transform" select="SourceXML/updatedFields/Property/{fieldvalue}-dot-ohusermention/com.opshub.eai.metadata.UserMeta">
    <xsl:element name="{concat('UserMention_',position())}">
      <uuid>
        <xsl:value-of select="uuid"/>
      </uuid>
      <xsl:choose>
          <xsl:when test="userEmail">
          <xsl:variable name="emailTarget" select="excel:lookup({Excel Id},'{Sheet Name}','{System1 Column}','{System2 Column}',userEmail)"/>
          <xsl:choose>
            <xsl:when test="$emailTarget!=''">
              <userFound>
                <xsl:value-of select="'yes'"/>
              </userFound>
              <userName>
                <xsl:value-of select="$emailTarget"/>
              </userName>
            </xsl:when>
          </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
          <userFound>
            <xsl:value-of select="'no'"/>
          </userFound>
          <userName>
            <xsl:value-of select="userDisplayName"/>
          </userName>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:for-each>
</{fieldvalue}-dot-ohusermention>
```

In given excel mapping, in Sheet1 the column A will contain userEmail address of source system and column B will contain the username target system.

The `{fieldvalue}`, `{Excel Id}`, `{Sheet Name}`, `{System1 Column}`, `{System2 Column}` should be replaced with the corresponding mapped field and excel upload details. Example for excel mapping: `excel:lookup(1,'Sheet1','A','B',userName)`

#### User Field Configuration When User Search On Email Not Supported

If source system or target system doesn't support user search on Email API then the default XSLT needs to be changed. Below are some sample XSLT that can be configured according to given use case.

**Sample 1** – This mapping will work when username in both source and target end systems are same.

```xml
<{fieldvalue}>
  <xsl:choose xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:when test="SourceXML/updatedFields/Property/{fieldvalue}/userName">
      <xsl:variable name="userNameTarget" select="SourceXML/updatedFields/Property/{fieldvalue}/userName"/>
      <xsl:choose>
        <xsl:when test="$userNameTarget!=''">
          <xsl:value-of select="$userNameTarget"/>
        </xsl:when>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="SourceXML/updatedFields/Property/{fieldvalue}/userDisplayName"/>
    </xsl:otherwise>
  </xsl:choose>
</{fieldvalue}>
```

The **{fieldvalue}** should be replaced with the corresponding mapped field.

**Sample 2 - This is an Excel mapping example where we need to have an Excel file which will have one-to-one user mapping. This will get the username of a user in target end system corresponding to the source system user's username from Excel sheet.**

```xml
<{fieldvalue}>
  <xsl:choose xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:when test="SourceXML/updatedFields/Property/{fieldvalue}/userName">
      <xsl:variable name="userNameTarget" select="excel:lookup({Excel Id},'{Sheet Name}','{System1 Column}','{System2 Column}',SourceXML/updatedFields/Property/{fieldvalue}/userName)"/>
      <xsl:choose>
        <xsl:when test="$userNameTarget!=''">
          <xsl:value-of select="$userNameTarget"/>
        </xsl:when>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="SourceXML/updatedFields/Property/{fieldvalue}/userDisplayName"/>
    </xsl:otherwise>
  </xsl:choose>
</{fieldvalue}>
```

In given excel mapping, in Sheet1 the column A will contain username of source system and column B will contain the username target system.

The `{fieldvalue}`, `{Excel Id}`, `{Sheet Name}`, `{System1 Column}`, `{System2 Column}` should be replaced with the corresponding mapped field and excel upload details. Example for excel mapping: `excel:lookup(1,'Sheet1','A','B',userName)`

**Sample 3** – This is excel mapping example where we need to have an excel file which will have one-to-one user mapping. This will get the username of a user in target end system corresponding to the source system user email address from excel sheet.

```xml
<{fieldvalue}>
  <xsl:choose xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:when test="SourceXML/updatedFields/Property/{fieldvalue}/userEmail">
      <xsl:variable name="emailTarget" select="excel:lookup({Excel Id},'{Sheet Name}','{System1 Column}','{System2 Column}',SourceXML/updatedFields/Property/{fieldvalue}/userEmail)"/>
      <xsl:choose>
        <xsl:when test="$emailTarget!=''">
          <xsl:value-of select="$emailTarget"/>
        </xsl:when>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="SourceXML/updatedFields/Property/{fieldvalue}/userName"/>
    </xsl:otherwise>
  </xsl:choose>
</{fieldvalue}>
```

In given excel mapping, in Sheet1 the column A will contain userEmail address of source system and column B will contain the username target system.

The `{fieldvalue}`, `{Excel Id}`, `{Sheet Name}`, `{System1 Column}`, `{System2 Column}` should be replaced with the corresponding mapped field and excel upload details. Example for excel mapping: `excel:lookup(1,'Sheet1','A','B',userName)`

## Rank

### Overview

The Rank Synchronization is used to maintain the Rank of the entity in target system view \[equivalent to its Rank in source system view]. The Rank will position the entity in the correct sequence among its siblings through synchronization, which can help users to visualize the data in a more meaningful manner. Below details will help better understand the meaning of Rank for various systems.

**Windchill RV\&S view**

<div align="center"><img src="/files/00ogWVqVC0Si9ngt7lC7" alt="" width="900"></div>

In the above image, each entity Rank can be determined based on the structure displayed on the left panel under 'Outline' or, with the 'Section' value of the entity display on the right panel. For example:

* The respective Ranks of entities, 268100, 268102, and 268104 are 1, 2 and 3. The respective Ranks of entities, 268106, 268108, and 268110 within the entity 268102 are 2.1, 2.2, and 2.3.
  * If user synchronizes all these entities without Rank synchronization, they will see the target entities in different sequence as compared to the source sequence \[based on their processing order and the target system behaviour]. If the user synchronizes all of these entities with Rank synchronization, they will see a similar view where the target entity for 268100, 268102, 268104 and 268106, 268108, 268110 is in the equivalent sequence similar to the source sequence.

Hence, Rank Synchronization helps the user synchronize these entities and visualize Rank/Structure on the target system similar to the source Rank/Structure.

**Jira R4J Plugin view**

<div align="center"><img src="/files/RjBiTaCWxh3Yt3imF9Mv" alt="" width="900"></div>

In the above image, the respective Ranks of entities, PROJ3-883, and PROJ3-884 within the entity PROJ3-882 are 1 and 2. Similarly, the respective Ranks of entities, PROJ3-885, PROJ3-886, and PROJ3-887 within the entity PROJ3-883 are 1, 2 and 3.

### Supported Connectors

Rank Synchronization is supported by following connectors:

1. [**Windchill RV\&S**](/connectors/windchillrv-and-s#rank)
2. [**Jira R4J Plugin**](/connectors/jira#rank-r4j-plugin)
3. [**Verisium Manager**](/connectors/vmanager#rank)
4. [**Codebeamer**](/connectors/codebeamer#rank)
5. [**IBM Rational Doors**](/connectors/doors#rank)

### Configuration

A field named **OH Enable Rank** is required to be mapped in order to enable the Rank Synchronization. It is recommended to map the **OH Enable Rank** field with the **OH Enable Rank** field only.

> **Name**: OH Enable Rank **Data Type**: Boolean **Value**: This field value contains the Boolean value. It is used to decide whether rank processing is required or not.

> **Note** : If the target system is having multi-level structure view, then please configure the relationship mapping to have a level structure view in addition to enable the Rank synchronization. Please refer to the below examples for better understanding:
>
> * Windchill RV\&S system allows Multi Level Structure with Contains-Contained By relationship. The entity within this structure can have a particular Rank. Hence, the user can enable the Relationship configuration to maintain the relationship between the entities. Also, the user can enable Rank Synchronization to maintain the entity rank within the structure.
> * R4J system allows Multi Level Structure with R4J Parent Link-R4J Child Link relationship. The entity within this structure can be in a particular Rank. Hence, the user can enable the [Relationship configuration](/connectors/jira#relationships) to maintain the relationship between the entities. Also, the user can enable Rank synchronization to maintain the entity rank within the structure.

Refer to the [Relationship configuration](#relationships) section to learn more about how to configure relationship.

### Known Behavior and Limitations

1. Rank Synchronization will be considered for the entities within same project.
2. Reconciliation is not supported for Rank Synchronization.
3. Conflict is not supported for **OH Enable Rank** field. <code class="expression">space.vars.OIM</code> will always consider "Source win" policy for this field.
4. If **OH Enable Rank** field is added to an already running integration: Rank Synchronization will keep maintaining the Rank for the entities being processed after the mapping change.
5. If **OH Enable Rank** field is removed from a running integration: Rank Synchronization will not maintain the Rank for new entities being processed after the mapping change. For already processed entities, the Rank will be maintained if any of the adjacent entity's mapping configuration has the Rank synchronization enabled.
   * For example, two integrations are running with Rank Synchronization enabled for issue type "A" and "B". If user disables the Rank synchronization for only entity type "B", the processing of entities of type "A" will maintain the Rank for already synchronized (and all adjacent) entities of Type "B". If user disables the **OH Enable Rank** field for both entity types "A" and "B" mapping configurations, then <code class="expression">space.vars.OIM</code> will not process Rank Synchronization for both entity types.
   * This behaviour will be revised in future OIM release.

> **Note** : Please refer to the respective connector document to check on connector limitations for Rank Synchronization.

## Synchronize source field updates as comments

### Overview

* This feature is used to add comments in the target system when the source field is updated/modified.
* It helps the user to generate traceability for source fields in the target system.
  * For example, suppose "State" field is mapped from source to target system. Now, if the source system has more number of states than the target system, then in value mapping of "State" field, we will not be able to map all the states of the source system.
    * To synchronize the unmapped states of the "State" field, this feature can be utilized by adding a comment in the target system based on the "State" field changes.

### Configuration

* A field named **OH Comment** is required to be mapped in the target system in order to enable this feature.
* The **OH Comment** field can be mapped multiple times with different source fields.
  * All the fields having difference in old and new values will be merged together and added as a single comment in the target system. Consider the following example:
    * Suppose "Priority" and "State" field in the source system are mapped with **OH Comment** field in the target system.
    * If "Priority" is changed from "Low" to "High" and "State" is changed from "Proposed" to "Active", then a comment will be added in the target system as below:

```
Priority changed from [Low] to [High]

State changed from [Proposed] to [Active]
```

* The username of the user, who updated the fields can also be included in the comment, which will be added in the target system.

**To change/customize the comment message, please refer the below steps:**

1. In the mapping, the **OH Comment** field needs to be mapped.
2. Navigate to the icon ![](/files/WuAk5rxbE2FuyiQ8LDqT), which will appear adjacent to the **Comments**. Click on this icon and a window will open as shown below:

   <div align="center"><img src="/files/VaU8D49dlBz6g87mrLcv" alt="" width="900"></div>
3. Here, the comment type and comment body format can be configured for each field mapped with **OH Comment** field.
4. To configure the comment body format, <code class="expression">space.vars.OIM</code> provides special tokens as mentioned below to access various values of the source field:
   * `@field_name@`: This token is used to access the display name of the source field.
   * `@old_value@`: This token is used to access the old value of the source field.
   * `@new_value@`: This token is used to access the new value of the source field.
   * For example, comment body format can be: **@field\_name@ updated in source from "@old\_value@" to "@new\_value@"**

### Known Behavior and Limitations

* Reconciliation, Conflict Detection and Default Value Configuration are not supported for this feature.
* If the **Include author detail in OH Comment** is enabled:
  * Correct author details will not be added in the comment, if the integration is in **Current State** mode or the source system does not support **history**.
  * Only the "username" will be added to the comments.

## Restrict Target Update

### Overview

* In certain scenarios, the target entity cannot undergo further updates, when it is in a closed/done state or resides within an archived folder. Consequently, attempts by <code class="expression">space.vars.OIM</code> to update such entities will result in processing failures.
* To address such cases, updates on the target entity can be restricted. "OH Update Target" field can be utilized for the same.

### Configuration

* **"OH Update Target"** field can be mapped in any mapping mode in the above-mentioned use cases.
  * This field is of Lookup type.
  * Possible values for this field are:
    * **Yes**: Indicates that the target entity will be updated.
    * **No**: Indicates that the target entity will not be updated.

## Advance Settings

Expand the pop-up by clicking the arrow icon.

<div align="center"><img src="/files/BHJJRvG1SzJx34MrOfdB" alt="" width="1200"></div>

### Conflict Management

* In the **Detect Conflict** column, define the mechanism to resolve the conflict between System 1 and System 2. The options are: **Do not detect conflict**, **End system 1 wins**, **End system 2 wins**, and **Manual**. Select the relevant option from the **Detect Conflict** drop-down list.

From the **Detect Conflict** drop-down list:

* Select **Do not detect conflict** when you don't want <code class="expression">space.vars.OIM</code> to detect and notify a conflict between the select entities in System 1 and System 2.
* Select **Endpoint 1 wins** when you want System 1 to be allowed to overwrite the information in System 2.
* Select **Endpoint 2 wins** when you want System 2 to be allowed to overwrite the information in System 1.
* Select **Manual** when you want the user to manually take an action to resolve the conflict.
* Select **Custom Strategy** when you want the user to define the action with a pre-defined condition, for example the system in which the entity was updated last is allowed to overwrite the information in the other system.

<div align="center"><img src="/files/zcU7V25bd9mwEvh4msH3" alt="" width="1200"></div>

Read in detail about Custom Conflict Resolution Strategy [here](/integrate/configure-integrations/mapping-configuration/custom-conflict-resolution-strategy).

## Overwrite

* Click System 1 or System 2 in the **Overwrite** column depending on the system on which you want to overwrite the data.

## Sync When

From the **Sync When?** drop-down list against a field in [Create-Update Mode](#create-update-mode):

* Select **Both** when you want to sync the field when an entity gets created or updated in the target system. This is also the pre-configured setting.
* Select **Create** when you want to sync the field when an entity gets created in the target system.
* Select **Update** when you want to sync the field when an entity gets updated in the target system.

> **Note**: Do not set the **Conflict Resolution Strategy** as **Manual** when you have set **Sync When?** to Update. Reason: As the field was not created at sync time, this will result into conflict error.

<div align="center"><img src="/files/32h3gkhe7SOKTp460Mu9" alt="" width="800"></div>

For the [Delete Mode](#delete-mode) mapping configuration, the default **Sync When?** mode is **Soft Delete**.

## Known Limitations

* While converting from Wiki to HTML:
  * Numbered list and Bullet list present in table cells in the wiki field will not be displayed properly in the HTML field.
  * Text between pipe character (`|`) and the next newline character in the wiki field will be converted to a table cell in the html field.
  * When a word contains two distinct formatting types, then such formatting will not synchronize to the target system as expected.
    * **Source Value:** **conve**rsion
    * **Target Value:** **conve**+rsion+
  * Source Wiki type field is mapped with target HTML type field:
    * Superscript and Subscript formatting of source field will sync along with wiki formatting in target system.
      * If text with superscript is: `X<sup>2</sup>` then in target data sync as: `X^2^`
      * If text with subscript is: `X<sub>2</sub>` then in target data sync as: `X~2~`
    * If cell gets merged in table of source system's field then table content will sync along with wiki formatting in target system.
    * Emojis present in source system's field then, in the target system, the emojis will be sync as space.

## Update a Mapping

* Open the mapping from the integration page. Alternatively, you can also click the mapping name on the mapping configuration page. You will be navigated to the Mapping Configuration page. You can click the option highlighted in the image below to edit the mappping.

<div align="center"><img src="/files/nNq5AKW425v44pzsNHum" alt="" width="500"></div>

* Update the details and click the **Update Mapping** button to save the details. You will receive a prompt when the mapping details are updated.

## Actions on Existing Mapping

Apart from updating, you can also take multiple other actions on an existing mappings. Roll over the icon on the right most corner against the mapping name to see all actions that you can take.

<div align="center"><img src="/files/ylE4wfuGPUCn0OrC9NWf" alt="" width="300"></div>

Here are the actions you can perform on an existing mapping:

You can:

* Export a mapping
* View XSL script for the selected mapping
* Clone the selected mapping
* Delete the selected mapping

Refer to the image below.

<div align="center"><img src="/files/rmXUZ5GYQnLFHmd9Cirk" alt="" width="800"></div>

> **Note** : From version 7.0 onwards, exported mapping will be in XML format with display name of fields rather than internal names to make mapping portability robust.
>
> Additionally, XSL for fields, in which default transformation is automatically generated, won't be added to export mapping so that when user import mapping on newer version then automatically if default mapping is upgraded then that comes into effect. If user has done custom mapping then XSL for that will be shown in exported mapping.

You can also perform other actions on multiple selected mappings:

<div align="center"><img src="/files/gBvJTlBOqSnwh57d65vv" alt="" width="900"></div>


# Advanced Mapping Utility

## Overview

* This Advance Utility is useful when user want some customization in default xslt or user have some specific requirement. For acheiving those requirement <code class="expression">space.vars.OIM</code> provides some Utilities which handle some custom requirement.

## Common placeholder and its value

|  **Placeholder**  |              **Value**             | **Description**                                                                                                                                                                                             |
| :---------------: | :--------------------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `<<Workflow Id>>` |             $workflowId            | if workflowId is required for any utility pass it as $workflowId, it is always available in mapping xml.                                                                                                    |
|  `<<System Id>>`  | $sourceSystemId or $targetSystemId | If the requirement is to have the value for the source system then set this as '$sourceSystemId' and if the requirement is to have the value for the target system then set the value as '$targetSystemId'. |

## Utilities

### Get Field Value of Entity

* **Overview:** This Utility will help to fetch value of any field of specific entity.
* **Utility Definition:**

  ```code
  getEntityFieldValue(WorkflowId, SystemId, ProjectValue, EntityType, EntityId, FieldInternalName)
  ```
* This utility can be used in the advance xslt in this manner:

  ```xml
  <xsl:value-of select="utils:getEntityFieldValue(<<Workflow Id>>,<<System Id>>,<<Project Value>>,<<Entity Internal Name>>,<<Entity Id>>,<<Internal Field Name>>)"/>
  ```

*How to set the placeholders:*

* `<Workflow Id>`: refer [Common placeholder and its value](#common-placeholder-and-its-value) section.
* `<System Id>`: refer [Common placeholder and its value](#common-placeholder-and-its-value) section.
* `<Project Value>`: Pass project's value if required else pass null.
* `<Entity Internal Name>`: Pass internal name for the entity.
* `<Entity Id>`: Pass internal id of specific entity for fetching particular field's value.
* `<Internal Field Name>`: Pass field's internal name for fetching value of it.

***

### Get Matching Lookup Value of Target from Source

* **Overview:** This Utility will help to find matching lookup value from system by giving regular expression.
* **Utility Definition:**

  ```
  getMatchingLookupValue(WorkflowId, SystemId, projectValue, EntityType, RegexExpression, isRegexOnInternalValue, isThrowErrorOnMultipleMatch, isRefreshOnCacheMiss)
  ```
* This utility can be used in advance xslt in this manner:

```xml
<xsl:value-of select="utils:getMatchingLookupValue(<<Workflow Id>>,$targetSystemId,<<Project Value>>,<<Internal Field Name>>,<<RegexExpression>>,<<Regex on Internal Value>>,<<Throw Error On Multiple Match>>,<<Refresh On Cache Missing>>)"/>
```

*How to set the placeholders:*

* `<<Workflow Id>>`: refer [Common placeholder and its value](#common-placeholder-and-its-value) section.
* `<<Project Value>>`: Pass project's value if required else pass null.
* `<<Internal Field Name>>`: Pass field's internal name for fetching value of it.
* `<<RegexExpression>>`: Here, the user can pass a valid regular expression. If user wants to map the lookup values in such a way that it fetches the value which ends with field value of source entity, then pass `concat('.*','<<Searched value>>')`.
* `<<Regex On Internal Value>>`: Pass this as `'true'`, if user wants to search value on basis of internal value of lookup, else pass `'false'` which will search on the basis of display value of lookup.
* `<<Throw Error On Multiple Match>>`: Pass this as `'true'`, if user wants to throw error if multiple match are found for given expression, else pass `'false'` which will throw error in case there are multiple lookups with the same value found.
* `<<Refresh On Cache Miss>>`: <code class="expression">space.vars.OIM</code> maintains cache for lookups to decrease the number of times API is called for the end system. If the user passes the value as `'true'`, <code class="expression">space.vars.OIM</code> will reload the cache if a lookup with a certain value is not found. If this is passed as `'false'`, <code class="expression">space.vars.OIM</code> will always refer the cache and will not reload the cache if a certain matching lookup is not found.


# Custom Conflict Resolution Strategy

Custom Conflict Resolution Strategy assists user in making complex resolution decisions based on the run time values in the source and target systems. With this strategy, users can resolve conflict by considering which end point was updated last or which end point was updated first. User can also make the master/slave decision at run time, based on the current state of the end systems. For example, whether the end system in which a workitem is still open becomes the master or a system in which workitem was not created by sync becomes the master and so on.

***

## Steps to provide XSLT for defining Custom Strategy

Given below are steps to provide XSLT for custom strategy:

* Click the edit adjacent to the **Custom Strategy** drop-down option.

<div align="center"><img src="/files/fGK4lwjSEY32vw8yxdBd" alt="" width="1000"></div>

* Remove comments and provide XSLT in the open box.

<div align="center"><img src="/files/BNtFECcfcMFLiUPzW6r9" alt="" width="400"></div>

***

### Field Value Access Table

| Description                              | Example                                                                                                                                    |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **You can access the source old value:** | <p><code>SourceXML/sourceSystemOld/Property/$FieldName$</code><br><em>$FieldName$ is the internal name of the source system field</em></p> |
| **You can access the source new value:** | <p><code>SourceXML/sourceSystemNew/Property/$FieldName$</code><br><em>$FieldName$ is the internal name of the source system field</em></p> |
| **You can access the target value:**     | <p><code>SourceXML/targetSystem/Property/$FieldName$</code><br><em>$FieldName$ is the internal name of the target system field</em></p>    |

***

### Example

For example, take that resolution strategy for Title field is 'master system is selected based on originated-in system.'\
We can provide the script:

```xml
<Title>
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="xPathVariable" select="SourceXML/sourceSystemNew/Property/Created-space-By/userEmail"/>
  <xsl:choose xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:when test="$xPathVariable='test@opshub.com'">
      <xsl:value-of select="SourceXML/targetSystem/Property/Title"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="SourceXML/sourceSystemNew/Property/Title"/>
    </xsl:otherwise>
  </xsl:choose>
</Title>
```


# Default Link Configuration

`Default Link Settings` provide information about the default target entity that needs to be linked with the synced target entities (synced from source system) at the time of synchronization.

## When to configure default link

* **Case 1**: **When the target system has any link type that must be added when the entity is created, and the source system may or may not have that corresponding link.**
  * For example: TFS Task to VersionOne Task integration\
    Tasks entity in VersionOne must have a parent link type. The parent link could be a Backlog item or a Defect. In TFS, Tasks can have a parent link, but it is not mandatory. Therefore, when user needs to synchronize a Task from TFS that doesn't have any parent in VersionOne, user should provide a default link configuration in the Issue Relationship panel at the time of mapping. So that, the entity meeting this configuration can be set as a parent entity for the synced task in VersionOne.
* **Case 2**: **When the target system requires a mandatory link when an entity is created, but the corresponding link type does not exist in the source system or source system doesn't have a mandatory link for that entity**
  * For example: JIRA Task to VersionOne Task integration\
    Tasks entity in a VersionOne must have a parent link type. The parent link could be a Backlog item or Defect. In JIRA, there is no parent type link available for a Task that can be mapped to a parent in VersionOne. In this case, user can map the 'OH-Default' value from the source link type with the target link type (OH-Default → Parent). User should provide a default link configuration in the Issue Relationship panel at the time of mapping.
* **Case 3**: **When both the end systems have a set of linkages available for mapping and none of the linkages in the target system are mandatory - but business use case is to set default link whenever an entity synchronizes in the target system.**

  In TFS, Tasks can have a parent link, but it is not mandatory. In JIRA, there is no parent type link available for a Task. Taking an example of synchronization of Tasks from JIRA to TFS, if you want to assign the TFS tasks to some Problem or Requirement Work item, then, you can have a default link configuration stating that link the TFS tasks to a certain existing Problem or Requirement.

## How to configure the default link

<div align="center"><img src="/files/Z3peGUThJyFIh2EKjmbQ" alt="" width="700"></div>

<div align="center"><img src="/files/mPJtdxKOKCVjMPAEkmIy" alt="" width="600"></div>

* Open **Issue Relationship** section.
* Map the source link type to the target link type for which the default link needs to be configured.
* Click the edit icon against the link type for which you need to set default link. The 'Default Link Settings' option is applicable to any link type, not necessary to only mandatory link.
* Provide the default link setting parameters: Entity Type and Look-up query.
  * **Entity Type**: Entity type of the target end system that will be linked as the default link.
  * **Look-up query**: The lookup query must be provided in the target end system's native format which must be a valid value for XSLT element. This query is used to look up the entity that needs to be set as a default link while entity synchronizes to the target system. <code class="expression">space.vars.OIM</code> searches the entity in the target system using 'look-up' query against the target entity type and considers the first matched entity as the default link. Found entity will be linked as default link for the link type against which this setting is configured.
    * The **look-up query** can have dynamic (evaluating expression) or static value. Refer section [Default Query Sample](#default-query-sample) for examples on dynamic and static value in look-up query.
  * When "Default link" is configured for an entity type X in mapping, but the same entity type X does not exist in the target project configured in the integration:
    * In such case to avoid the sync failure, a target project can be overridden for entity type X in Default Link configuration. This project can be overridden in the relationship's advanced mapping.
    * Here, the user needs to provide the project Id as a value for **TargetProject** element in the relationship mapping.
    * Any project which contains the entity type X (configured in default link) can be utilized.

```xml
<xsl:for-each xmlns:xsl="http://www.w3.org/1999/XSL/Transform" select="$linksToBeAddedAsDefault">
  <op_list>
    <xsl:element name="{.}">
      <xsl:element name="_1">
        <xsl:element name="EntityType">
          <xsl:value-of select="@entityType"/>
        </xsl:element>
        <xsl:element name="LookupQuery">
          <xsl:value-of select="@lookupQuery"/>
        </xsl:element>
        <xsl:element name="TargetProject">
          <xsl:value-of select="10405"/>
        </xsl:element>
      </xsl:element>
    </xsl:element>
  </op_list>
</xsl:for-each>
```

> **Note** : For the end system native query format, refer the **criteria configuration** section of the corresponding system.

* Option: **Fail event if linked entity does not exist** set as 'true'. If the configured default link is not found in the target system then event processing results into failure, otherwise no default link is set to target entity.

> **Note** : If an incoming event from source has the corresponding link then precedence is given to the incoming link from source upon the default link.

## Appendix

### Default Query Sample

Lookup query can be given in 2 ways:

1. Static lookup query
2. Dynamic lookup query

For any of the query type, if your target system's native format expects `{` or `}` then `{` braces must be used as `{{` and `}` braces must be used as `}}`. Please refer to default link configuration for Verisium Manager end system for such example.

#### Look-up query with fixed value / Static query

**TFS Task to Version One Task:** Default link for Parent link type of end system (VersionOne)

* **Sample target lookup query:**
  * **Link type in Relationship configuration:** Parent → Parent
  * **Default Link Setting:**
    * **Entity Type:** Defects
    * **Query:** `Workitem.Number='D-43478'`

> **Note**: Here, `Workitem.Number='<static value>'` is as per target end system's native query format whereas, `<static value>` is the static value with which you need to match field Workitem.Number.\
> The above query will search for Defect 'D-43478' in VersionOne end system and will link all VersionOne tasks (synced from source system TFS) to the found target defect.

#### Look-up query with evaluating expression within query / Dynamic query

**TFS Task to Version One Task:** Default link for Parent link type of end system (VersionOne)

* **Sample target lookup query:**
  * **Link type in Relationship configuration:** Parent → Parent
  * **Default Link Setting:**
    * **Entity Type:** Defects
    * **Query:** `Workitem.Number='{SourceXML/updatedFields/Property/workitemid}'`

> **Note**: Here, `Workitem.Number='<evaluating expression>'` is as per target end system native query format whereas, `<evaluating expression>` is the dynamic part with which you want to match field Workitem.Number. The property path `SourceXML/updatedFields/Property/workitemid` refers to the source system field name i.e. Name of the field in which the Workitem id of target entity will be stored. The source field name is an internal field name which can be found from advance mapping XSL corresponding to the field mapped.

**JIRA Test Case to HP ALM Test Case:** Default link for Test\_Instance link type of end system (HP ALM)

* **Sample target lookup query:**
  * **Link type in Relationship configuration:** OH-Default → Parent Link
  * **Default Link Setting:**
    * **Entity Type:** test-sets
    * **Query:** `name['{SourceXML/opshubProjectName}']`

> **Note**: Here, `name['<evaluating expression>']` is as per target system native query format whereas, `<evaluating expression>` is the dynamic part which you want to evaluate.\
> The above query fetches the first test-set matching the name equivalent to the incoming project name from JIRA. The property path `SourceXML/opshubProjectName` refers to the source system project name i.e. Name of the project to which incoming entity from system belongs to. Here, `opshubProjectName` is a source field. The source field name is an internal field name which can be found from advance mapping XSL corresponding to the field mapped.


# System Configuration

Systems here refer to the applications such as Team Foundation Server (TFS) and JIRA that you are using in your Application Lifecycle Management (ALM) ecosystem.

In this section, you will learn how to configure a system onto <code class="expression">space.vars.OIM</code> and how to update the system details after configuration, if required.

## Add a System

* While creating an integration on the Integration Configuration screen, click the the plus button \[+] adjacent to System 1 and System 2 fields to access the System Configuration screen.

<div align="center"><img src="/files/mIZJXYXYCxVOpCa9sKo4" alt="" width="900"></div>

* The System Configuration page will open.
* In the **Systems type** field, type the name of the system you want to create. The system name will appear in the drop-down options. For example, we type JIRA in the field and the JIRA system appears in the drop-down list.

<div align="center"><img src="/files/AvD1cdg0CGoK2ejsCSaU" alt="" width="900"></div>

* Select the system you want to integrate. A form requesting system details opens.
* Fill the form with relevant details:
  * **System Name**: The name that you want to assign to the system you are configuring
  * **Version**: The version of the system that you are configuring
  * **Database Connection**: This field is for the systems that use database and for which OIM needs to have a connection with the database.
  * Other system-specific details: We have dedicated section for each system we support. Refer to the specific System Configuration section under that [Connectors](/connectors) page.

> **Note** : If the end system uses the MySQL database connection, then use the MySQL Connector Jar `mysql-connector-java-5.1.38-bin.jar`. You need to place this jar in `<OIM Installation Path>\OpsHubServer\lib`. In case MySQL jar already exists, then replace that MySQL jar with `mysql-connector-java-5.1.38-bin.jar`. MySQL jar can already be available in the case, OIM is installed with MySQL database.

<div align="center"><img src="/files/bRdGA6EGgxne14ekm4Z4" alt="" width="900"></div>

* Click the **Save** button to save the details.
* Repeat the same instructions to add another system.

<div align="center"><img src="/files/Rsn4fcFqH952cZrD3MBY" alt="" width="900"></div>

You can also directly go to the System Configuration screen by clicking the System Configuration icon shown in the image below.

<div align="center"><img src="/files/6hwJCwZ6fev5yKahQ7xl" alt=""></div>

## Edit System Details

* If the system you want to configure to <code class="expression">space.vars.OIM</code> is already configured, but you want to update some configuration details, you can click the pencil icon shown adjacent to the system name after you enable the edit mode in integration by clicking the icon show below.

<div align="center"><img src="/files/SHZ1d8j6dO6LrwBEwABH" alt="" width="1200"></div>

* The form containing details will open. You will then get an option to edit the system details.

<div align="center"><img src="/files/GVihNWNQKoxvDKvofxu0" alt="" width="1500"></div>

* Update the details and click the **Save** button to save the details. You will receive a prompt when the system details are updated.

<div align="center"><img src="/files/V9tkEvwsCYDZthhJ6Oml" alt="" width="900"></div>

### Understanding Json Metadata Input

* For some systems like Jira Align, Enterprise Architect, etc. we take json input for metadata.
* Below is the sample JSON input and explanation about what each field means and how to populate the data. Jira Align system is taken as a reference for this explanation:

```json
{
  "entities": [
    {
      "internalName": "capabilities",
      "displayName": "Capability",
      "readMechanism": "HISTORY",
      "hasReadSupport": true,
      "hasWriteSupport": true,
      "systemSpecific": {
        "projectEntityType": "PROGRAM",
        "projectFieldInternalName": "primaryProgramId"
      },
      "fields": {
        "system": [
          {
            "internalName": "title",
            "displayName": "Title",
            "dataType": "text",
            "mandatory": true,
            "systemSpecific": {
              "fieldNameInRevision": "Name"
            }
          },
          {
            "internalName": "state",
            "displayName": "State",
            "dataType": "lookup",
            "lookUpValues": {
              "1": "1 - Not Started",
              "2": "2 - In Progress",
              "3": "3 - Accepted"
            },
            "mandatory": true,
            "systemSpecific": {
              "fieldNameInRevision": "State"
            }
          },
          {
            "internalName": "programId",
            "displayName": "Primary Program",
            "dataType": "reference",
            "systemSpecific": {
              "lookuptype": "programs",
              "fieldNameInRevision": "Primary Program"
            },
            "mandatory": true
          },
          {
            "internalName": "parentId",
            "displayName": "Parent Initiative",
            "systemSpecific": {
              "entityType": "Initiative",
              "lookuptype": "epics",
              "fieldNameInRevision": "Parent Initiative"
            },
            "dataType": "reference",
            "mandatory": true
          },
          {
            "internalName": "description",
            "displayName": "Description",
            "dataType": "text",
            "mandatory": true,
            "systemSpecific": {
              "fieldNameInRevision": "Description"
            }
          },
          {
            "internalName": "tags",
            "displayName": "Tags",
            "dataType": "text",
            "multiselect": true,
            "mandatory": false,
            "systemSpecific": {
              "fieldNameInRevision": "Tags"
            }
          },
          {
            "internalName": "type",
            "displayName": "Type",
            "dataType": "lookup",
            "lookUpValues": {
              "1": "Business",
              "2": "Enabler",
              "3": "Non Functional",
              "4": "Architectural",
              "5": "Supporting"
            },
            "mandatory": true,
            "systemSpecific": {
              "fieldNameInRevision": "Type"
            }
          }
        ],
        "custom": []
      },
      "relationship": {
        "entities": [
          {
            "internalName": "epics",
            "displayName": "Initiative",
            "supportedAsSource": true,
            "supportedAsTarget": true
          },
          {
            "internalName": "Programs",
            "displayName": "Program",
            "supportedAsSource": true,
            "supportedAsTarget": true
          },
          {
            "internalName": "Features",
            "displayName": "Epic",
            "supportedAsSource": true,
            "supportedAsTarget": true
          },
          {
            "internalName": "Releases",
            "displayName": "Program Increment",
            "supportedAsSource": true,
            "supportedAsTarget": true
          }
        ],
        "linkTypes": [
          {
            "linkType": "Parent Initiative",
            "linkTypeInternalName": "parent",
            "linkTypeDirection": "FORWARD",
            "linkCardinality": "OneToOne",
            "reverseLinkType": null,
            "mandatory": true,
            "supportedAsSource": true,
            "supportedAsTarget": true
          }
        ]
      }
    },
    {
      "internalName": "themes",
      "displayName": "Theme",
      "readMechanism": "NON_TIMESTAMP",
      "hasReadSupport": true,
      "hasWriteSupport": true,
      "entityScope": "Global",
      "systemSpecific": {
        "OH_LastUpdatedField": "description",
        "projectEntityType": "ENTERPRISE"
      },
      "fields": {
        "system": [
          {
            "internalName": "title",
            "displayName": "Title",
            "dataType": "text",
            "mandatory": true
          },
          {
            "internalName": "isActive",
            "displayName": "Active",
            "dataType": "lookup",
            "lookUpValues": {
              "1": "Yes",
              "0": "No"
            },
            "mandatory": true
          },
          {
            "internalName": "state",
            "displayName": "State",
            "dataType": "lookup",
            "lookUpValues": {
              "1": "1 - Not Started",
              "2": "2 - In Progress",
              "3": "3 - Done"
            },
            "mandatory": true
          },
          {
            "internalName": "programIds",
            "displayName": "Programs",
            "multiselect": true,
            "dataType": "lookup",
            "systemSpecific": {
              "lookuptype": "programs",
              "entityType": "Program"
            },
            "mandatory": false
          },
          {
            "internalName": "releaseIds",
            "displayName": "Program Increments",
            "multiselect": true,
            "dataType": "lookup",
            "systemSpecific": {
              "lookuptype": "releases",
              "entityType": "Program Increment"
            },
            "mandatory": false
          }
        ],
        "custom": []
      },
      "relationship": {
        "entities": [
          {
            "internalName": "releases",
            "displayName": "Program Increment",
            "supportedAsSource": true,
            "supportedAsTarget": true
          },
          {
            "internalName": "programs",
            "displayName": "Program",
            "supportedAsSource": true,
            "supportedAsTarget": true
          }
        ],
        "linkTypes": [
          {
            "linkType": "Program Increments",
            "linkTypeInternalName": "program",
            "linkTypeDirection": "FORWARD",
            "linkCardinality": "OneToOne",
            "reverseLinkType": null,
            "mandatory": false,
            "supportedAsSource": true,
            "supportedAsTarget": true
          },
          {
            "linkType": "Programs",
            "linkTypeInternalName": "program",
            "linkTypeDirection": "BACKWARD",
            "linkCardinality": "OneToOne",
            "reverseLinkType": null,
            "mandatory": false,
            "supportedAsSource": true,
            "supportedAsTarget": true
          }
        ]
      }
    }
  ],
  "projects": [
    {
      "internalName": "4",
      "displayName": "Legacy Apps",
      "entities": []
    },
    {
      "internalName": "8",
      "displayName": "Digital Services",
      "entities": [
        {
          "internalName": "defects",
          "displayName": "Defect Override",
          "hasReadSupport": true
        }
      ]
    }
  ]
}
```


# Excel Upload

* Excel Upload is a functionality provided in <code class="expression">space.vars.OIM</code> when the user wants to map more than 100 field values for a field.
* Using this excel upload functionality, the user can upload the excel file in the <code class="expression">space.vars.OIM</code> itself.
* This functionality provides <code class="expression">space.vars.OIM</code> user to upload the excel file directly into the <code class="expression">space.vars.OIM</code>.\
  User can synchronize data between two systems by providing the sheet name, source column and target column in the mapping page.

## Upload Excel

* To upload the excel file, user must click on the below mentioned "Excel" icon in the sidebar on the integrate page of <code class="expression">space.vars.OIM</code>.

<div align="center"><img src="/files/EvFVaP5PWJYdAQ94adp0" alt=""></div>

* To upload a new excel file, click on the plus sign given at the top right corner.

  <div align="center"><img src="/files/n7gFBrjoj8SS5nC4Uvli" alt="" width="1200"></div>
* The user has to fill the mandatory fields(Name and Excel File) given as shown in the screenshot below:

  <div align="center"><img src="/files/u7QpJAiQWoHN6y39vdBp" alt="" width="2000"></div>

## Edit Excel

* Click on the excel file which needs to be edited as shown in the screenshot below:

  <div align="center"><img src="/files/TtaOQOAsJfvgXfKD3DZf" alt="" width="2000"></div>

  In the edit page, the user can change name, description and upload another excel file\
  (in case there any changes in the excel file content). User can click on the pencil icon to edit the details.

  <div align="center"><img src="/files/I2c21rL3gN4SniRh3Yky" alt="" width="2000"></div>

## Delete Excel

### Delete Single Excel File

* The user can delete the excel file by clicking on the delete icon that appears on expanding the three dots icon as shown in the screenshot below:

<div align="center"><img src="/files/5PqHwICTlzled4WmBRyx" alt="" width="2000"></div>

<div align="center"><img src="/files/hO4SaAOGTdbhzSxt78Lq" alt="" width="2000"></div>

### Delete Multiple Excel Files

* To delete more than one file at a time, the user can select the radio buttons beside the respective files and click on delete icon to delete more than one file at a time.

  <div align="center"><img src="/files/p1hUcHNmawoXt8bx7f4d" alt="" width="2000"></div>
* To delete all the excel files at a time, the user can select the radio button in the Excel Files column.

## Export Excel

### Export Single Excel File

* The user can export the excel file by clicking on the export icon that appears on expanding the three dots icon as shown in the screenshot below:

  <div align="center"><img src="/files/5PqHwICTlzled4WmBRyx" alt="" width="2000"></div>
* On clicking the highlighted icon in the given screenshot, the excel file will be downloaded(zip file format).

  <div align="center"><img src="/files/BmLnr6Fj2ij8KMQC9tvW" alt="" width="2000"></div>

### Export Multiple Excel Files

* The user can select the radio buttons beside the respective files and click on export icon to export more than one file at a time.

  <div align="center"><img src="/files/oUMsYqftn1auw9PtsRVe" alt="" width="2000"></div>
* Similarly user can select the radio button in the Excel Files column to export all the files at once.


# Advanced Synchronization Scenarios

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>Comment Author Impersonation</strong></td><td><a href="/pages/2ym8kKKdDu6v9YNWUQpV">/pages/2ym8kKKdDu6v9YNWUQpV</a></td></tr><tr><td align="center"><strong>"Entity Type" and/or "Project" Change Synchronization</strong></td><td><a href="/pages/fWocZsHGz2uQzhWnX2C4">/pages/fWocZsHGz2uQzhWnX2C4</a></td></tr><tr><td align="center"><strong>Attachment &#x26; Inline Image/ File Synchronization</strong></td><td><a href="/pages/R40ExjaqRbr171YsXQIq">/pages/R40ExjaqRbr171YsXQIq</a></td></tr><tr><td align="center"><strong>Source Delete Synchronization</strong></td><td><a href="/pages/VS43yNXtb8qSUOPpmQDs">/pages/VS43yNXtb8qSUOPpmQDs</a></td></tr><tr><td align="center"><strong>Rule Based Routing</strong></td><td><a href="/pages/boG0cHOllQn4myzQeVPE">/pages/boG0cHOllQn4myzQeVPE</a></td></tr></tbody></table>


# Comment Author Impersonation

* <code class="expression">space.vars.OIM</code> supports the comment author impersonation, where the comment from the source system will be synced to the target system along with the comment author.
* For an example:
  1. Integration is configured for Epic entity from Jira to Azure DevOps. The Azure DevOps synchronization user has the required permission to perform the user impersonation.
  2. **User 1** added one comment in Jira Epic. As a part of the sync, the comment will be added to Azure DevOps via **User 1** (instead of the <code class="expression">space.vars.OIM</code> sync user).

## Supported systems

* Azure DevOps Services and Team Foundation Server
  * Please refer to [Team Foundation Server](/connectors/azure-devops) to learn about the required permissions for impersonating comment author.

## Configuration

* Enable the comment sync in the <code class="expression">space.vars.OIM</code> mapping. As a result, the comment sync will enable the comment's author impersonation without any additional configuration.


# "Entity Type" and/or "Project" Change Synchronization

## Overview

<code class="expression">space.vars.OIM</code> supports the synchronization of source "Entity type" and/or "Project" change by performing the following steps on the target entity:

1. Change the target "Entity type" and/or "Project", if the target system supports the conversion of the "Entity type" and/or "Project".
2. Deprecation of previously synced target entity and creation of new entity on the target if the target system doesn't support the conversion of the "Entity type" and/or "Project."

<div align="center"><img src="/files/TdjNc09M2ft51AFY43NM" alt="" width="800"></div>

* As a part of "Deprecation", the Logical Delete, Soft Delete or Archive operation will be performed on the entity.
  * In the "Logical Delete", the fields of the target entity can be marked with predefined values(configured from "Delete Mode" mapping of <code class="expression">space.vars.OIM</code>) to represent that the corresponding source entity's "Entity type" and/or "Project" is changed.
  * In the "Soft Delete", the entity will be deleted in the target, and will move to the recycle bin of the corresponding systems.
    * Currently, the "Soft Delete" is supported for Rally, Digital.ai Agility (Formerly known as VersionOne), and Team Foundation Server systems in <code class="expression">space.vars.OIM</code>.
  * In the "Archive operation", the entity will be archived in the corresponding systems.
    * Currently, the "Archive operation" is supported for Jira On Premise system in <code class="expression">space.vars.OIM</code>.

Furthermore, <code class="expression">space.vars.OIM</code> supports the synchronization of project structures (in which each project from that hierarchy can be synced to target project) via [Child Project Sync](/integrate/configure-integrations/integration-configuration#child-project-synchronization) feature. In such cases, if the project is restructured in the end system, and the entity from the new project structure is transformed to a different target project (other than the previously synchronized one), it will be categorized as project movement synchronization. Refer to [Synchronization with project hierarchy](#synchronization-with-project-hierarchy) for more details.

## Configuration Steps

* In order to perform the Deprecation in the target entity, "Delete Mode" mapping shall be configured in the mapping configuration of the older Entity type and/or Project's integration.
  * Refer to '[Delete Mode mapping configuration](/integrate/configure-integrations/mapping-configuration#delete-mode)' section for further details on "Delete Mode" mapping.
* If the "Delete Mode" mapping is not configured, then deprecation will be reflected in the sync report of <code class="expression">space.vars.OIM</code> only.

> **Note** : To distinguish between "Logical Delete" performed on target entity due to source delete synchronization or deprecation performed due to source entity's "Entity type" and/or "Project" change, some advanced mapping configurations can be used. Refer to [Differentiating source delete synchronization and deprecation](#differentiating-source-delete-synchronization-and-deprecation) section for further details on the same.

## Known Behaviors

* <code class="expression">space.vars.OIM</code> facilitates the synchronization of updates in the "Entity type" and/or "Project" to the target by performing the above pre-defined actions by default.
  * However, if the user does not want to change the "Project" once the entity is created in the target system, the "Create" option can be set in "Sync When?" setting of the 'Projects' field mapping. Refer to the [Restrict project update in target](#restrict-project-update-in-target) section for more details.
* If in the source system, the "Entity type" and/or "Project" are changed, and this new "Entity type" and/or "Project" are transformed to the same "Entity type" and/or "Project" of the target system (which is previously synchronized), such scenario would not be considered as entity movement. Refer to [Synchronization with flat project mapping](#synchronization-with-flat-project-mapping) for more details.
* To synchronize the source entity's "Entity type" and/or "Project" changes, the integration user for the target system must have read and write permission on previously synced(having older entity type/project) entities.

### When the target system doesn't support the "Entity type" and/or "Project" change

* <code class="expression">space.vars.OIM</code> will perform the following operations:

  1. Previously synced entities will be marked deprecated based on the "Delete Mode" mapping configured of older "Entity type" and/or "Project"'s integration.

  > **Note**: If the integration associated with the older "Entity type" and/or "Project" is not available, then the delete mode mapping configured in the integration related to new "Entity type" and/or "Project" will be considered.

  2. A new entity will be created based on the current data of the source entity.
  3. If the comments are mapped in the mapping, ['OpsHub-020404' or 'OH-Connector-06201'](/help-center-index/troubleshooting-index/errors-index/common-error-solutions/opshub-020404) error will be observed temporarily in the sync.
* If the source entity is restored to the older "Entity type" and/or "Project", it will be treated as a new change on that source entity. As a result, deprecation and new creation of the entity will be performed in the target system.
* <code class="expression">space.vars.OIM</code> has integration configurations, involving multiple systems:

<div align="center"><img src="/files/gQLnz00dxJIbdhkmoTvi" alt="" width="900"></div>

* Here, if the "Entity type" and/or "Project" are changed in the source system, "Endpoint 1":
  * If both the target systems, "Endpoint 2", and "Endpoint 3" support the conversion, the "Entity type" and/or "Project" conversions will be performed in the target systems.
  * If "Endpoint 3" supports the conversion but "Endpoint 2" does not, the change will not be updated in "Endpoint 3".
    * In this case, the deprecation and creation of the entity will take place at "Endpoint 2". There will be a standard create/update sync from "Endpoint 2" to "Endpoint 3".
    * To reflect the deprecated entity from "Endpoint 2" to "Endpoint 3", [source delete synchronization](/integrate/advanced-sync-scenario/source-delete-synchronization) can be configured if the entity is deleted in "Endpoint 2".
* Deprecated entity is not applicable for further synchronization by <code class="expression">space.vars.OIM</code>:
  * Deprecated entities will not be fetched from any other integration configuration.
  * If there is any failure on the target entity, which is going to be deprecated, <code class="expression">space.vars.OIM</code> will delete the failures on that entity.

### When the target system supports the "Entity type" and/or "Project" change

* When <code class="expression">space.vars.OIM</code> contains a single "Entity type" and/or "Project" to multiple "Entity types" and/or "Projects" integration configurations:
  * For the older "Entity type" and/or "Project":
    * The last updated entity by <code class="expression">space.vars.OIM</code> is applicable for conversion, and the rest entities will be deprecated as shown:

<div align="center"><img src="/files/VittWb7LxsZ88F3Fvyy7" alt="" width="900"></div>

```
- In the above example, a "Bug" has been synced as "Defect" and "Problem" in the target, and "Problem" was last updated. Now, "Bug" is converted to "Story". <code class="expression">space.vars.OIM</code> will convert "Problem" to "Story" and deprecate "Defect".
```

* For the newer "Entity type" and/or "Project":
  * The integration which fetches the updated entity first will perform the type/project change in the target. Others will do normal create/update.

<div align="center"><img src="/files/ZTjJN4rg1fjrs7RoBE7u" alt="" width="900"></div>

```
- In this example, "Bug" → "Story", first fetched by "Story - Story" integration. So "Defect" → "Story" and a new "Requirement" is created by "Story - Requirement" integration.
```

* If the "Entity type" and/or "Project" has been updated multiple times immediately, and the integration relevant to each is present in <code class="expression">space.vars.OIM</code>, some interim conversions may get skipped if not fully fetched:

<div align="center"><img src="/files/jzSaWQs9a4iE2nd0sKp1" alt="" width="900"></div>

* In this case: "Bug" → "Story" → "Requirement" → "Feature"
  * If "Requirement" update is not fetched, result is "Bug" → "Story" → "Feature". The skipped steps will be missed.

### Processing Failures

* If the entity being updated has a failure in the integration of the older type/project, sync of update will be blocked until that failure is resolved.

## Differentiating source delete synchronization and deprecation

* In Source Delete Synchronization, "Event Type" = `OH Delete`.
* In source type/project change, "Event Type" = `Create` or `Update`.
* Advanced mapping logic can differentiate:

```xml
<Status>
  <xsl:variable xmlns:xsl="http://www.w3.org/1999/XSL/Transform" name="eventType" select="SourceXML/opshubEventType"/>
  <xsl:choose xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:when test="$eventType='OH Delete'">
      <xsl:value-of select="'Deleted due to deletion in the Source'"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="'Deprecated due to type change'"/>
    </xsl:otherwise>
  </xsl:choose>
</Status>
```

## Restrict project update in target

* If the user wants to restrict the project changes in the target system:
  * The field representing the project in the end system such as "Projects" (or "Rally Projects" for the Rally system), must be mapped within the mapping configuration.
  * Select "Create" option in "Sync When?" setting.
* The project mapping is defined at the integration level in <code class="expression">space.vars.OIM</code>. If there are no intended modifications in the project field's value mapping, the "Same as Integration" option within the value mapping can be used. This will avoid redundant project value mappings for the "Projects" field.
* By performing the above configurations, <code class="expression">space.vars.OIM</code> will synchronize the source updates to the target (on the previously synchronized entity) without altering the project, i.e.,
  * Configurations in <code class="expression">space.vars.OIM</code> are as follows:

| Integration Configuration |           |               |                |           | Mapping Configuration |               |                      |                |
| ------------------------- | --------- | ------------- | -------------- | --------- | --------------------- | ------------- | -------------------- | -------------- |
| **Endpoint 1**            |           | **Direction** | **Endpoint 2** |           | **Endpoint 1 field**  | **Direction** | **Endpoint 2 field** | **Sync When?** |
| Entity Type               | Project   |               | Entity Type    | Project   |                       |               |                      |                |
| Defect                    | Project A | Forward       | Bug            | Project B | Projects              | Forward       | Projects             | Create         |
| Defect                    | Project C | Forward       | Bug            | Project D |                       |               |                      |                |

* Here, if the project of the Defect entity SE1 is updated to 'Project C' in Endpoint 1, <code class="expression">space.vars.OIM</code> will synchronize this update to the Bug of Project B, i.e., TE1 in Endpoint 2 (instead of updating the project to Project D):

<div align="center"><img src="/files/tyXTVO4Zn0WzRv3hmS6R" alt="" width="900"></div>

## Known behaviors

* Updates on the 'Entity Type' will not be restricted with this configuration. Refer to [Entity Type update with project update restriction](#entity-type-update-with-project-update-restriction) section for more details.
* It is recommended to select the same "Sync when?" option in both directions of the 'Projects' field mapping. If different options are chosen, it may lead to duplicate entities in the end system. Refer to [Different "Sync When" options per direction with project update restriction](#different-sync-when-options-per-direction-with-project-update-restriction) section for more details.
  * However, if the user wants to synchronize project updates from Endpoint 1 to Endpoint 2 (where the entity is unique across projects), but restricts the project updates from Endpoint 2 to Endpoint 1 (as Endpoint 1 is the master system for synchronization), it's acceptable for both directions to have different "Sync When?" options.
    * Refer to [Different "Sync When" option for master system with project update restriction](#different-sync-when-option-for-master-system-with-project-update-restriction) section for more details.
* The project update restriction cannot be enabled for the configuration of a single "Entity type" and/or "Project" to multiple "Entity types" and/or "Projects". Refer to [Single entity to multiple entities sync with project update restriction](#single-entity-to-multiple-entities-sync-with-project-update-restriction) section for more details.
  * If the source entity was previously synchronized to multiple "Entity Types" and/or "Projects" of the target system, enabling this setting will ensure that all subsequent synchronizations of that entity will be performed on the most recently updated active entity in the specified target system.
    * Refer to [Syncing the older entity to multiple entities with project update restriction](#syncing-the-older-entity-to-multiple-entities-with-project-update-restriction) section for more details.

## Use Cases

### Entity Type update with project update restriction

* Configurations in <code class="expression">space.vars.OIM</code> are as follows:

| Integration Configuration |           |               |                |           | Mapping Configuration |               |                      |                |
| ------------------------- | --------- | ------------- | -------------- | --------- | --------------------- | ------------- | -------------------- | -------------- |
| **Endpoint 1**            |           | **Direction** | **Endpoint 2** |           | **Endpoint 1 field**  | **Direction** | **Endpoint 2 field** | **Sync When?** |
| Entity Type               | Project   |               | Entity Type    | Project   |                       |               |                      |                |
| Defect                    | Project A | Forward       | Bug            | Project B | Projects              | Forward       | Projects             | Create         |
| Defect                    | Project C | Forward       | Story          | Project D |                       |               |                      |                |

* Here, if the project of the Defect entity SE1 is updated to 'Project C' in Endpoint 1, <code class="expression">space.vars.OIM</code> will synchronize this update to the Bug entity of Project B, i.e. TE1 in Endpoint 2 by modifying the Entity Type to 'Story':

<div align="center"><img src="/files/n5VGl83bffU4CNhWoh00" alt="" width="900"></div>

* If the Endpoint 2 does not support the "Entity Type" modification, then it will mark the Entity TE1 as deprecated and create a new entity TE2 in the Project B of Endpoint 2.

### Different "Sync When" options per direction with project update restriction

* Configurations in <code class="expression">space.vars.OIM</code> are as follows:

| Integration Configuration |           |               |                |           | Mapping Configuration |               |                      |                |
| ------------------------- | --------- | ------------- | -------------- | --------- | --------------------- | ------------- | -------------------- | -------------- |
| **Endpoint 1**            |           | **Direction** | **Endpoint 2** |           | **Endpoint 1 field**  | **Direction** | **Endpoint 2 field** | **Sync When?** |
| Entity Type               | Project   |               | Entity Type    | Project   |                       |               |                      |                |
| Defect                    | Project A | Bidirectional | Bug            | Project B | Projects              | Forward       | Projects             | Create         |
| Defect                    | Project C | Bidirectional | Bug            | Project D | Projects              | Backward      | Projects             | Both           |

* Here, if the project of the Defect entity SE1 is updated to 'Project C' in Endpoint 1, <code class="expression">space.vars.OIM</code> will synchronize this update to the Bug of Project B, i.e., TE1 in Endpoint 2.
* Afterwards, if the Bug entity TE1 is updated in the Endpoint 2, it will create a new Defect entity in 'Project A' of Endpoint 1, i.e., SE2:

<div align="center"><img src="/files/afKmlzC7uaiHg9Orzigl" alt="" width="900"></div>

* Hence, for one Endpoint 2 entity, i.e., TE1, there will be two entities in Endpoint 1, i.e., SE1 and SE2.

### Different "Sync When" option for master system with project update restriction

* The synchronization is configured between Jira and Rally systems, where Jira is the master system.
  * The entities are unique across the projects of the same workspace in Rally.
  * The projects of the same workspace are configured in <code class="expression">space.vars.OIM</code>.
* Configurations in <code class="expression">space.vars.OIM</code> are as follows: **Integration Configuration** (Left) | **Mapping Configuration** (Right)

| Jira Entity Type | Project     | Direction     | Rally Entity Type | Project     | Jira Field         | Direction     | Rally Field    | Sync When? |
| ---------------- | ----------- | ------------- | ----------------- | ----------- | ------------------ | ------------- | -------------- | ---------- |
| Defect           | Project A   | Bidirectional | Bug               | Project B   | Rally Project Enum | Bidirectional | Projects       | Both       |
| Defect           | Project A   | Bidirectional | Bug               | Project C   | Projects           | Backward      | Rally Projects | Create     |
| Defect           | Project D   | Bidirectional | Bug               | Project E   | Projects           | Forward       | Rally Projects | Both       |
| (continued)      | (continued) | (continued)   | (continued)       | (continued) | Projects           | Backward      | Rally Projects | Create     |

* If the project of the Defect entity SE1 is updated to 'Project D', <code class="expression">space.vars.OIM</code> will synchronize this update by updating the project of Rally Bug entity TE1 to 'Project E'.
* If the project of the Bug entity TE2 is updated to 'Project E', <code class="expression">space.vars.OIM</code> will synchronize this update to Jira Defect entity SE2 of Project A in Endpoint 1 without modifying its project:

<div align="center"><img src="/files/QNeZR9XTaWL5quMRvHLE" alt="" width="900"></div>

### Single entity to multiple entities sync with project update restriction

* Synchronize the Defect entity of Endpoint 1 as Bug entity in two different projects of the Endpoint 2
* Configurations in <code class="expression">space.vars.OIM</code> are as follows: **Integration Configuration** (Left) | **Mapping Configuration** (Right)

| Endpoint 1  | Project   | Direction | Endpoint 2  | Project   | Endpoint 1 Field | Direction | Endpoint 2 Field | Sync When? |
| ----------- | --------- | --------- | ----------- | --------- | ---------------- | --------- | ---------------- | ---------- |
| Entity Type | Project   |           | Entity Type | Project   |                  |           |                  |            |
| Defect      | Project A | Forward   | Bug         | Project B | Projects         | Forward   | Projects         | Create     |
| Defect      | Project A | Forward   | Bug         | Project C |                  |           |                  |            |

* The Defect entity SE1 of the Project A in Endpoint 1 will be synchronized as a Bug entity TE1 in 'Project B' of Endpoint 2 via Integration 1 and Integration 2. So, there will be no entity corresponding to SE1 in the 'Project C' of the Endpoint 2:

<div align="center"><img src="/files/l3EzNXZj98EK4QoqjfXh" alt="" width="900"></div>

### Syncing the older entity to multiple entities with project update restriction

* The old and new configurations in <code class="expression">space.vars.OIM</code> are as follows:

| **Configurations** | **Integration Configuration** |                        |               |                            |                        | **Mapping Configuration** |               |                      |                |
| ------------------ | ----------------------------- | ---------------------- | ------------- | -------------------------- | ---------------------- | ------------------------- | ------------- | -------------------- | -------------- |
|                    | **Endpoint 1 Entity Type**    | **Endpoint 1 Project** | **Direction** | **Endpoint 2 Entity Type** | **Endpoint 2 Project** | **Endpoint 1 Field**      | **Direction** | **Endpoint 2 Field** | **Sync When?** |
| **Old**            | Defect                        | Project A              | Forward       | Bug                        | Project B              | Projects                  | Forward       | Projects             | Both           |
| **Old**            | Defect                        | Project A              | Forward       | Problem                    | Project C              |                           |               |                      |                |
| **New**            | Defect                        | Project D              | Forward       | Bug                        | Project E              | Projects                  | Forward       | Projects             | Create         |

* Here, the Defect entity SE1 of Endpoint 1 will be synchronized in Endpoint 2 as Bug in Project B (TE1) and as a Problem entity in Project C (TE2).
* If the project of the Defect entity SE1 is updated to 'Project D', <code class="expression">space.vars.OIM</code> will synchronize this update to TE2 of Project C (the last updated entity) in Endpoint 2 by modifying the Entity Type from 'Problem' to 'Bug' and deprecate the older entity TE1 (to avoid orphan entities) in Endpoint 2:

<div align="center"><img src="/files/F7zCukCYN890zVxJRLk3" alt="" width="900"></div>

* If the Endpoint 2 does not support the "Entity Type" modification, it will mark the Entity TE1 and TE2 as deprecated and create a new entity TE3 in the target project B.

### Project Restructuring Use Cases

#### Synchronization with project hierarchy

* Configurations in <code class="expression">space.vars.OIM</code> are as follows:

<div align="center"><img src="/files/B1U5ZtNnWSYAxvqZJs7T" alt="" width="900"></div>

* Here, the entity SE1 of Child Project 1 is synchronized to 'Target Project 1' as TE1.
* If the 'Child Project 1' is moved under 'Parent Project 2' in Endpoint 1, <code class="expression">space.vars.OIM</code> will synchronize the SE1 either by updating the project of TE1 to 'Target Project 2' (if Endpoint 2 supports project update) or create a new entity TE2 in 'Target Project 2' and deprecate TE1 (if Endpoint 2 does not support project update).

#### Synchronization with flat project mapping

* Configurations in <code class="expression">space.vars.OIM</code> are as follows:

<div align="center"><img src="/files/Do0DjAz0JBIJ4pwlpBwk" alt="" width="900"></div>

* Here, the entity SE1 of Child Project 1 is synchronized to 'Target Project' as TE1.
* If 'Child Project 1' is moved under 'Parent Project 2', <code class="expression">space.vars.OIM</code> will synchronize the SE1 to TE1 without updating its project (as the new transformed project is same as the previously synchronized project).


# Inline Image or File Synchronization

## Overview

<code class="expression">space.vars.OIM</code> supports the synchronization of images and files across end systems in fields, comments, and as attachments on the entity.

* There are certain types of end systems based on how they add images/ files on their entity fields and comments.

1. **Entity Storage:**
   * Upon adding an image/ file to rich text fields, the same image/ file is also added as an attachment to the entity.
   * Example: If image/ file is added to rich text field in Rally, the same image/ file will be visible in attachment section of the entity.
   * Entity Storage Systems: Rally, Jira, OpenText ALM Quality Center (Formerly Micro Focus ALM/QC), qTest, DOORS NG, ServiceNow, Codebeamer, Windchill, TestRail, OpenText ALM Octane, Enterprise Architect, Aha!, Redmine
2. **Server Storage:**
   * Upon adding an image/ file to rich text fields, they are uploaded to an end system location itself, but the image/ file will not be added as an attachment to the entity.
   * Example: If image/ file is added to rich text field in Azure DevOps, this image/ file will not be visible in attachment section of entity. Instead, it will be uploaded to an end system.
   * Server Storage Systems: Version one, Jama, Aras, Readyone, Salesforce, ETM, DOORS, Hubs=Spot, Azure DevOps
3. **Base64 Storage:**
   * Upon adding an image/ file to rich text fields, they are not uploaded anywhere. The raw data itself is encoded in Base64 and is set in the rich text field. Image/ file will not be added as an attachment on the entity.
   * Example: If image/ file is added to rich text field in Broadcom Clarity, image/ file will not be uploaded anywhere. Also, it will not be added as attachment on the entity.
   * Base64 Storage Systems: Broadcom Clarity
4. **Field Storage:**
   * Upon adding an image/ file to a rich text field (such as the Test Step field), it is stored only within that specific field. It is not stored at the entity level or server level.
     * This means the attachment is linked directly to the field where it is added (field-level storage).
   * Example: If an image/ file is added to the Test Step field of a Test entity in Jira Xray (Cloud), it will be visible only in the attachment section of that Test Step field.
   * Field Storage System: Jira Xray (Cloud) – Test Step field of Test entity

<div align="center"><img src="/files/1xmEpI0rhk5aCLSQXG8k" alt="Step with Attachment" width="500"></div>

## Image/ File Synchronization Behavior with Storage Combinations

### Server/ Base64 Storage System Combinations

<div align="center"><img src="/files/oawNAxUZ4Oy1vk6MyXt9" alt="" width="800"></div>

* Between server/ base64 and server/ base64 storage combination systems, if an inline image/ file is added to the entity upon synchronization by <code class="expression">space.vars.OIM</code> as shown in the above image, it will be similar to the way image/ file is added to the source end system entity, i.e., it will only be added on inline field/ comment.

### Entity Storage System Combinations

<div align="center"><img src="/files/vM7MvMcnT4CTMIJ2UpMx" alt="" width="800"></div>

* Between entity and entity storage combination systems, if an inline image/ file is added to the entity, upon synchronization by <code class="expression">space.vars.OIM</code> as shown in the above image, it will be similar to the way image/ file is added to the source end system entity, i.e., it will be added on inline field/ comment and also as an attachment on the entity.
  * Due to the entity storage system's behavior of auto-adding the image/ file as an attachment to the entity regardless of whether attachment synchronization is enabled/ disabled in mapping. <code class="expression">space.vars.OIM</code> will also add the attachment on the entity to synchronize the image/ file.

### Server/ Base64 Storage and Entity System Combinations

![](/files/bOpbs6fQyQ46eYEYaQSr)

* Between server/ base64 and entity storage combination systems, if an inline image/ file is added to the entity, upon synchronization by <code class="expression">space.vars.OIM</code> above shown image will be the way image/ file will be added to the entity.
  * When the entity storage system is the target, <code class="expression">space.vars.OIM</code> will auto-add the image/ file as an attachment to the entity.
  * When server/ base64 storage system is the target, <code class="expression">space.vars.OIM</code> will not auto-add the image/ file as an attachment to an entity. It will only be added in the rich text field/ comment.
  * View parity between these storage combinations will be due to end-system behavior differences.

## Image/ File Synchronization Behavior with Text Fields/ Comments

* In the case of a Text type field/ comment, we cannot add renderable images/ files.
  * Hence, we will add a custom tag with the uploaded image/ file URL and the filename of the uploaded image/ file.

```xml
<InlineFile src="https:://opshub.jamacloud.com/attachment/1193337/img1.png">img1.png</InlineFile>
```

* In case of backward synchronization of such fields:
  * The original uploaded image to the original source will be preserved. i.e., in backward synchronization, we will ensure that the renderable source image is not removed.
    * For Base64 end systems, since a custom tag was not added in backward sync, the original image added to the source entity will be removed.

> **Note:** If the target end system is Base64 storage and the mapped field is text type, then bidirectional mapping with a rich text field is not advisable due to the removal of the image at the source field

## Image/ File Synchronization Behavior with Target end system not supporting Inline Synchronization

* In case the target end system does not support inline synchronization, and an inline image/ file is added to the source entity rich text field/ comment, then upon synchronization by <code class="expression">space.vars.OIM</code>, below mentioned will be the behavior:
  * Data synchronized to the target entity will not have any renderable images/ files or opshub custom tags for image/ file when it is not a renderable field/ comment.
  * Images/ files will be uploaded to the entity as attachments.
  * In backward synchronization, from such end systems, the originally added images/ files will be removed from the fields.

## Image/ File Synchronization Behavior with Comment

* If a comment has been synchronized by <code class="expression">space.vars.OIM</code> with an inline image/ file, the target comment will also have the image/ file.
  * Now, even if the comment is deleted in the source end system, the image/ file will persist in the target comment and also as an attachment on the entity in case it is an entity storage end system.

## Attachment and Inline Image Synchronization with Field Storage

#### Applicable to following systems:

* Jira Xray cloud, Jama and Codebeamer

Other systems may require additional customization to handle step level attachments and inline images. Please refer to connector documentation for more details.

### Pre-requisite

* Attachment mapping must be enabled in <code class="expression">space.vars.OIM</code> to synchronize step level attachments.
  * Attachment type will be auto-mapped based on field configuration in mapping to sync step level attachment. For more details, refer [Auto-mapping of Attachment type](#auto-mapping-of-attachment-type).
* No pre-requisite to synchronize step level inline images.

### General Behaviors:

* Format conversion of step-level fields (except additional step-level fields) is automatically managed by the system.
* Only the additional step-level fields (which may vary from system to system) need to be handled explicitly in the mapping XSLT, as done earlier.
* When a test-step type field with attachments is synced from a field storage system (Jira Xray Cloud) to an entity/server storage system (Jama or Codebeamer), the attachment is stored at the entity level in Jama/Codebeamer.

#### Step field data synchronization based on mapping configuration

| Mapping Configuration                                    | Behavior                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 'Step' field is mapped & 'Attachment' mapping is enabled | Steps with attachment and inline images will be synchronized.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| Only 'Step' field is mapped                              | Steps with inline images will be synchronized. Attachments will not be synchronized.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| Only 'Attachment' mapping is enabled                     | <p>If previously 'Step' field mapping was configured & now removed from mapping, given attachment is enabled now, the attachment types won't be removed from attachmet mapping. However, as Step field is not mapped now, no new attachment will be synced at step level, they will only be synced at entity level. If there is any update on already synced steps attachment, they will be synced and no impact on them.<br>If Step field is not mapped and only attachment mapping is enabled, then attachment will be synced at entity level and no action will be performed at step level.</p> |

#### Auto-mapping of Attachment type

* To sync the step level attachment, the attachment mapping must be enabled in the OIM mapping configuration. This is the only action which is required from the end user.
* Fields, which provide field level storage for attachments, will be shown as attachment type in the attachment mapping in OIM.
* The attachment types will be auto mapped based on 2 triggering events
  * Configuring field level storage field like 'Step' field mapping
  * Enabling 'Attachment' mapping
  * For example, I have mapped the step field in the mapping, and later I am enabling the attachment or attachment is already enabled, and now I am mapping the step fields in the mapping.
* In cases where a single source field is mapped to multiple target fields, and all these fields exist in their respective attachment type lists, the attachment type will be auto-mapped for the first field mapping; the rest will be discarded.
* For example:
  * Source field: TestSteps
  * Target fields: Step1, Step2
  * Field mapping: TestSteps <-> Step1 TestSteps -> Step2
  * For above-mentioned mapping configuration, following attachment types will be auto-mapped
    * TestSteps <-> Step1
* If 'Step' field mapping is removed, the corresponding attachment type mapping will be retained to ensure that already synced step attachments remain unaffected.
* It is recommended to validate the attachment type mapping for any complex use case.

#### Attachment Synchronization

| Source Storage | Target Storage        | Behavior                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| -------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Field Storage  | Field Storage         | Attachment is added to the field.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| Field Storage  | Entity/Server Storage | <p>Attachment is added to the entity.<br>For the end systems, where field level attachments are not supported, attachments associated with a particular step are included in the Description sub-field of that step. So user will know that which attachments are a part of step from entity level attachments. However, this is just plain text data for reference point of view, not a link to those attachments.<br><br>For example: two attachments are added for step 1 & one attachment is added for step 2 to the entity, step content will be as followed:<br>Step 1 description: “step 1 text data \<Attachments: image1.png, file1.pdf>”<br>Step 2 description: “step 2 text data \<Attachments: file2.txt>”<br><br>It is suggested to keep <code class="expression">space.vars.OIM</code> added content at the end of original content during modification; however, synchronization will not be impacted regardless of its placement.</p> |

#### Inline Image/File Synchronization

| Source Storage | Target Storage        | Behavior                                                                                     |
| -------------- | --------------------- | -------------------------------------------------------------------------------------------- |
| Field Storage  | Field Storage         | Attachment is added to the field and its reference is added in the field content.            |
| Field Storage  | Entity/Server Storage | Attachment is added to the entity or server and its reference is added in the field content. |

## Synchronization Behavior

Following are the **Before** and **After** behaviors for the given scenarios:

| **Serial No.** | **Scenario**                                                                                                                                                                                                                    | **Source Applicable To** | **Target Applicable To** | **Behavior before 7.195**                                                                                                                                                                                                                                   | **Behavior after 7.195**                                                                                                                                                                                                                                                                                  |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1              | <p>- Create entity with no attachment or inline images<br>- Add inline image to entity & start synchronization</p>                                                                                                              | Entity Storage           | Server Storage           | <p>- An image will be uploaded twice, one as attachment & second as inline image<br>- Due to re-upload of image, one image of source will be in sync with multiple target images</p>                                                                        | - An image will be uploaded on server & will be referred in rich text field                                                                                                                                                                                                                               |
| 1 (contd.)     |                                                                                                                                                                                                                                 | Entity Storage           | Entity Storage           | - An image will be added to entity as attachment & will be referred in rich text field                                                                                                                                                                      | Same                                                                                                                                                                                                                                                                                                      |
| 2              | <p>- Create entity with no attachment or inline image<br>- Add comment with inline image & start synchronization</p>                                                                                                            | Entity Storage           | Server Storage           | <p>- First, image will be added as attachment<br>- When the image is detected as inline image, the same will be removed from the attachment<br>- A new image will be uploaded as the inline image. It will be referred from rich text field or comment.</p> | Same                                                                                                                                                                                                                                                                                                      |
| 3              | <p>- Create entity with one attachment<br>- Add the same file in rich text field</p>                                                                                                                                            | ALL                      | ALL                      | Same                                                                                                                                                                                                                                                        | Same                                                                                                                                                                                                                                                                                                      |
| 4              | <p>- If the rich text field was not mapped previously and it had inline images<br>- After few revisions, rich text field is mapped</p>                                                                                          | ALL                      | ALL                      | - No image was added in target, OH\_IMG tag was added with a unique code                                                                                                                                                                                    | - Field will have inline images in target                                                                                                                                                                                                                                                                 |
| 5              | <p>- Create entity with multiple same name images referred in single rich text field & synchronize to target<br>- Update target entity & start other way synchronization</p>                                                    | ALL                      | ALL                      | - All same named images will be mapped to one source image                                                                                                                                                                                                  | - Despite matching file names, a one-to-one mapping between source and target images will be preserved                                                                                                                                                                                                    |
| 6              | <p>- Create entity with same image referred in two or more rich text fields<br>- Update the content of image<br>- In later revision, both rich text field has some text appended</p>                                            | ALL                      | ALL                      | <p>- Inline image will be updated twice<br>- Due to re-upload, one image of source will be in sync with multiple target images</p>                                                                                                                          | - Inline image will be updated only once                                                                                                                                                                                                                                                                  |
| 7              | <p>- HTML type of field is mapped with text field in target<br>- Source field has an inline image</p>                                                                                                                           | ALL                      | Server Storage           | <p>- Two images will be uploaded, one as external image in target system and other as attachment on entity<br>- In target text field, it will be shown as <code>\<ImageTag>Img1.png\</ImageTag></code></p>                                                  | <p>- One image will be uploaded in the target system and this will not be visible in attachment section of entity<br>- In target text field, it will be shown as <code>\<ImageTag src=”Server storage uploaded URL”>Img1.png\</ImageTag></code></p>                                                       |
| 7 (contd.)     |                                                                                                                                                                                                                                 | ALL                      | Entity Storage           | <p>- Attachment will be uploaded twice<br>- In target text field, it will be shown as <code>\<ImageTag>Img1.png\</ImageTag></code></p>                                                                                                                      | <p>- Attachment will be visible in attachment section of entity.<br>- In target text field, it will be shown as <code>\<ImageTag src=”Attachment URL”>Img1.png\</ImageTag></code></p>                                                                                                                     |
| 7 (contd.)     |                                                                                                                                                                                                                                 | ALL                      | Base64 Storage           | - Inline image with base64 storage is not supported                                                                                                                                                                                                         | <p>- Target text field will have <code>\<ImageTag>Img1.png\</ImageTag></code><br>- Image will not be uploaded to attachment or anywhere. Instead, an image tag with filename will be created</p>                                                                                                          |
| 8              | <p>- Same source field is mapped to two different fields in target & one of them is a text field and other one is a rich text field<br>- Source field has inline image</p>                                                      | ALL                      | Server Storage           | <p>- Image will be synchronized both as inline image for rich text field and as attachment to the target entity<br>- Rich text field has inline image<br>- Text field has <code>\<ImageTag>Img1.png\</ImageTag></code><br>- Entity has attachment</p>       | <p>- Rich text field will have inline image<br>- Text field will have <code>\<ImageTag src = ”Server storage uploaded URL”>Img1.png\</ImageTag></code><br>- Image will be uploaded to external server and will be referred in these 2 fields</p>                                                          |
| 8 (contd.)     |                                                                                                                                                                                                                                 | ALL                      | Entity Storage           | <p>- Rich text field will have inline image<br>- Text field will have <code>\<ImageTag src= ”Attachment URL”>Img1.png\</ImageTag></code><br>- The entity will have only the attachment due to the implicit behaviour of Entity Storage Connector</p>        | Same                                                                                                                                                                                                                                                                                                      |
| 9              | <p>- Create entity with no attachment or inline image<br>- Add comment with inline image & start synchronization<br>- Target end system does not support inline image in comments</p>                                           | ALL                      | Server Storage           | <p>- Same image will be uploaded twice to the end system<br>- Attachment will be added to the entity also</p>                                                                                                                                               | <p>- First, image will be added as attachment<br>- When the image is detected as inline image, the same will be removed from attachment & image will be uploaded to server again<br>- The comment will be added with <code>\<ImageTag src = ”Server storage uploaded URL”>Img1.png\</ImageTag></code></p> |
| 9 (contd.)     |                                                                                                                                                                                                                                 | ALL                      | Entity Storage           | <p>- First, image will be added as attachment to entity<br>- When the image is detected as inline image, a comment will be added with <code>\<ImageTag src = ”Attachment URL”>Img1.png\</ImageTag></code></p>                                               | Same                                                                                                                                                                                                                                                                                                      |
| 10             | <p>- Comment synchronization is enabled<br>- Rich text field is mapped to text field in target<br>- Both have same inline image</p>                                                                                             | Entity Storage           | Server Storage           | <p>- Image will be uploaded to server system & text field data added with <code>\<ImageTag src = ”Server storage uploaded URL”>Img1.png\</ImageTag></code><br>- Comment will be added with referred inline image</p>                                        | Same as before                                                                                                                                                                                                                                                                                            |
| 11             | <p>- Source HTML field is mapped to target text field<br>- Create entity with inline image & synchronize<br>- Update target text field & start reverse synchronization (from target to source)</p>                              | ALL                      | Base64 Storage           | - Inline image with base64 storage is not supported                                                                                                                                                                                                         | <p>- If same name image is found in source entity, it will be replaced with source URI<br>- In case, image with same name is not found, the image will be removed from the source entity</p>                                                                                                              |
| 12             | <p>- Create entity with rich text field having image 1<br>- In next revision, image 2 is uploaded on the same field<br>- If the events fail and are in retry but image 1’s base64 data is missing from the write-side cache</p> | Base64 Storage           | ALL                      | - Inline image with base64 storage is not supported                                                                                                                                                                                                         | <p>- Base64 content for image 1's hashcode will be queried in source entity<br>- Since, it is no longer present on entity now, image 1 will not be synchronized<br>- In the next revision, image 2 will be synchronized</p>                                                                               |


# Source Delete Synchronization

## Overview

* <code class="expression">space.vars.OIM</code> supports the synchronization of sync-abandoned source entities by performing Logical delete, Soft delete, or Archive operation on the target entity.
  * An entity will be treated as sync-abandoned in the following cases:
    1. <code class="expression">space.vars.OIM</code> is unable to access that entity due to insufficient permission or its deletion.
       * Such entities are categorized as "Not Accessible" in the integration sync report.
    2. Sometimes, the entity is no longer a part of synchronization in <code class="expression">space.vars.OIM</code>, then also it will be treated as sync-abandoned entity, i.e.,
       * Modification of project and/or entity type of an entity in the end system leads to its exclusion from the synchronization, when the configuration related to updated entity type and/or project:
         1. Does not exist in <code class="expression">space.vars.OIM</code>.
         2. Exists with specified criteria but the entity no longer meets the criteria.
       * Such entities are categorized as "Not Applicable" in the integration sync report.
  * In the "Logical Delete", some of the fields of the target entity is updated with some fixed values to represent that the corresponding source entity is deleted.
  * In the "Soft Delete", the target entity will be deleted in the target, which can go to the recycle bin of the corresponding systems.
    * Currently, the "Soft Delete" is supported for the Aha, Rally, Team Foundation Server, VersionOne, Doors, Salesforce, Codebeamer and Monday.com systems in <code class="expression">space.vars.OIM</code>. For further details on the same, please refer to connector documentation of systems.
  * In the "Archive operation", target entity will be archived in the corresponding systems.
    * Currently, "Archive" is supported in **Jira data center** and Monday.com systems.

## Configuration Steps

1. Configure '[Enable Delete Sync](/integrate/configure-integrations/integration-configuration#enable-delete-sync)' in the advance configuration panel of the integration.
2. Upon '[Enable Delete Sync](/integrate/configure-integrations/integration-configuration#enable-delete-sync)' configuration, Soft Delete or Archive operation will be performed by default based on target system behavior.
   * To perform only logical delete, configure the '[Delete Mode](/integrate/configure-integrations/mapping-configuration#delete-mode)' mapping for the corresponding fields, setting the default value to 'No' in the '[Delete Mode](/integrate/configure-integrations/mapping-configuration#delete-mode)' mapping.
   * If the target end system supports both Soft Delete and Archive operations, Soft Delete will be performed by default. Otherwise, deletion will be performed as per the '[Delete Mode](/integrate/configure-integrations/mapping-configuration#delete-mode)' mapping.

## Known Behaviors

* This configuration needs to be performed for each entity pair configured in the integration group.
* If the source entity is restored somehow in the end system, in that case, the further updates on that entity will be synchronized under the configuration done for the regular synchronization of the "Create"/"Update" events.
* If the access of the integration user is revoked from some set of entities, then those entities will be considered as deleted for that integration user. Therefore, they will be considered for the Source Delete synchronization. Once access is being given to those entities, they would remain in sync and the behavior of the synchronization would be similar to the restoration of the entity in the source.
* If the '[Delete Mode](/integrate/configure-integrations/mapping-configuration#delete-mode)' mapping gets updated, then the earlier synchronized data cannot be reconciled as per the new "Delete Mode" configuration.
* If the Delete event is synchronized for the source entity, for which <code class="expression">space.vars.OIM</code> has recreated the entity in the target as per 'Recreate' configuration of '[Action on Entity Deleted in Target](/integrate/configure-integrations/integration-configuration#action-on-entity-deleted-in-target)' advanced setting, then in the '[Integration Sync Report](/help-center-index/troubleshooting-index/integration-sync-report)', the already deleted entity will be in the 'Active' state.
* If **Synchronize Not Applicable Entities** is configured with **Yes** input:
  * <code class="expression">space.vars.OIM</code> will meticulously scan all the configurations between relevant source and target systems. Consequently, there's a risk of erroneously identifying entities as not applicable under certain circumstances:
    * Criteria configuration will be updated in any dormant integration configuration related to the updated entity type or project.
      * In this case, <code class="expression">space.vars.OIM</code> will consider the criteria set during the delete synchronization, which can lead to misidentification in the following cases:
        * Even if an entity meets the criteria (to be updated in the dormant configuration), it will still be flagged as "Not Applicable" because it didn't meet the criteria at the time of delete synchronization.
        * If the entity meets the criteria defined in the dormant configuration during the delete synchronization, it will be included in the synchronization process of dormant configuration, when reactivated, even if it no longer meets the updated criteria.
  * Hence, it is recommended to enable this setting only when all the configurations within <code class="expression">space.vars.OIM</code> are strictly configured with the intended criteria, and there are no dormant or obsolete configurations (to be deleted in future).

## Use Case

* Suppose, the configuration between System 1 and System 2 is as follows:
  * The Delete configuration of Bug integration includes soft deletion or archive operation on the target entity in System 2.
  * <code class="expression">space.vars.OIM</code> has synchronized 6 entities from System 1 to System 2, i.e., source entities SE1, SE2,...,SE6 to target entities TE1, TE2,...,TE6, respectively.

<div align="center"><img src="/files/pgNryxfssSVC0KJamKDi" alt="" width="900"></div>

* Now, the user in the System 1 performs the following actions:

| **Entity** | **Action**                                                     |
| ---------- | -------------------------------------------------------------- |
| SE1        | Deleted                                                        |
| SE2        | Permission is removed from it for the sync user                |
| SE3        | Type is updated to Task                                        |
| SE4        | Type is updated to Story and Priority Value is updated to High |
| SE5        | Type is updated to Story and Priority Value is updated to Low  |
| SE6        | Type is updated to Feature                                     |

* The Delete configuration of the Bug integration in the <code class="expression">space.vars.OIM</code> will perform these actions:
  * TE1 and TE2 will be deleted in the target, and the sync report will be updated with the "Not Accessible" state for these entities.
  * Updates on the SE3 and SE4 will be synchronized to the target entities TE3 and TE4 respectively via Task and Story integration.
  * TE5 (as SE5 fails to meet the criteria of Story integration) and TE6 (as the configuration related to Feature is missing in <code class="expression">space.vars.OIM</code>) will be soft deleted or archived in the target as per the configuration, and the sync report will be updated with the "Not Applicable" state for this entity.

<div align="center"><img src="/files/Me7bUA4wbznidXCOQndd" alt="" width="900"></div>


# Rule Based Routing

## Overview

* In many real-world integrations, a single entity type in the source system may need to synchronize with different entity types in the target system based on the value of a specific field — such as Request Type, Category, or Type.
* Even though the source entity type remains the same, its business means changes when that field’s value changes. In such cases, the target entity type should update automatically without creating duplicates, ensuring both systems stay consistent.

This need typically arises when:

* The number of entity types differs between the source and target systems.
* A classification or partitioning field determines how the entity should behave (e.g., Bug, Feature Request, Change Request).
* Entities are created from both systems, and entity type changes must remain synchronized in both directions.

### Handling Rule-Based and Duplicate Configuration

If your configuration includes both **convertible** and **duplicate** entity types — for example, some entities that can convert into each other (*Bug ↔ Story ↔ Epic*) and others that should remain as duplicates (*Task*) — follow the steps below to avoid unexpected behavior.

| **Source Entity Type** | **Target Entity Type(s)** | **Purpose**                      |
| ---------------------- | ------------------------- | -------------------------------- |
| Bug                    | Bug / Story / Epic        | Conversion between related types |
| Bug                    | Task                      | Duplicate creation               |

* Do **not** use the same source–target system pair for both rule-based and duplicate configurations.
* Create a **separate system** for the duplicate configuration.\
  This separation ensures that conversion logic applies only to convertible entity types and does not affect duplicate entities.

### Know Behaviors

* If entity matched multiple rules and no rules, then the sync will be failed with below-mentioned processing failure
  * Example 1: Multiple Routing Rule Match:
    * Row1: `{"condition":"OR","criterias":[{"condition":"EQUALS","field":"type","value":"Bug"},{"condition":"EQUALS","field":"priority","value":"Low"}]}`
    * Row2: `{"condition":"OR","criterias":[{"condition":"EQUALS","field":"type","value":"Feature"},{"condition":"EQUALS","field":"priority","value":"High"}]}`
    * The entity read from the end system has `type = 'Feature'` and `priority = 'Low'`, in this case, multiple routing rules are matched.
  * Example 2: No Routing Rule Match
    * Row1: `{"condition":"OR","criterias":[{"condition":"EQUALS","field":"type","value":"Bug"},{"condition":"EQUALS","field":"priority","value":"Low"}]}`
    * Row2: `{"condition":"OR","criterias":[{"condition":"EQUALS","field":"type","value":"Feature"},{"condition":"EQUALS","field":"priority","value":"High"}]}`
    * The entity read from the end system has `type = 'Story'` and `priority = 'Medium'`, in this case, no routing rule is matched.

### Routing Rules Configuration Guidelines

Follow these guidelines when configuring the **Routing Criteria** and **Routing Query** in the **Routing Criteria Settings** section:

* Configure **routing rules** for every row, otherwise you will not be able to save the integration.
* Write the routing query in the [OpsHub Query Format](/integrate/configure-integrations/integration-configuration/opshub-query-format).
* Make sure the **Default Values** in the **Routing Criteria Field Values** table match the routing criteria.
  * Each value in the field values table must be a valid subset of the defined routing criteria.
  * **Example:** If the routing criteria is `{"condition": "IN", "field": "priority", "values": ["High", "Medium"]}`, then only *High* and *Medium* can be used as default values for *priority*.
* Do **not** map the fields in the mapping used in the routing criteria query.
  * Example: If the routing criteria query uses the `priority` field, it should not be mapped in the sync direction from the N-side configuration to the 1-side configuration, as <code class="expression">space.vars.OIM</code> automatically manages the field's value based on the defaults defined in the Routing Criteria Field Values table.
* Use the **same field set** across all rows in a rule-based configuration.
  * Example: If one row in a rule-based configuration uses the `priority` field in its routing query, then all other rows in that configuration must also use only the `priority` field in their routing queries.
* Keep all **routing rules independent** across rows.
  * Example: If one row in a rule-based configuration uses the routing criteria `{"condition": "IN", "field": "priority", "values": ["High", "Medium"]`}, then another row in the same configuration **cannot** use`{"condition": "IN", "field": "priority", "values": ["High", "Low"]}`. Each row must define a distinct and non-overlapping routing rule.
* Do **not** use routing-based configuration if duplication is expected in the target.
  * If one source entity needs to stay in sync with multiple target entity types at the same time, avoid rule-based routing.\
    Under rule-based routing, a source entity can sync with only one target entity type at a time — based on the rule it matches.

## Default Route Configuration Guidelines

Follow these guidelines when configuring the **default route**:

* Only one default route can be configured, within a given rule-based configuration.
* The default route is applied only when no routing criteria match for an incoming entity.
* Changes to the default route can impact previously synchronized entities.
  * When modified, entities that were synchronized due to default route may undergo entity type conversion during subsequent synchronization.
* Disabling the default route will result in synchronization failures for incoming entities where no routing criteria match.

## Example Use Case

Consider a source system where all items are created as a Request, and the field **requestType** determines the entity type to be created in the target.

| **requestType Value** | **Target Entity Type** |
| --------------------- | ---------------------- |
| Bug                   | Bug                    |
| Feature Request       | Feature                |
| Change Request        | Change Request         |

**Typical Behavior:**

* When the source Request has requestType = Bug, it is synchronized as a Bug in the target system.
* If the requestType changes to Feature Request, the previously synced Bug is automatically converted to a Feature Request — without creating duplicates.
* If the entity type changes on the target side, the requestType field in the source system updates automatically to stay aligned.

## Configure default route

In integrations where routing criteria determine the target entity type, there may be scenarios where incoming entities do not match any configured conditions. The default route ensures such entities are still processed by assigning a fallback target entity type.

Consider a source system where all items are created as a Request, and the field **requestType** determines the entity type to be created in the target (as per the above example use-case)

Integration Configuration with default route

| **Source Entity Type** | **Target Entity Type** | **Routing Criteria**          | **default route** |
| ---------------------- | ---------------------- | ----------------------------- | ----------------- |
| Request                | Bug                    | requestType = Bug             | false             |
| Request                | Feature                | requestType = Feature Request | true              |
| Request                | Change Request         | requestType = Change Request  | false             |

**Behavior with default route Configured**

* When a source Request has requestType = Story (or any value not matching configured criteria), no explicit routing criteria is satisfied.
* In such cases, the *default route* is applied for the synchronization, For example, for requestType = Story, the target entity type will be Feature (as per the above configuration).

**Behavior When default route is Changed**

* Continuing the above scenario, a Request with requestType = Story is initially synchronized as a Feature.
* If the default route is changed to requestType = Bug route.
  * On the next synchronization, the existing target entity will be converted from Feature to Bug.
* **Warning** : Changing default route will change the entity type of all records synchronized via the default route in the next sync cycle.

**Behavior When default route is Disabled**

* If the default route is disabled and an entity does not match any routing criteria:
  * The synchronization will fail with the error message: "OpsHub-020604: No routing criteria matched the provided entity values. Review the currently configured routing criteria: {currently configured criteria}"

<code class="expression">space.vars.OIM</code> allows seamless conversion when the routing field value changes and automatically updates the corresponding target entity type. It also ensures that when updates flow in the reverse direction, the source field value is adjusted accordingly, maintaining complete bidirectional consistency. For more details about configuration, refer to this section: [Routing Rules Configuration](/integrate/configure-integrations/integration-configuration#rule-based-routing).


# Integration Reconciliation

## Overview

Reconciliation feature helps reconcile data for fields added in integration. Primary use of this feature is to reconcile existing data in the end system after changing mapping, for example after adding new field, link type, enabling attachment, etc.\
Some of the use cases where this feature can be used are:

1. The user wants to add field(s) that was previously not integrated, but now the user would like it to be integrated. But the user also does not want to perform any mass update on all other entities existing in the source system so that the value of only the newly added field is integrated.
2. The user may already be using <code class="expression">space.vars.OIM</code> for sync and the data got into an inconsistent state, either due to bad failure management or inappropriate conflict resolution. And now, the user wants to reconcile both the systems to achieve a consistent state.

An important point to remember is that Reconciliation is not Integration or Migration, and hence should not be confused with them.

## Steps to Configure Reconciliation

> **Note**: Few things to know before reconciling data:
>
> * Inactive the integration to be reconciled. If the integration is not inactivated, then it will be automatically inactivated once data reconciling starts.
> * When Reconciliation is configured on integration, all Failed Events currently associated with the integrations would be **deleted**.
> * **Remote Entity Id** and **Remote Entity Link** fields are not supported.
> * Workspace / Project / Entity type name with Unicode character is not supported.

* To configure Reconciliation, navigate to the integration to be reconciled. Click on reconcile icon as shown below:

<div align="center"><img src="/files/hpdpsUgbGwfUl4mZzGsh" alt="Reconcile Icon" width="1500"></div>

* The window will come up for the given integration:

<div align="center"><img src="/files/QZbwNZmae3Lz6Ic6mZx2" alt="Config" width="900"></div>

* User can select direction ![Direction](/files/7x62keXCYFkXoJIp57U7) based on: the system or the entity type that is to be reconciled. Reconcile can be configured in one direction at a time. By default, all fields that are mapped in associated mapping for selected entity will be reconciled with source data being copied over to target.
* Now, click on **Save Reconciliation** button to save the reconcile. Basic reconcile with default options will be created.

> **Note** : If you are getting a warning stating that **Reconciliation start date will be changed**, then you have some criteria configured in your integration and you do not have a valid Migration license.\
> If you click on Yes, then Reconciliation will start from the date shown in the message (which is 60 days before the day of your first valid license).\
> If your reconcile is already created before this restriction, then you will see the same warning when you will activate your Reconciliation.

### Change Default Setting

* To change default setting click on ![Config Rule](/files/0sS5Oa5eaO50iXSSG4HG) to configure Reconciliation. A new window which displays all the mapped fields will come up.

<div align="center"><img src="/files/DyFe1cQSj989O1sxa56T" alt="Mapping Fields" width="700"></div>

* **Configure Mismatch** option:
  * This defines the strategy on which the field value is to be reconciled in case a mismatch is found between its value in the source entity and the target entity.
  * **Source** means that the value of source system would be written.
  * **Target** means that the value of the target would be kept intact.
  * **Custom** allows the user to configure a custom configuration for a situation where mismatch is found.
  * **Target Empty** option will reconcile a field only if the mapped destination field is empty.
* **Reconcile For**: **Both** / **Create** / **Update**\
  This feature allows the user to select for which event the fields should reconcile.
  * **Both** implies that for both Create and Update events, the field must be reconciled.
  * **Create** implies that the field is reconciled only in cases when reconciliation must create an entity on the destination side.
  * **Update** implies that the field is only reconciled for the Update event.
* If the user intends to have **Custom** rule as Mismatch Option, click on ![Edit Rule Icon](/files/qD62NtbOHhUCNJ1ayxdH) button.
* Below window will appear to insert custom XSL rule:

<div align="center"><img src="/files/9qmdC4QVVFMyhXfnQWao" alt="Custom Rule" width="700"></div>

> **Note** : If user wants to define rules for reconciling field based on a condition, then custom rules can be defined.\
> For example: a user wants to reconcile priority in target system based on a condition as shown above.

* Click **Save Reconcile Configuration** button to save reconcile rule changes.
* Now, on clicking **Save Reconcile** button, reconciliation will start.

## Configure Workflow

* By default, **Default Reconcile Workflow** will be selected.
* To select customized workflow, click on ![Config Workflow](/files/ch0Xgf9dVCQ4AimnE7Tb) on Reconciliation page and select workflow for reconcile.

## Monitor Reconciliation

* User can manage reconciliation failures like integration failures.
* Once the reconciliation is completed, integration status will change to green.

## Switch Back to Integration Mode

* If the reconciliation is completed, the status will change to green on Reconcile page.
* Go back to the same integration and set the polling time in integration to a time after reconciliation is completed to poll old updates which are already reconciled.
* To re-run the Reconciliation, follow same steps. You can change the settings on Reconciliation page.


# Monitoring and Organization

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>Merge Integrations</strong></td><td><a href="/pages/YiiNct3masc523IhskmA">/pages/YiiNct3masc523IhskmA</a></td></tr><tr><td align="center"><strong>Organize Integrations</strong></td><td><a href="/pages/S6Oi5ChHLTSJB43Hm8DF">/pages/S6Oi5ChHLTSJB43Hm8DF</a></td></tr><tr><td align="center"><strong>Search and Navigation</strong></td><td><a href="/pages/IxSUxb8DylTNLCUfF3Jm">/pages/IxSUxb8DylTNLCUfF3Jm</a></td></tr><tr><td align="center"><strong>Using the Dashboard</strong></td><td><a href="/pages/mTtapehuwzd07MvMwclJ">/pages/mTtapehuwzd07MvMwclJ</a></td></tr><tr><td align="center"><strong>Using Trends &#x26; Metrics</strong></td><td><a href="/pages/NNPKjLKhF4huaba2A7sd">/pages/NNPKjLKhF4huaba2A7sd</a></td></tr></tbody></table>


# Merge Integrations

This page explains the merge feature available from version 7.0 onwards.

## When To Merge Integrations

As the name says, this feature allows users to merge existing configurations such as mappings and integration groups for usability purpose. It also helps reduce the maintenance cost. Given below are some cases in which merge feature can be useful.

* User was using the old User Interface (UI) for integration and has now shifted to the new UI. Before <code class="expression">space.vars.OIM</code> Version 7.0, it was not possible to create bidirectional mapping and integrations in one go. If a user wanted to create a bidirectional integration between TFS and JIRA, the required configurations were as follows:
* **Configuration 1**
  * Mapping 1 \[TFS User Story to JIRA Requirement]
  * Mapping 2 \[JIRA Requirement to TFS User Story]
  * Integration 1 \[TFS User Story to JIRA Requirement] with Mapping 1 associated with the integration
  * Integration 2 \[JIRA Requirement to TFS User Story] with Mapping 2 associated with the integration

But from version 7.0 onwards, it's possible to have 1 mapping and 1 Integration for such cases. If a user wanted to create a bidirectional integration between TFS and JIRA, the required configurations now are as follows:

* **Configuration 2**
  * Mapping 1 \[TFS Story to and from JIRA Requirement]
  * Integration 1 \[TFS User Story to and from JIRA Requirement] with Mapping 1 associated with the integration

So, if a user migrates <code class="expression">space.vars.OIM</code> instance to 7.0 version or onwards, the user can merge Mapping 1 and Mapping 2 into Mapping 1 as well as Integration 1 and Integration 2 into Integration 1. So, the user doesn't have to manage multiple integrations. Users can simply delete Mapping 2 and Integration 2 after they are successfully merged to another configuration and if they are not being used in any other integration.

The above case is also applicable when Configuration 1 is created in the new UI and user wants to have configuration like Configuration 2. If the user has created different integrations created for different projects:

User had defined configurations as given below. It is because of project templates mismatch, user was required to create different mappings and different integrations.

* Mapping 1 \[TFS User Story to JIRA Requirement for Project 1]
* Mapping 2 \[TFS User Story to JIRA Requirement for Project 2]
* Integration 1 \[TFS User Story to JIRA Requirement for Project 1] with Mapping 1 associated with the integration
* Integration 2 \[TFS User Story to JIRA Requirement for Project 2] with Mapping 2 associated with the integration

But now both projects fall under similar templates and same mapping can be used in them. So, user can merge Integration 1 and Integration 2 and delete the other integration and mapping if they are not being used anywhere else.

## Merging Mappings or Integrations

The process for merging two mappings or integrations with sample example is given below.

### Merge Mappings

Here for example let us assume there are 2 different mappings \[TFS User Story to JIRA Requirement and JIRA Requirement to TFS User Story as below]

* TFS User Story to JIRA Requirement
* JIRA Requirement to TFS User Story

<div align="center"><img src="/files/PDEollngSlJ74lUDlMAY" alt="" width="1000"></div>

Now, if these two mappings are to be merged, the following steps can be followed:

* Inactivate the integrations that are using any of the mappings that are to be merged.
* Make sure the mappings are configured between the same end points, otherwise merge will throw validation error and won't proceed further \[Because if the mappings to be merged are configured for different end points, their context like projects/entity types, fields etc. are different]
* Make sure both the mappings are configured between same projects and entity types, otherwise merge will give validation error and won't proceed further \[Because if both mappings are configured for different projects/entity types, their template/fields are different]
* Select merge option: On the Mappings list page, select 2 mappings. An option for merging those would be available as shown below.

<div align="center"><img src="/files/oLq66Yz9fR2lDB3eXbHk" alt="" width="1000"></div>

* Click the "Merge Mapping" option. Select the Primary Mapping. Take the backup of the primary mapping and refer to the instructions on the screen before clicking the Merge button.\\

<div align="center"><img src="/files/SJEYEFES5xFHLK2AW4hR" alt="" width="600"></div>

* After clicking the Merge button, a mapping screen comes up as a result of merged mapping object that shows a preview of merged mapping which contains the existing primary mapping configurations and the secondary non-conflicting configurations merged. \*Take a look at the fields mapping, value mapping, mapping for other configurations such as Comments, Attachments, Issue Relationship, etc. in the preview as well as Merge Conflict(s). If user wants this mapping as a result of your merged mapping, they should click the "Update Mapping" button.
  * In case there are conflicts in the primary and secondary mappings, then primary mapping's configuration will be considered in the preview of merged mapping details and warnings would be given for the conflict details in the Merge Conflict(s) section of preview.
  * In case any Merge Conflict(s) warning is/are available, please go through it before clicking the Update Mapping and perform the Update Mapping only if the behavior mentioned in Merge Conflict(s) is acceptable.
* Once the primary mapping is updated as per the merge result, merge operation is completed. The steps given below are then to be performed manually for the second mapping:
  * For all the integrations that use secondary mapping, they should be edited to use primary mapping (Merged Mapping).
  * Take a backup of secondary mapping \[Export it].
  * Delete the secondary mapping.

**Mapping merge with conflicting case example**

This section describes the sample conflict cases to give an overview on mapping merge operation with Merge Conflict(s).

* **Case 1**: Let's consider a case where there are two mappings from TFS 'Bug' to JIRA 'Bug', but in that some of the field mappings of secondary mapping have conflicts amongst them and they can't be merged.

Mapping 1: TFS Bug -> Jira Bug

<div align="center"><img src="/files/U3DTLwLpoz9dYN2Tj58X" alt="" width="990"></div>

Mapping 2: TFS Bug -> Jira Bug 2

<div align="center"><img src="/files/GdvI9IISBRVwpfZADAgT" alt="" width="990"></div>

Here, as per the Primary Mapping Environment \[Mapping 1: TFS Bug -> Jira Bug], field value for JIRA Bug should be as per the Environment Field value of TFS Bug, but as per the Secondary Mapping Environment \[Mapping 2: TFS Bug -> Jira Bug 2] field value for Jira Bug should be as per the Description Field value of TFS Bug. Now, this information contradicts with Primary Mapping. Hence, this Field mapping is available in the Merge Conflict(s) warning and in the Merged mapping preview, Environment -> Environment field mapping is being considered.

* **Case 2**: Let's consider a case where we have two mappings from TFS Bug to JIRA Bug but in those mappings some of the value mappings of secondary mapping are conflicting and can't be merged.

Primary Mapping: Basic Details: TFS Bug -> Jira Bug Field Mapping: Priority -> Severity Value Mapping: High -> High Critical -> High Low -> Low

Secondary Mapping: Basic Details: TFS Bug -> Jira Bug Field Mapping: Priority -> Severity Value Mapping: High -> High Critical -> Blocker Low -> Low

So, the Merged Preview will have Value Mapping as shown below: Value Mapping: High -> High Critical -> High Low -> Low

In the Merge Conflict(s), there will be a warning around second value mapping "\[Critical -> High] for field mapping priority -> Serverity can't be merged as it's conflicting with primary mapping."

Similar conflicts can also come for mapping configurations of Comments, Attachments, Issue Relationship, etc. as well.

### Merge Integrations

For example, let's assume there are 2 different integrations \[TFS To JIRA and JIRA To TFS as shown below.]

The initial configurations were as below:

* TFS to JIRA Integration with mapping TFS Bug to JIRA Bug
* JIRA to TFS Integration with Mapping Jira Bug to TFS Bug With mapping merge operation, merge the TFS Bug to JIRA bug and JIRA Bug to TFS Bug into TFS Bug to JIRA Bug \[ primary mapping] and name it TFS Bug <-> Jira Bug mapping and associate it with both the integrations:

**TFS Bug to Jira Bug**

<div align="center"><img src="/files/y39O28N98wezogqXuWtD" alt="" width="990"></div>

**Jira Bug to TFS Bug**

<div align="center"><img src="/files/QELbB0sNFVf8L1uFH99A" alt="" width="990"></div>

Now merge these 2 integrations and follow the steps given below:

* Inactivate the integrations that are to be merged
* Ensure both the integrations are configured between same end points, otherwise merge will give validation error and won't proceed further \[Because if both integrations are configured for different end points, their context like projects/entity types etc. would be different]

In our example, both the mappings are configured between TFS and JIRA.

* Select merge option: On the view integrations list page, once the 2 integrations are selected, an option for merging the integrations would be available as shown in the image below:

<div align="center"><img src="/files/YSeINGOiJu6Djr714Knh" alt="" width="990"></div>

* Click the "Merge Integration" option. Select the Primary Integration. Take a backup of the primary integration \[Clone the primary integration and keep it in Inactive mode] Please refer to the instructions on the screen before clicking the Merge button.
* When the Merge button is clicked, a Merge Integration screen comes up as a result of merged mapping objects that show a preview of the merged integration. It that contains the existing primary integration configurations and the secondary non-conflicting configurations merged together.

Look at the image below. It shows an example where the Integration for Bug entity as well as the project mapping is bidirectional in merge preview.

<div align="center"><img src="/files/0IKaqsybJe4sW29YNb4I" alt="" width="990"></div>

* Take a look at each configuration in the preview as well as Merge Conflict(s). If this is wanted as a result of the merged integration, click the Save button \[Edit the preview in case there are any changes required here]
* In case there are conflicts in the primary and secondary integration configurations, then primary integration's configuration will be considered in the preview of merged integration details and warnings would be given for the conflict details in the Merge Conflict(s) section of the preview.
* In case any Merge Conflict(s) warning is/are available, go through it before clicking the Save button and perform the Save operation only if the behavior mentioned in Merge Conflict(s) is acceptable.
* Once the primary integration is updated/saved as per the merge result, merge operation is completed. The secondary integration can now be deleted.

**Integration merge with conflicting cases examples:** This section describes some of the conflicting cases/examples to give the overview on integration merge operation with Merge Conflict(s).

* **Case 1**: Let's consider a case where one has not performed Merge Mapping and are trying to merge Integrations with the following configurations:
  * TFS to JIRA Integration with mapping TFS Bug to Jira Bug
  * Jira to TFS Integration with Mapping Jira Bug to TFS Bug

In that case the merge preview will look as follows:

<div align="center"><img src="/files/IJCCCZNPiFZBKC1mKrZ8" alt="" width="990"></div>

The Merge Integration preview has merge integration preview along with Merge Conflict(s). Merge Conflict(s) has warnings because both integrations have different mapping. In this case, the Primary mapping is being considered and this mapping is not bidirectional. Therefore, it's not compatible with the merged integration. So, the user needs to select a compatible mapping for saving the merged integration.

* **Case 2**: Merge 2 integrations of TFS Bug to Jira Bug but having conflicting project configuration as shown below:
  * Integration 1: TFS Bug Demo Project to Jira Bug OIM Demo Project
  * Integration 2: TFS Bug Demo Project to Jira Bug BoardDemo

The merge preview will look as shown below:

<div align="center"><img src="/files/SqhmgN89imVn52p3ZRLn" alt="" width="990"></div>

The Merge Integration preview has merge integration preview along with Merge Conflict(s). Merge Conflict(s) has warnings because as per the Primary Integration, TFS Demo Project Bugs are to be synchronized to Jira OIM Demo Project and as per the Secondary Integration TFS Demo Project Bugs are to be synchronized to Jira BoardDemo Project. In this case, the primary configuration is being considered.

## Best Practices

Before a user attempts merge integration, they should ensure the mapping associated with the integrations are compatible with the merged integration results. If required, they should merge their mappings first and then the integrations.

## Expected Behavior For Merge Conflicts

For Merge operation, primary configurations are given first preference and non-conflicting secondary configurations are merged to them. But for integration merge, following configurations of secondary integration will not being added/merged to the Primary/Merged integration even if they are not configured in the Primary Integrations.

**Post Failure Notification**

* If Primary Integration doesn't have Post Failure Notification configured but the Secondary Integration has it configured, the Merged Integration will also not have Post Failure Notification configured in it. Therefore, once the Merged Integration is saved, users must manually configure Post Failure Notification manually.
* If Post Failure Notification is configured in the Primary Integration, it will be retained after merge operation as well.

**Reconciliation**

* If Primary Integration doesn't have Renconciliation configured but the Secondary Integration has it configured, the Merged Integration will also not have Renconciliation configured in it. Therefore, once the Merged Integration is saved, users must manually configure Renconciliation manually.
* If Reconciliation is configured in the Primary Integration, it will be maintained after merge operation as well.

### What To Do After Merge is Completed

On clicking the merge button, for the merge response, the merged previewed details will be saved into the primary configuration and the secondary configuration will remain as it is. The secondary configuration can, then, be removed if not being used anywhere else.


# Organize Integrations

## Folder Management

Folder Management helps in organizing Integrations, Mappings, and Systems under separate workspace/folder.

### Benefits of Folder Management

* Structured view of integrations instead of having all integrations under one roof.
* Searching an integration made easy.
* Ease in managing and debugging integrations.

### How it works

* Folders can be found on the top panel.

<div align="center"><img src="/files/hdNXjcW813bdgGW3v6Al" alt="" width="400"></div>

* "Default" is the root folder.
* To create new folder, click the add icon as shown below.

<div align="center"><img src="/files/Vpups3OB2qseYrI3Z82A" alt="" width="400"></div>

* Multi-level hierarchy of a folder can be created based on set of integrations.

<div align="center"><img src="/files/NhGGRS1dvogLgdxYW4zM" alt="" width="400"></div>

* Search bar helps in locating folders within OpsHub Integration Manager by allowing users to search using full or partial folder name. The search is case-insensitive, making it easy to find folders.

<div align="center"><img src="/files/tBMJl9yTQ9NMFYOwDSss" alt="" width="400"></div>

* All the matching folders are displayed along with their parent folders, preserving the hierarchy for easy navigation. The matched text within the folder name is highlighted for better visibility.

<div align="center"><img src="/files/snZ1l7hY82hXlsa9bxsG" alt="" width="400"></div>

* If no folder matches the search text or user does not have sufficient permission to view the folder than "Nothing to see here or you do not have sufficient permission!" message would be displayed.

<div align="center"><img src="/files/roXCaCrT7LhXa1hfGtm5" alt="" width="400"></div>

> **Note**: The search text will be cleared and the default folder structure will be restored when
>
> * navigating between folders
> * clicking on the refresh button

### Include parent item

From child folder, a user can view all the config done in parent folders, using the toggle button:

<div align="center"><img src="/files/rzXJ1wVynxyclbGIRg1o" alt="" width="400"></div>

* Integrations, mappings, and systems created under parent folder will be accessible to the child folder.
* Parent folder cannot access its child folder integrations, mapping, and systems.
* Systems and mappings created in parent folder can be re-used in child folders.
* The dashboard provides a comprehensive view of all integrations from the current folder and its parent folders.
* The assests below show all systems created in Default folder and Folder 1, which is the child folder of Default folder.

<div align="center"><img src="/files/Mexlr8a6kwjUTPzRnaLg" alt="" width="600"></div>

<div align="center"><img src="/files/GOqxIAHKNcsfx8oHd6US" alt="" width="600"></div>

### Move configuration

* Integrations, mappings and systems can be moved from one folder to another folder across hierarchy.
* To move an item from one folder to another folder, click on item, select move action as shown below.
*

<div align="center"><img src="/files/2keMQXapXLiIicXaCfEE" alt="" width="800"></div>

* All the existing folder will be listed, select the folder, and click **Move**.

<div align="center"><img src="/files/M6MZyfabMC5s6EtY1PKp" alt="" width="600"></div>

* Similarly, mappings and systems can be moved.

#### Rules to move configurations

**Rules for Moving System:**

Systems can be moved in a manner that associated mappings and integrations are at the same level or below the system in the same hierarchy.

Example:

Folder Hierarchy: `/Default/A/B/C/D/E/F`

* `/Default/A/B` - System1, System2
* `/Default/A/B/C` - Mapping1 created using System1 and System2
* `/Default/A/B/C/D/E` - Integration1 created using Mapping1

Valid moves for Mapping1: `/Default/A/B`, `/Default/A/B/C/D`, `/Default/A/B/C/D/E`

**Rules for Moving Mapping:**

Mappings can be moved in a manner that associated systems are at the same level or above in the same hierarchy, and integrations are at the same level or below the mapping in the same hierarchy.

Same example applies.

**Rules for Moving Integration:**

Integrations can be moved in a manner that associated systems, mappings, and workflows are at the same level or above in the same hierarchy.

Same example applies.

## Modelling integrations

Given below are a few sample use cases on how to model integrations and divide them into folders.

Create a model for arranging integrations to be configured in <code class="expression">space.vars.OIM</code> based on use case. Given below are some example of use case and using folders to manage integrations:

**1. Divide based on system combination**

* User wants integration between VersionOne, TFS and HP ALM.
* Integration can be divided into two sets:
  * VersionOne and TFS integrations
  * TFS and HP ALM integration

> **Note**: It can be a bi-directional integration with multiple entities involved for each set of integration.

* Create systems at default level so that it can be accessed in child folders.
* Create mappings and integration in folders as shown below.

<div align="center"><img src="/files/7NmX2z7DuzffMenL3Ev4" alt="" width="600"></div>

**2. Dividing based on Team/Users under same organization**

* This approach can be used when the user wants to divide integration sets based on use case of team/users within organization using common tools.
* For Example: 2 Teams are using common tools.

Folder structure can be as follows:

<div align="center"><img src="/files/MpCLY9baWuOJWMUxD7YR" alt="" width="600"></div>

**3. Dividing based on customer**

* This type of model is useful for customer who are service providers, providing integrations to other customers.
* Create a separate folder for each customer integrations.
* Here Systems, Mapping, and Integrations will be created under specific folder created for each customer (as different customer do not share systems).

<div align="center"><img src="/files/xXwdmResKqu4eCSNMNr3" alt="" width="600"></div>

> **Note** : Currently all the users will have access to all the folders.

## Appendix

### Sorting behavior for integration folder name

The sorting behavior for integration folder names is based on their ASCII values. Refer to the following ASCII values table for more information:

<div align="center"><img src="/files/07umQafdOgX6iiXde8OK" alt=""></div>


# Search and Navigation

The search functionality allows users to quickly locate components such as Integrations, Mappings, Systems, Workflows, etc., within <code class="expression">space.vars.OIM</code>.

You can search within two scopes — depending on whether you want a focused or global search: **Current Folder** and **All Folders**.

<div align="center"><img src="/files/eWCJmZNsZmUUSMU6YupB" alt=""></div>

For example, if you are viewing a folder that contains several integrations and no search text is entered.

<div align="center"><img src="/files/RUepMTYaFG9pfEvCuFan" alt=""></div>

Now, let’s see this in different search scopes

## Search Scope

### Current Folder Search

* Default search mode when you start searching.
* Shows results directly in the current folder view without changing your location.
* Filters and displays only the components within the folder you are currently viewing based on your search text.
* Ideal when you already know where the component is located or want a focused search within a specific folder

<div align="center"><img src="/files/dq5LUvdWApqZRhbwEEzq" alt=""></div>

### All Folders Search

* Searches across **all folders** you have permission to access.
* Displays results in a separate panel below the search bar, keeping your current folder view unchanged.

<div align="center"><img src="/files/VzZiD7L3czwVhflotxSF" alt=""></div>

* Useful when you are **unsure of the component’s location** or need a **global search** across all folders.
* Clicking a component name or folder path in the results panel navigates you directly to the folder where the component exists.
* After navigation, the folder view updates to show all matching components within that folder.

<div align="center"><img src="/files/VRPEQXCZnr5FSxshItCO" alt="" width="2000"></div>

* From there, you can perform all standard operations, such as editing integrations, creating mappings, or carrying out other routine tasks

> **Note:**
>
> * **Current Folder** is selected by default.
> * If you switch to **All Folders**, all searches will continue to use this mode **until you manually change it back**.
> * We respect your preference—once you choose a search mode, it stays active during navigation so you don’t need to reset it each time.


# Integration Landscape

The OIM dashboard gives a quick view of integrations configured in <code class="expression">space.vars.OIM</code>. Users can check overall health of integrations and know if integrations are working fine or have any failures. Users can navigate directly to integrations, systems, and failures from the dashboard.

Here is a video on how to use the dashboard in OIM:

{% embed url="<https://youtu.be/ZPXRxJduU1A>" %}

## Graphical View

* Login into <code class="expression">space.vars.OIM</code>.
* Dashboard will appear on home page under Integration Landscape tab.

<div align="center"><img src="/files/WlCKMcR53zrOLPA62BLK" alt=""></div>

\- Click on !\[]\(../assets/rotate.png) at top right corner of dashboard to rotate graphical representation of integration.

<div align="center"><img src="/files/Y95pwcwjdOZEjXy7gcRu" alt=""></div>

* **Node:** Represents system created in <code class="expression">space.vars.OIM</code>.
* **Branch:** Represents that two nodes are connected through integration. Click on branch to view integration in read-only mode. Color of branch depicts status of integration.
  * **Green:** Integration is active.
  * **Gray:** Integration is inactive.
  * **Red:** Job failure in integration.
  * **Orange:** Processing failures in integration.
  * Click on ![](/files/zip9eP0ggzOSLlXRVQwZ) to view integration details from dashboard.

<div align="center"><img src="/files/boyU1q6huNsx76Feulyv" alt="" width="1500"></div>

In integration details window, the following information is shown:

* Entity type(s) integrated.
* Flow of integration (Uni-directional or Bi-directional) for each entity type.
* For each flow:
  * **Last processed time:** Last time when integration was executed.
  * **Last processed entity ID:** Last entity processed by integration.
  * **Health:** Shows failures, if any, logged in integration.

## Filtering the Dashboard by Various Functions

> **Note**: The dashboard display data associated with the currently selected folder, including its child folders. To view data across all folders, select the Default Folder. You can also select any other folder that you have access to.

Users can filter the integrations according to the system and integration status.

* Click the funnel icon to view the filter options.

<div align="center"><img src="/files/LU7sSGp0QPkKV7wrRoxq" alt=""></div>

* Select the **systems** and click **Filter** button. All the integrations that use the selected systems will be displayed.
* The available options for **integration status** are: All, Active, Inactive, and In error. Select one and click **Filter**.
* If “Include from child folders” is enabled, integrations from child folders are also included. This option is enabled by default.
* You can try combinations — for example: set Jira as a system filter, Active as an integration status filter, and enable include from child folders to view all active Jira integrations of current folder and its child folders.

<div align="center"><img src="/files/FVGLibfK2RIBH21KWKLS" alt="" width="1500"></div>

* Click **Clear** to view all integrations and remove applied filters.

## Navigation from Dashboard

### Navigate to System

* Click on a system node in the graph. For example, clicking on the “Team Foundation Server” icon will open that system’s configuration.

<div align="center"><img src="/files/KcLNySnaqP092MIpV0Jc" alt="" width="1000"></div>

### Navigate to Integration

* Click on the integration name in the graph to open its details.

<div align="center"><img src="/files/YJz5WedvYhn56HfcxPfV" alt="" width="2000"></div>

### Navigate to Failure

* Click on "Global Failure(s)" or "Processing Failure(s)" to go directly to the Failures module.

<div align="center"><img src="/files/wdftZnXB6szcqqUr8NBv" alt="" width="2000"></div>


# Trends and Metrics

The Trends dashboard provides a quick view of synchronization activity, project configuration patterns, and failure insights across <code class="expression">space.vars.OIM</code>. Users can monitor sync volume, identify high- or low-activity areas, track project growth across systems, and drill down into specific systems, integrations, projects, and entity types for deeper analysis.

## Trends & Metrics View

* Login into <code class="expression">space.vars.OIM</code>.
* Navigate to Metrics and Trends Dashboard on the home page

<div align="center"><img src="/files/HyfCjMPfLjUlbVdCiZFB" alt=""></div>

## Metrics

### Projects in sync

Shows the total number of configured projects including child projects in <code class="expression">space.vars.OIM</code> across all integrated systems.

<div align="center"><img src="/files/DB4fsmkFuZWHymrdFfVd" alt=""></div>

Note: Child projects are not included in the count if the integration that contains child projects is not activated at least once.

### Entities synchronized

Shows the total number of entities synchronized by <code class="expression">space.vars.OIM</code> across all integrated systems.

<div align="center"><img src="/files/QSLtqFJVr1rcbgKTBQ6t" alt=""></div>

### Entity sync count by system

Displays the total count of entities synchronized by <code class="expression">space.vars.OIM</code> across all systems, including both in-sync and deleted entities.

* In sync entities include all active entities that are currently part of the synchronization.
* Deleted entities include all entities that have been deleted, archived, or deprecated - including entities deprecated due to project conversion, entity conversion, or both.

<div align="center"><img src="/files/ayIYJSX9JAp3b3SbclFT" alt=""></div>

Click a bar to view the entity-type breakdown for the selected system.

<div align="center"><img src="/files/X2Q9lAghq7FW5haXkHmp" alt=""></div>

### Project pairs with high sync rate

Shows the top 10 project pairs with the highest synchronization activity, helping teams quickly identify the most active integrations, focus monitoring and optimization efforts on critical data flows.

<div align="center"><img src="/files/Ys331vwENH5MpJr70Zys" alt=""></div>

Click a pie slice to view the entity-type pair breakdown for the selected project pair.

<div align="center"><img src="/files/QzorxpRXeniqKQtgwmMQ" alt=""></div>

### Project growth across systems

Displays project growth trends per system over time, helping teams understand adoption patterns, compare system usage, and identify periods of rapid growth or stagnation for better planning and decision-making.

<div align="center"><img src="/files/oCYWcdtISLUmlSJzJfi2" alt=""></div>

### Project pairs with low sync rate

Highlights project pairs with low synchronization activity, drawing attention to possible issues such as sync failures, misconfiguration, decommissioned projects, or candidates for archival or cleanup, enabling timely investigation and corrective action.

<div align="center"><img src="/files/Ff7bDT4D4nek9JH9gFgY" alt=""></div>

Click a bar to view the entity-type pair breakdown for the selected project pair.

<div align="center"><img src="/files/jiy0yj8doWsiMxX7vpz9" alt=""></div>

### Top 10 recent integrations with global failures

Displays the top 10 most recent integrations with active global failures, helping teams quickly spot critical issues and take prompt action for sync stability.

<div align="center"><img src="/files/s7qHVtxoYr8AKMaf4TMW" alt=""></div>

Click a bar to view the job-level breakdown, including integration, and delete jobs.

<div align="center"><img src="/files/DXgob8pepZVXM70Z1Y99" alt=""></div>

### Top 10 integrations with high processing failures

Displays the top 10 most recent integrations experiencing processing failures, helping teams quickly identify integrations with such failures, understand failure impact, and prioritize investigation

<div align="center"><img src="/files/dgdtBFI3otiQKRTvCu8d" alt=""></div>

Click a bar to view the project-wise breakdown.

<div align="center"><img src="/files/fMK6WylrRPE2HqM5oyuC" alt=""></div>

## Filtering the Dashboard

> **Note**: All charts display data associated with the currently selected folder, including its child folders. To view data across all folders, select the Default Folder. You can also select any other folder that you have access to.

### Date Range

Select the date range to filter metrics.

Predefined options include – Last 1 Week, Last 1 Month, Last 3 Months, Last 6 Months and Last 1 Year.

<div align="center"><img src="/files/IGb8yJbcLFgPF78rOqXH" alt=""></div>

For a custom range, choose Custom option and select the start and end dates.

<div align="center"><img src="/files/fJwEdRLacP3PDwevUupk" alt=""></div>

To ensure optimal performance and system reliability, chart data is aggregated at different granularities based on the selected date range.

* Daily granularity is applied when the selected date range is within the last 3 months.
* Monthly granularity is applied when the selected date range extends beyond 3 months and up to 3 years.
* Yearly granularity is applied when the selected date range extends beyond the last 3 years.

Examples:

Assume today’s date is 22 Dec 2025.

#### Example 1

Selected date range: 09 Jan 2024 - 22 Dec 2025 Since this date range extends beyond the last 3 months but is within 3 years, monthly granularity is applied.

Data is displayed using the following actual date range: 01 Jan 2024 - 22 Dec 2025

#### Example 2

Selected date range: 14 Mar 2006 - 22 Mar 2006 Since this date range extends beyond the last 3 years, yearly granularity is applied.

Data is displayed using the following actual date range: 01 Jan 2006 - 31 Dec 2006

### Filter options

Click the funnel icon to view the filter options.

<div align="center"><img src="/files/qdUeILps1LkqNjUoB1TP" alt=""></div>

#### Systems

Filter metrics by selected systems (primary filter). Other filters (integrations, projects, entity types) will remain disabled. They can be applied only after the primary filter is selected.

<div align="center"><img src="/files/A5PqslSa3eL5PLAKkzB7" alt=""></div>

#### Integrations

Filter metrics by selected integrations.

<div align="center"><img src="/files/vwOKZfe30riM1VEcEl9e" alt=""></div>

#### Projects

Filter metrics by selected projects. Projects can be chosen independently. If integrations are selected, only their associated projects will be available.

<div align="center"><img src="/files/RWPxqbF5BG8iXMSS1yPG" alt=""></div>

#### Entity types

Filter metrics by selected entity types. Entity types can be chosen independently. If integrations are selected, only their associated entity types will be available. 

<div align="center"><img src="/files/FerOI1N2VLYzHOXAGelH" alt=""></div>

#### Include from child folders

Enables including items from child folders in metrics. This option is enabled by default.

<div align="center"><img src="/files/5ApTYUaULlYTIIEULnMH" alt=""></div>

<div align="center"><img src="/files/tunTZJTri3f4HFEJwwP8" alt=""></div>

* Click **Apply** to filter metrics based on the selected options.
* Click **Clear** to remove all applied filters.

## Chart data refresh

Chart data is automatically refreshed every 12 hours to ensure optimal performance and overall system reliability.

Click the refresh icon to update the chart with the latest data.

<div align="center"><img src="/files/hs1Nb1r4KW9a4aokTqyS" alt=""></div>

## Export

The Export feature allows you to download chart data in a single Excel file, making it easy to analyze, share, and present insights.

* For each chart, both aggregated data and raw data are included in the same Excel file, organized into separate sheets for clarity.
* The exported Excel file is automatically saved to the Downloads folder and can be shared with anyone, such as management, stakeholders, or external teams, for reporting and decision-making.

### Raw Data Limit

* To keep export operations fast and system performance optimal, raw data is limited to the top 10,000 records per chart.
* Raw data is primarily intended for debugging and deeper analysis.
* If more focused data is required, you can fine-tune the export using filters to narrow down the dataset.

<div align="center"><img src="/files/mD51Ug54RBVYKEK4waCt" alt=""></div>

Click the Export charts button to download the raw and aggregated chart data as an Excel file (packaged in a ZIP format).


# Best Practices

Here are some best practices to consider when working with <code class="expression">space.vars.OIM</code>.

## Infrastructure

### Database

* Use any database from the supported 4 databases \[Oracle, MSSQL Server, MySQL, PostgreSQL] for production deployment. HSQL shouldn't be used for production deployments.

### Database Disk Space

| WorkItem          | Sync State      | Estimated DB Size |
| ----------------- | --------------- | ----------------- |
| <100K             | Current/History | 50GB              |
| 100K to 500K      | Current/History | 100GB             |
| 500K to 1 million | History State   | 150GB             |
| 500K to 1 million | Current State   | 150GB to 250GB    |

> **Note**: Actual size depends on various factors, including the total count of work items, sync state, sync failures, number of attachments, links, and overall usage patterns. For small-scale implementations, starting with a minimum database size of 15GB is recommended to accommodate initial needs effectively.

### RAM and Threads

| Integration | RAM allocated to OIM | Threads in OIM | Machine Core | Heap Space | Machine Disk Space | Environment Type |
| ----------- | -------------------- | -------------- | ------------ | ---------- | ------------------ | ---------------- |
| Up to 50    | 8GB                  | 27             | 4            | 4GB        | 50GB-100GB         | Small            |
| 50-150      | 16GB                 | 50             | 6            | 12GB       | 150GB-200GB        | Medium           |
| 150-900     | 32GB                 | 100-150        | 8            | 28GB       | 300GB-350GB        | Large/Enterprise |

> **Note**: The RAM data is estimated, as RAM requirements depend on several factors, including the number of integrations, thread count, and scheduling cycle settings.

### Enable Monitoring for OpsHub Service, Database, and VM for Health Check

* In a production environment, it's important to have monitoring in place for the OpsHub service, database, and the virtual machine (VM) where OpsHub is installed.
  * **Set up alert**: OpsHub service, database, or VM goes down.
  * **Monitor OpsHub's database access** (if possible): if the database becomes unavailable or there are access issues, alerts are triggered.
* When OpsHub is down: It will not generate its usual failure alerts. Therefore, external monitoring is necessary to ensure you receive alerts if the system, database, or VM becomes unresponsive.

### Enable Database and VM backups

* **Database backup**: Once a day or less (point in time).
  * Frequent backups ensure you can quickly recover the most recent configuration, mappings, and sync histories in case of data loss or corruption.
* **VM \[OIM installed] backup**: Once a month or quarterly.
  * A monthly or quarterly backup allows you to capture the state of the VM, including OS-level changes and configurations, while not overwhelming storage with frequent snapshots.

## Integration

### Integrate multiple projects through a single integration

* Group integrations for management efficiency when:
  * Multiple projects share similar templates or artifact structures.
  * Managing individual integrations becomes cumbersome.\
    Example: Managing user stories, tasks, and bugs across multiple Jira and Rally projects.
* **Grouping Benefits:**
  * Reduced API Calls
  * Simplified Maintenance
  * Unified Control
  * Easier Error Handling

### Managing Project Count in Integrations

* **Limit Projects per Integration**: 25 or fewer for optimal performance.
* **Balance Large and Small Projects**: Combine large projects (100,000+ entities) with smaller ones to avoid overloading the integration.

### Enable Remote ID and Remote Link

* **Remote ID**: Easily find and track items across systems.
* **Remote Link**: Relationships between items and understanding their connections.

### Polling Frequency/Scheduling

Setting the appropriate polling frequency is crucial for effective integration management.

| Criteria                                            | Recommended Polling Frequency                              | Use case                                                             |
| --------------------------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------------------- |
| Target: Reporting and compliance (Once a week)      | <p>Every 12 hours<br>High volume: every 1 to 6 hours</p>   | Predictable data availability with fixed schedule (e.g., 6 AM/6 PM). |
| Target: Needs latest data within 24 hrs             | Every 2 to 6 hours                                         | Ensures data is updated in target system within a few hours.         |
| Small-scale environments                            | Every 15 minutes                                           | Ensure quick data updates.                                           |
| Large-scale environments with 150+ integrations     | Every 30 minutes or more (Consult OpsHub for under 30 min) | Reduces API calls and optimizes performance.                         |
| Non-time-based entities (e.g., Sprints, Iterations) | Every 24 hours                                             | Poll during non-peak hours (e.g., 12 AM) to minimize system load.    |

## Mapping

### Configure Multiple Integrations via a Single Mapping

* Identify similar integrations: Determine if multiple integrations share the same project template or artifact structure.
* Create a single field mapping: Develop one field mapping to apply across all identified integrations.

### Configure Default Value for Mandatory Fields

* When source field is optional and target is mandatory:
  * Do default value mapping: Configure a default value for the mandatory field in the target system to avoid sync failures.
* User fields' mismatch:
  * Ensure matching email addresses: Confirm that the same users exist in both systems to find the correct user during synchronization.
* User missing in target system:
  * Set up a default user: Assign a default user when an exact match isn't found to ensure successful synchronization.

### Enable Link Configuration in Cross-Entity Mappings for Sync

* To ensure that links sync reliably, set up relationships in both mappings.
  * For example, if a Bug is linked to a Requirement and you want this link to transfer to another system, add the link configuration in both the Bug and Requirement mappings. This setup helps keep relationships consistent across systems.

## Sync Monitoring

### Enable Failure Notification Emails

Setting up the failure notification emails in OIM is an essential practice that helps you stay on top of any issues with your data integration.

* **CC Key Personnel**: Add key team members to CC for prompt action if the main recipient is unavailable.
* **Persistent Failure Alert**: Set to 1 hour—alerts you about serious issues beyond temporary glitches.
* **Inactivity Alert**: Set to 24 hours to flag prolonged inactivity; shorter durations may cause unnecessary alerts.
* **Include Error Trace**: Enable to provide detailed failure information, speeding up troubleshooting.

### Manage Log Settings to Optimize Size and Improve Troubleshooting

| Setting                                 | Description                                                                                                |
| --------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| Compress Backup Files \[Global setting] | Enable at the global level to reduce log size and save memory.                                             |
| Log level                               | <p>Production: Use WARN<br>Temporary Debugging: Use DEBUG/TRACE, then revert to WARN<br>Testing: DEBUG</p> |
| Max Log Size                            | 50MB                                                                                                       |
| Backup Files                            | 5                                                                                                          |
| Lines per Log file                      | 100                                                                                                        |

### Organize Integrations with Folders for Better Management

* Create folders for different integrations to enhance clarity.
* **Team or Project-Specific Folders**: Set up specific folders for each team or project to simplify management.

## Sync Optimization

### Enhance Performance by Setting a Longer Cache Timeout in OpsHub System

To reduce API calls and improve performance, it's recommended to set a longer cache timeout (like 24 or 48 hours), especially when metadata updates such as projects and fields are stable or infrequent. This approach minimizes unnecessary requests and helps prevent memory issues.

| Metadata Update Frequency            | Cache Timeout |
| ------------------------------------ | ------------- |
| Multiple times a day (e.g., hourly)  | 60 minutes    |
| Infrequent updates (1–2 times/week)  | 24 – 48 hours |
| Stable environment with rare updates | 1 week        |

## Secure Port & Protocol Standards

* **HTTPS (port 8443) is the preferred option** and should be used for cloud-based, or any environment where the network is not fully controlled and secured.
* **Use a valid SSL/TLS certificate** when configuring HTTPS. A CA-signed certificate is strongly recommended for production and cloud deployments.
* **Expose only the required port**, if HTTPS is enabled, keep port 8989 closed to minimize the server’s attack surface.
* **For environments that require HTTP**, ensure access is restricted to trusted internal networks. Where applicable, configure an automatic redirect from HTTP (8989) to HTTPS (8443) so users are seamlessly upgraded to a secure connection.

## Don'ts

Here are the practices you must avoid while working with <code class="expression">space.vars.OIM</code>. While some exceptional cases may require specific operations, admins must not perform any of the following actions with the <code class="expression">space.vars.OIM</code> system without proper guidance.

* Do not rename entity types or projects into end systems. Please consult the system expert or <code class="expression">space.vars.OIM</code> support before implementing any such change in the end system.
* Do not upgrade <code class="expression">space.vars.OIM</code> without going through pre and post migration checklist document.
* Do not back date 'Start polling time' once integration has started synchronizing.
* Do not delete any failures from the integration failure queue.
* Verify target search queries when you configure integration or reconciliation with this input to consider manually created entities are matched before integration transacts. Admin should manually verify that the search query is correct and producing the expected results. If this query is wrongly configured, then there are chances of entity duplication. For more information on what target search query is, refer to [Search in Target Before Sync](/integrate/configure-integrations/integration-configuration#search-in-target-before-sync) section.


# Known Behaviours And Limitations

## Common

There are a few limitations that are common across all connectors. The limitations are listed below:

* **User Mention Synchronization Limitations**
  * If both the source and the target system support synchronization of User mentions and the user which is being synchronized from the source system does not exist in the target system, then that user's display name as seen in the source system will synchronize to the target system as literal text.
  * If the source system supports synchronization of User mentions but the target system does not, then there are two scenarios:
    * If the user *exists in both the source and the target system*, then the target system's user's display name will synchronize to the target system as literal text.
    * If the source user *does not exist in the target system*, then the source system's user's display name as seen in the source system will synchronize to the target system as literal text.
  * In both the above-mentioned cases, once the literal text for the user's display name is synchronized to the target system, and when this data is synchronized back to the other system, the actual User mention will be overwritten with the literal text as displayed in the target system.
* **Inline Image Synchronization Limitations**
  * The inline image from an entity of the source system synchronizes as a broken image to the target system, given that the embedded inline image URL in the source system is not accessible/reachable from the machine on which <code class="expression">space.vars.OIM</code> is installed while the entity is getting synchronized. In that case, the inline image synchronizes to the target system without transformation in the URL corresponding to the target system. As a result, the synchronized image is broken.
  * Synchronization of the height and width of the inline image is performed only for HTML-supported systems.
  * If the same image is referred to more than once with a different height and width, then only the size of the last image is synchronized with all the images on the target side.
* **Comment Synchronization Behaviour (Edited Comments)**
  * Consider the following scenario:
    * Initial sync of an entity:
      * Comments **C1** and **C2** are added and synchronized to the target system.
    * Later:
      * Comment **C1** is edited in the source system.
  * When the edited comment is synchronized:
    * <code class="expression">space.vars.OIM</code> detects the updated **C1** based on its modified timestamp.
    * As **editing existing comments is not supported**, the <code class="expression">space.vars.OIM</code> does not update the previously synced comment (C1).
    * Instead, a **new comment is created** with the updated content.
  * This may result in **duplicate-looking comments** in the target system (original C1 + updated C1).

## End System Limitations

In addition to the common limitations, each system has its own set of synchronization limitations.\
Such limitations are available in the limitations section on each connector's page under [Connectors](/connectors).


# Manage

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center">⚙️ <strong>Administration</strong></td><td><a href="/pages/st8wIQ3AMFJJeD4Zft9D">/pages/st8wIQ3AMFJJeD4Zft9D</a></td></tr><tr><td align="center">🧰 <strong>Advanced Utilities</strong></td><td><a href="/pages/3HiSkPFDdHN9Dp4FsUjq">/pages/3HiSkPFDdHN9Dp4FsUjq</a></td></tr><tr><td align="center">🧩 <strong>APIs</strong></td><td><a href="/pages/ed6jdR8ednZuwCNkeFHe">/pages/ed6jdR8ednZuwCNkeFHe</a></td></tr><tr><td align="center">🤖 <strong>MCP Server</strong></td><td><a href="/pages/MRv3AdqM1yo7VKMnoNk6">/pages/MRv3AdqM1yo7VKMnoNk6</a></td></tr><tr><td align="center">⬆️ <strong>Upgrade</strong></td><td><a href="/pages/TV3dyAicgH7G3sO3CTtt">/pages/TV3dyAicgH7G3sO3CTtt</a></td></tr></tbody></table>
{% endif %}

{% if "OM4ADO" === visitor.claims.unsigned.product %}

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center">⚙️ <strong>License Installation</strong></td><td><a href="/pages/dTHtq57PauMdrbfXofLF">/pages/dTHtq57PauMdrbfXofLF</a></td></tr><tr><td align="center">🧰 <strong>Advanced Utilities</strong></td><td><a href="/pages/3HiSkPFDdHN9Dp4FsUjq">/pages/3HiSkPFDdHN9Dp4FsUjq</a></td></tr><tr><td align="center">⬆️ <strong>Upgrade</strong></td><td><a href="/pages/TV3dyAicgH7G3sO3CTtt">/pages/TV3dyAicgH7G3sO3CTtt</a></td></tr></tbody></table>
{% endif %}


# Administrator

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>User Management</strong></td><td><a href="/pages/ir33CHeBLDvHbyXubcVk">/pages/ir33CHeBLDvHbyXubcVk</a></td></tr><tr><td align="center"><strong>API Key Management</strong></td><td><a href="/pages/mG0fkBlJHgmLNzSpBC3k">/pages/mG0fkBlJHgmLNzSpBC3k</a></td></tr><tr><td align="center"><strong>Login Server Management</strong></td><td><a href="/pages/viPf2UANjxXEuFumodCx">/pages/viPf2UANjxXEuFumodCx</a></td></tr><tr><td align="center"><strong>Managing Licenses</strong></td><td><a href="/pages/bhnvVRbnzx7hL4wQkPUr">/pages/bhnvVRbnzx7hL4wQkPUr</a></td></tr><tr><td align="center"><strong>Proxy Settings</strong></td><td><a href="/pages/BzU5dUw0yOHiptO8g6d3">/pages/BzU5dUw0yOHiptO8g6d3</a></td></tr><tr><td align="center"><strong>Register Connectors</strong></td><td><a href="/pages/2gElsdzm9tDoed9tPc1a">/pages/2gElsdzm9tDoed9tPc1a</a></td></tr><tr><td align="center"><strong>Purge Change Logs</strong></td><td><a href="/pages/tZkaoBGRMNMBSf8EyGFS">/pages/tZkaoBGRMNMBSf8EyGFS</a></td></tr><tr><td align="center"><strong>Rules Management</strong></td><td><a href="/pages/ph4BCZ5DiAKrLqzbeGjN">/pages/ph4BCZ5DiAKrLqzbeGjN</a></td></tr><tr><td align="center"><strong>Reset Default Password</strong></td><td><a href="/pages/7DT94km0nATi9yojImHp">/pages/7DT94km0nATi9yojImHp</a></td></tr><tr><td align="center"><strong>Increase Server Memory</strong></td><td><a href="/pages/cH5Bv5dVgYb9lV9Wd2DO">/pages/cH5Bv5dVgYb9lV9Wd2DO</a></td></tr><tr><td align="center"><strong>Configure Socket Timeout</strong></td><td><a href="/pages/MN7de0h3Hz9jQgEn4Seo">/pages/MN7de0h3Hz9jQgEn4Seo</a></td></tr><tr><td align="center"><strong>Scheduler</strong></td><td><a href="/pages/S04wbuV9IpGj8njhiziu">/pages/S04wbuV9IpGj8njhiziu</a></td></tr><tr><td align="center"><strong>Log Viewer</strong></td><td><a href="/pages/9uMzU8wHAloMzrjC9rmJ">/pages/9uMzU8wHAloMzrjC9rmJ</a></td></tr><tr><td align="center"><strong>User Access Control</strong></td><td><a href="/pages/GmPHO5Lq6vTUqduKv8PL">/pages/GmPHO5Lq6vTUqduKv8PL</a></td></tr></tbody></table>


# User Management

In this section, you will learn how to create and manage users.

## Create User

Here is a video on how to create and manage users for different operations within <code class="expression">space.vars.OIM</code>:

> **Note** : All the new users in <code class="expression">space.vars.OIM</code> have administrator-level permissions. With the administrator-level permissions, the users will have access to all features.

{% embed url="<https://youtu.be/r8HbL_Kz-rQ>" %}

To add a new user, follow the steps given below:

* Click **Administration**.
* The **Users** page will open. You can see the list of users already added.
* To add a new user, click the plus sign (+) on the top right corner of the screen.

<div align="center"><img src="/files/7SCt7xlZhzfEL92tWfRB" alt="" width="2000"></div>

* The Create User form will open. Fill the following details in the form:
  * First name of the user
  * Last name of the user
  * Email Address of the user
  * User name: Provide name as per the username attribute on Identity Provider.\
    **Note:** For Azure Active Directory, it has to be same as 'Unique User Identifier'. To get 'Unique User Identifier' refer to [Username Identifier for Azure Active Directory](#username-identifer-for-azure-active-directory).

<div align="center"><img src="/files/3aGjrdDmrJJJJJVRQwXF" alt="" width="1000"></div>

* You also need to fill the fields as shown in the image above.
* Click **Save**.

> **Note** : All the new users have administrator-level permissions. With the administrator-level permissions, the users will have access to all features.

## Appendix

### Username Identifier for Azure Active Directory

* After logging in the Azure Active Directory,
  1. Go to **Enterprise applications**.

     <div align="center"><img src="/files/Rx7T2SCe2c2GuXFIebCD" alt=""></div>
  2. Select your application from **All applications**.

     <div align="center"><img src="/files/zHzTSDPcane4d3b12sRe" alt="" width="900"></div>
  3. Select **Single sign-on** from left panel.

     <div align="center"><img src="/files/XRnMnwSPJGL4J0KGopnf" alt=""></div>
  4. Refer to section **User Attributes & Claims**.

     <div align="center"><img src="/files/Q5SM0qNm2gH4jDaRUbWI" alt="" width="800"></div>

> **Note** : The attribute which is specified in 'Unique User Identifer' should be used while defining the user's 'User name' in <code class="expression">space.vars.OIM</code>. For example, here 'user.mail' is the selected attribute and so this property of the user from Azure Active Directory is to be used while defining 'User name' in <code class="expression">space.vars.OIM</code>.


# API Key Management

### Overview

API Keys provide a secure, dedicated credential for programmatic access to the [Admin APIs](/manage/api/getting-started-with-api) and [MCP integrations](/manage/mcp/getting-started-with-mcp) — without sharing a user's username and password.

> **Note:** API Key authentication is an additional mechanism and does not replace existing Basic Authentication.

* **License**
  * API Keys are available on the **Professional** and **Ultimate** editions only. To verify your edition, refer to the value shown in the footer of <code class="expression">space.vars.OIM</code>.
* **API Key Permissions**
  * An API Key inherits the permissions of the user who created it — it cannot be used to perform any action beyond what that user is authorized to do.
* **Where to Create**
  * API Keys are created and managed from the <code class="expression">space.vars.OIM</code> UI under **Administration → API key**, and can be revoked at any time. Refer to [Create an API Key](#create-an-api-key) for the steps.

***

### Access API Key Management

1. Click **Administration**.
2. Select **API key** from the options in the left pane. The **API key** list view opens, showing all keys you have created.

> **Note:** The toggle for **My API keys / All API keys** is visible only to administrators (Super Admin or users with **User Management – Write** permission). For more details, refer to [User Access Control](#user-access-control) on this page.

<div align="center"><img src="/files/XSjGc5CDtW42ao46v8dG" alt="" width="1000"></div>

The list displays the following details for each key:

| Column            | Description                                                            |
| ----------------- | ---------------------------------------------------------------------- |
| **Name**          | The unique label provided when creating the key.                       |
| **Created By**    | The user who created the key.                                          |
| **Created on**    | The timestamp when the key was created.                                |
| **Expires on**    | The configured expiry datetime of the key.                             |
| **Last accessed** | The timestamp of the last successful use of the key.                   |
| **Status**        | The current state of the key: **Active**, **Expired**, or **Revoked**. |
| **Action**        | Option to revoke the key.                                              |

> **Note:** For security reasons, this list shows only the key's details, not the key value itself. The actual API Key value is shown only once at the time of creation.

***

### Create an API Key

1. Navigate to **Administration → API key**.
2. Click the **+** button on the top right corner of the screen.
3. The **Create API Key** form opens. Fill in the following details:
   * **Name** *(required)* — A unique name to identify the key.
   * **Expires on** *(required)* — A future expiry datetime, no more than **1 year** from the current date.

#### Field Validations

The same validations apply while creating or editing a key. If an entered value does not meet a rule, a warning message is shown and the key is not saved:

| Field          | Validation                                                                                      | Warning message                                                                                       |
| -------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| **Name**       | Must be unique.                                                                                 | API key name must be unique.                                                                          |
| **Expires on** | <p>• Must be a future date and time.<br>• Cannot be more than 1 year from the current date.</p> | <p>• Expiry date must be a future datetime.<br>• Expiration date cannot exceed 1 year from today.</p> |

<div align="center"><img src="/files/IEd6ka1qVJRRpDY7CEVa" alt="" width="1000"></div>

4. Click **Save**. The system generates a cryptographically secure API Key.
5. The generated key is displayed **one time only** in a pop-up. Click **Copy** to copy the key and store it securely.

<div align="center"><img src="/files/qkTUYQ518qkMGuw4ooGn" alt="" width="600"></div>

6. Click **Close** to dismiss the pop-up. You are redirected back to the API key list view where the newly created key is visible.

{% hint style="warning" %}
**Important:** For security reasons, the API Key value is shown **only once**. After the pop-up is dismissed, the key value cannot be retrieved again. Be sure to copy and store it in a secure location. If the key is lost, you must generate a new key.
{% endhint %}

***

### Use an API Key

Once generated, an API Key can authenticate requests to the **Admin API** and **MCP** endpoints. Pass the key in one of the following request headers:

```
x-api-key: <api-key>
```

or

```
Authorization: ApiKey <api-key>
```

On a successful request, the **Last accessed** timestamp of the key is updated automatically. If the key is invalid, expired, or revoked, a **401 Unauthorized** response is returned:

```json
{
  "errorMessage": "Authentication failed. Valid credentials are required to access this resource.",
  "stackTrace": null
}
```

***

### Edit an API Key

An API Key can be edited only while it is in the **Active** state.

1. Navigate to **Administration → API key**.
2. Click on an active key to open its details.
3. Click the edit button on the top right corner.
4. Update the **Name** and/or **Expires on** fields. The same field validations apply as when creating a key.
5. Click **Save**.

<div align="center"><img src="/files/bWFHvFyFT95WMaxrZqnB" alt="" width="1000"></div>

> **Note:** Editing is not available for expired or revoked keys — the edit option will be disabled for those keys.

***

### Revoke an API Key

You can revoke a key from the **API key** list view by clicking the **✕** button in the **Action** column against that key.

<div align="center"><img src="/files/z5kBDVVRhEx2W9Mbh51n" alt="" width="1000"></div>

1. Navigate to **Administration → API key**.
2. Click the **✕** button against the key you want to revoke in the **Action** column.
3. A confirmation prompt appears: *"API key with name \<api-key-name> will be permanently revoked. This action is irreversible."*
4. Click **Yes, revoke it!** to confirm.

<div align="center"><img src="/files/GwN0rZjE6QxOkNy0grRg" alt="" width="600"></div>

After revocation:

* The key remains visible in the list with a **Revoked** status — it is not deleted.
* Any subsequent request using that key returns a **401 Unauthorized** response.
* A revoked key cannot be reactivated. If access is required again, a new key must be generated.

***

### API Key Statuses

Every API Key has one of the following statuses:

| Status      | Description                                                                     |
| ----------- | ------------------------------------------------------------------------------- |
| **Active**  | The key is valid and can be used to authenticate requests.                      |
| **Expired** | The configured expiry datetime has been reached. The key can no longer be used. |
| **Revoked** | The key has been revoked. It cannot be used, restored, or reused.               |

A newly created key starts in the **Active** state. **Expired** and **Revoked** are terminal states — a key in either state cannot be restored or reused.

***

### Audits

All actions performed on API Keys are logged and can be viewed from the **API key audits** screen. Each audit entry captures the **Name**, **Author**, **Change Time**, **Revision Type**, and changed field values.

<div align="center"><img src="/files/MM9Wa5cmQE37U188MKce" alt="" width="1000"></div>

The following actions are recorded:

* **Create** — logged when a new key is created, along with its name and expiry date.
* **Update** — logged when the name or expiry date of a key is changed.
* **Revoke** — logged when a key is revoked, along with the change in its status.

***

### User Access Control

* Any authenticated user, irrespective of role, can generate and manage their own API Keys.
* A user can only view and manage their own keys — they cannot view, modify, or revoke keys created by another user.
* By default, only the **Super Admin** can manage API Keys across all users. Users with the **User Management – Write** permission in a custom role can also view and manage API Keys of other users. Refer to [User Access Control](/manage/administrator/user-access-control) for more details.

> **Note:** A regular user always sees only their own keys. Users who are allowed to manage other users' keys (the **Super Admin**, or a custom role with **User Management – Write** permission) get a toggle on the **API key** list view to switch between **My API keys** (only the keys they created) and **All API keys** (keys across all users). This toggle is visible only to these privileged users — a regular user does not see it.

<div align="center"><img src="/files/ckLYZmQcYNAofQvYU0QR" alt="" width="1000"></div>

***

### Known Behaviors

| Behavior                          | Detail                                                                                             |
| --------------------------------- | -------------------------------------------------------------------------------------------------- |
| **Key shown once**                | After generation, the key value cannot be retrieved. A new key must be generated if it is lost.    |
| **Revocation is immediate**       | Once revoked, a key cannot be restored. A new key must be generated if needed.                     |
| **No key rotation**               | In-place key rotation is not supported. Generate a new key and revoke the old one.                 |
| **No per-key permission scoping** | API Keys inherit the generating user's full permissions — granular scope control is not supported. |
| **Deleted user keys**             | All API Keys of a deleted user are revoked automatically and cannot be reactivated.                |


# Login Server Management

<code class="expression">space.vars.OIM</code> supports LDAP and SAML Authentication, so that user can login with their own LDAP or SAML credentials.

## LDAP

### LDAP Server Limitations

<code class="expression">space.vars.OIM</code> does not support configuration and authentication of LDAP servers that are running behind the proxy.

### New LDAP Server Configuration

To proceed, select Login Server Type as LDAP. This will display the form shown above. Provide the following inputs to all the fields:

Select Login Server Type as LDAP and the form shown above would be displayed. Provide inputs to all the fields, as given below:

* **Login Server Name**: Enter a unique name for the LDAP Server configuration.
* **LDAP Domain String**: Enter the exact directory path (Distinguished Name) where LDAP users reside.

If your company structure is as follows:

<div align="center"><img src="/files/QOzn4Vsok2jTTz7f8BtJ" alt="Company Structure"></div>

Now, here if you want to give access to John Doe, follow the below configuration:

<div align="center"><img src="/files/fEplcU2NAyr3hwskVhhb" alt="LDAPS"></div>

Below are the three examples for constructing path:

1. As per the above example, the domain string will be:\
   `CN=John Doe,CN=UsersSales,OU=Sales,OU=People,DC=company,DC=com`\
   This path means Look for "John Doe" in "UsersSales" group within the "Sales" Organizational Unit, under "People" Organizational Unit in the company domain structure company.com.
2. A few more examples for better understanding. Let's say the path is:\
   `CN=UsersEng,DC=company,DC=com`\
   This path will give access to all users under "UsersEng" group within company domain company.com.
3. Now, if there is another OU "Engineering" parallel to "Sales" organization unit, then the path formed will be:\
   `CN=Smith Doe,CN=UsersEng,OU=Engineering,OU=People,DC=company,DC=com`

The paths mentioned above must match the LDAP directory structure precisely to locate the users. An incorrect path may allow a successful test connection but can cause login failures.\
If you want to give permission to these two OU's "Sales" and "Engineering" only in company.com, then we must configure two LDAP configurations.

* **LDAP Directory Host**: Specify the LDAP server's machine name or IP address.
* **LDAP Server Port**: Enter the port number on which the LDAP server is running. The default is 389 for LDAP, and 636 for LDAPS.
* **Username Attribute**: Choose the LDAP attribute for validating usernames. Options include CN, UID, Name, sAMAccountName, or userPrincipalName. You can use any of the above options. For example, if set to sAMAccountName, the login process will use this attribute to validate the provided username.
* **Username**: Provide a username for connecting to the LDAP server. This is mandatory if the Username Attribute is set to UID, Name, or sAMAccountName. It’s not required for CN or userPrincipalName.
* **Use SSL Encryption**: Select YES if the connection to the LDAP Server is secured, otherwise select NO.
* **Password**: Provide a password for the above given username.

**Note** : For LDAPS, the certificates will be auto imported by <code class="expression">space.vars.OIM</code> and if not, then user can manually import it as specified in [Import SSL Certificates](/getting-started/installation/ssl-certificate-configuration).

* **Allow Anonymous Login**: Select "Yes" if you want to allow Anonymous login. If the anonymous login feature is enabled on your remote LDAP server and this option is activated in the login server configuration, users can log in without a password.
* Select **Test Connection Before Adding Server** when users want to test the connection before adding it to the records. Otherwise, it would only be added to the database but not validated.

After providing all the inputs, user can test or save the configuration.

* **Save Configuration**: It will save the entire configuration of LDAP Server to database. If **Test Connection Before Adding Server** is put on, then, <code class="expression">space.vars.OIM</code> would first test the connection and if the connection to the server is successful, it would save the configuration to the database. The server would be added in the Inactive state.
* **Test Configuration**: This will validate the connection to the LDAP server using the provided configuration details. If no connection username and password are specified, the test will verify only the connectivity to the LDAP server host, without performing a bind or login request.

Once the server is configured, user needs to activate it to authenticate with that server.

**Note** : To use <code class="expression">space.vars.OIM</code> using LDAP user, we need to create LDAP user in <code class="expression">space.vars.OIM</code>. Refer to Create User section on [User Management](/manage/administrator/user-management) page to create LDAP user.

***

## SAML 2.0

Identity Providers following SAML 2.0 standards and having HTTP/HTTPS metadata URL for downloading their metadata are supported.

### Just-In-Time (JIT) User Provisioning

* We Support SAML-based Just-In-Time (JIT) user provisioning, where users are automatically created in the application upon their first successful login.
* No prior user creation is required. User attributes such as name, email, and roles/groups are populated dynamically from the Identity Provider (IdP) during authentication.
* This ensures consistent user data and streamlined onboarding aligned with the IdP.

### Identity Provider (IdP) Requirements

To enable SAML JIT user provisioning, the Identity Provider must be configured to send the required user attributes in the SAML assertion.

#### Mandatory Attributes

| Attribute Name | Description                                |
| -------------- | ------------------------------------------ |
| First Name     | User’s given name                          |
| Last Name      | User’s family name                         |
| Email          | email id for the user                      |
| Groups         | Group information associated with the user |
| Roles          | Roles information associated with the user |

> **Note:** Attribute names and formats must align with the application’s SAML configuration. You can define Groups or Roles, both are not required.

#### User Data Handling

When a SAML response is received:

* The <code class="expression">space.vars.OIM</code> checks whether the user already exists.
* If the user does not exist, a new user is automatically created (JIT provisioning).
* User attributes are created or updated from the Identity Provider (IdP), including:
  * First Name
  * Last Name
  * Email Address
  * Group or role attributes provided by the IdP
* User details are refreshed on every login to stay aligned with the IdP.

> **Note:** User that was pre-created by admin will not be de provisioner if the IDP is not providing any Group or role information. User that was auto created via JIT approach will be de provisioner.

### Service Provider Metadata

Below information should be used for configuring <code class="expression">space.vars.OIM</code> as a Service Provider for Identity Provider(s):

* **Assertion Consumer Service (ACS) URL** or **Single sign on URL** → `<protocol>://<hostname>:<port>/OpsHubWS/login/saml2/sso/opshubsaml`
  * protocol: `http` or `https` depending on the type of <code class="expression">space.vars.OIM</code> installation
  * hostname: hostname of machine where <code class="expression">space.vars.OIM</code> is installed
  * port: port on which <code class="expression">space.vars.OIM</code> is installed
* **Audience URI** or **Service Provider Entity ID** → `opshubsaml`

**Note** : The complete <code class="expression">space.vars.OIM</code> SAML Service Provider metadata can be downloaded from:\
`<protocol>://<hostname>:<port>/OpsHubWS/saml/metadata`

### New SAML Login Server Configuration

For enabling SAML authentication, user needs to configure SAML server. For configuring new SAML server, go to\
**Administration > Login Server Management > Add Login Server**.\
Select Login Server Type as SAML 2.0 and the form shown below would be displayed:

<div align="center"><img src="/files/UibS7RE3AaYc4hyk4R3L" alt=""></div>

* Provide inputs to all the fields, as shown in the above image. Only after providing all the inputs, user can save the configuration.
* The <code class="expression">space.vars.OIM</code> allows administrators to define how IdP groups or roles map to <code class="expression">space.vars.OIM</code> roles using a JSON configuration.
* Group‑to‑Role mapping enables automatic role assignment at login, centralized access control through IdP groups and elimination of manual role management in the <code class="expression">space.vars.OIM</code>.
* The mapping configuration is defined as a JSON array. Each object in the array specifies:
  * An IdP group or role name
  * One or more corresponding <code class="expression">space.vars.OIM</code> roles
  * For example,

    ```json
    [
      {
        "idpGroupOrRoleName": "IDP_ADMIN_GROUP",
        "opshubRoleNames": ["ROLE_ADMIN", "ROLE_MANAGER"]
      }
    ] 
    ```
  * If multiple roles given, <code class="expression">space.vars.OIM</code> will assign the unique union role to the user.
* The server would be added in Inactive state.
* SSL certificate needs to be imported when SAML Identity Server is on HTTPS. To import the SSL certificate, please follow the steps given on [Import SSL Certificates](/getting-started/installation/ssl-certificate-configuration).\
  **Note:** In case of Azure SAML, refer to [Azure Active Directory Configuration](#azure-active-directory-configuration)
* Once the server is configured, user needs to create equivalent SAML Users in <code class="expression">space.vars.OIM</code> and then Activate the SAML login server, in order to authenticate with that server. **Note** :Refer to Create User section on [User Management](/manage/administrator/user-management) page to create SAML user.

***

#### Azure Active Directory Configuration

* **For downloading HTTPS Certificate:**
  1. Go to **Enterprise applications**

     <div align="center"><img src="/files/Rx7T2SCe2c2GuXFIebCD" alt=""></div>
  2. Select your application from **All applications**

     <div align="center"><img src="/files/zHzTSDPcane4d3b12sRe" alt=""></div>
  3. Select **Single sign-on** from left panel

     <div align="center"><img src="/files/XRnMnwSPJGL4J0KGopnf" alt=""></div>
  4. Go to section **SAML Signing Certificate** and download 'Certificate (Base64)'

     <div align="center"><img src="/files/mFmXzWxv4r4Ctrwk3wiu" alt=""></div>
* **For extracting the key credential from metadata XML file:**
  1. Open metadata URL in new browser window. It will open an XML file.
  2. Find `<X509Certificate>` inside `<Signature>` tag.
  3. Copy the key between `<X509Certificate>` and `</X509Certificate>`
  4. Paste it into a new file in the below format and save with `.crt` extension:

     ```
     -----BEGIN PKCS7-----
     <Paste key here>
     -----END PKCS7-----
     ```
  5. Now import the key certificate file into `opshubSAMLKeyStore.jks`.\
     Refer to [Import SSL Certificate](/getting-started/installation/ssl-certificate-configuration) for steps. Use:
     * **Path:** `<<OpsHub_Installation_Directory>>\OpsHub_Resources\config\opshubSAMLKeyStore.jks`
     * **Password:** `int3gr@tion`

***

### Known Behaviors

* If <code class="expression">space.vars.OIM</code> is behind the proxy server, and you want to configure SAML authentication, then after configuring proxy using [Proxy Setting](/manage/administrator/proxy-setting), you need to re-start the <code class="expression">space.vars.OIM</code> server.
* Users pre-created by an administrator will not be de-provisioned if the IdP does not provide group or role information. However, users created via JIT provisioning will be assigned the default least permission where only login is allowed and not able to read any data even, roles/groups attributes are no receiving from the IdP.

***

## Default <code class="expression">space.vars.OIM</code> Server

In the list of login servers, users can find a record for **Default Server** of type <code class="expression">space.vars.OIM</code>.\
Using this, users can login with the default credentials or the users configured in <code class="expression">space.vars.OIM</code> itself fall in this category.

<div align="center"><img src="/files/EYguJUTJki7rXJYtDiJN" alt=""></div>

This server cannot be deleted.

**Note** : If the Default Server is inactivated and <code class="expression">space.vars.OIM</code> is unable to connect with any of the active LDAP servers, please contact sales/support representative.

### Password Policy Configuration

**Admin** users with the **Super Administration** role can define the password security standards for users authenticating via the default server. By default, the system enforces a password strength policy requiring a **minimum of 10 characters** and at least **three of the four** available character types:

* Uppercase letters (A–Z)
* Lowercase letters (a–z)
* Numbers (0–9)
* Special characters (!@#$%^&\*).

To customize these settings, navigate to the Default <code class="expression">space.vars.OIM</code> Server configuration page:

<div align="center"><img src="/files/zUC1xEPBbe0QiyNz3v9c" alt=""></div>

* Password Policy Configuration: Use the toggle to enable or disable custom policy enforcement.
* Password Minimum Length: Specify the minimum number of characters required. This value must be 10 or greater.
* Password Strength Requirements: Select the character types that must be included in a valid password. At least three of the following options must be selected:
* Click **Save Configuration** to apply the changes.

**Note** To maintain a high security standard, the default policy serves as a mandatory baseline. While administrators can further strengthen these requirements (e.g., requiring 12 characters or all four character types), the policy cannot be downgraded below the 10-character/3-type minimum.

***

## View Login Servers

To manage Login servers, go to **Administration > Login Server Management > View Login Servers.**\
It would lead to the page which allows managing multiple servers.

This page displays all the configured login servers with a search tool in the first part.

<div align="center"><img src="/files/t18kbdoHnr4iwRWoWX9E" alt=""></div>

One can search configured login servers using the search options available.

* **Server Name**: Search could be done by name of server.
* **Status**: Login servers could be filtered by the state **Active** or **Inactive**.
* **Server Type**: Login Servers could be filtered on the basis of Server type, i.e. LDAP, SAML 2.0 or <code class="expression">space.vars.OIM</code>.

**Login Server view has the following information:**

* **Server Name** of the servers configured.
* **Server Type** of the servers configured.
* Current **Status** of the servers.
* **Actions**: Following actions could be performed on a server:
  * **Edit**: User can edit the server configuration as per their requirement.
  * **Activate/Inactivate**: User can change the status of the server as per their requirement.
  * **Delete**: User can delete the server configuration.

**Note** All servers cannot be inactivated at the same time. At any point of time, at least one server should be in Active state.


# Managing Licenses

## Overview

This section covers how to install new licenses, renew licenses and uninstall licenses.

The License Management option will be shown under the Administration drop-down.

<div align="center"><img src="/files/mOhBB0CjNkYuRQTCurES" alt="" width="1000"></div>

The License Management section contains your license details and information such as what kind of license you have, how many days are left for your license to expire, etc.

For detail about how to get a license issued, please refer the section [How to Procure and Renew Licenses](#how-to-procure-and-renew-licenses) in appendix.

## Install License

* Navigate to the Administration section and select **License Management** from the drop-down options.

<div align="center"><img src="/files/YHAwa0dZhL6rqOkEU8ux" alt="" width="1000"></div>

* Click the **Upload License** link. It will open install license window.

<div align="center"><img src="/files/kj8iERAI0Hs05skmvJJE" alt="" width="1000"></div>

* You can drag & drop the license on **Drop license file here** box or upload the license file using the **Choose File** button.
* License updates will get populated in the form on the right.
* Click **Install License** button to install the license. If you want to reset this change, click the **Reset** button.

After installing, refresh the browser.

**Note** : You can check the status of license and even delete the license from this window.

## View License

* Navigate to the Administration section and select **License Management** from the drop-down options.
* You will see the **Licenses** screen.
* Click the eye icon against the License name for which you want to view the details.

<div align="center"><img src="/files/hY2q87SuZPfB1lZyYQQe" alt="" width="1000"></div>

A pop-up with **License Details** will open.

<div align="center"><img src="/files/6GRu0Xpc3B5CbUm3dC19" alt="" width="700"></div>

**Note** See the Version \[Example: QAOIMV6.16-U4B002] and Build \[Example: QA2018Q1PH19\_6\_16\_004\_B002] details in the footer.

## License Expiry Notification

* <code class="expression">space.vars.OIM</code> **UI Notifications**
  * On <code class="expression">space.vars.OIM</code>, upon login, upcoming license expiry warning notifications will be shown for each license starting 60 days till its expiry date. **Note** : No additional configuration is required to enable the same.
* **Mail Notifications**
  * To get mail notifications regarding each upcoming license expiry, the SMTP mail server notifications can be configured
  * Refer to [Creating SMTP System](/help-center-index/troubleshooting-index/configure-post-failure-notification#smtp-configuration) for creating an SMTP system.
  * SMTP Mail Client system must be created in <code class="expression">space.vars.OIM</code> and configured in **OpsHub System** under **SMTP System For Notification**.

<div align="center"><img src="/files/i6mfUhcetUMvG4t5dzTt" alt="" width="900"></div>

* Mails will be sent out to the **to** and **cc** configured in SMTP system.
* It will notify the configured SMTP system regarding upcoming expiry at intermittent intervals starting from 60 days before its expiry date. It will send out mail notifications on 60, 45, 30, 15, and from 10 days until 1 day before the expiry of any license.
* If for any reason (such as the SMTP mail server is not connected or SMTP system configuration is not valid or <code class="expression">space.vars.OIM</code> is down) license expiry notification doesn't come, it will be logged in <code class="expression">space.vars.OIM</code> logs.

## Uninstall License

* Navigate to the Administration section and select **License Management** from the drop-down options.
* You will see the **Licenses** screen.
* Click the cross icon against the License name which you want to delete.

<div align="center"><img src="/files/vpiFSIPMlU5AYhOCVl0l" alt="" width="1000"></div>

After uninstalling, refresh the browser.

**Note** You will not be able to see the details for a trial license and you will not be able to uninstall it.

### How to Procure and Renew Licenses

For procuring a license, you have to contact our [Sales](mailto:sales@opshub.com) / [Support](mailto:ps@opshub.com) representatives.

* Name
* Email
* Phone
* Organization name
* Country
* MAC Address

If you want to renew your license, send your current license number and your requirement to our sales/support representatives.

<code class="expression">space.vars.OIM</code> works best with the following browsers: Google Chrome, Mozilla Firefox, and Safari.

## Known Behaviour

* When multiple valid licenses are installed, feature availability is determined by the latest generated license. This license is treated as the active license for feature validation.
* If a newly installed license does not include features that were available in a previously installed license, those features will no longer be available, even if the older license remains installed and valid.
* Before installing a new license, review the feature differences carefully. A warning message will be displayed if the new license contains fewer features than the currently active license.


# Proxy Settings

You need to configure proxy settings to be able to access the external resources from the machine which is behind a proxy server or when <code class="expression">space.vars.OIM</code> is behind a proxy server.

## How to Configure Proxy Settings

Watch the following video to learn how to configure proxy settings:

> **Note:** This video has no audio.

{% embed url="<https://youtu.be/KL7eiS9HdXQ>" %}

1. Navigate to the top right corner of the screen and click **Administration** as shown in the screenshot below:

<div align="center"><img src="/files/Im4qxTgO2W16elPbWdgF" alt="" width="1000"></div>

2. Now, click the third icon on the left menu as shown in the screenshot below:

<div align="center"><img src="/files/zsCSuPezgGGyvZjEP0Us" alt="" width="600"></div>

The proxy settings form opens as shown in the screenshot below:

<div align="center"><img src="/files/7v5NT2DnnJUsqECiRGmN" alt="" width="800"></div>

3. Fill the relevant details in the form:

**HTTP settings**

* For HTTP you can fill the following details:
  * Provide the **HTTP Host Name** if proxy is configured on HTTP
  * Provide **HTTP Port** on which HTTP proxy is configured (by default it will use port 80)
  * Provide **HTTP Username** to connect to proxy if username is configured for above proxy
  * Provide **HTTP Password** if password is configured for above proxy
  * For **HTTP Non Proxy Hosts**, provide host(s) that should be connected directly without using HTTP proxy and separate the names with "|"
    * Some examples are: `10.13.27.1|10.13.27.200|jira.aws.com|localhost`

**HTTPS settings**

* Select **Use Same Parameter** for HTTPS as **Yes**, if both HTTP and HTTPS are configured on same proxy server – otherwise, select **No** and provide the credentials to connect to HTTPS proxy
  * Provide the **HTTPS Host Name** if proxy is configured on HTTPS
  * Provide **HTTPS Port** on which HTTPS proxy is configured (by default it will use port 443)
  * Provide **HTTPS Username** to connect to proxy if username is configured for above proxy
  * Provide **HTTPS Password** if password is configured for above proxy
  * For **HTTP Non Proxy Hosts**, provide host(s) that should be connected directly without using HTTPS proxy and separate the names with "|"

**SOCKS settings**

* For SOCKS, you can fill the following details:
  * In **SOCKS Host Name**, provide host name of the SOCKS Proxy
  * In **SOCKS Port**, provide the port where proxy is installed; if, by default, it is kept empty, set port 1080 with the given host name
  * Provide **SOCKS Username** to connect to the proxy
  * Provide **SOCKS Password** for the given user name

4. Save the configuration and check the connection by trying to create mapping.


# Register Connectors

## Overview

This section will guide the users on how to register and edit the connectors.

## Register Connectors

* Connectors can be registered from administration page by clicking the "plug" icon ![](/files/03NWQLpCu6zzRhOD3y7I) present in left side bar as shown in the image below:

![](/files/FS6kheJPxxcG8RvW8OI5)

* To register a connector, click the "+"\[add image] icon on the top right corner of the "Registered Connectors" page.
* The following page comes which requires two inputs as shown in the image below:

![](/files/QdnlNMBU94nZFWypX5Wj)

* Fill the form with relevant details:
  * **'''System Type Name '''**: The name that you want to assign to the connector you are registering. This name will be shown in the system type list on "Configure Systems" page.
  * **'''SDK API Base URLs'''**: Base URL of the Connector SDK where it is hosted. E.g., http\://:/sdk-api/api/1.0 . You can add more than one SDK URLs for a given connector. It can be added with the "+" icon present on the right side of the text box.The first URL entered will be used for fetching the metadata of the connector. All the SDK API calls will be made by appending resource path in this URL.
* All the URLs entered will be checked if they are implemented with the same connector's name and version or not.
* After entering valid details, click the Save button to register the connector with the given name.

> **Note** : System Type Name must be unique as <code class="expression">space.vars.OIM</code> won't allow you to use the same name for registering the connector.

## View Connectors

* The registered connectors are available in the form of list on the "Registered Connectors" page as shown in the image below:

![](/files/yE5nm2ZNT3DvkF8ccjwW)

* There is an audit icon ![](/files/Nw7ABBPSHdxeHH3H3PD8) present on the top right corner of the list. Clicking this icon will show all the audits related to the registered connectors.

## Edit Connectors

* Registered connectors can be edited by clicking the specific connector followed by clicking the pencil icon on the top right corner of the page.

![](/files/2UPmLtJijrSKroB2d96D)

* You can edit the system name, add or remove URLs. There is also a check box in case you want to refresh the metadata of the connector.

![](/files/hjEYBSTyGPQymoXaPgij)

> **Note** : Edit register connector option will not allow you to remove the URL if it is already used in any system or in the integration of the systems. An error message will be displayed in case the URL that is already in use is deleted.

### Refresh Connector Metadata

Refresh Connector Metadata checkbox (as shown in the image above) can be selected under the following condition:

* Whenever there is any change (addition or deletion) of metadata in the connector.

While editing the connector, if the refresh connector metadata is checked, a warning pops up as shown in the image below:

<div align="center"><img src="/files/B0M4QqZdwqEQiQqR831h" alt=""></div>

> **Note**: If you want to refresh metadata for a connector, it is advisable to verify the systems and integrations that will be affected.

This warning box contains the instructions on how the systems and integrations created on the connector will be affected, if you choose to refresh the metadata of the connector. As shown in the image, this warning also shows the particular field that is removed and the screens affected by it.


# Purge Change Logs

## Overview

* The **Purge** feature in <code class="expression">space.vars.OIM</code> helps users clean up old or unnecessary data associated with integration configuration changes or previously synchronized records.
* Following are the types of **Purge** provided:
  * **Audit Logs**: It enables users to purge different types of change logs, such as **Excel upload audits**, **Job schedule audits**, **Roles audits**, etc. Refer to the [Purge Audit Logs](#purge-audit-logs) section for more details.
  * **Integrated Data Records**: It enables users to purge integrated data records from the <code class="expression">space.vars.OIM</code> database. Refer to the [Purge Integrated Data Records](#purge-integrated-data-records) section for more details.

### Steps to access the Purge Feature

* Navigate to the top-right corner of the screen and click **Administration**.

<div align="center"><img src="/files/nEFYqDVgYb87d8RCAEak" alt="" width="800"></div>

* Now, click the **Purge** icon on the left sidebar, as shown in the image.

<div align="center"><img src="/files/gNFow4zFD5NrIdwdBKrH" alt="" width="800"></div>

## Purge Audit Logs

### Overview

**Purge Audit Logs** provides the functionality to purge change logs for the following component(s):

1. Event failures
2. Excel upload
3. Integration change
4. Job schedules
5. Login information
6. Login server
7. Mapping
8. Permissions associated with roles
9. Roles
10. System
11. System type extension
12. Users
13. Workflow

### Prerequisites

Only users with an **Ultimate** license can access the **Purge Audit Logs**.

### Steps to purge audit logs

1. From the **Purge category**, select the **Audit Logs** as shown in the image below.

<div align="center"><img src="/files/GAXfJi8T1PXVhHQoWyYN" alt="" width="800"></div>

2. Now, from the **Audit component(s) drop-down list**, select the **Audit component(s)** as per your requirements, as shown in the image below.
3. Then select the date from the **Purge audits created before date** field.

<div align="center"><img src="/files/uPnQ2TuYtiKR5A636W9g" alt="" width="800"></div>

4. Click the **Purge** button to filter the information according to the specified inputs.

Audit Logs of all the selected components before the specified date in the **Purge audits created before** field will be purged.

## Purge Integrated Data Records

### Overview

* The **Purge Integrated Data Records** feature allows users to clean up integrated data directly from the <code class="expression">space.vars.OIM</code> user interface, eliminating the need for standalone SQL utilities.
  * This improves usability and accessibility and simplifies the cleanup process.
* This feature is especially useful in **re-sync** or **re-migration** scenarios, where previously synchronized data needs to be purged before initiating a new sync.
* Users can filter and control purge operations based on the following:
  1. **System Pair:** Select the source and target systems involved
  2. **Integration Groups:** Choose from configured integration groups between the selected systems
  3. **Entity Type Pairs:** Choose from configured entity type mappings within the integration group

### Prerequisites

#### User privileges

Following are the privileges required for the dedicated <code class="expression">space.vars.OIM</code> user to purge synchronized entities:

**Required role**

| **Role Name**       | **Required in** |
| ------------------- | --------------- |
| Super Administrator | Administration  |
| Sync Monitor        | Integration     |

**Minimum required permissions in case of customized roles**

| **Permissions Name**                          | **Permissions Scope** |
| --------------------------------------------- | --------------------- |
| Administration Permissions: Server Management | Delete                |
| Integration Permissions: Integration          | Action                |

Refer to the [Permissions and Corresponding Actions](/manage/administrator/user-access-control/role-configuration#permissions-and-corresponding-actions) section to understand which operations can be performed based on the configured role.

#### License requirement

* Users with either a 'Professional' or 'Ultimate' license have access to the **Purge Integrated Data Records** feature.

#### Purge usage guidelines

* For **configured integrations**:
  * Integrations must be **inactivated** before purging their synchronized records.
  * **Reason:** Purging data from an active integration can accidentally remove information that is still in use or currently being synchronized. This may result in processing failures or even impact other active integrations.
* For **deleted integrations**:
  * Purge operations are also supported for **deleted integrations**, allowing removal of previously synchronized records and related data from the database.
  * **Important:** Ensure that the **issue type(s)** configured in the deleted integration are **not used in any existing integration** with the same system and scope.
  * If they are still in use, the purge will fail with an error, as illustrated in the image below.

<div align="center"><img src="/files/BsNQcA9z0cFzRRsunOFR" alt="" width="800"></div>

### Steps to purge integrated data records

1. From the **Purge category**, select **Integrated data records** as shown in the image below.

<div align="center"><img src="/files/3Uf3g1baLeyD6fm5yxwM" alt="" width="800"></div>

2. Now, select **System 1** and **System 2** from the dropdown to filter the integrated records for purging as shown in the image below.
   * These are mandatory selections.

<div align="center"><img src="/files/U9x1UhxIy2lVwGEoJrS0" alt="" width="800"></div>

3. After selecting both **System 1** and **System 2**, the interface displays **Integration state** and **Integration(s)** as shown in the image below.

   * The **Integration(s)** dropdown lists configured (but inactive) integrations between the selected systems by default.
   * You can switch to **deleted integrations list** by choosing **Integration state** as **Deleted**.
   * These selections are optional, meaning purge can be performed based solely on the system selection also.

   <div align="center"><img src="/files/8XCSU2ubPrO5tgByhYst" alt="" width="800"></div>
4. From the **Integration(s)**, select the integrations as per your requirements as shown in the image below.

   * This is a multi-select field, allowing multiple integrations to be selected for purge at the same time.

   <div align="center"><img src="/files/bSvcjAEQWXNimTv2be6R" alt="" width="800"></div>
5. After selecting **Integration(s)**, the interface displays **Entity type pair(s)** as shown in the image below.
   * Users can select for which **entity type pair(s)** they want to purge the synced records.
   * This is a multi-select field, allowing multiple pairs to be selected for purge at the same time.

<div align="center"><img src="/files/0gRSe0XDMjsl2EDpRI4Z" alt="" width="800"></div>

```
> **Note**: **Entity type pair(s)** is not available for **Deleted Integrations**. All entity types configured for the deleted integration will be purged.
```

6\. After selecting required **Entity type pair(s)**, click on **Next** to view the details of records to be purged.

<div align="center"><img src="/files/omRnXIfZaKO5qn1PzYfd" alt="" width="800"></div>

7. The **Purge confirmation** page loads as shown in the image below:

<div align="center"><img src="/files/lpNFjySCKyfcf8mykyaw" alt="" width="800"></div>

* The **Purge confirmation** page is a critical safety checkpoint in the database cleanup process that displays a comprehensive preview of all integrated records that will be marked for deletion from the OpsHub database. This page serves as the final verification step before executing the purge operation.
* **Key Aspects**:
  1. **Warning Alert:** The selected records will be marked as deleted in the OpsHub database. These records will be recreated during resynchronization. A backup of the database is strongly recommended before proceeding.
  2. **Records Preview Table:** Users can review detailed information about the records being purged, including integration name, systems involved, projects, entity types, and IDs.
  3. **Export Option:** An option to export the record list as a CSV file is available for offline review or audit purposes. The file will be downloaded to the **Downloads** folder in the user end-system.
  4. **Data Preservation:** All deleted records are saved as CSV files in the <code class="expression">space.vars.OIM</code> directory, `@INSTALLATION_PATH@\AppData\PurgedRecords` and kept permanently unless manually removed.

Click on **Purge** to purge the selected records from the **OpsHub** database.

### Important Purge Behaviors and Considerations

#### End System Data Not Cleaned Before Purging

* Before purging records from <code class="expression">space.vars.OIM</code>, make sure the synced data is also deleted or archived in the target (end) system.
* If the end system still holds the data, <code class="expression">space.vars.OIM</code> will lose reference to it after purge.
* Upon reactivating the integration, <code class="expression">space.vars.OIM</code> will treat the existing entities in the end system as new, resulting in:
  * Duplicate records
  * Orphaned entities
  * Data inconsistencies and potential sync conflicts

#### Replication of Source Data to Multiple Target Systems

* When you purge data from a source system that is used in multiple integrations, it impacts **all integrations connected to that same source**.
* This is because the purge removes shared information these other integrations will also need to resynchronize data using correct target lookup settings.
* This scenario requires additional configuration of target lookup to ensure consistent and conflict-free data across all target systems.
* For example:
  * Source entity: **Bug**
    1. Integration A: **Jira → Rally**, "Bug" → "Defect".
    2. Integration B: **Jira → ServiceNow**, "Bug" → "Problem".
  * If you purge data for **Integration A** only, you must:
    * Either **purge Integration B** as well,
    * Or **update the target lookup** in Integration B to make sure data is re-synced correctly and without conflicts.

#### Data Recovery and Audit Trail

* All purged records are automatically saved as CSV files in the <code class="expression">space.vars.OIM</code> installation directory: `@INSTALLATION_PATH@\AppData\PurgedRecords`
* Each purge operation generates a unique timestamped file, maintaining a complete audit trail of all cleanup operations.
* These logs are kept permanently unless explicitly deleted.

#### Selective Purging Based on Filters

* If no specific integration or entity type filters are applied, <code class="expression">space.vars.OIM</code> purges data for **all configured integrations and entity types** between the selected source and target systems.
* **Warning:** Use with caution, broad scope purging to avoid removing unintended data.

#### REST API implementation

* Purge Integrated Data Records is **not supported with REST APIs**.
* This is to prevent accidental data loss, as API-based purging would skip important warnings and confirmation steps visible in the UI.


# Rules Management

## View Rules

To view Rules, go to Administration > Rules Management. This would lead to a page that lists multiple rules that are already configured for different systems integrated using <code class="expression">space.vars.OIM</code>.

<div align="center"><img src="/files/YzUeh8p4Tfo2s0Q6dpap" alt="" width="1000"></div>

### Filters

* **Filter by rule name**: Search configured rules using the search available in the header navigation bar
* **Filter by rule state**: Click on the Active, All, or Inactive button to filter by the status

### Actions

* **View rule's xml**: Click the rule's name to view the rule's xml
* **Export rules**: Roll over the vertical ellipses icon ![](/files/5uqzRTtW2f7YPwkzPaM1) against the rule that you want to export and then select *Export rule*
* **Activate/Inactivate rules**: Select the *Status* button against the rule for which you want to toggle the status. The status will change from *Active* to *Inactive* or from *Inactive* to *Active*
* **Actions over multiple rules**: Select multiple rules and then roll over the cursor to point to the vertical ellipses icon ![](/files/5uqzRTtW2f7YPwkzPaM1) on the table header to see the operations that you could perform on multiple selected rules.

***

## Upload Rule

To upload a new rule, follow the steps given below:

* Click on **"Administration"**
* Click on ![](/files/adbOeVrGLBIOiPcwELEv) given on the left panel. You can see the list of rules that are already uploaded
* To upload a new rule, click on ![](/files/Lm7iqnufThxoIpmYNEFS) given on the top right corner of the screen

<div align="center"><img src="/files/GtvqMMw7S7yE1OGsrAMK" alt="" width="1000"></div>

* The Upload form will open. Fill the following details in the form:
  * **System Name**: It gives option to select the system from all the SCM systems mentioned in the dropdown
  * **Rule Name**: It represents the name of the rule which will be uploaded
  * **Rule XML**: Upload the XML file using the *Choose File* option
  * **Weight**: It defines the priority of rule. Higher the weight, higher will be the priority given to the rule
  * **Status**: It represents whether the rule is active or inactive

<div align="center"><img src="/files/d1J9ExLRGklG7DWg8jDT" alt="" width="1000"></div>

* Click on **Save**
* Click on **Reset** to fill the form again

***

## Edit Rule

* To edit a rule, follow the steps given below:
  * Click on **"Administration"**
  * Click on ![](/files/adbOeVrGLBIOiPcwELEv) given on the left panel. You can see the list of rules that are already uploaded
  * To edit a rule, roll over the vertical ellipses icon ![Ellipses](/files/5uqzRTtW2f7YPwkzPaM1) against the rule that you want to edit
  * Click on&#x20;

<div align="center"><img src="/files/QESZLxY7bekEQgI5nBAY" alt="" width="2200"></div>

* The Edit form will open. Edit the details in the form. Refer to the image below:

<div align="center"><img src="/files/fjIHhSsJBkoTbMnhwLoT" alt="" width="900"></div>

<div align="center"><img src="/files/dWa8YaYmmc7MFl1dDffb" alt="" width="900"></div>

* Click on **"Save"**
* Click on **"Reset"** to set the previously saved value

***

## Delete Rule

* To delete the rule which is active, first you need to inactivate the rule
* To delete a rule, roll over the vertical ellipses icon ![](/files/5uqzRTtW2f7YPwkzPaM1) against the rule that you want to delete
* Click on&#x20;

<div align="center"><img src="/files/p5SiS96AHI4A4S90aLis" alt="" width="1000"></div>

* You will not be able to recover the rule once you delete it

<div align="center"><img src="/files/WUSvsTtayzISHDY57CfX" alt="" width="600"></div>

* Click on **"Yes, delete it"** to delete the rule
* Click on **"Cancel"** to cancel the process


# Reset Default Password

Use **admin** as User Name and **password** as Password for log-in after installation.

<div align="center"><img src="/files/qaEjcpK2GOcmyjYaBmfI" alt=""></div>

## Changing Password

As shown below, click on the **ADMINISTRATION**. It will display the User Details with above window. Then click on Edit Icon. It will display the following window.

<div align="center"><img src="/files/ztj4pwnVh8gWmatAYasq" alt="" width="1000"></div>

Then type your desired password in Password field and retype it in the Re-type Password field for confirmation. Then click on the Save button to save the password.

<div align="center"><img src="/files/2R1wY0EwivBWYlzfPkTT" alt=""></div>


# Increase Server Memory

<code class="expression">space.vars.OIM</code> is by default deployed with 4 GB memory, but if that needs to be changed then refer to the section below.

## Memory Configuration File

From version 7.4 onwards, there is a configuration file **OIM\_Config.properties** added in <code class="expression">space.vars.OIM</code>.

You can find this configuration file under the `<code class="expression">space.vars.OIM</code> Installation Path>/AppData/OpsHubData` directory.

**OIM\_Config.properties** file contains the server memory parameters that can be configured.

## How to Increase Server Memory

1. From `services.msc`, stop the `Opshub Server Service`.
2. Open the command prompt with administrator privileges, and:
   1. Navigate to `<code class="expression">space.vars.OIM</code> Installation Path>/OpsHubServer/bin` directory.
   2. Run `unregisterservice.bat`. This will remove the `Opshub Server Service`.
3. From Windows Explorer, go to `<code class="expression">space.vars.OIM</code> Installation Path>/AppData/OpsHubData` directory and open `OIM_Config.properties` file using any text editor.\
   In this file, there will be default memory settings for the server as `Xms=1024m` and `Xmx=4096m`.\
   Minimum recommended memory parameter configuration is `Xms=1024m` and `Xmx=4096m` but depending on <code class="expression">space.vars.OIM</code> instance load/configuration, these parameters may need to be increased.
   * Format for memory parameter is like, `Xms=<Memory parameter>m`
   * Update `OIM_Config.properties` file based on the required parameters and click **Save**.
4. Now switch back to the previously opened command prompt in step #2.\
   If it is closed, you can reopen it with administrator privileges and navigate to `<code class="expression">space.vars.OIM</code> Installation Path>/OpsHubServer/bin` directory.
   1. Run `registerservice.bat`. This will register the `Opshub Server Service` with configured parameters in `OIM_Config.properties` file.
5. From `services.msc`, start the `Opshub Server Service`.


# Configure Socket Timeout

* Socket Timeout is the amount of time for which <code class="expression">space.vars.OIM</code> will wait for an API response after making an API request.
* Sometimes, the end systems do not respond within the predefined time period, which cause **SocketTimeoutException** failure in the sync. In such cases, it is recommended to update the socket timeout parameter in <code class="expression">space.vars.OIM</code>.
  * <code class="expression">space.vars.OIM</code> is by default deployed with socket timeout set to 30 minutes. However, if the above mentioned failure is observed in the sync, to change the value of the socket timeout parameter, refer to the section below.

## How to Configure Socket Timeout

1. From services.ms, stop the 'OpsHub Server Service'.
2. Open the command prompt with administrator privileges.
   1. Navigate to "`<code class="expression">space.vars.OIM</code> Installation Path>`/OpsHubServer/bin" directory.
   2. Run **unregisterservice.bat**, to remove the 'OpsHub Server Service'.
3. If user wants to configure the socket timeout for **OpsHubTFSService**:
   1. From Windows Explorer, go to "`<code class="expression">space.vars.OIM</code> Installation Path>`/OpsHub\_Resources/config" and open **TFSProperty.properties.sample** file using any text editor. In this file, there will be default socket timeout settings for the **OpsHubTFSService** as **serviceRequestTimeOutInMinutes=1440**.
   2. The format for socket timeout parameter is **serviceRequestTimeOutInMinutes=**`<Timeout in minutes>`.
   3. Update **TFSProperty.properties.sample** file based on the required parameters and click **Save**.
4. If user wants to configure the socket timeout for any supported systems of OpsHub \[except OpsHubTFSService]:
   1. From Windows Explorer, go to "`<code class="expression">space.vars.OIM</code> Installation Path>`/AppData/OpsHubData" directory and open **OIM\_Config.properties** file using any text editor. In this file, there will be default socket timeout settings for the server as **http.socket.timeout=1800000**.
   2. The format for socket timeout parameter is, **http.socket.timeout=**`<Timeout in milliseconds>`.
   3. Update **OIM\_Config.properties** file based on the required parameters and click **Save**.
5. Switch back to the previously opened command prompt in step #3. If it is closed, you can reopen it with administrator privileges and navigate to "`<code class="expression">space.vars.OIM</code> Installation Path>`/OpsHubServer/bin" directory.
   1. Run **registerservice.bat**, to register the 'OpsHub Server Service'.
6. From services.ms, start the 'Opshub Server Service'.


# Scheduler

All the users in <code class="expression">space.vars.OIM</code>, who have a 'Professional' or 'Ultimate' license , will have access to 'Job Schedules' \[which are associated with the integrations].

## Create Schedules

To create a new schedule, follow the steps given below:

* Click on **"Administration"**
* Click on ![](/files/lnwBcjqohdTYVgAXwZ3g) given on the left panel. You can see the list of schedules that are already created
* To create a new schedule, click on ![](/files/Lm7iqnufThxoIpmYNEFS) given on the top right corner of the screen

<div align="center"><img src="/files/uU1NFR20TW05aR4RAf4D" alt="" width="1000"></div>

* The Create Schedule screen will open. Fill the following details:
  * **Schedule Name**: Give the name of the schedule which you will create.
  * **Schedule Type**: Select the type of schedule which you want to create:
    * **Fix Schedule**: Integration will check for updates in end system at specified schedule.
    * **Interval Repetition**: Integration will check for the updates in end system at selected interval.
  * **Frequency**: Select the time duration at which the integration wil check for updates.

| **Schedule Type**       | **Frequency** | **Fields**      | **Description**                                                                                                                                                                                          |
| ----------------------- | ------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Interval Repetition** | All           | Repeat Interval | It represents the unit of interval, i.e., MINUTES, HOURS, WEEKS, DAYS, SECONDS (If you select '5' as repeat interval and 'MINUTES' as unit, then integration will check for the updates every 5 minutes) |
| **Fix scheduler**       | All           | Start Time      | It represents the date and time from which the scheduler will start checking for updates in the end system.                                                                                              |
|                         |               | End Time        | It represents the date and time until the scheduler keeps checking for updates in the end system.                                                                                                        |
|                         |               | Time            | It represents the time at which the integration needs to check for updates in end system. Maximum 5 time slots can be given.                                                                             |
|                         | Monthly       | Day             | It represents the day at which the integration will check for the updates in the end system.                                                                                                             |
|                         |               | Week of Month   | It represents the week at which the integration needs to check for the updates in the end system.                                                                                                        |
|                         | Weekly        | Day(s)          | It represents the day(s) at which the integration needs to check for the updates.                                                                                                                        |

* Click on **"Save"**.

## Edit Schedule

* System generated schedules can't be edited
* To edit the schedule which is associated with active integration, first you need to inactivate the integration and then you can edit
* To edit a schedule, follow the steps given below:
  * Click on **"Administration"**
  * Click on ![](/files/lnwBcjqohdTYVgAXwZ3g) given on the left panel. You can see the list of schedules that are already created
  * To edit a schedule, click on ![](/files/S1PLm1f5wDEMZEXcy6AP) at the end of the corresponding schedule that you want to edit

<div align="center"><img src="/files/bg2N4vWdPuaTQMXtIzMt" alt="" width="2000"></div>

* The Edit Schedule form will open. Edit the details in the form. Refer to the image below:

<div align="center"><img src="/files/NCQRMDCGYbkyqM8oGJut" alt="" width="900"></div>

* Click on **"Save"**
* Click on **"Reset"** to set the previous saved value

## Delete Schedule

* System generated schedules can't be deleted
* To delete the schedule which is associated with any integration, first you need to remove this schedule from the integration and then you can delete
* To delete a schedule, click on ![](/files/j0aOk7rcQRQjE0RLGvX6) at the end of a corresponding schedule that you want to delete

<div align="center"><img src="/files/mwL4m242mUYpiLLUuxum" alt="" width="900"></div>

* You will not be able to restore the schedule once you delete it

<div align="center"><img src="/files/FEgL1IZ2m5XHC8pF4JwK" alt="" width="800"></div>

* Click on **"Yes, delete it"** to delete the schedule
* Click on **"Cancel"** to cancel the process


# Log Viewer

There are different logs maintained and stored under <code class="expression">visitor.claims.unsigned.product</code>**'s `<Installation Folder>\AppData\logs`** during the installation process and one log is maintained to track the ongoing processing in \<code class="expression">space.vars.OIM.

| **Log File Name**      | **Description**                                                                                                          |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| DatabaseCreation.log   | Log generated during Database Creation phase of Installation                                                             |
| Install.log            | Log related to installation steps                                                                                        |
| OpsHubServer.log       | Log generated while <code class="expression">visitor.claims.unsigned.product</code> Installation (like launching URL).   |
| Service.log            | Log generated while registering <code class="expression">visitor.claims.unsigned.product</code> Application as Service.  |
| ConnectionModeConf.log | Log related to the Connection Mode Configuration.                                                                        |
| OpsHub.log             | <code class="expression">visitor.claims.unsigned.product</code> Application log file for all the migrations/integrations |
| OpsHubTFSService.log   | Common log file for TFS API interaction                                                                                  |
| Integrations           | Folder contains the files for the logs of each migrations/integrations                                                   |

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

## Log Settings

System log helps to view logs for tracking backend activity in <code class="expression">space.vars.OIM</code>. Usually logs are useful when any failure or unusual behavior is detected in integration. System log can store logs in 5 different levels. Logs will capture information based on logging level set in System log.

To navigate to System log

* Click on Administration on top right corner.
* On Left panel click on Global log as shown below

<div align="center"><img src="/files/10U4efuvkrCVqCB262VT" alt="" width="1000"></div>

## Settings

Click on Setting button on System log window to configure log settings as mentioned below

<div align="center"><img src="/files/Xhb0vIKvT5TCCUDGAPYu" alt="" width="900"></div>

## Integration Log Setting

**Class/Package Name:** The name of the package or class for which logs need to be monitored. To monitor the logs within the 'com.opshub', package 'com.opshub' should be entered here.

**Log Level:** Represents the logging level which determines the amount of information recorded in the log files. By default, only Error logged in <code class="expression">space.vars.OIM</code> are logged in logs. The coverage of information increases in ascending order from logging level 1 to 6.

1-FATAL, 2-ERROR, 3-WARN, 4-INFO, 5-DEBUG, 6-TRACE

1-FATAL will log minimum amount of data, not sufficient for tracking integrations, while 6-TRACE will log maximum data, most useful for tracking integration but it also creates log sizes and creates multiple log files due to amount of information logged.

**No. of Lines:** Number of lines of logs to be displayed on the log viewer screen of the UI.

**No. of max backup log files:** Maximum number of backup files to store excluding the current log file used by the integration.

**Size of log file \[MB]:** Maximum size (in MB) that an integration log file can have before a new backup log file is created.

**Reset all integrations to global log settings?:** This option reverts all individual/custom log settings for each integration to the global/default log configuration defined at the system level. Any integration-specific overrides will be removed.

## Global Log Setting

**No. of max backup global log files:** Select the maximum number of backup files to store, excluding the current log file used by the UI logs.

**Location to save logs:** Location where log files should be saved, this should be configured if default directory where <code class="expression">space.vars.OIM</code> is installed do not have sufficient space to store log files. By default, logs are stored in default directory where <code class="expression">space.vars.OIM</code> is installed.

* If you change the default location to another location, all the older logs will be copied to the updated location, except for Tomcat Server logs. The new logs will be logged at the updated location.

**Size of global log files \[MB]:** Select the maximum size (in MB) that a UI log file can have before a backup log file is created.

**Compress Backup Log Files:** Enable the toggle button to store all the backup log files in **compressed(.zip)** format.

> **Note**: Following points should be considered:

* When the toggle button for 'Compress Backup Log Files' is enabled or disabled, ensure that no other application is using the backup files.
* When the toggle button for 'Compress Backup Log Files' is enabled or disabled, ensure to configure the values for 'No. of max backup global log files' and 'No. of max backup log files' appropriately.

## Refresh Log

<div align="center"><img src="/files/87wG5XjJgOCNigPkeC3j" alt=""></div>

**Refresh log** button on the top of window can be used to refresh logs once to display latest logged data.

<div align="center"><img src="/files/U0G53mm3g0qUaqFPOLqH" alt=""></div>

**Auto Refresh Log** is a toggle button, it can be set on to automatically refresh logs in every few seconds (2-3 seconds).

## Export Logs

<div align="center"><img src="/files/4G8ZpUIS8VFCJLlPBbqo" alt=""></div>

Click on Export logs button to export logs as zip file.

## Word Wrap

<div align="center"><img src="/files/YjbD8kABWS1m31SoSIU7" alt=""></div>

Click on Word Wrap to enable/disable the word wrapping behavior in the log viewer.

* Word wrap is enabled by default.
* When word wrap is enabled, long log entries are wrapped, making them easier to read without horizontal scrolling.
* When word wrap is disabled, log entries remain on a single line, preserving the visual alignment of timestamps and structure. However, horizontal scrolling may be needed.
  {% endif %}


# User Access Control

[Role Configuration](/manage/administrator/user-access-control/role-configuration)

[User Role Association](/manage/administrator/user-access-control/user-role-association)


# User Role Association

## Overview

* <code class="expression">space.vars.OIM</code> allows to associate roles with users defining what actions a user can perform.
* One user can have multiple Integration and Administration Roles. The permissions available to that role will be a union of permissions associated with all individual roles.
* Only users with permission **Permission Grant** can associate roles with users.
* Roles can be associated with user from **View associated roles** button in rightmost column against a given user.

<div align="center"><img src="/files/723qC8c15xeoMm9P6OYC" alt="" width="1700"></div>

## Associating Administration Role to a User

* Navigate to user role association screen and click on edit icon in top right corner.

<div align="center"><img src="/files/7GoAMLmrSs3JKC9dVIwS" alt="" width="1700"></div>

* Select roles to be associated with given user. Refer to [Permissions and Corresponding Actions](/manage/administrator/user-access-control/role-configuration#permissions-and-corresponding-actions) section to understand which operations can be performed based on the configured role.
* Under the drop down list, only Administration roles will be available.
  * For instance, if Sync Administrator role is to be associated with user 'David Smith', it can be selected under Administration as shown below:

<div align="center"><img src="/files/sGfAdJf33RVyN0wH6RWa" alt="" width="1700"></div>

* Click on **Save** button to save user role association.

## Associating Integration Role to a User

* Navigate to User Role Association screen and click on edit icon in top right corner as shown below:

<div align="center"><img src="/files/7GoAMLmrSs3JKC9dVIwS" alt="" width="1700"></div>

* Select roles to be associated with the given user. Refer to [Permissions and Corresponding Actions](/manage/administrator/user-access-control/role-configuration#permissions-and-corresponding-actions) section to understand which operations can be performed based on the configured role.
* Under the drop down list, only Integration roles will be available.

<div align="center"><img src="/files/hfWPeDweS01PMeFIktv4" alt="" width="1700"></div>

* Here, roles can be assigned folder-wise.
* Permissions' Inheritance in Child Hierarchy:
  * Roles associated with given folder would be inherited in entire child hierarchy of that folder.
  * Associating roles in the child folder will override roles of parent folder.
* Assigning any role in a given folder indicates that user will have **Read** access to all integration resources in that folder and its child hierarchy as well.
* Assigning any role with **Read** access to integration or mapping in a child folder indicates **Read** access to all associated mappings and systems in the parent folder.

<div align="center"><img src="/files/RUSnFpu8rRRXvvE5WeNl" alt="" width="2200"></div>

* For above configuration, the user will be able to perform the following operations:

| **Folder**               | **Actions supported**                                   |
| ------------------------ | ------------------------------------------------------- |
| Default/Parent 1         | All actions associated with **Sync Monitor** role       |
| Default/Parent 1/Child 1 | All actions associated with **Sync Monitor** role       |
| Default/Parent 1/Child 2 | All actions associated with **Sync Monitor** role       |
| Default/Parent 1/Child 3 | All actions associated with **Sync Administrator** role |
| Default/Parent 2         | All actions associated with **Sync Administrator** role |


# Role Configuration

## Overview

<code class="expression">space.vars.OIM</code> supports User Access Control, enabling users manage permissions in <code class="expression">space.vars.OIM</code> by associating users with specific roles. Each role encapsulates a set of permissions suited to particular responsibilities.

## Permission

Permission refers to specific rights like Read, Write, Delete, Grant on different resources like System, Mapping, Integration, User Management associated with a given role.

## Role

* A Role is a set of permissions that define what actions a user is permitted to perform on a resource.
* Integration Role:
  * An Integration role allows user to configure permissions for operations that can be performed on **Integration** tab in <code class="expression">space.vars.OIM</code> like System, Mapping, Integration, etc.
  * Refer to [Associating Integration Role to a User](/manage/administrator/user-access-control/user-role-association#associating-integration-role-to-a-user) section to understand how integration roles can be associated with user.
* Administration Role:
  * An Administration role allows user to configure permissions for operations that can be performed on **Administration** in <code class="expression">space.vars.OIM</code> tab like Proxy Settings, License Management, etc.
  * Refer to [Associating Administration Role to a User](/manage/administrator/user-access-control/user-role-association#associating-administration-role-to-a-user) section to understand how administration roles can be associated with user.

## Default Roles

<code class="expression">space.vars.OIM</code> provides with the following default roles:

| **Role Name**       | **Description**                                                                                                                                                                                   |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Super Administrator | <p>All administration permissions are available<br></p><p><img src="/files/KJb7d4uwKdHjkBdFWPFx" alt="" data-size="original"></p>                                                                 |
| Sync Administrator  | <p>All integration permissions are available<br></p><p><img src="/files/xnEhoJfZmgSfxb5ztbZg" alt="" data-size="original"></p>                                                                    |
| Sync Monitor        | <p>All read and sync action permissions are available<br><img src="/files/SHJugsAsAhFyY5G1w5dH" alt="Sync Monitor"></p><p><img src="/files/SHJugsAsAhFyY5G1w5dH" alt="" data-size="original"></p> |

## Create Custom Roles

* Navigate to **Role Management** screen under **Administration** tab and click on Create Role button on the top right corner as shown below:

  <div align="center"><img src="/files/pE7ns1DrSdNMsHbRXoql" alt="" width="1300"></div>
* Add Role Name, Description, Type and select permissions that a user want to associate with the role. For instance, if a role is to be configured for performing all system operations, select **Integration** under Role type and tick mark **write** permission checkbox as shown below:

  <div align="center"><img src="/files/8iP1n6ZoeRURKDGNKhmo" alt="" width="805"></div>
* Save the role and it will be accessible from **Role Management** screen as shown below:

  <div align="center"><img src="/files/V4czlA7P0cBFcb0H3PFw" alt="" width="1300"></div>

## Standard Role Behaviors

* In Integration type role, **read** permission is granted by default on all resources like System, Mapping, Folder, etc.
* In Integration type role, with **Write** permission, **Action** permission is granted by default for **Integration**.
* Default roles cannot be edited or deleted.
* In Administration type Role, with **write** permission on **User Management**, all write operations can be performed in all user accounts.
* Role type cannot be changed after the role is created.

## Permissions and Corresponding Actions

* Permissions and operations that can be performed are listed below:

| **Permission Name**                                                                          | **Permission Scope** | **Actions Supported**                                                                                                                                                                                               |
| -------------------------------------------------------------------------------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Integration Permissions**                                                                  |                      |                                                                                                                                                                                                                     |
| Folder                                                                                       | Read                 | Read Folders                                                                                                                                                                                                        |
| Folder                                                                                       | Write                | Create, update, delete folders                                                                                                                                                                                      |
| Folder                                                                                       | Grant                | Allows user to manage integration permissions of other users on the folders on which the user has access                                                                                                            |
| Integration                                                                                  | Read                 | <p>Read integrations, reconciliations, failures<br>Export sync report<br>Read failure notifications' configuration</p>                                                                                              |
| Integration                                                                                  | Write                | <p>Create, update, delete, merge, move integrations<br>Create, update reconciliations</p>                                                                                                                           |
| Integration                                                                                  | Action               | <p>Failures: Retry, delete, edit event xml, configure failure notifications<br>Integrations: Activate, inactive, execute<br>Delete Synchronization: Execute<br>Switch to integration mode (from reconciliation)</p> |
| Mapping                                                                                      | Read                 | <p>Read, import, export mappings<br>Read, export excel uploads</p>                                                                                                                                                  |
| Mapping                                                                                      | Write                | <p>Create, update, delete, clone, merge, move mappings<br>Create, update, delete excel uploads</p>                                                                                                                  |
| System                                                                                       | Read                 | Read systems                                                                                                                                                                                                        |
| System                                                                                       | Write                | Create, update, move systems                                                                                                                                                                                        |
| Workflow                                                                                     | Read                 | Read, export workflows                                                                                                                                                                                              |
| Workflow                                                                                     | Write                | Create, update, move, delete workflows                                                                                                                                                                              |
| *Note:* Move operation requires **write** permission in both source and destination folders. |                      |                                                                                                                                                                                                                     |
| **Administration Permissions**                                                               |                      |                                                                                                                                                                                                                     |
| User Management                                                                              | Read                 | <p>Read users<br>Read login servers</p>                                                                                                                                                                             |
| User Management                                                                              | Write                | <p>Create, update users<br>Create, update login servers</p>                                                                                                                                                         |
| Server Management                                                                            | Read                 | <p>Read licenses<br>Read proxy settings<br>Read registered connectors<br>Read system logs<br>Read purge<br>Read rules management<br>Read schedule</p>                                                               |
| Server Management                                                                            | Write                | <p>Install license<br>Update proxy settings<br>Create, update registered connectors<br>Create, update rules management<br>Create, update schedules</p>                                                              |
| Server Management                                                                            | Delete               | <p>Uninstall License<br>Apply purge<br>Delete rules management<br>Delete schedules</p>                                                                                                                              |
| Permission Management                                                                        | Read                 | Read roles                                                                                                                                                                                                          |
| Permission Management                                                                        | Write                | Create, update roles                                                                                                                                                                                                |
| Permission Management                                                                        | Delete               | Delete roles                                                                                                                                                                                                        |
| Permission Management                                                                        | Grant                | Grant permissions to other users                                                                                                                                                                                    |


# Advanced Utilities

1. [Migrating Database](/manage/advanced-utilities/database-migration)
2. [Updating Database Password](/manage/advanced-utilities/updating-database-password)
3. [Changing MSSQL Server Host](/manage/advanced-utilities/how-to-change-mssql-database-server-host)
4. [Switching to Windows authentication](/manage/advanced-utilities/switching-to-windows-authentication-mode-for-mssql-server)

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}
5\) [Usage Report Manual](/manage/advanced-utilities/usage-reports)
6\) [Change Keystore and Private Key passwords](/manage/advanced-utilities/change-keystore-and-private-key-passwords)
7\) [Secret Key Reset Utility](/manage/advanced-utilities/regenerate-secret-key)
8\) [Certificate Private Key Password Encryptor Utility](/manage/advanced-utilities/certificate-private-key-password-encryptor-utility)
9\) [Data Count Utility](/manage/advanced-utilities/data-count-utility)
10\) Encrypt Password Utility
{% endif %}


# Usage Report Manual

## Overview

The **Usage Reports** feature enables administrators to export detailed system usage data for analysis and licensing purposes. Reports can be downloaded directly from the **Licenses screen** or through the **Admin API**, providing a convenient and efficient way to access usage information.

The exported report is provided as a **Usage Reports.zip** file, which contains two Excel reports:

* **Usage Report (Last 6 Months)**
* **Usage Report (Last 1 Year)**

Each report includes both **summary and detailed insights** about activity across integrated systems. The reports provide information such as unique users, integrated projects, integrated entity types, synced data, and detailed information about processed users across systems.

User activity is captured across multiple interaction points, including mapped user fields, comments, attachments, user mentions, and updates. This helps provide a comprehensive view of system usage and user interactions across integrations.

These reports help administrators review usage patterns, monitor integration activity, and obtain the necessary insights for operational analysis and licensing purposes.

***

## Prerequisites

To access and download the reports, the user must:

* Have an **Administrator role**
* Have **Read permission for Server Management**

<div align="center"><img src="/files/jjdjPjZ1BZcNvsGBmB6Q" alt="Required Permission"></div>

***

## Download Usage Reports

### Using UI

Follow these steps to download the usage reports from the application:

1. Navigate to the **Licenses** screen.
2. Locate the **Export Usage Reports** button on the screen, as shown in the image below. The button is highlighted with a red rectangular box.
3. Click the **Export Usage Reports** button.
4. The **Usage Reports.zip** file will be downloaded to your browser’s default download location.
5. Extract the ZIP file to access the reports.

<div align="center"><img src="/files/Hh9LBdlNOQDIESyEpH3G" alt="Export Button"></div>

### Using Admin API

Administrators can also download the usage reports using the Admin API.

**Endpoint** GET `/export/usage-reports`

**Response**

* Returns the **Usage Reports.zip** file.

<div align="center"><img src="/files/Id2u2te44mNcGuzNRxOY" alt="Admin Api For Usage Report"></div>

***

## Contents of the Downloaded File

After extracting **Usage Reports.zip**, the following files will be available:

* `Usage Report (Last 6 Months).xlsx`
* `Usage Report (Last 1 Year).xlsx`

Each Excel report contains the following sheets:

1. `Summary`
2. `Unique User Count`
3. `Entity Type Count`
4. `Integrated Project Count`
5. `Synced Data Count`
6. `Detailed User Report`

### Summary Sheet

This sheet provides an overall summary of all the reports included in the Usage Reports. It gives a quick overview of key metrics, allowing administrators to quickly understand system usage and user activity.

#### Example

<div align="center"><img src="/files/JbZKJqTmiOzfOj7aKaTy" alt="Summary Report"></div>

#### Explanation of Metrics

* **Total Unique Users** – Displays the total number of unique users observed across all systems, with a breakdown based on available identifiers such as emails, display names, and usernames.
* **Total Unique Entity Types** – Shows the total number of different entity types involved in synchronization across the systems.
* **Total Unique Projects** – Represents the total number of integrated projects observed during the selected period.
* **Total Entities Synced** – Counts all entities that were successfully synchronized between systems.

This summary sheet provides a **high-level overview of system usage**, allowing administrators to quickly assess usage from a single sheet instead of reviewing each detailed report individually.

***

### Unique User Count Sheet

Displays the total number of unique users identified across integrated systems, along with a system-wise breakdown.

#### Explanation of Columns

* **System / Source** – The system where the users were detected.
* **Count** – Total number of unique users identified in the system.
* **Identifiers** – Breakdown of how users were identified, following a **priority order**:
  1. **Usernames or Emails** – Users matched using **username or email** when both fields are available. If either username or the local part of email (case-insensitive) matches an existing user, it is considered the same user. **This is the highest priority.**
  2. **Emails** – Users identified **by email only** when no match was found using username or username/email combination in the first step.
  3. **Display Names** – Users identified by display name if no email is available.
  4. **Usernames** – Users identified by username if both email and display name are empty.

This information helps administrators understand how user identities are detected and matched across different integrated systems.

#### Example

<div align="center"><img src="/files/mAi2QyKmfofDJmrrUrqw" alt="Unique User Count"></div>

***

### Entity Type Count Sheet

Displays the entity types involved in synchronization across system pairs during the selected period.

#### Explanation of Columns

* **System Pairs** – The pair of systems involved in synchronization.
* **End System** – The system where the entity resides or is synced to.
* **Entity Types** – The types of entities synced between the systems.
* **Status** – The current status of the integration (Active or Inactive).
* **Last Synced** – The most recent timestamp when the entity was successfully synced.

<div align="center"><img src="/files/4J0DQxOPrulVlONaBl6j" alt="Entity Type Count"></div>

***

### Integrated Project Count Sheet

Lists the unique project pairs that were involved in integrations during the selected timeframe, along with their status and last updated time.

#### Explanation of Columns

* **End System 1 / End System 2** – The source and target systems involved in the integration.
* **End System 1 Project / End System 2 Project** – Source and target projects participating in the integration.
* **Status** – The current status of the integration (Active or Inactive).
* **Last Updated** – The timestamp when the integration was last updated.
* **Last Synced** – The timestamp when the last entity was successfully synced between the project pair.

This table provides a **clear view of project-level integrations**, helping administrators monitor integration activity and identify inactive or outdated integrations.

<div align="center"><img src="/files/lph9MMzM1MsJLbXg4tjD" alt="Integrated Project Count"></div>

***

### Synced Data Count Sheet

Displays the total number of entities successfully synchronized between integrated system pairs.

#### Explanation of Columns

* **End System 1 / End System 2** – The source and target systems between which entities are synchronized.
* **Counts Based on System Pair** – The total number of entities successfully synced between the two systems.
* **Last Synced** – The most recent timestamp when entities were fully synchronized.

<div align="center"><img src="/files/ReqbTlSY2tXbB9to691X" alt="Synced Entity Count"></div>

***

### Detailed User Report Sheet

The **Detailed User Report** sheet provides comprehensive information about each observed user across integrated systems.

The report includes the following information:

* **Email** – User email address
* **Username** – Username of the user
* **Display Name** – Display name of the user
* **Interaction Types** – Areas where the user was detected (such as comment authors, attachment authors, mapped user fields, mentions in rich text fields, etc.)
* **Observed In** – Systems where the user was detected, along with timestamps
* **Service Account** – Indicates whether the user is used as a service account
* **Last Seen** – The last observed activity time of the user in the system
* **Duplicates** – Identifies users with matching email IDs but different usernames across systems

<div align="center"><img src="/files/vpsufDrgEsMv5y9stPPN" alt="Detailed User Report"></div>


# Migrating Database

Please refer to [Database Prerequisites](/getting-started/prerequisites#database-prerequisites) before proceeding with the migration details.

### Introduction

As HSQL is not suitable for production usage, <code class="expression">space.vars.OIM</code> needs to be migrated to one of three databases supported by <code class="expression">space.vars.OIM</code>. There is a utility provided with <code class="expression">space.vars.OIM</code> installation and packaged in <code class="expression">space.vars.OIM</code>'s `<Installation Directory>\OpsHub_Resources\DatabaseMigrator` directory \[Migrator directory].

### Steps to migrate from HSQL to other supported databases

* Keep driver for database for which migration needs to be done in: <code class="expression">space.vars.OIM</code>'s `<Installation Directory>\OpsHubServer\lib` directory.
  * For MySQL connector driver jar 5.1.8 is not supported, hence the latest connector driver jar should be used from <http://dev.mysql.com/downloads/connector/j/5.1.html>
* Change `destinationconnection.properties` and `sourceconnection.properties` in Migrator directory:
  * **sourceconnection.properties**: Change `CONNECTION_HSQL_FILE_PATH` property and replace `<installation path>` with installation path
  * **destinationconnection.properties**: Provide all properties value as guided in file.

{% if "OM4ADO" === visitor.claims.unsigned.product %}

* Close OM4ADO application.
  {% endif %}

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

* Shut down server (ensure service is not running if registered).
  {% endif %}

* Take back up of database

Refer to Database Backup section on [Taking Application Backup](/manage/upgrade-index/taking-application-backup) page for details.

### Migrating on Windows

Run `migrator.bat` in Migrator directory

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

### Migrating on Linux

Run `migrator.sh` in Migrator directory\
If file execution fails with ^M bad interpreter error, use following steps:

* Execute command in terminal `dos2unix migrator.sh`
* Now execute the sh file in terminal `migrator`
  {% endif %}

### Steps to perform after successful migration

Following are the steps to be performed after successful database migration:

* Go to <code class="expression">space.vars.OIM</code>'s `<Installation Directory>\OpsHubServer\webapps\OpsHubWS\META-INF` directory
* Delete `war-tracker` file
* Go to <code class="expression">space.vars.OIM</code>'s `<Installation Directory>\OpsHubServer\webapps\OpsHubWS` directory
* Select all the files and add to archive with name `OpsHubWS.zip`
* Rename `OpsHubWS.zip` to `OpsHubWS.war`
* Go to <code class="expression">space.vars.OIM</code>'s `<Installation Directory>\OpsHubServer\webapps` and replace newly created `OpsHubWS.war` with the existing one
* Delete <code class="expression">space.vars.OIM</code>'s `<Installation Directory>\OpsHubServer\webapps\OpsHubWS` directory and start the service.


# Updating Database Password

If <code class="expression">space.vars.OIM</code> database password has been modified by a user, then this utility would update the new password in <code class="expression">space.vars.OIM</code> application.

Follow the steps given below for updating database password in OpsHub:

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

* Stop OpsHub Server/ Service before execution of this utility.
  {% endif %}

{% if "OM4ADO" === visitor.claims.unsigned.product %}

* Close OM4ADO application before execution of the utility.
  {% endif %}

* Go to <code class="expression">space.vars.OIM</code> Installation Folder>/Other\_Resources/Resources.

* Unzip `OpsHub Database Management utility.zip`.

* Run `OpsHubDatabaseManagementUtility.bat` for Windows system.

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

* In case of Linux system, run `OpsHubDatabaseManagementUtility.sh`.
  {% endif %}

- Enter path for OpsHub Installation Directory.

<div align="center"><img src="/files/PX5gdnAvEbS71XMtBsQA" alt="" width="1100"></div>

* Enter the new database password.

<div align="center"><img src="/files/BGoafYEbcqmqZF7Feygp" alt="" width="1100"></div>

* This would update database password in OpsHub application.

<div align="center"><img src="/files/CT3zVO0zL8bh6rHvKc0K" alt="" width="1100"></div>


# Changing MSSQL Server Host

{% if "OM4ADO" === visitor.claims.unsigned.product %}

* Close OM4ADO application before execution of the utility.
  {% endif %}

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

* Stop OpsHub Server Service before execution of the utility.
  {% endif %}

* Go to <code class="expression">space.vars.OIM</code>'s `<Installation Folder>/Other_Resources/Resources`

* Unzip `HostChange.zip`

{% if "OM4ADO" === visitor.claims.unsigned.product %}

* Open Command Prompt with administrator privileges and go to <code class="expression">space.vars.OIM</code>'s directory `<Installation Folder or OM4ADO>/Other_Resources/Resources/HostChange` using command **`cd <Installation Folder or OM4ADO>/Other_Resources/Resources/HostChange`**
  {% endif %}

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

* Open Command Prompt with administrator privileges and go to <code class="expression">space.vars.OIM</code>'s directory `<Installation Folder or OpsHub>/Other_Resources/Resources/HostChange` using command **`cd <Installation Folder or OpsHub>/Other_Resources/Resources/HostChange`**
  {% endif %}

* Run `HostChange.bat` for Windows system.

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

* In case of linux system, run `HostChange.sh`
  {% endif %}

- Enter the path for <code class="expression">space.vars.OIM</code>'s Installation Directory

<div align="center"><img src="/files/LEQY7FzqxpIQ13EYEDdv" alt=""></div>

### HostChange with MYSQL

* Enter the new Host Name for MYSQL:

<div align="center"><img src="/files/lj8jbuWPmimS4BmBmByk" alt=""></div>

* If the Host Name input is not entered in the above step, then user will get the notification mentioned in the screen shot below. As the Host Name is a mandatory input that defines the new Host Name you want <code class="expression">space.vars.OIM</code> database to refer to:

<div align="center"><img src="/files/p8U4KN6eSX6WfruGdqgm" alt=""></div>

* Enter the Port for MYSQL:

<div align="center"><img src="/files/fFeQzNjXcSo97O5Ww5Dx" alt=""></div>

* If the Port input is not entered in the above step, then utility will use the existing Port \[entered at a time of <code class="expression">space.vars.OIM</code> installation]. If that is not the case, then enter the Port here:

<div align="center"><img src="/files/HND3MIUfTi36QxAvqHEX" alt=""></div>

* Utility will check the connection with new Host Name:

<div align="center"><img src="/files/4psc5CPswV4swpexx2wI" alt=""></div>

### HostChange with ORACLE

* Enter the new Host Name for ORACLE:

<div align="center"><img src="/files/3gPD05KTHWbgYwa8GN43" alt=""></div>

* If the Host Name input is not entered in the above step, then user will get the notification mentioned in the screen shot below. As the Host Name is a mandatory input that defines the new Host Name you want <code class="expression">space.vars.OIM</code> database to refer to:

<div align="center"><img src="/files/ZjUdWcj4XGtut23C0zpo" alt=""></div>

* Enter the Port for ORACLE:

<div align="center"><img src="/files/sNwyp2PCOtDPPYsE9ZF1" alt=""></div>

* If the Port input is not entered in the above step, then utility will use the existing Port \[entered at the time of <code class="expression">space.vars.OIM</code> installation]. If that is not the case, then enter the Port here:

<div align="center"><img src="/files/nkjdphJJDrXeqVMTQQQs" alt=""></div>

* Utility will check the connection with new Host Name:

<div align="center"><img src="/files/7cFgBTvgMrs2I9ZXpxbw" alt=""></div>

### HostChange with MSSQL Server

* **Note**: If <code class="expression">space.vars.OIM</code> is installed with Windows Authentication mode, then before running the utility, the user needs to make sure that the user who is logged into the Windows \[where the <code class="expression">space.vars.OIM</code> is installed] also logs into the new host's MSSQL instance with the same credentials.
* Enter the new Host Name for MSSQL Server:

<div align="center"><img src="/files/ZsDMxqcubzJMUv5jovt3" alt=""></div>

* If the Host Name input is not entered in the above step, then user will get the notification mentioned in the screen shot below. As the Host Name is a mandatory input that defines the new Host Name you want <code class="expression">space.vars.OIM</code> database to refer to:

<div align="center"><img src="/files/ct9Nf9Pi6vpSNpF9ghdb" alt=""></div>

* If the new Host Name is a named instance, then there is no input required for the Port. Hence, after entering the Host Name, utility will check the connection with the new Host:

<div align="center"><img src="/files/KMindj68GknHsGJcCBy6" alt=""></div>

* If the new Host Name is a non-named instance, then enter the Port for MSSQL:

<div align="center"><img src="/files/FbRsYY2VBUvoalDEqNL0" alt=""></div>

* If the Port input is not entered in the above step, then utility will use the existing Port \[entered at the time of <code class="expression">space.vars.OIM</code> installation]. If that is not the case, then enter the Port here:

<div align="center"><img src="/files/wFUYr9Uv6UFPOvlFC9GW" alt=""></div>

* Utility will check the connection with new Host Name \[In the case of SQL Authentication]:

<div align="center"><img src="/files/kZKXUZ4cZtTnAsvtavMd" alt=""></div>

* Utility will check the connection with new Host Name \[In the case of Windows Authentication]:

<div align="center"><img src="/files/1Nyhoaz9AUSyvhsSBhOh" alt=""></div>

### HostChange with PostgreSQL

* Enter the new Host Name for PostgreSQL:

<div align="center"><img src="/files/KlO92pgOCSBd3jWHLij2" alt=""></div>

* If the Host Name input is not entered in the above step, then user will get the notification mentioned in the screenshot below. The Host Name is a mandatory input that defines the new Host Name user wants <code class="expression">space.vars.OIM</code> database to refer to:

<div align="center"><img src="/files/KBu1UDI46fJI0Xo54YGQ" alt=""></div>

* Enter the Port for PostgreSQL:

<div align="center"><img src="/files/HNIGjm6g9rucRxggST2G" alt=""></div>

* If the Port's input is not entered in the above step, then the utility will use the existing Port \[entered at the time of <code class="expression">space.vars.OIM</code> installation]. If that is not the case, enter the Port as shown in the screenshot below:

<div align="center"><img src="/files/TelAieOXu4us2vCi9jfq" alt=""></div>

* Utility will check the connection with the new Host Name:

<div align="center"><img src="/files/kSra7tfKz4C3Xys9sBxZ" alt=""></div>


# Switching to Windows authentication

Please go through the section [Installation Prerequisites](/getting-started/prerequisites#windows) for Windows Authentication mode before executing steps given below.

Please ensure the Windows user (who is used in MS SQL Windows Authentication) has **Read** and **Write** privileges before executing `databaseManagementUtlity`. You can grant the **Read** and **Write** privileges by executing the steps given below.

* Open properties window of <code class="expression">space.vars.OIM</code> installation folder (directory in which you have installed <code class="expression">space.vars.OIM</code> i.e. `c:\Program Files\OpsHub`), it will show you the dialogue box shown below.
* Select the user (to whom you want to grant privileges) from the Security tab and check Read and Write checkbox.
* Click OK after checking the Read and Write checkbox.

<div align="center"><img src="/files/TqVGkiYLAAmEqtfYSXq4" alt="" width="600"></div>

If the database is on MSSQL SQL Authentication mode and you need to switch to Windows Authentication mode, then follow the steps given below:

* Go to `<Installation Folder>/Other_Resources/Resources`.
* Unzip `OpsHub Database Management utility.zip`.
* Run `DatabaseManagementUtility.bat` for Windows system.
* In case of Linux system, run `DatabaseManagementUtility.sh`.
* Enter path for the installation directory.

<div align="center"><img src="/files/hcpCWNIhZkST1xPxoaxM" alt="" width="1000"></div>

* Press `2` to switch to Windows authentication mode.

<div align="center"><img src="/files/jDIpO5cCxjMfoscOd9iu" alt="" width="1000"></div>

* Provide Microsoft JDBC Driver 4.0 (`tar.gz`) File Path.

<div align="center"><img src="/files/7JpxxJ3WmFBYSqdKBRKf" alt="" width="1000"></div>

* Provide Windows Service Credentials.

<div align="center"><img src="/files/62FeQAK2hLQcAbOyeE2B" alt="" width="1000"></div>

> **Note:**\
> If Windows credentials are not added correctly during switching, the OpsHub Server service will not be started.\
> To avoid such an occurrence, the user will have to manually set the service log-on credentials for OpsHub Server Service in case wrong Windows credentials are added at the time of switching.

## Follow the below mentioned steps to set the credentials in the OpsHub Server Services:

1. Open the services application and search for `OpsHub Server Service`.
2. Right-click on the service, select **Properties** and go to the **Log On** Tab.
3. Enter Windows credentials in **This account**.

> If the user is registered with a domain, the username format will be "{username}@{domain}" or "{domain}{username}". Otherwise, the username format will be ".\username".

<div align="center"><img src="/files/4Cj21hmKN3TNvTMkrUsE" alt="" width="600"></div>


# Change Keystore and Private Key passwords

In case of HTTPS deployment of <code class="expression">space.vars.OIM</code>, if the user wants to change the existing keystore or private key passwords for <code class="expression">space.vars.OIM</code> certificate, this utility can be used to change and update the encrypted passwords in <code class="expression">space.vars.OIM</code> application.

Follow the steps given below for updating the encrypted keystore and private key passwords in <code class="expression">space.vars.OIM</code>:

* Stop OpsHub Server Service before execution of this utility.
* Navigate to `<code class="expression">space.vars.OIM</code> Installation Folder>/Other_Resources/Resources`.
* Unzip `"OpsHub Keystore Password Encryptor Utility.zip"`.
* Run `KeystorePasswordEncryptorUtility.bat` for Windows system. In case of Linux system, run `KeystorePasswordEncryptorUtility.sh`.
* Enter the path for OpsHub Installation Directory.

<div align="center"><img src="/files/sTzl0b1P3YfHj07um3Ys" alt="" width="1400"></div>

* Enter the keystore password.

<div align="center"><img src="/files/H2crmq0LCaDjwMNohRCg" alt="" width="1400"></div>

* Enter the private key password.

<div align="center"><img src="/files/kdFyhD0fqPg0SiUDtSoU" alt="" width="1400"></div>

*If the private key input is not entered in the above step, then user will get the notification mentioned in the screenshot below. In this case, the private key password will be considered same as keystore password.*

<div align="center"><img src="/files/74oW6lUEQaulX5UgM6ih" alt="" width="1400"></div>

* It will update keystore and private key passwords in OpsHub application in the encrypted format.

<div align="center"><img src="/files/ucJ1WhWNJLczeCspVOvh" alt="" width="1400"></div>


# Secret Key Reset Utility

This utility regenerates Secret Key for application. This can be used in following cases:

* Secret Key is lost.
* Secret Key has been tampered.
* User wants to change secret key for application.

Please follow below given steps for execution of this utility:

* Stop OpsHub Server/ Service before execution of this utility.
* Go to `<OpsHub Installation Folder>/Other_Resources/Resources`.
* Unzip `OpsHub Secret key reset utility.zip`.
* Execute `OpsHubSecretKeyResetUtility.bat` / `OpsHubSecretKeyResetUtility.sh` for Windows/Linux respectively.
* Enter path for OpsHub Installation Directory.

<div align="center"><img src="/files/4QPXMY3kBMVnTinVuwvB" alt="" width="1000"></div>

* Enter new location for security. (`opshub.key` should not be available on the same location).

<div align="center"><img src="/files/FWXM6fZcCjslj7SlauwB" alt="" width="1000"></div>

* Select Data Encryption algorithm. By default, AES (128) is selected.

<div align="center"><img src="/files/XITZVdDFeAx5cQAzUC5l" alt="" width="1000"></div>

* Provide password for database.

<div align="center"><img src="/files/7VSD0JnLAfMAbmdf80Bo" alt="" width="1000"></div>

* This would generate new key at specified location.

<div align="center"><img src="/files/hO804zkepImy1gwgDMq5" alt="" width="1000"></div>

* In case of HTTPS deployment of <code class="expression">space.vars.OIM</code>, run [Change Keystore and Private Key passwords utility](/manage/advanced-utilities/change-keystore-and-private-key-passwords) to store the passwords in encrypted form.
* Start OpsHub Server/ Service.
* Re-enter passwords for all configured systems, configured database connections, configured proxy settings and overridden passwords in Advance Configuration of Integration.


# Certificate Private Key Password Encryptor Utility

If multiple certificates are imported into the Keystore, and the certificates have different private key passwords, this utility can be used to create a `cacerts_config.properties` file having all the certificate alias names and their passwords in encrypted format. The information in this file would be used to load certificates from Keystore.

Follow the steps given below for creating/updating the `cacerts_config.properties` file:

* Stop OpsHub Server Service before execution of this utility.
* Navigate to `<code class="expression">space.vars.OIM</code> Installation Folder>/Other_Resources/Resources`.
* Unzip `OpsHub Certificate Passwords Utility.zip`.
* Run `OpsHubCertificatePasswordsUtility.bat` for Windows system. In case of Linux system, run `OpsHubCertificatePasswordsUtility.sh`.
* Enter the path for OpsHub Installation Directory.

<div align="center"><img src="/files/EYNxsdc27YkPJB24k88J" alt="" width="1300"></div>

* Enter the certificate alias as shown below:

<div align="center"><img src="/files/osjiQzBoKEwIRq5pfRZ9" alt="" width="1300"></div>

* Enter the private key password of the certificate with the same alias as shown below:

<div align="center"><img src="/files/rAB9zROG5QcVCyKYDWBx" alt="" width="1300"></div>

* Type "y" if more alias entries need to be added. The utility will prompt for alias name and password again. Type "n" if no more entries are required.

<div align="center"><img src="/files/OxD3SoLuSDOCeVbdx24e" alt="" width="1300"></div>

* The utility will create `cacerts_config.properties` file with certificate alias names and their corresponding passwords in encrypted format.

<div align="center"><img src="/files/JfwdrJh6JZh5QAJI1UJc" alt="" width="1300"></div>

* If the `cacerts_config.properties` file already exists, then this utility will not create this file, it will just replace the password for the existing alias or add the new alias and encrypted password in the existing `cacerts_config.properties`.


# Data Count Utility

## Overview

* This utility counts the total number of issues across one or more projects. It supports the following systems:
  * **Rally ( Cloud )**
  * **Jira ( Cloud, DC: 8.x to 11.x )**
  * **OpenText ALM ( 12.x to 24.x )**
  * **Helix ALM ( 2021, 2024 )**
* **After Downloading the Utility**
  * Once the utility is extracted, the folder will contain the following files:
    * **OpshubCountUtility.jar** – The main executable JAR file of the utility.
    * **run.bat** – Script to run the utility on Windows systems.
    * **run.sh** – Script to run the utility on Linux or macOS systems.
    * **propertyFiles** – Directory containing configuration property files.
    * **jre** – Bundled Java Runtime Environment.

## Configuration

Configuration should be provided in the respective properties file of the system for which you want to count the issues.

* Locate the **propertyFiles** directory. This directory contains the property files for each supported system:
  * **Jira.properties**
  * **HelixCoreALM.properties**
  * **Rally.properties**
  * **OpenTextALM.properties**
* Edit and provide the required configuration details in the property file corresponding to the system for which issue counts need to be calculated.

## Steps to Run Utility

Following are the steps to run the utility:

### STEP 01

* Open **Command Prompt**.
* Refer to the screenshot below:

<div align="center"><img src="/files/kQ4w26W8RCvcY5gui14U" alt="" width="950"></div>

### STEP 02

* Go to the **directory** where the **Utility** is located.
* Refer to the screenshot below:

<div align="center"><img src="/files/OprER5lO2lV04xukJTli" alt="" width="950"></div>

### STEP 03

* Type **run.bat** and press **Enter**.
* Refer to the screenshot mentioned below:

<div align="center"><img src="/files/GcNLr6DZpVSOdoAPFaPP" alt="" width="950"></div>

Once you press Enter, you will see the screen shown below.

<div align="center"><img src="/files/vYnRovZu6HaQQFlKmm5Q" alt="" width="950"></div>

### STEP 04

* Once the welcome screen appears, it will prompt you to enter your email ID.
* Provide the **email ID** and press **Enter**.
* Refer to the screenshot below:

<div align="center"><img src="/files/tLQn9qp2kudzBJhUHr8Q" alt="" width="950"></div>

### STEP 05

* After providing the email ID, another screen will appear asking you to enter the system code displayed on the screen.
* Enter the **code** corresponding to the system for which you want to count the issues.
* Refer to the screenshot below:

<div align="center"><img src="/files/VTvDqheNoUBNO98ALLYu" alt="" width="950"></div>

### STEP 06

The utility will prompt you to enter the system credentials. Provide the credentials for the system you selected.

#### For Rally

Supports two types of authentication modes **Authentication Token** and **Username and Password**.\
Based on the configuration in the **Rally.properties** file:

* If the value of the **rallyAuthType** property is set to 1, the user must provide the **Authentication Token**.

  * Refer to the screenshot below:

  <div align="center"><img src="/files/07bY5OHBRIXEYedC1fmr" alt="" width="950"></div>
* If the value of the **rallyAuthType** property is set to 2, the user must provide the **Username and Password**.

  * Refer to the screenshots below:

  <div align="center"><img src="/files/u5yhZBItIbrxpoyWbU7l" alt="" width="950"></div>

  <div align="center"><img src="/files/OTIcAzuBmfcS92TyBmtI" alt="" width="950"></div>

#### For Jira

The utility supports both **Data Center (DC)** and **Cloud** instances for Jira. Users must provide credentials based on the type of instance being used.

* If the instance type is **Cloud**, provide the **email address** as the username.\
  If the instance type is **Data Center (DC)**, provide the **username**.

  * Refer to the screenshot below:

  <div align="center"><img src="/files/rB0znlrD3Awnx5TMoiNW" alt="" width="950"></div>
* Provide the API token for **Cloud** instances, or the Password/API token for **Data Center (DC)** instances.

  * Refer to the screenshot below:

  <div align="center"><img src="/files/fzx8CHGTryy721dhLCIH" alt="" width="950"></div>

#### For OpenText ALM

In the case of OpenText ALM, the user must provide only the Username and Password.

* Refer to the screenshots below:

<div align="center"><img src="/files/u5yhZBItIbrxpoyWbU7l" alt="" width="950"></div>

<div align="center"><img src="/files/OTIcAzuBmfcS92TyBmtI" alt="" width="950"></div>

#### For Helix Core ALM

In the case of Helix, the user must provide only the Username and Password.

* Refer to the screenshots below:

<div align="center"><img src="/files/u5yhZBItIbrxpoyWbU7l" alt="" width="950"></div>

<div align="center"><img src="/files/OTIcAzuBmfcS92TyBmtI" alt="" width="950"></div>

### STEP 07

* Once the user provides all the credentials and presses Enter, a **verification code** will be sent to the registered email ID.
* The user must enter this code to complete the validation process.
* Refer to the screenshot below:

<div align="center"><img src="/files/62tRYr3rUDa1pe8gGZr9" alt="" width="950"></div>

> **Note**: The above steps are explained for Windows OS. For **Linux**, the user should execute the **run.sh** file located in the utility folder and follow the steps mentioned above.

### Output

* Once the utility execution starts and all issue details are fetched, it creates an **output** folder. This folder contains subfolders named **Jira**, **Rally**, etc., based on the system selected by the user.
* Based on the system selected, the execution result will be stored in a data count CSV file. For example, for Jira, the file name will be **Jira\_Count\_Data.csv**.

  * The CSV file contains counts of all issues of all issue types based on the project. Refer to the screenshot below:

  <div align="center"><img src="/files/j5Jdde4zUO2OfO5E4nKk" alt="" width="950"></div>
* In case any issue or error occurs, the utility creates another CSV file containing the error details. This CSV file is generated inside the system-specific output folder located within the main **output** directory.
  * For example, if the utility encounters an issue while processing a project for Jira, it will store the error details in the **jira\_error\_report.csv** file.
* Once the utility execution starts, it stores all execution logs in the **app.log** file located in the **OpsHubCountUtility/logs** folder.


# APIs

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>Getting Started with APIs</strong></td><td><a href="/pages/2il4e1PNRp7sjFvORaiJ">/pages/2il4e1PNRp7sjFvORaiJ</a></td></tr><tr><td align="center"><strong>Sample Use Cases and Scripts</strong></td><td><a href="/pages/rUeOtF36W7W2U2xum4F9">/pages/rUeOtF36W7W2U2xum4F9</a></td></tr><tr><td align="center"><strong>API Capability Matrix</strong></td><td><a href="/pages/QIKKZBLXCJ363nJ3FdDM">/pages/QIKKZBLXCJ363nJ3FdDM</a></td></tr></tbody></table>


# Getting Started with APIs

## Overview

<code class="expression">space.vars.OIM</code> has rich user interface for achieving the integration configurations and using other functionality of <code class="expression">space.vars.OIM</code>. However, there can be various cases where the user might need to achieve/use them programmatically, i.e., with the external script, external software program, or with some API client, and <code class="expression">space.vars.OIM</code> API is useful in such cases. It is an alternate way to communicate with the <code class="expression">space.vars.OIM</code>.

The <code class="expression">space.vars.OIM</code> API is organized around REST and uses [JSON](https://www.json.org/json-en.html) format for data exchange.

To have a quick look on the use cases samples and <code class="expression">space.vars.OIM</code> API usage examples, please refer to [Use Cases](/manage/api/sample-use-cases).

## Prerequisites

Following are the prerequisites to use <code class="expression">space.vars.OIM</code> API:

### Access to <code class="expression">space.vars.OIM</code> Instance

* An active instance of <code class="expression">space.vars.OIM</code> which needs to be accessible from the machine/[platform](#platforms) for invoking the <code class="expression">space.vars.OIM</code> API.
* URL of <code class="expression">space.vars.OIM</code> instance. Example: `http://10.13.20.20:8989/OIM/` or `https://10.13.20.20:8443/OIM/`.
* User credentials for accessing the <code class="expression">space.vars.OIM</code> instance.

> **Note**: Please refer to [Validate access](#validate-access-to-opshub-integration-manager-instance) for validating this prerequisite.

### API License

* Usage of <code class="expression">space.vars.OIM</code> API requires "API" add-on in the <code class="expression">space.vars.OIM</code> license.

> **Note**: Please refer to [Validate API feature](#validate-api-feature) to determine whether the "API" feature is enabled or not on your <code class="expression">space.vars.OIM</code> instance.

### Platforms

* <code class="expression">space.vars.OIM</code> APIs can be invoked from the platform which can make the REST API Calls.
  * API client such as [postman](https://www.postman.com/).
  * Programs written in any programing language which has support for HTTP or HTTPS communication.
  * Command line tool such as [curl](https://curl.se/).

## Access to API

Access to API will be available for your instance with URL like below:

`<Protocol>://<Host Name or IP address of` <code class="expression">space.vars.OIM</code> `instance>:<Port Number>/OIM/rest/api/docs`

**For example** – If the application url of <code class="expression">space.vars.OIM</code> is `http://10.13.20.20:8989/OIM/`, then the Swagger UI will be available at `http://10.13.20.20:8989/OIM/rest/api/docs`.

## Appendix

### Validate API feature

To check whether the "API" feature is enabled in the <code class="expression">space.vars.OIM</code> or not, please perform the below steps:

1. [Login](/getting-started/logging-in) to <code class="expression">space.vars.OIM</code> with the valid <code class="expression">space.vars.OIM</code> user credentials.
2. Navigate to the Footer and find "Edition" value.
3. Click on the Edition value of the <code class="expression">space.vars.OIM</code>

<div align="center"><img src="/files/2pE8yJ6sLbYn3gvDgJjY" alt="" width="800"></div>

4. Please make sure the "API" feature is enabled.

<div align="center"><img src="/files/ktUJUeItt7ynuqFky35G" alt="" width="800"></div>

> **Note**: If this feature is disabled, and you have the license in which this feature is available, then please install the correct license. If you don’t have a valid license, please reach out to OpsHub Sales/Support team for receiving the appropriate license.

### Validate access to <code class="expression">space.vars.OIM</code> instance

To check whether the <code class="expression">space.vars.OIM</code> instance is accessible or not, please perform the below steps:

1. Open <code class="expression">space.vars.OIM</code> instance URL from any browser from the machine/platform where <code class="expression">space.vars.OIM</code> APIs are invoked.
2. Access the <code class="expression">space.vars.OIM</code> instance from browser using the credentials you want to use for <code class="expression">space.vars.OIM</code> API communication.
3. If you can successfully login, this prerequisite is met.

> **Note**: If <code class="expression">space.vars.OIM</code> is configured on HTTPS, then SSL certificates needs to be imported based on the chosen platform:

* For the API clients like [postman](https://www.postman.com/), there are some [steps](https://learning.postman.com/docs/sending-requests/certificates/) to configure it.
* For the [curl](https://curl.se/) command, this can be [configured using -cert](https://curl.se/docs/manpage.html) option.
* For the programs, the steps will differ based on the expectation of the programming languages in which it was written.

## Known Limitations

1. SAML Users won't be able to login through the API.
   * Let's say the user has configured SAML login for OIM UI Login. Such users won't be able to login through the API. It would need either Default or LDAP user.


# Sample Use Cases and Scripts

**Sample Use Cases**

* [Get the project pairs configured in integration(s)](/manage/api/sample-use-cases/use-case-get-all-project-pairs)
* [Integration health details like getting list of active integrations with failures count](/manage/api/sample-use-cases/use-case-integration-healthcheck)
* [Trigger integration execution on demand](/manage/api/sample-use-cases/use-case-execute-integration)
* [Add fields to existing Mapping](/manage/api/sample-use-cases/add-fields-to-mapping)
* [Configure Reconciliation on existing Integration](/manage/api/sample-use-cases/configure-reconcile-on-exisiting-integration)
* [Retrieve and Configure Integration Pair Log Settings](/manage/api/sample-use-cases/retrive-and-configure-integration-pair-log-setting)


# Get the project pairs configured in integration(s)

## Description

* Given two systems, if you want to get the projects in synchronization (for all active integration configured) between those systems, then you can use this sample script.

## Input

* Instance details
  * Instance details like <code class="expression">space.vars.OIM</code> instance url, username and password are to be given in **instanceDetails.properties** file available within script.
* End Point details (To be given at the time of script execution)
  * End Point 1 Id
  * End Point 2 Id

## Output

* List of project pairs configured in all the active integrations between the two systems.

## Script

You can download the script from [here](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/IQCYsYXc54Z8T5HPSFXGPA1FAbbDAjg1vtp7umfq3B21Oo8).

Below is an example of execution for this script.

<div align="center"><img src="/files/pkmWSQhM2rhdMHq2QNj5" alt=""></div>


# Integration health including the details like list of active integrations with failures count

## Description

* If you want to get the health status of all active integrations between two systems, then you can use this sample script.
* Health status includes number of active integrations, failure count for all integrations, global failure present or not, etc.

## Input

* Instance details
  * Instance details like <code class="expression">space.vars.OIM</code> instance url, username and password are to be given in **instanceDetails.properties** file available within script.
* End Point details (To be given at the time of script execution)
  * End Point 1 Id
  * End Point 2 Id

## Output

* Number of active integrations
* Number of active synchronizations
* Synchronization details like synchronization direction, failure count present in the integration, was there any global error in last cycle?, global error timestamp.

## Script

You can download the script from [here](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/EcIhGxnr2M9Nt1mK2w-i7ZAB0O2XJ1-Sc8q8OnWYgZqPGg).

Below is an example of execution of script which shows the input and output.

<div align="center"><img src="/files/fblmF4ZBMi1QzW1Hvwsf" alt="" width="700"></div>

<div align="center"><img src="/files/TkquppZLB9XC68ni1u2Y" alt="" width="700"></div>


# Trigger integration execution on demand

## Description

* Given two systems, if you want to execute/trigger all active integration configured between those systems, then you can use this sample script.

## Input

* Instance details
  * Instance details like <code class="expression">space.vars.OIM</code> instance url, username and password are to be given in **instanceDetails.properties** file available within script.
* End Point details (To be given at the time of script execution)
  * End Point 1 Id
  * End Point 2 Id

## Output

* List of all active integrations between the two systems that were successfully executed.

## Script

You can download the script from [here](https://opshubtrial-my.sharepoint.com/:u:/g/personal/support_opshub_com/EdaLRfGX_KRAoyYTssd-kswBT1VC_QfpRCwwYMkGhAx7rQ).

Below is an example of execution of script which shows the input and output.

<div align="center"><img src="/files/B87GtTC076t6NN749wVL" alt="" width="700"></div>


# Add fields to existing Mapping

## Description

* If you want to add fields to an existing mapping, then you can use this sample script.

## Input

* Instance details:
  * Instance details like <code class="expression">space.vars.OIM</code> instance URL, username and password are to be given in **instanceDetails.properties** file available within script.
* Mapping details (to be given at the time of script execution):
  * Mapping id to be updated.
  * Internal name of the field of system 1.
  * Internal name of the field of system 2.

### Output

* Updated mapping

### Script

You can download the script from [here](https://opshub.com/ohftp/AdminAPI/addFieldsToMapping.zip).

Below is an example of execution of script which shows the input and output:

<div align="center"><img src="/files/vvz8cxrNvrPUV7mxDUbz" alt=""></div>


# Configure Reconciliation on existing Integration

## Description

* To set reconcile rule on the existing mapping and configure reconciliation, use this sample script.

## Input

* Instance details:
  * Instance details like <code class="expression">space.vars.OIM</code> instance URL, username and password are to be given in **instanceDetails.properties** file available within script.
* Integration details (to be given at the time of script execution):
  * Integration Group id on which Reconciliation is to be configured.
  * Select directional integration id.
* Mapping details (to be given at the time of script execution):
  * Select the mapped fields on which Reconcile Rule is to be configured
  * Select **Mismatch**, and **Reconcile For** options for each field.
* Reconciliation details (to be given at the time of script execution):
  * Workflow id (should be a type of Reconciliation)
  * Select the reconciliation status

## Output

* Configured Reconciliation for given fields in an Integration.

## Script

You can download the script from [here](https://opshub.com/ohftp/AdminAPI/configureReconciliationOnExistingIntegration.zip).

Below is an example of execution of script which shows the input and output:

<div align="center"><img src="/files/689gjfbaHoJQz9lFTsgs" alt=""></div>

<div align="center"><img src="/files/WeCrdzIzclcg8LmwnM4T" alt=""></div>


# Retrieve and Configure Integration Pair Log Settings

## Description

To retrieve and modify Integration Pair Log Settings.

## Input

* Instance details:
  * Instance details like <code class="expression">space.vars.OIM</code> instance URL, username and password are to be given in **instanceDetails.properties** file available within the script.
* Integration details (to be given at the time of script execution):
  * Integration Group id of the entity pair for which you want to retrieve or modify the logSettings.
  * Select Integration entity pair.
* Integration Log Setting details (to be given at the time of script execution):
  * Select the jobMode from the available options.
  * Enter 'y' to modify the Integration Log Setting configuration.
  * Enter 'n' to end the execution.
* Update Integration Log Setting details (to be given at the time of script execution):
  * Select the value for As per Global Log Settings.
  * If As per Global Log Settings is selected as true, Global Log Settings will be followed.
  * If As per Global Log Settings is selected as false, enter the Integration Log Setting configuration details.

## Output

Configured Log Settings for the integration pair.

## Script

You can download the script from [here](https://opshub.com/ohftp/AdminAPI/retrieveandconfigurelogsetting.zip).

Here is an example of execution of script showing the input and the output:

<div align="center"><img src="/files/gwEiZCAdFbc2OfPKxtbg" alt=""></div>

<div align="center"><img src="/files/BLmZyHZnPUUBYtjgvL51" alt=""></div>


# API Capability Matrix

This document provides an overview of API capabilities available in <code class="expression">space.vars.OIM</code>. It outlines which operations (Get, Create, Update, Delete, List, Execute) are supported across Integration and Admin modules.

Use this matrix as a quick reference to understand API coverage.

***

## Legend

| Symbol | Meaning              |
| ------ | -------------------- |
| ✅      | Available in API     |
| ❌      | Not Available in API |
| —      | Not Applicable       |

***

## Integration

| Feature / Module     | Get | Create | Update | Delete | List | Execute | Notes                     |
| -------------------- | --- | ------ | ------ | ------ | ---- | ------- | ------------------------- |
| System               | ✅   | ✅      | ✅      | —      | ✅    | —       | —                         |
| System Type          | —   | —      | —      | —      | ✅    | —       | —                         |
| System Template      | ✅   | —      | —      | —      | —    | —       | —                         |
| Mapping              | ✅   | ✅      | ✅      | ✅      | ✅    | —       | —                         |
| Integration          | ✅   | ✅      | ✅      | ✅      | ✅    | ✅       | API to get sync log files |
| Workflow             | ✅   | ✅      | ✅      | ✅      | ✅    | —       | —                         |
| Folder               | ✅   | ✅      | ✅      | ✅      | ✅    | —       | —                         |
| Excel Upload         | ✅   | ✅      | ✅      | ✅      | ✅    | —       | —                         |
| Reconcile            | ✅   | —      | —      | —      | —    | ✅       | —                         |
| Processing Failure   | ✅   | —      | ✅      | ✅      | ✅    | ✅       | —                         |
| Global Failure       | ✅   | —      | —      | ✅      | ✅    | —       | —                         |
| Failure Notification | ✅   | ✅      | ✅      | ✅      | —    | —       | —                         |
| Sync Report          | —   | —      | —      | —      | ✅    | —       | —                         |
| Audits               | —   | —      | —      | —      | ❌    | —       | —                         |

***

## Admin

| Feature / Module        | Get | Create | Update | Delete | List | Execute | Notes               |
| ----------------------- | --- | ------ | ------ | ------ | ---- | ------- | ------------------- |
| System Information      | ❌   | —      | —      | —      | —    | —       | —                   |
| User                    | ❌   | ❌      | ❌      | —      | ✅    | —       | —                   |
| User-Role               | ✅   | —      | ✅      | —      | —    | —       | —                   |
| Role                    | ✅   | ✅      | ✅      | ✅      | ✅    | —       | —                   |
| SDK                     | ✅   | ✅      | ✅      | —      | ✅    | —       | —                   |
| Scheduler               | ✅   | ✅      | ✅      | ✅      | ✅    | —       | —                   |
| Log Setting             | ✅   | —      | ✅      | —      | —    | —       | —                   |
| Usage Report            | ✅   | —      | —      | —      | —    | —       | —                   |
| Trends Dashboard        | ✅   | —      | —      | —      | —    | —       | —                   |
| Login Server Management | ❌   | ❌      | ❌      | ❌      | ❌    | ❌       | —                   |
| License                 | —   | —      | —      | —      | —    | —       | Not there by design |
| Purge                   | —   | —      | —      | —      | —    | —       | Not there by design |
| Rules                   | —   | —      | —      | —      | —    | —       | Not there by design |


# MCP Server

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>Get Started</strong></td><td><a href="/pages/cLSPWRZ3wLbX8cztdoG6">/pages/cLSPWRZ3wLbX8cztdoG6</a></td></tr><tr><td align="center"><strong>Configuration</strong></td><td><a href="/pages/Gqx3GCMgGFWVkoaKUB9A">/pages/Gqx3GCMgGFWVkoaKUB9A</a></td></tr><tr><td align="center"><strong>Available Tools</strong></td><td><a href="/pages/ltKrkSC5trGJnyvzCdXr">/pages/ltKrkSC5trGJnyvzCdXr</a></td></tr><tr><td align="center"><strong>MCP Capability Matrix</strong></td><td><a href="/pages/oPxrNrW8f7It28CP6HiF">/pages/oPxrNrW8f7It28CP6HiF</a></td></tr><tr><td align="center"><strong>Sample Use Cases</strong></td><td><a href="/pages/4VfirohKVp3ty4v0kLQ1">/pages/4VfirohKVp3ty4v0kLQ1</a></td></tr><tr><td align="center"><strong>Known Behaviours and Limitations</strong></td><td><a href="/pages/lC07eg85W2yA4dDKsfXZ">/pages/lC07eg85W2yA4dDKsfXZ</a></td></tr><tr><td align="center"><strong>Troubleshooting</strong></td><td><a href="/pages/ziOnmevr0th7LA4V6RAb">/pages/ziOnmevr0th7LA4V6RAb</a></td></tr></tbody></table>


# Get Started

## Overview

Consider asking your AI assistant *"How many integrations are currently running in OIM?"* or *"Create an integration between Jira and Rally for Project Alpha"* - and getting it done instantly. The <code class="expression">space.vars.OIM</code> MCP (Model Context Protocol) server connects your AI assistant directly to your <code class="expression">space.vars.OIM</code> instance, enabling you to query, configure, and manage integrations through natural language - while fully preserving the security and role-based access controls configured in <code class="expression">space.vars.OIM</code>.

> **Tip**: For best results, it is recommended to also connect the **OpsHub Documentation MCP** alongside the <code class="expression">space.vars.OIM</code> MCP server. This allows your AI assistant to access OpsHub product documentation - including connector, providing richer context when generating configurations.

To explore what operations are supported, kindly refer to [MCP Capability Matrix](/manage/mcp/mcp-capability-matrix).\
To get started with sample interactions, kindly refer to [Sample Use Cases](/manage/mcp/mcp-sample-use-cases).

***

## Prerequisites

### License

MCP server access is available with the **Professional** and **Ultimate** editions of <code class="expression">space.vars.OIM</code>. It is **not available** with OM4ADO.

To verify whether the MCP feature is enabled on your instance:

1. [Login](/getting-started/logging-in) to <code class="expression">space.vars.OIM</code>.
2. Navigate to the Footer and click on the **Edition**.

<div align="center"><img src="/files/kvp5CrdlxIczQxSzGmTa" alt="" width="800"></div>

3\. Confirm that the \*\*MCP\*\* feature is listed as enabled.

<div align="center"><img src="/files/MTMnqP2tg90wz7W39uZn" alt="" width="800"></div>

> **Note**: If the MCP feature is not enabled and you have a license that should include it, please install the correct license. If you do not have a valid license, please reach out to the OpsHub Sales/Support team.

### User requirements

* A valid <code class="expression">space.vars.OIM</code> user account with appropriate roles and permissions to perform the desired operations via MCP.

> **Recommendation**: A dedicated user of OIM rather than individual user accounts improves traceability of all actions performed via MCP and ensures access is limited to only the permissions needed. To create a new user, navigate to **Administration → User Management** in <code class="expression">space.vars.OIM</code> and create a new user with the appropriate role.

### MCP-compatible AI client

The MCP server works with any client that supports the Model Context Protocol over HTTP. Supported clients include:

* [Claude Desktop](https://claude.ai/download)
* [Claude Code](https://docs.anthropic.com/en/docs/claude-code/getting-started)
* [Visual Studio Code](https://code.visualstudio.com/) with a compatible MCP extension (Github Copilot)
* [Cline](https://github.com/cline/cline)
* [Continue](https://www.continue.dev/)
* Any other MCP-compatible client that supports HTTP transport

***

## Accessing the MCP server

The <code class="expression">space.vars.OIM</code> MCP server is available at the following endpoint:

```
<OpsHub Integration Manager URL>/OpsHubWS/mcp
```

**For example** — If your <code class="expression">space.vars.OIM</code> application URL is `http://10.13.20.20:8989/OIM/`, then the MCP endpoint will be:

```
http://10.13.20.20:8989/OpsHubWS/mcp
```

To configure your AI client to connect to this endpoint, kindly refer to [Configuration](/manage/mcp/mcp-configuration).


# Configuration

This page covers how to authenticate with the <code class="expression">space.vars.OIM</code> MCP server and how to configure popular MCP-compatible clients.

***

## Authentication

The <code class="expression">space.vars.OIM</code> MCP server supports the following authentication methods. Credentials are passed as part of the MCP client configuration headers.

> **Note**: LDAP and SAML users cannot authenticate with the MCP server. This is because MCP clients do not perform browser-based or redirect-based login flows that LDAP and SAML require. Use a local <code class="expression">space.vars.OIM</code> user account for MCP access.

Credentials can be passed in one of the following ways in your client configuration:

### Option 1 — API Key header (recommended)

Use an API Key generated from the <code class="expression">space.vars.OIM</code> UI. Refer to API Key Management for details. This is the most secure option as the key is dedicated, revocable, and keeps your user credentials out of configuration files entirely. Pass it via the `x-api-key` header:

```json
{
  "servers": {
    "opshub-mcp": {
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "type": "http",
      "headers": {
        "x-api-key": "<your-api-key>"
      }
    }
  },
  "inputs": []
}
```

Alternatively, you can pass the API Key via the `Authorization` header:

```json
{
  "servers": {
    "opshub-mcp": {
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "type": "http",
      "headers": {
        "Authorization": "ApiKey <your-api-key>"
      }
    }
  },
  "inputs": []
}
```

> **Tip**: To generate an API Key, go to **Administration → API key** in <code class="expression">space.vars.OIM</code>. See API Key Management for step-by-step instructions.

### Option 2 — base64-encoded authorization header

Encode your credentials as a Base64 string in the format `username:password` and pass them via the standard `Authorization` header. This avoids exposing plain-text credentials in your configuration file.

```json
{
  "servers": {
    "opshub-mcp": {
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "type": "http",
      "headers": {
        "Authorization": "Basic <Base64 encoded username:password>"
      }
    }
  },
  "inputs": []
}
```

> **Tip**: To generate the Base64 value, encode `username:password` using any Base64 encoder. For example, `admin:password` encodes to `YWRtaW46cGFzc3dvcmQ=`.

### Option 3 — username and password as headers

```json
{
  "servers": {
    "opshub-mcp": {
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "type": "http",
      "headers": {
        "username": "mcpuser",
        "password": "password"
      }
    }
  },
  "inputs": []
}
```

***

## Client configuration

Below are sample configurations for popular MCP-compatible clients. Replace the URL and credentials with values specific to your <code class="expression">space.vars.OIM</code> instance.

### Visual Studio Code

{% tabs %}
{% tab title="API Key" %}

```json
{
  "servers": {
    "opshub-mcp": {
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "type": "http",
      "headers": {
        "x-api-key": "<your-api-key>"
      }
    }
  },
  "inputs": []
}
```

{% endtab %}

{% tab title="Authorization Header" %}

```json
{
  "servers": {
    "opshub-mcp": {
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "type": "http",
      "headers": {
        "Authorization": "Basic <Base64 encoded username:password>"
      }
    }
  },
  "inputs": []
}
```

{% endtab %}

{% tab title="Username & Password Headers" %}

```json
{
  "servers": {
    "opshub-mcp": {
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "type": "http",
      "headers": {
        "username": "mcpuser",
        "password": "password"
      }
    }
  },
  "inputs": []
}
```

{% endtab %}
{% endtabs %}

### Claude Desktop

> **Note**: Claude Desktop does not natively support HTTP-type MCP servers. The `mcp-remote` npm package is required as a bridge. Install it by running `npm install -g mcp-remote`, then use the configuration below.

{% tabs %}
{% tab title="API Key" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "command": "<path-to-npm-global-bin>\\mcp-remote.cmd",
      "args": [
        "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
        "--header",
        "x-api-key: <your-api-key>"
      ]
    }
  }
}
```

{% endtab %}

{% tab title="Authorization Header" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "command": "<path-to-npm-global-bin>\\mcp-remote.cmd",
      "args": [
        "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
        "--header",
        "Authorization: Basic <Base64 encoded username:password>"
      ]
    }
  }
}
```

{% endtab %}

{% tab title="Username & Password Headers" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "command": "<path-to-npm-global-bin>\\mcp-remote.cmd",
      "args": [
        "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
        "--header",
        "username: mcpuser",
        "--header",
        "password: password"
      ]
    }
  }
}
```

{% endtab %}
{% endtabs %}

### Claude Code

{% tabs %}
{% tab title="API Key" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "type": "http",
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "headers": {
        "x-api-key": "<your-api-key>"
      }
    }
  }
}
```

{% endtab %}

{% tab title="Authorization Header" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "type": "http",
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "headers": {
        "Authorization": "Basic <Base64 encoded username:password>"
      }
    }
  }
}
```

{% endtab %}

{% tab title="Username & Password Headers" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "type": "http",
      "url": "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
      "headers": {
        "username": "mcpuser",
        "password": "password"
      }
    }
  }
}
```

{% endtab %}
{% endtabs %}

### Cline

{% tabs %}
{% tab title="API Key" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "disabled": false,
      "timeout": 60,
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
        "--header",
        "x-api-key: <your-api-key>"
      ]
    }
  }
}
```

{% endtab %}

{% tab title="Authorization Header" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "disabled": false,
      "timeout": 60,
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
        "--header",
        "Authorization: Basic <Base64 encoded username:password>"
      ]
    }
  }
}
```

{% endtab %}

{% tab title="Environment Variables" %}

```json
{
  "mcpServers": {
    "opshub-mcp": {
      "timeout": 120,
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "<OpsHub Integration Manager URL>/OpsHubWS/mcp",
        "--header",
        "username: ${USERNAME}",
        "--header",
        "password: ${PASSWORD}"
      ],
      "env": {
        "USERNAME": "mcpuser",
        "PASSWORD": "password"
      }
    }
  }
}
```

{% endtab %}
{% endtabs %}

### Continue

{% tabs %}
{% tab title="API Key" %}

```yaml
mcpServers:
  - name: opshub-mcp
    command: npx
    args:
      - "-y"
      - "mcp-remote"
      - "<OpsHub Integration Manager URL>/OpsHubWS/mcp"
      - "--header"
      - "x-api-key: <your-api-key>"
    env: {}
```

{% endtab %}

{% tab title="Authorization Header" %}

```yaml
mcpServers:
  - name: opshub-mcp
    command: npx
    args:
      - "-y"
      - "mcp-remote"
      - "<OpsHub Integration Manager URL>/OpsHubWS/mcp"
      - "--header"
      - "Authorization: Basic <Base64 encoded username:password>"
    env: {}
```

{% endtab %}

{% tab title="Username & Password Headers" %}

```yaml
mcpServers:
  - name: opshub-mcp
    command: npx
    args:
      - "-y"
      - "mcp-remote"
      - "<OpsHub Integration Manager URL>/OpsHubWS/mcp"
      - "--header"
      - "username: mcpuser"
      - "--header"
      - "password: password"
    env: {}
```

{% endtab %}
{% endtabs %}

***

## HTTPS configuration

If your <code class="expression">space.vars.OIM</code> instance is configured on HTTPS, your MCP client must trust the SSL certificate used by the server.

* For clients that use `mcp-remote` as a bridge (Claude Desktop, Cline, Continue), the certificate must be trusted by your OS certificate store or Node.js environment.
* If you are using a self-signed or internal CA certificate, you may need to explicitly add it to Node.js using the `NODE_EXTRA_CA_CERTS` environment variable:

  ```bash
  NODE_EXTRA_CA_CERTS=/path/to/your/certificate.pem
  ```
* For VS Code and Claude Code, which connect directly over HTTP/HTTPS, ensure the certificate is trusted at the OS level.

> **Note**: If you encounter SSL errors, contact your system administrator to obtain the correct certificate file and follow the steps above.


# Available Tools

This page lists all tools exposed by the <code class="expression">space.vars.OIM</code> MCP server. Your AI assistant uses these tools to perform operations on your <code class="expression">space.vars.OIM</code> instance.

> **Note**: You do not invoke these tools directly. Your AI assistant selects and calls the appropriate tools based on your natural language prompt. This reference helps you understand what is available and what each tool does.

> **Note**: Delete operations are not supported via any MCP tool. See [Known Behaviours and Limitations](/manage/mcp/mcp-known-limitations) for details.

***

### Planner tools

Planner tools guide the AI assistant through the correct sequence of steps before performing complex operations. The AI assistant calls the relevant planner automatically before executing create, update, or action operations on the corresponding resource.

| Tool                         | Description                                                                                                                                                                                                                                                                                                                    |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `system_planner`             | Provides a step-by-step execution plan for system operations (create, update, list, get). Ensures the AI assistant gathers all required inputs before calling system API tools.                                                                                                                                                |
| `mapping_planner`            | Provides a step-by-step execution plan for mapping operations (create, update, list, get). Ensures field metadata, entity types, and transformation requirements are resolved before creating or updating a mapping.                                                                                                           |
| `integration_planner`        | Provides a step-by-step execution plan for integration operations (create, update, list, get, activate, inactivate, execute).                                                                                                                                                                                                  |
| `folder_planner`             | Provides a step-by-step execution plan for folder operations (create, update, list, get).                                                                                                                                                                                                                                      |
| `schedules_planner`          | Provides a step-by-step execution plan for schedule operations (create, update, list, get).                                                                                                                                                                                                                                    |
| `health_checkup_planner`     | Guides the AI assistant through a comprehensive multi-stage health checkup of the <code class="expression">space.vars.OIM</code> instance — covering integrations, systems, mappings, failures, and instance resource parameters. Produces a visual dashboard with colour-coded health status and prioritised recommendations. |
| `failure_resolution_planner` | Guides the AI assistant through a structured diagnostic process to identify the root cause of integration failures. Covers integration configuration, mapping, system connectivity, and permissions, and produces a step-by-step resolution plan.                                                                              |

***

### System tools

| Tool                    | Description                                                                                                                                                                           |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `getSystemTypes`        | Lists all supported system types available in <code class="expression">space.vars.OIM</code> with their system type IDs. Supports search by system name and pagination.               |
| `getSystemTypeTemplate` | Retrieves the required fields and configuration template for a given system type. Used by the AI assistant to understand what inputs are needed before creating or updating a system. |
| `get_systems_list`      | Lists all systems configured in the <code class="expression">space.vars.OIM</code> instance with search, filter, and sort capabilities.                                               |
| `get_system`            | Retrieves full details of a specific system by its ID.                                                                                                                                |
| `create_system`         | Creates a new system (endpoint) in <code class="expression">space.vars.OIM</code>.                                                                                                    |
| `update_system`         | Updates an existing system's configuration by its ID.                                                                                                                                 |

***

### Metadata tools

Metadata tools retrieve structural information about systems — such as available projects, entity types, fields, and lookup values. These are used by the AI assistant when building or validating mappings.

| Tool                      | Description                                                                                                                                                                     |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `get_projects`            | Retrieves the list of projects available in a specific system.                                                                                                                  |
| `get_entities`            | Retrieves the list of entity types (e.g., issues, defects, stories) available for a given system and project.                                                                   |
| `get_fields_meta`         | Retrieves field metadata for a given system and entity type, including field names, types, and whether they are required or read-only.                                          |
| `get_lookup_values`       | Retrieves the allowed values for a specific lookup-type field in a system (e.g., status values, priority values).                                                               |
| `get_complex_fields_meta` | Retrieves internal metadata for complex field types — comments, links, and attachments — for both systems in a mapping. Used to configure advanced field-level transformations. |

***

### Mapping tools

| Tool                                  | Description                                                                                                                                                                                                                                        |
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `get_mappings_list`                   | Lists all mappings configured in the instance with search, filter, and sort capabilities.                                                                                                                                                          |
| `get_mapping`                         | Retrieves the full configuration of a specific mapping by its ID, including all field mappings and transformation rules.                                                                                                                           |
| `create_mapping`                      | Creates a new mapping between two entity types.                                                                                                                                                                                                    |
| `update_mapping`                      | Updates an existing mapping by its ID.                                                                                                                                                                                                             |
| `get_advanced_transformation_comment` | Retrieves the advanced XSLT transformation scripts for comment field mapping, including user mention, entity mention, and comment XSLT scripts. Called after a base mapping is created when comment field mapping requires advanced configuration. |

***

### XSLT tools

XSLT tools provide reference guidance that the AI assistant uses when generating or validating advanced field-level transformations in mappings.

| Tool                                               | Description                                                                                                                                   |
| -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `Advanced_XSLT_Transformation_Guidelines`          | Provides the strict rules and constraints that the AI assistant must follow when generating or updating advanced XSLT used in field mappings. |
| `Core_Utility_Methods_Reference_for_advanced_XSLT` | Provides the library of available utility method definitions that can be used within XSLT transformations for field mappings.                 |

***

### Integration tools

| Tool                                       | Description                                                                                                                                                                                                                                        |
| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `get_integrations_list`                    | Lists all integrations configured in the instance with search, filter, and sort capabilities.                                                                                                                                                      |
| `get_integration`                          | Retrieves the full configuration of a specific integration by its ID, including project pairs, entity pairs, sync directions, and settings.                                                                                                        |
| `create_integration`                       | Creates a new integration.                                                                                                                                                                                                                         |
| `update_integration`                       | Updates an existing integration by its ID.                                                                                                                                                                                                         |
| `execute_status_change`                    | Changes the execution status of one or more integrations. Supports three actions: **activate** (enable the integration for scheduled sync), **inactivate** (disable the integration), and **execute** (trigger an immediate on-demand sync cycle). |
| `get_advanced_config_settings_integration` | Retrieves all advanced configuration settings available for a given integration and direction — including override parameters for read/write operations and criteria configuration.                                                                |

***

### Folder tools

| Tool               | Description                                                                   |
| ------------------ | ----------------------------------------------------------------------------- |
| `get_folders_list` | Lists all folders in the instance with search, filter, and sort capabilities. |
| `get_folder`       | Retrieves details of a specific folder by its ID.                             |
| `create_folder`    | Creates a new folder. The parent folder must exist.                           |
| `update_folder`    | Updates an existing folder by its ID.                                         |

***

### Schedule tools

| Tool                 | Description                                                                                                         |
| -------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `get_schedules_list` | Lists all schedules configured in the instance. Supports filtering by schedule type, status, and name.              |
| `get_schedule`       | Retrieves details of a specific schedule by its ID, including type, configuration, status, and next execution time. |
| `create_schedule`    | Creates a new schedule for automating integration execution.                                                        |
| `update_schedule`    | Updates an existing schedule by its ID.                                                                             |

***

### Workflow tools

| Tool            | Description                                                                                                                                                  |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `get_workflows` | Lists all workflows available in the instance with search, filter, and sort capabilities. Workflows can be referenced when configuring integration settings. |

***

### Failure tools

| Tool                           | Description                                                                                                                                                         |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `get_global_failures_list`     | Lists global failures across all integrations with search, filter, and sort capabilities. Global failures indicate errors that stopped an entire integration cycle. |
| `get_global_failure`           | Retrieves full details of a specific global failure by its ID, including the stack trace.                                                                           |
| `get_processing_failures_list` | Lists processing failures with search, filter, and sort capabilities. Processing failures are record-level failures where a specific item failed to sync.           |
| `get_processing_failure`       | Retrieves full details of a specific processing failure by its ID. Can optionally include dependent failure records.                                                |
| `retry_processing_failures`    | Retries one or more processing failures, re-queuing the failed records for synchronization.                                                                         |

***

### Health & diagnostics tools

| Tool                         | Description                                                                                                                                                                                                                                                                                                                          |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `get_oim_system_information` | Retrieves complete details about the <code class="expression">space.vars.OIM</code> instance — including OS, heap memory usage, disk space, database connection pool utilisation, HTTP thread pool usage, active thread count, log folder size, and global log level. Used during health checkup to assess instance resource health. |


# MCP Capability Matrix

This document provides an overview of the operations available through the <code class="expression">space.vars.OIM</code> MCP server. It outlines which operations (Get, Create, Update, List, Execute) are supported across functional areas exposed as MCP tools.

Use this matrix as a quick reference to understand MCP coverage.

> **Note**: Delete operations and modification of failed synchronization records are not supported via MCP. Refer to [Known Behaviours and Limitations](/manage/mcp/mcp-known-limitations) for details.

***

### Legend

| Symbol | Meaning               |
| ------ | --------------------- |
| ✅      | Supported via MCP     |
| ❌      | Not Supported via MCP |
| —      | Not Applicable        |

***

### Operations matrix

#### Systems, Mappings & Integrations

| Feature / Module     | Get | Create | Update | List | Execute | Notes                                                                      |
| -------------------- | --- | ------ | ------ | ---- | ------- | -------------------------------------------------------------------------- |
| System               | ✅   | ✅      | ✅      | ✅    | —       | —                                                                          |
| System Type          | —   | —      | —      | ✅    | —       | —                                                                          |
| System Type Template | ✅   | —      | —      | —    | —       | —                                                                          |
| Mapping              | ✅   | ✅      | ✅      | ✅    | —       | Includes advanced/customized mapping with XSLTs and mapped fields settings |
| Integration          | ✅   | ✅      | ✅      | ✅    | ✅       | —                                                                          |

#### Folders & Schedules

| Feature / Module | Get | Create | Update | List | Execute | Notes |
| ---------------- | --- | ------ | ------ | ---- | ------- | ----- |
| Folder           | ✅   | ✅      | ✅      | ✅    | —       | —     |
| Schedule         | ✅   | ✅      | ✅      | ✅    | —       | —     |
| Workflow         | ❌   | ❌      | ❌      | ✅    | —       | —     |

#### Integration monitoring & maintenance

| Feature / Module     | Get | Create | Update | List | Execute | Notes                                                                                                                                      |
| -------------------- | --- | ------ | ------ | ---- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| Global Failure       | ✅   | —      | —      | ✅    | —       | —                                                                                                                                          |
| Processing Failure   | ✅   | —      | ❌      | ✅    | —       | —                                                                                                                                          |
| Failure Notification | ❌   | ❌      | ❌      | —    | —       | —                                                                                                                                          |
| Health Checkup       | ✅   | —      | —      | —    | —       | Includes integration health analysis, failure diagnostics, and visibility into OIM instance configuration and resource utilization details |

#### Metadata

| Feature / Module | Get | Create | Update | List | Execute | Notes                                                 |
| ---------------- | --- | ------ | ------ | ---- | ------- | ----------------------------------------------------- |
| Projects         | —   | —      | —      | ✅    | —       | —                                                     |
| Entity Types     | —   | —      | —      | ✅    | —       | —                                                     |
| Fields           | ✅   | —      | —      | —    | —       | Includes fields, comments, attachments, relationships |

#### Others

| Feature / Module | Get | Create | Update | List | Execute | Notes |
| ---------------- | --- | ------ | ------ | ---- | ------- | ----- |
| Sync Report      | —   | —      | —      | ❌    | —       | —     |
| Audit            | —   | —      | —      | ❌    | —       | —     |
| Excel Upload     | ❌   | ❌      | ❌      | ❌    | —       | —     |
| Reconcile        | ❌   | —      | —      | ❌    | —       | —     |


# Sample Use Cases

The following sample use cases demonstrate how the <code class="expression">space.vars.OIM</code> MCP server can be used with an AI assistant to perform common integration management tasks through natural language.

* [Integration health monitoring](/manage/mcp/mcp-sample-use-cases/mcp-use-case-integration-healthcheck)
* [Create mapping between systems](/manage/mcp/mcp-sample-use-cases/mcp-use-case-create-mapping)
* [Trigger on-demand integration execution](/manage/mcp/mcp-sample-use-cases/mcp-use-case-execute-integration)
* [View configured systems and project counts](/manage/mcp/mcp-sample-use-cases/mcp-use-case-get-systems-and-projects)
* [View and retry failed synchronizations](/manage/mcp/mcp-sample-use-cases/mcp-use-case-retry-failures)


# Integration Health Monitoring

### Description

To get a complete picture of <code class="expression">space.vars.OIM</code> instance — not just whether integrations are running, but also the machine's memory consumption, disk space, database connection usage, active threads, and whether there are any unresolved failures that need attention. All of this without opening the UI.

### Example interaction

| Component               | Detail                                                                                                                                                                                                                                             |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **User prompt**         | "Give me a full health check of my OIM instance — I want to know the resource usage, how integrations are doing, and if there are any failures I should be worried about."                                                                         |
| **MCP tools invoked**   | `health_checkup_planner` → `get_oim_system_information` → `get_integrations_list` → `get_systems_list` → `get_processing_failures_list` → `get_global_failures_list` → `get_mappings_list`                                                         |
| **AI assistant steps**  | Fetches instance resource data (RAM allocation, memory used, disk space, DB connections, HTTP threads) → retrieves integrations with entity pair execution statuses, last sync times, and failure counts → retrieves and groups failures by cause. |
| **AI assistant output** | A health dashboard with overall status (HEALTHY / WARNING / CRITICAL), resource summary, integration and failure summaries, and prioritised recommendations.                                                                                       |

### Notes

* You can scope the check to specific systems: *"Health check for integrations between Jira and Rally."*
* To avoid stale results from a previous query in the same session, include "Do not use previously fetched data" in your prompt.


# Create Mapping Between Systems

### Description

A user wants to create a new field mapping between entity types of two systems — for example, mapping Jira Issues to Rally Defects.

### Example interaction

| Component               | Detail                                                                                                                                                      |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **User prompt**         | "Create a mapping between Jira Issues and Rally Defects for the Alpha (Jira) - Beta (Rally) project integration."                                           |
| **MCP tools invoked**   | `mapping_planner` → `get_fields_meta` (for both systems) → `create_mapping`                                                                                 |
| **AI assistant steps**  | Retrieves field metadata for both entity types → checks for duplicate mappings → presents proposed mapping for user confirmation → creates on confirmation. |
| **AI assistant output** | Confirmation of the created mapping with its ID and a summary of the fields mapped.                                                                         |

### Notes

* The AI assistant will always check for existing mappings before creating and will warn of potential duplicates.
* Advanced configurations such as XSLT transformations, conflict detection rules, and overwrite settings can be applied by requesting them in your prompt.


# Trigger On-Demand Integration Execution

### Description

A user wants to immediately trigger all active integrations between two configured systems without navigating the <code class="expression">space.vars.OIM</code> UI.

### Example interaction

| Component               | Detail                                                                                                                                                |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **User prompt**         | "Execute all active integrations between Jira and HP ALM right now."                                                                                  |
| **MCP tools invoked**   | `get_integrations_list` (filtered by system pair and ACTIVE status) → `execute_status_change` (status: EXECUTE)                                       |
| **AI assistant steps**  | Retrieves active integrations between the specified systems → presents list for user confirmation → triggers sync cycle for each and reports results. |
| **AI assistant output** | A list of integrations that were successfully triggered, along with their IDs and names.                                                              |


# View Configured Systems and Project Counts

### Description

A user wants to find out which systems are configured in <code class="expression">space.vars.OIM</code> and which project pairs are synchronizing between two specific systems.

### Example interaction

| Component               | Detail                                                                                                                             |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **User prompt**         | "What systems are configured in OIM? And what projects are integrated between System A and System B?"                              |
| **MCP tools invoked**   | `get_systems_list` → `get_integrations_list` → extract project pairs from integration details                                      |
| **AI assistant steps**  | Retrieves all configured systems → filters integrations by the two specified systems → extracts project pairs and sync directions. |
| **AI assistant output** | A summary of all configured systems, followed by a list of project pairs with sync directions between the two specified systems.   |

### Sample output

| System Pair  | Project (System A) | Direction     | Project (System B) |
| ------------ | ------------------ | ------------- | ------------------ |
| Jira ↔ Rally | Project Alpha      | BIDIRECTIONAL | Rally Project 1    |
| Jira ↔ Rally | Project Beta       | FORWARD       | Rally Project 2    |

> **Tip**: To avoid stale results from a previous query in the same session, include "Do not use previously fetched data" in your prompt.


# View and Retry Failed Synchronizations

### Description

A user wants to review the processing failures across integrations and retry them without navigating to the <code class="expression">space.vars.OIM</code> UI. Processing failures are record-level failures — individual items that failed to sync — and can be re-queued for synchronization once the underlying issue is resolved.

### Example interaction

| Component               | Detail                                                                                                                         |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| **User prompt**         | "Show me the processing failures and retry them."                                                                              |
| **MCP tools invoked**   | `get_processing_failures_list` → `retry_processing_failures`                                                                   |
| **AI assistant steps**  | Retrieves failures with messages and item details → presents list for user review → retries on confirmation → reports results. |
| **AI assistant output** | A list of processing failures with failure details, followed by confirmation of which failures were successfully re-queued.    |

### Notes

* Global failures can be listed and retrieved for review.
* Updating `eventXML` for processing failures is not supported via MCP tools, as the `eventXML` contains actual source record data and modifying it could lead to unintended mutation of user data.


# Troubleshooting

### MCP logs

The <code class="expression">space.vars.OIM</code> MCP server writes its activity to a dedicated log file. The log file captures all incoming MCP requests and tool invocations.

The MCP log file is located at:

```
<OpsHub Installation Directory>\AppData\logs\MCPServer.log
```

**For example** — On a default Windows installation:

```
C:\Program Files\OpsHub\AppData\logs\MCPServer.log
```

> **Note**: The installation directory may differ depending on the path chosen during setup.

#### What the logs contain

Each log entry follows this format:

```
<Timestamp> <Log Level> [<Thread>] <Class> - <Message>
```

For example:

```
2026-05-27 14:55:22.194+05:30 DEBUG [boundedElastic-3] co.op.mc.McpToolRegistrar - Executing tool=get_schema with arguments={toolName=update_system}
2026-05-27 14:55:40.301+05:30 DEBUG [boundedElastic-3] co.op.mc.McpToolRegistrar - Successfully executed MCP tool: update_system, Tool Call Result: ...
```

Typical entries include:

* **Tool invocations**: Logged with prefix `Executing tool=<tool_name>` — shows the tool called and the arguments passed
* **Tool results**: Logged with prefix `Successfully executed MCP tool: <tool_name>` — shows the result returned

### Debugging

* **To verify MCP server started and tools are registered**: Search for `Registering MCP tool` — confirms the MCP server started and all tools are available.
* **To check if an MCP request is being processed**: Search for `Executing tool=<tool_name>` (e.g., `Executing tool=get_integrations_list`) — confirms the request reached the server and processing has begun.
* **To check the result of a processed request**: Search for `Successfully executed MCP tool: <tool_name>` — confirms the request completed and returned a result.
* **To find failures**: Search for `ERROR` or `WARN` in the log.

***

### Common issues

* [AI assistant does not connect to MCP Server](#ai-assistant-does-not-connect-to-mcp-server)
* [Authentication failure](#authentication-failure)
* [Tool calls succeed but return unexpected results](#tool-calls-succeed-but-return-unexpected-results)
* [HTTPS / SSL certificate errors](#https--ssl-certificate-errors)

***

#### AI assistant does not connect to MCP server

**Symptom**: The AI client reports that it cannot connect to the MCP server, or no OpsHub tools appear.

**Resolution**:

1. Verify the MCP endpoint URL is correct: `<OpsHub Integration Manager URL>/OpsHubWS/mcp`
2. Confirm the <code class="expression">space.vars.OIM</code> instance is running and accessible — open it in a browser to verify.
3. Check that no firewall or proxy is blocking the connection to the <code class="expression">space.vars.OIM</code> host and port.
4. In the log file, check whether `Registering MCP tool` entries are present — if absent, the MCP server did not start correctly.

#### Authentication failure

**Symptom**: The AI client connects but operations return authentication or authorization errors.

**Resolution**:

1. Verify the username and password (or Base64-encoded `Authorization` header value) in your client configuration are correct.
2. Confirm the user account is a local <code class="expression">space.vars.OIM</code> user — LDAP and SAML accounts cannot authenticate via MCP.
3. Confirm the user has the required roles and permissions for the operations being attempted.

#### Tool calls succeed but return unexpected results

**Symptom**: The AI assistant invokes tools successfully but the data returned seems stale or incorrect.

**Resolution**:

* Add *"Do not use previously fetched data"* to your prompt. AI assistants may cache tool results within a conversation session, so this forces a fresh query to <code class="expression">space.vars.OIM</code>.

#### HTTPS / SSL certificate errors

**Symptom**: The MCP client reports an SSL certificate error when connecting to an HTTPS <code class="expression">space.vars.OIM</code> instance.

**Resolution**: Refer to the [HTTPS Configuration](/manage/mcp/mcp-configuration#https-configuration) section for steps to trust your server's certificate in the MCP client environment.


# Known Behaviours and Limitations

* **LDAP and SAML-based authentication methods are not supported**
  * Reason: MCP clients do not support browser-based authentication flows required by these mechanisms.
* **Delete operations are not supported via MCP.**
  * Deletions are irreversible and must be performed directly through the <code class="expression">space.vars.OIM</code> UI to ensure controlled execution and prevent unintended data loss.
* **Modification of failed synchronization records \[failure XML] is not supported via MCP.**
  * These records contain the original data captured during synchronization. Allowing updates through AI-driven or automated interactions could unintentionally alter the original synchronization data and result in incorrect updates on the target system.


# Upgrade

{% if "OM4ADO" !== visitor.claims.unsigned.product && "OAM" !== visitor.claims.unsigned.product %}

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>Upgrading Application Version</strong></td><td><a href="/pages/3JMrgECh88TUCVDJ79CZ">/pages/3JMrgECh88TUCVDJ79CZ</a></td></tr><tr><td align="center"><strong>Taking Application Backup</strong></td><td><a href="/pages/jqSd0k8g5WV1jl5HO5T2">/pages/jqSd0k8g5WV1jl5HO5T2</a></td></tr></tbody></table>
{% endif %}

{% if "OM4ADO" === visitor.claims.unsigned.product %}

<table data-view="cards" data-full-width="false"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>Upgrading Application Version</strong></td><td><a href="/pages/DHpQGvMycWKZMsxDB2bR">/pages/DHpQGvMycWKZMsxDB2bR</a></td></tr><tr><td align="center"><strong>Taking Application Backup</strong></td><td><a href="/pages/jqSd0k8g5WV1jl5HO5T2">/pages/jqSd0k8g5WV1jl5HO5T2</a></td></tr></tbody></table>
{% endif %}


# Upgrading Application Version

Migration is required from current version to higher version as it includes support and feature enhancement from the older version.

### Migration Pre-requiste for Windows and Linux

Provide the permissions to database user as mentioned in the [Database Selection](/getting-started/installation#database-selection) section on the Installation Steps page.

Follow instruction as mentioned in [Pre-Migration Checklist](/manage/upgrade-index/upgrade-application/pre-migration-checklist) before starting the upgradation process based on current version of <code class="expression">space.vars.OIM</code> installed and version to which <code class="expression">space.vars.OIM</code> will be upgraded. (If you do not have access to the [Pre-Migration Checklist](/manage/upgrade-index/upgrade-application/pre-migration-checklist), log a ticket on our customer portal if you have the access or get in touch with your point of contact (POC) for integration.)

#### Best Practices for Memory Allocation in the Upgrade Process

To ensure a smooth and successful migration, especially when handling larger data sets, it is essential to manually configure memory allocation. The default memory allocation might not be sufficient, potentially causing heap memory issues. Follow these best practices to optimize memory settings during the upgrade process:

**1. Review Default Memory Allocation**

By default, the migration process automatically allocates **one-fourth** of the total available RAM. This allocation works for most use cases but might not be enough for larger datasets, leading to potential memory issues.

For example, if the machine has 16GB RAM available and 8GB RAM is allocated to <code class="expression">space.vars.OIM</code> at the time of the upgrade, Java will still pick the default 4GB RAM (1/4th of total).

**2. Check Memory Settings in OIM Configuration File**

To confirm that the memory settings align with your requirements, review the following file: `<installation path>\OpsHubServer\conf\OIM_Config.properties`

This file contains the allocated memory settings for running <code class="expression">space.vars.OIM</code>.

**3. Set JAVA\_OPTS for Optimal Memory Allocation**

For better stability and performance during migration, manually set the `JAVA_OPTS` environment variable before starting the upgrade process. This allows you to define the initial and maximum memory allocated to the process, ensuring it can handle larger datasets.

**Recommended Configuration (Same as Allocated to** <code class="expression">space.vars.OIM</code>**)**

**Where:**

* -Xms2g – Sets the initial memory allocation to 2GB.
* -Xmx8g – Sets the maximum memory allocation to 8GB.

### Migration Steps for Windows

Given below are the migration steps:

* Inactivate all the integrations.
* Stop Server Service from services.ms
* Take back up of the database (refer to the [Taking Application Backup](/manage/upgrade-index/taking-application-backup#database-backup) page).
* Take back up of the application folder (refer to the [Taking Application Backup](/manage/upgrade-index/taking-application-backup#application-backup) page).
* Extract `OpsHubV<version>_Migrator_<OS>.zip` and execute the migration file
* It will ask for existing installation path, give the same installation path where you have installed the application.
* Click Next.
* If you are migrating to version 7.12 or above, you need to register by following the steps mentioned [here](/getting-started/installation/registration).
* Once you click Next, it will show the upgrade information "Product is already installed on given path".
* Click Next to start the product upgrade process.
* Refer [Post Migration Steps](#post-migration-steps-for-windows-and-linux) for further steps.

### Migration Steps for Linux

Given below are the migration steps:

#### Pre Migration Steps

* Inactivate all the integrations.
* To stop the Server service, run this command on command prompt **ps -ef | grep "java"** to get the PID and then execute **kill -9 .**
* If you are running <code class="expression">space.vars.OIM</code> without service or without root access stop server as described below:
  * Go to "/OpsHubServer/bin" directory and run shutdown.sh file. It will take some time to stop server.
* Take back up of the database (refer to the [Taking Application Backup](/manage/upgrade-index/taking-application-backup) page).
* Take back up of the application folder (refer to the [Taking Application Backup](/manage/upgrade-index/taking-application-backup) page).
* Extract `OpsHubV<version>_Migrator_<OS>.zip.`
* For Silent Migration user needs to register using external utility as described [here](/getting-started/installation/registration#silent-registration-for-linux).
* If you are migrating to version 7.19 or above, Please follow steps described in **Before Installation** section here.

#### Migrate with GUI Access

* Make sure, you have performed the pre-migration steps as described [here](#pre-migration-steps).
* Execute the migration file using command **sudo -E sh install.sh**
* You will be prompted to enter the existing installation path. Give the same installation path where you have installed the application.
* If you are migrating to version 7.12 or above, you need to register by following the steps mentioned [here](/getting-started/installation/registration).
* Click Next.
* Refer [Post Migration Steps](#post-migration-steps-for-windows-and-linux) for further steps.

#### Migrate without GUI Access (Silent Migration)

To upgrade <code class="expression">space.vars.OIM</code> through terminal connection (i.e. Putty), follow the steps given below:

* Make sure, you have performed the pre-migration steps as described [here](#pre-migration-steps).
* Modify the external configuration file and export OPSHUB\_AUTO\_INSTALL variable as described at **To Run sh File from External File** section [here](/getting-started/installation#launch-the-installer-in-different-operating-systems).
* Execute the migration file using command **sudo -E sh install.sh**
* Please refer [Possible Error](/getting-started/installation#possible-error-during-silent-installationupgradation) section for trouble shooting error(s) occurred during Upgradation.
* Refer [Post Migration Steps](#post-migration-steps-for-windows-and-linux) for further steps.

### Post Migration Steps for Windows and Linux

* After the successful migration, server will start automatically.
* After loading <code class="expression">space.vars.OIM</code> UI, please refresh the browser before doing any operation. Verify the version at the bottom of UI.
* Follow the guidelines given in the [Post-Migration-Checklist](/manage/upgrade-index/upgrade-application/post-migration-checklist) once the migration process is complete.
* Activate all the integrations.

**Note** : For systems like Azure DevOps Server, OpenText ALM, or Enterprise Architect that require proxy, replace proxy files and re-register services. Refer to Section 2, "Upgrade system proxy," in the Post Migration Checklist.


# Pre Migration Checklists

> > 👉 **Looking for older version steps?**\
> > Refer to the [Pre-Migration Checklist](https://docs.myopshub.com/oim/index.php/Pre-Migration_Checklist). for `<code class="expression">space.vars.OIM</code>` versions prior to **7.121**.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.121 or above

### Upgradation of MySQL Server

**Applicable When:** <code class="expression">space.vars.OIM</code> is installed with MySQL database.

**Reason:** From version 7.121 onward, the special characters having 4 byte UTF8 encoding can be stored in <code class="expression">space.vars.OIM</code> database.

**Actions:** Upgrade MySQL database to 5.7.18 or above versions.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.134 or above

**Applicable When:** If <code class="expression">space.vars.OIM</code> is installed with MSSQL database and the base installation version of <code class="expression">space.vars.OIM</code> is 6.03 or an earlier version.

**Actions:**

* Execute the following queries to remove the default value constraint for column `Is_marked_deleted` of table `OHMT_EAI_entity_info` in MSSQL:

  ```
  SELECT col.name AS ColumnName, def.name AS ConstraintName 
  FROM sys.default_constraints def 
  INNER JOIN sys.columns col 
  ON def.parent_object_id = col.object_id 
     AND def.parent_column_id = col.column_id 
  WHERE parent_object_id = OBJECT_ID(N'DATABASE_NAME.TABLE_NAME');
  ```

  * The above query's output will be the constraint's name to be dropped. Example: `'DF__OHMT_EAI___Is_ma__63E3BB6D'`. Please put the constraint name fetched above in the query below to drop the constraint.

  ```
  ALTER TABLE DATABASE_NAME.TABLE_NAME DROP CONSTRAINT CONSTRAINT_NAME_FOUND_FROM_ABOVE_QUERY_FOR_COLUMN_IS_MARKED_DELETED;
  ```

**Reason:** In the 6.03 version, the default value was added to the `Is_marked_deleted` column of `OHMT_EAI_entity_info`. Because of this, MSSQL implicitly added a default constraint on this table. In the 7.134 version, the column `Is_marked_deleted` was dropped as a part of one feature of <code class="expression">space.vars.OIM</code>.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.139 or above

**Applicable When:** If the initial installation version of <code class="expression">space.vars.OIM</code> is 6.11 Update 2 HF4 or earlier, the actions mentioned must be performed.

**Reason:** In the `reportsdb` database's `ReportsDBVersion` table, `6.11.02.00.00` entry was wrongly added to the `version` column.

**Actions:**

```sql
DELETE FROM reportsdb.ReportsDBVersion WHERE version='6.11.02.00.00';
```

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.145 or above

### Upgradation of MS SQL Server to enabled support for TLS 1.2 or above

**Applicable When:** <code class="expression">space.vars.OIM</code> is installed with MSSQL database and that MSSQL version does not support TLS v1.2 or above.

**Reason:** From version 7.145 onward, TLSv1.0 and TLSv1.1 protocols are not supported by <code class="expression">space.vars.OIM</code>.

**Actions:** An upgrade to MS SQL version will be needed, which supports TLSv1.2 or above. Refer to [this Microsoft link](https://support.microsoft.com/en-us/topic/kb3135244-tls-1-2-support-for-microsoft-sql-server-e4472ef8-90a9-13c1-e4d8-44aad198cdbe) for upgrading MS SQL version.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.149 or above

### Link changes in <code class="expression">space.vars.OIM</code> for Jira Cloud

**Applicable When:**

* Jira Cloud is configured as one of the end points in the integration and the Epic link/Parent link/Issues in Epic/Child issues are configured in the <code class="expression">space.vars.OIM</code> mapping.

**Actions:**

* If the user has mapped both the Epic and the Parent links in the <code class="expression">space.vars.OIM</code>'s relationship mapping:
  * The user needs to remove one of them from the mapping. For example, they can remove Epic link/Parent link. Both these links must not be mapped.
* If the user has mapped both Child issues and Issues in the Epic link in the <code class="expression">space.vars.OIM</code>'s relationship mapping:
  * The user needs to remove one of them from the mapping. For example, they can remove Child issues/Issues in Epic. Both these links must not be mapped.

**Reason:**

* In Jira Cloud, the Epic link and the Parent link are merged to Parent link and Child issues & Issues in Epic are merged to the Child link. To adopt the Jira cloud behavior changes, the link changes are executed in the <code class="expression">space.vars.OIM</code>.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.151 or above

### Link changes in <code class="expression">space.vars.OIM</code> for Codebeamer

**Applicable When:**

* Codebeamer/Codebeamer X is configured as one of the end points in the integration and the Parent/Hierarchy Parent/Child/Hierarchy Child links are configured in the <code class="expression">space.vars.OIM</code> mapping.

**Actions:**

* If the user has mapped both Parent and Hierarchy Parent links in the <code class="expression">space.vars.OIM</code>'s relationship mapping:
  * The user needs to remove one of them from the mapping. For example, Parent/Hierarchy Parent link can be removed. Both these links must not be mapped.
* If the user has mapped both Child and Hierarchy Child links in the <code class="expression">space.vars.OIM</code>'s relationship mapping:
  * The user needs to remove one of them from the mapping. For example, Child/Hierarchy Child link can be removed. Both these links must not be mapped.

**Reason:**

* In Codebeamer/Codebeamer X, links synchronization and hierarchy synchronization are processed via Hierarchy Parent and Hierarchy Child Links.

***

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.160 or above

### Integration configuration changes for Milestone entity in Rally

**Applicable When:**

* Rally is configured as one of the end systems and Milestone entity is configured in integration group along with other Rally entities.

**Actions:**

* A separate integration should be created for Milestone entity.

**Reason:**

* In Rally, Milestone is a workspace level entity, whereas other Rally entities are project level entities. Hence, it is recommended to have a separate integration for Milestone entity.

**Applicable When:**

* Rally is configured as one of the end systems and Milestone entity is configured with child project sync enabled at the integration level.

**Actions:**

* A new integration should be created for Milestone with no child project sync enabled in the integration configuration.

**Reason:**

* In Rally, Milestone is the workspace level and it has no concept of child workspace.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.162 or above

### Provide additional permission for the Personal Access Token of Azure DevOps Services (Cloud Deployment)

<div align="center"><img src="/files/PBEpDp3Gxwm2YkKSr6oK" alt="" width="950"></div>

**Applicable When:**

* If Azure DevOps Services is configured as a target system and any user field is mapped for synchronization.
* If the Azure DevOps Services (Cloud Deployment) is configured with personal access token as authentication mode.

**Actions:**

* The user needs to provide read permission of Graph for the given Personal Access Token.

**Reason:**

* Due to supporting service principal synchronization as a user, it is required to provide that permission.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.172 or above

### Upgrade MSSQL Server to 2012 or above

**Applicable When:**

* If <code class="expression">space.vars.OIM</code> is installed with Microsoft SQL Server database version below 2012.

**Actions:**

* Upgrade Microsoft SQL Server to 2012 or above versions.
* Correct the connector JAR as mentioned in pre-migration checklist [here](#updating-the-mssql-2012-database-connector-jar).

**Reason:**

* From version 7.172 onward, deprecated support of Microsoft SQL Server versions below 2012.

***

### Updating the MSSQL 2012 database connector JAR

**Applicable When:**

* This update is necessary if <code class="expression">space.vars.OIM</code> is running on MSSQL 2012 and currently using the connector JAR package `sqljdbc_6.0.8112.100_enu.tar.gz`.

**Actions:** **Prerequisites**

1. If the current OIM version is lower than <code class="expression">space.vars.OIM</code> 7.143 and an upgrade to 7.172 is required, follow these steps:
   * First, upgrade to <code class="expression">space.vars.OIM</code> 7.143 using the old JAR file, `sqljdbc_6.0.8112.100_enu.tar.gz`.
   * After completing the migration to version 7.143, proceed with the steps mentioned below and then upgrade to version 7.172.

* Locate the old JAR file `sqljdbc42.jar` in the following directories:
  * `<INSTALLATION_PATH>/Connector_Jars/`
  * `<INSTALLATION_PATH>/OpsHubServer/lib/`
* Replace the old JAR file with the new JAR `mssql-jdbc-10.2.0.jre11.jar`:
  * Download the new JAR from [this link](https://go.microsoft.com/fwlink/?linkid=2186164)
  * Unzip the new connector JAR package `sqljdbc_10.2.0.0_enu.tar.gz`
  * Locate `mssql-jdbc-10.2.0.jre11.jar` in the directory `sqljdbc_10.2.0.0_enu/sqljdbc_10.2/enu`
  * Copy the new JAR to the directories mentioned above and delete the old JAR `sqljdbc42.jar` from both the locations.
* If Windows authentication is being used, follow these additional steps:
  * Copy `mssql-jdbc_auth-10.2.0.x64.dll` from `sqljdbc_10.2.0.0_enu/sqljdbc_10.2/enu/auth/x64` to `<INSTALLATION_PATH>/OpsHub_Resources/jre/bin`.
  * Delete the existing `sqljdbc_auth.dll` located in `<INSTALLATION_PATH>/OpsHub_Resources/jre/bin`.

**Reason:**

* Flyway has been updated from version 4.2 to 10.15, and the newer version does not support the connector JAR `sqljdbc42.jar`. Therefore, it is necessary to upgrade to `mssql-jdbc-10.2.0.jre11.jar` to maintain compatibility and avoid <code class="expression">space.vars.OIM</code> upgrade failure.

***

### Updating MSSQL 2014 or above database connector JAR

**Applicable When:**

* This update is necessary if <code class="expression">space.vars.OIM</code> is running on MSSQL 2014 or above and currently using the connector JAR package `sqljdbc_6.0.8112.100_enu.tar.gz`.

**Actions:** **Prerequisites**

1. If the current OIM version is lower than <code class="expression">space.vars.OIM</code> 7.143 and an upgrade to 7.172 is required, follow these steps:
   * First, upgrade to <code class="expression">space.vars.OIM</code> 7.143 using the old JAR file, `sqljdbc_6.0.8112.100_enu.tar.gz`.
   * After completing the migration to version 7.143, proceed with the steps mentioned below and then upgrade to version 7.172.

* Locate the old JAR file `sqljdbc42.jar` in the following directories:
  * `<INSTALLATION_PATH>/Connector_Jars/`
  * `<INSTALLATION_PATH>/OpsHubServer/lib/`
* Replace the old JAR file with the new JAR `mssql-jdbc-12.2.0.jre11.jar`:
  * Download the new JAR from [this link](https://learn.microsoft.com/en-us/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver16#122)
  * Unzip the new connector JAR package `sqljdbc_12.2.0.0_enu.tar.gz`
  * Locate `mssql-jdbc-12.2.0.jre11.jar` in the directory `sqljdbc_12.2.0.0_enu/sqljdbc_12.2/enu`
  * Copy the new JAR to the directories mentioned above and delete the old JAR `sqljdbc42.jar` from both the locations.
* If Windows authentication is being used, follow these additional steps:
  * Copy `mssql-jdbc_auth-12.2.0.x64.dll` from `sqljdbc_12.2.0.0_enu/sqljdbc_12.2/enu/auth/x64` to `<INSTALLATION_PATH>/OpsHub_Resources/jre/bin`.
  * Delete the existing `sqljdbc_auth.dll` located in `<INSTALLATION_PATH>/OpsHub_Resources/jre/bin`.

**Reason:**

* Flyway has been updated from version 4.2 to 10.15, and the newer version does not support the connector JAR `sqljdbc42.jar`. Therefore, it is necessary to upgrade to `mssql-jdbc-12.2.0.jre11.jar` to maintain compatibility and avoid <code class="expression">space.vars.OIM</code> upgrade failure.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.181 or above

### Link rename for OpenText ALM Octane

**Applicable When:**

* Integration configuration has failures and configuration involves OpenText ALM Octane Endpoint and any of the following relationship is configured: Originated defect, Originated feature, Originated epic, Originated user story, Originated quality story, Original defect, Original feature, Original epic, Original user story, Original quality story.

**Actions:**

* Resolve all the failures before upgrading <code class="expression">space.vars.OIM</code>.

**Reason:**

* Relationship link names are renamed after upgrade on <code class="expression">space.vars.OIM</code>. So failed-entity are required to be resolved first.

***

## Migrating <code class="expression">space.vars.OIM</code> 's version to 7.205 or above

### Improved Change Identification in Gerrit

**Applicable When**

* You are using **Gerrit** as one of the endpoints in your integration.

**Actions**

* Please contact **<support@opshub.com>** for upgrade assistance.

**Reason**

* In earlier versions, Gerrit sometimes could not uniquely identify changes across repositories or branches, which could lead to errors.
* From **7.205 onwards**, the <code class="expression">space.vars.OIM</code> uses an improved ID format to ensure changes are always uniquely identified, avoiding such issues.

## Migrating <code class="expression">space.vars.OIM</code> 's version to 7.218 or above

### Windows Server Versions Earlier Than 2016 Are No Longer Supported

**Applicable When**

* You are running <code class="expression">space.vars.OIM</code> on Windows Server versions earlier than 2016 (i.e., Windows Server 2012 or older).
* Any associated database is hosted on these Windows Server versions.

**Actions**

* Upgrade the operating system to Windows Server 2016 or later. Refer to the [Supported Operating System](https://docs.opshub.com/getting-started/prerequisites#supported-operating-systems) documentation for detailed requirements.

**Reason**

* To meet enhanced security requirements, the JDK (Java Development Kit) has been upgraded to version 17.0.18, which requires **Windows Server 2016 or later**.


# Post Migration Checklists

> > 👉 **Looking for older version steps?**\
> > Refer to the [Post-Migration Checklist (MediaWiki)](https://docs.myopshub.com/oim/index.php/Post-Migration_Checklist) for <code class="expression">space.vars.OIM</code> versions prior to 7.175.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.175 or above

### Update the Advance XSLT used for Jira Zephyr Test-step results

**Applicable When**

* System: Jira Zephyr
* Entity: Test Execution
* Field: Step Results
* Scenario: Step Result field is mapped as a source using advance XSLT.

**Actions**

* The source XML path for the step result field needs to be changed. Replace the following instance with mentioned replacement:
  * `[SourceXML/updatedFields/Property/stepResult/*]` replace with `[SourceXML/updatedFields/Property/stepResult/Property/*]`
* Replace the path of step result fields with `Property/[fieldName]`:
  * Example: Replace `status` with `Property/status`
* For more details refer: [Sample advanced mapping for Jira Zephyr Test Execution](/connectors/jira#supported-relationships)

**Reason**

* Step Results were stored as a List in old values, and as a Hashmap in new values. This inconsistency can cause failures in parsing list of step results correctly.
* For maintaining consistency between old values and new values in the event xml, the format has been changed to List of step results.

### Change the SAML IDP Single sign-on URL

**Applicable When**

* SAML-based authentication is configured in <code class="expression">space.vars.OIM</code>.

**Actions**

* The user has already configured SAML Identity Provider. Example., OKTA, Azure Active Directory, etc.
* In SAML Identity Provider configuration, the user can find the single sign-on URL field under the SAML settings.
* The user must change the single sign-on URL in SAML Identity Provider when <code class="expression">space.vars.OIM</code> is installed with HTTP protocol:
  * Current configuration: `http://localhost:8989/OpsHubWS/saml/SSO`
  * Updated URL configuration must be: `http://localhost:8989/OpsHubWS/login/saml2/sso/opshubsaml`
* The user must change the single sign-on URL in SAML Identity Provider when <code class="expression">space.vars.OIM</code> is installed with HTTPS protocol:
  * Current configuration: `https://localhost:8443/OpsHubWS/saml/SSO`
  * Updated URL configuration must be: `https://localhost:8443/OpsHubWS/login/saml2/sso/opshubsaml`

**Reason**

* Going forward, <code class="expression">space.vars.OIM</code> will use Spring Security Saml2 service provider to support SAML-based authentication. It will also eliminate vulnerabilities of older SAML framework.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.176 or above

### Update .NET framework to 4.7.2 or above

**Applicable When**

* OpsHubEAWindowsService is configured on a machine with a .NET framework version below 4.7.2.

**Actions**

* Install .NET framework 4.7.2 on the machine where OpsHubEAWindowsService is configured.

  * Check [software and hardware requirements](https://docs.microsoft.com/en-us/dotnet/framework/get-started/system-requirements) to install .NET Framework 4.7.2

  > **Note** : We recommend to uninstall any other .NET framework installed previously, to avoid any conflict.

**Reason**

* .NET Framework version 4.0 is out of support. Therefore, dependency on .NET framework version 4.0 has also been removed.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.177 or above

### Workflow Change for Any Customized Workflow

Pls refer, How to identify between Custom and Default Workflows and their associated integrations?

**Applicable When**

* The user has configured a customized workflow that is still in use.

**Actions**

* If advanced customizations are applied using old system and custom properties, users must open the customized workflow and update it to ensure compatibility with the current expected format to avoid failures.
* From version 7.177 onward, when retrieving specific properties from old values, the syntax of the code snippet needs to be updated to avoid conflicts.

**Workflow Code Example**

**Before modification:**

```java
HashMap sysProp = mappedProperties.get(Constants.NEWSYSTEMPROP);
HashMap custProp = mappedProperties.get(Constants.NEWCUSTOMPROP);
HashMap oldSystemValues = mappedProperties.get(Constants.OLDSYSTEMPROP);
HashMap oldCustomValues =  mappedProperties.get(Constants.OLDSYSTEMPROP);

// code comment: fetching avoid conflict map from old custom values
HashMap avoidConflictCustProps = oldCustomValues.get("AvoidConflict");
// code comment: fetching status value from avoid conflict map
String status = avoidConflictCustProps.get("Status");
```

**After modification:**

```java
HashMap sysProp = mappedProperties.get(Constants.NEWSYSTEMPROP);
HashMap custProp = mappedProperties.get(Constants.NEWCUSTOMPROP);
HashMap oldSystemValues = mappedProperties.get(Constants.OLDSYSTEMPROP);
HashMap oldCustomValues =  mappedProperties.get(Constants.OLDSYSTEMPROP);

// code comment: fetching status value from old custom values
String status = oldCustomValues.get("status");
```

#### Reason

Starting with version 7.177, all properties are directly accessible from the old properties map. The intermediate "avoid conflict" map has been removed.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.181 or above

### Remap values of lookup field when it contains special character(s)

#### Applicable When

Values for lookup field contains special characters (tab space) in the source/target system, even though these special characters are not visible in the lookup values of <code class="expression">space.vars.OIM</code>.

#### Actions

After upgrading <code class="expression">space.vars.OIM</code>, remap the lookup field that contains lookup values with the above specified special characters.

The following specified characters need to have their lookup field values remapped:

* Tab Space: `\t`

#### Reason

To regenerate XSLT to synchronize the actual value with the above mentioned special characters.

***

### Update Relationship Configuration for OpenText ALM Octane Endpoint

#### Applicable When

The user has configured any of the following relationship in integration configuration involving OpenText ALM Octane Endpoint. Originated defect, Originated feature, Originated epic, Originated user story, Originated quality story, Original defect, Original feature, Original epic, Original user story, Original quality story.

#### Prerequisite

Resolve all the failures for the configurations that requires update.

#### Actions

Open mapping configurations with mention relationships configured. Remove mentioned linkages and replace them as per following new linkages:

| Old link name            | New link name              |
| ------------------------ | -------------------------- |
| Originated defect        | Defect (Trace to)          |
| Originated feature       | Feature (Trace to)         |
| Originated epic          | Epic (Trace to)            |
| Originated user story    | Story (Trace to)           |
| Originated quality story | Quality Story (Trace to)   |
| Original defect          | Defect (Trace from)        |
| Original feature         | Feature (Trace from)       |
| Original epic            | Epic (Trace from)          |
| Original user story      | Story (Trace from)         |
| Original quality story   | Quality Story (Trace from) |

#### Reason

This makes link names visible in <code class="expression">space.vars.OIM</code> aligned with link names visible in OpenText ALM Octane UI for respective entity types.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.184 or above

### Update the Criteria Query Or Lookup Query for Tricentis qTest Module

#### Applicable When

* If integration is configured with qTest as source system for **Module** entity with criteria configuration:
  * To identify if criteria is configured for the integration, refer [Integration Criteria Configuration](/integrate/configure-integrations/integration-configuration#criteria-configuration).
* If target lookup or default query is configured with qTest as target system for **Module** entity.

#### Actions

* Earlier, if the query was, for example, `search=test`, it should be updated in JSON format as:\
  `{"search":"test","expand":"descendants"}`
  * `"expand"` should be added as it was the default query parameter used previously, along with "search".
* For more details, refer to [criteria configuration](/connectors/tricentis-qtest#criteria-configuration) and [Target Lookup Configuration](/connectors/tricentis-qtest#target-lookup-configuration) sections.

#### Reason

* Enhanced filtering for qTest module entity to support **expand** and **parentId** along with search query parameters.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.186 or above

### Update Relationship Mapping for Cycle Entity in OpenText ALM Quality Center

**Applicable When**

* If the integration is configured with OpenText ALM Quality Center as the target system for the **Cycle** entity.

**Actions**

* Map the parent link in the **Cycle** entity using the required default lookup query.
* Remove the **Release ID** field from the field mapping, as it is now redundant configuration after relationship mapping update.
* For instance, if the **Release ID** was previously mapped with the default value `'1058'`, update the relationship configuration to utilize the default lookup query: `'id[=1058]'` for the corresponding linking release.

<div align="center"><img src="/files/ajYCVNxKd8AoPkqUrunP" alt=""></div>

**Reason**

* The Cycle entity now includes enhanced support for linking to its parent release through name, ID, or a custom field using lookup query. Given that the Release is a mandatory link for cycle entity, the relationship mapping needs to be updated, and it is recommended to remove the Release ID field from the mapping.

***

### GitLab mapping configuration changes for Epic

**Applicable When**

* If an integration is configured with GitLab as the target system where **Start Date** and **End Date** fields are mapped for the epic entity.

**Actions**

* To synchronize fixed values for **Start Date** and **End Date**, **Date Type lookup field** must be mapped with the default value as `"Fixed"`; otherwise, it will result in processing failure.
* If **Start Date** and **End Date** field values need to be inherited from related milestone, **Date Type lookup field** must be mapped with the default value as `"Inherited"`.

For more details, please refer to [Gitlab connector mapping configurations](/connectors/gitlab#mapping-configuration).

**Reason**

* To support inherited date fields from the milestone, a Date Type lookup field has been introduced. If `"Inherited"` is selected, the Start Date and End Date fields are not required.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.189 or above

### Update the JSON input for Jira Xray Cloud Entity Display Name

**Applicable When**

* The deployment type is Cloud and Xray is selected as the test management plugin, and user has renamed any entity's display name.

**Actions**

* Update the value of field **Xray Entity Names** in Jira system configuration according to the current entity display name.
* For example, if `Test` entity is renamed to `Xray Test`, the input value must be modified as:

```json
[
    {
        "defaultEntityName": "Test",
        "currentEntityDisplayName": "Xray Test"
    },
    {
        "defaultEntityName": "Precondition",
        "currentEntityDisplayName": "Precondition"
    },
    {
        "defaultEntityName": "Test Set",
        "currentEntityDisplayName": "Test Set"
    },
    {
        "defaultEntityName": "Test Plan",
        "currentEntityDisplayName": "Test Plan"
    },
    {
        "defaultEntityName": "Test Execution",
        "currentEntityDisplayName": "Test Execution"
    },
    {
        "defaultEntityName": "Test Run",
        "currentEntityDisplayName": "Test Run"
    }
]
```

* Refer to [Jira Xray entity names](/connectors/jira#xray-entity-names) section for more details.

**Reason** The prerequisite to rename Jira Xray entities has been removed.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.195 or above

### Data type changes for Text type of fields in TestRail

**Applicable When**

* If the integration is configured with TestRail as one of the systems, with mapped fields of Text type

**Actions**

* Some of the text type fields' datatype has been changed to Markdown, remapping for them will be required.

**Reason**

* As per Testrail Documentation, a few field types are Text types, but they provide Markdown behavior. To preserve user experience, we have changed these fields to Markdown datatype.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.196 or above

### Update .py files used in commit hooks

**Applicable When**

* Using any hooks provided in `<OpsHub Installation Dir>/Other_Resources/Hooks`. For systems including SVN, Accurev, ClearCase, Git, Mercurial, and Perforce

**Actions**

* Use the latest `.py` files available in the installation directory, for the respective system in folder `<OpsHub Installation Dir>/Other_Resources/Hooks`.

Refer to respective section links for Commit Hooks setup: [SVN](/connectors/svn#configuring-and-installing-the-hook), [Git](/connectors/git#git-hook-configuration)

**Reason**

* This is to make sure these additional configurations are in alignment with our updated security standards.

***

### Recover Entity Type Mapping in Relationship Configuration

> ⚠️ This can be a breaking change. Kindly review thoroughly.

#### Applicable When

* Any integration where relationship sync is enabled.

#### Actions Taken by OIM

* During OIM upgrade, **entity type mappings will be removed** from relationship configurations.
* OIM will **automatically identify the target linked entity type** using entity type mapping at the integration level.

#### How OIM Detects Entity Type Mapping

* OIM checks the **linked entity** defined in the relationship.
* It automatically finds the equivalent target entity for the linked source entity.
* Entity type mapping is no longer needed for automatic detection.
* This works well when one source maps to one target.
* If multiple mappings exist, manual setup may be needed.
* If **manual entity type mapping is needed after migration**, you can refer to the backed-up mapping data created by OIM when it removes entity type mappings from relationship configurations.

> *Note: The Bypass Link Entity Type Mapping add-on is required in your license to enable manual entity type mapping.*

#### Backup Location

Removed entity type mappings are saved at the following path: \&#xNAN;**`<OpsHub Installation Dir>/AppData/LinkEntityTypeMapping`**

## Migrating <code class="expression">space.vars.OIM</code> version to 7.199 or above

### Remap values of lookup field **Planned For** in IBM Engineering Workflow Management

**Applicable When**

* The **Planned For** field is configured in Mapping Configuration for the IBM Engineering Workflow Management end system.

**Actions**

* Open the mapping configuration where **Planned For** field is mapped.
* Delete those value mappings (displaying in red colour) where the display name has changed from a simple leaf node name to a full hierarchical path, and remap them as per the use case.
  * For example, if the value node Child1 was previously displayed as "Child1", after upgrading to 7.199 version, it will appear as "Parent1/Child1". In this case, remove the old "Child1" value mapping and remap the new display name "Parent1/Child1" with its corresponding source/target lookup value.

**Reason**

* Earlier lookup values were displayed using only their name, which could cause ambiguity when multiple nodes have the same name. Starting with version 7.199, the Planned For field now displays the full hierarchical path from root to leaf for each value, eliminating display-name discrepancies.

***

## Migrating <code class="expression">space.vars.OIM</code> version to 7.201 or above

### Map the lookup field **Test Run Type** in Codebeamer

**Applicable When**

* The **Test Run** entity type is configured in Mapping Configuration for the Codebeamer end system.

**Action**

* Open the mapping configuration for the **Test Run** entity type.
* Map the **Test Run Type** lookup field with its corresponding value. For more details, refer to [Mapping For Test Run](/connectors/codebeamer#mapping-for-test-run) section.

**Reason**

* Previously, only the **Test Run (Parent)** entity was supported. Now, both **Test Run (Parent)** and **Test Run (Child)** are supported; the latter is automatically generated during Parent creation and is handled as a separate synchronization entity.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.203 or above

### Update Relationship Mapping for Jira

**Applicable When**

* Jira is configured as one of the endpoints in the integration and a not supported link type from Jira has been mapped in the <code class="expression">space.vars.OIM</code>. In such cases, after the upgrade, the mapping cannot be updated until the unsupported link type is removed.

**Actions**

* If the this kind of link is configured, after upgrading to 7.203, the user needs to remove the mapped link type from the mapping.

**Reason**

* Previously, <code class="expression">space.vars.OIM</code> displayed both the link type and its reverse link type in the link type mapping.
* Now, only the supported link type will be shown.
* For example
  * In Jira, for the **Test Plan** entity, two supported link types exist: ***tests*** and ***testExecution***.
  * The link type ***testplans*** is the reverse of both, meaning that from **Test** and **Test Execution** entities, a **Test Plan** could be linked back using ***testplans***.
  * Earlier, <code class="expression">space.vars.OIM</code> displayed all three — ***tests***, ***testExecution***, and ***testplans*** — in the mapping screen of Test Plan entity.
  * Going forward, only the supported link types (***tests*** and ***testExecution***) will be shown.
  * **Note:** ***testplans*** is not a supported link type for the **Test Plan** entity in Jira as well.

## Separate Workflow for Post Synchronization

### Migrating <code class="expression">space.vars.OIM</code> version to 7.207 or above

**Applicable When**

* Integration configurations are using a customized workflow.
* It is an optional post-migration step. The synchronization will continue to work without any issues with the existing workflow. However, configuring a dedicated post-sync workflow is recommended to improve flexibility, maintainability, and long-term support alignment.

**Actions** Update the custom workflow as described below:

* Identify the post-sync step (which updates the Remote Entity ID and Remote Entity Link to the source entity after syncing the source entity to the target system).
* If the post-sync step is not customized:
  * Remove it from the integration sync workflow and configure the 'Default Post Synchronization Workflow' in the integrations that use the corresponding custom workflow.
* If the post-sync step is customized:
  * Move it out of the customized integration sync workflow and configure it as a separate, dedicated post-sync workflow.
* To create or update separate workflows for synchronization and post-synchronization, refer to the default workflows available in <code class="expression">space.vars.OIM</code> at: `http://<serverIP>:8989/OIM/#/home/configure-integrations/workflows`

**Reason**

* From now on, updating the Remote Entity ID and Remote Entity Link to the source entity will be handled by a dedicated post-sync workflow.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.214 or above

### Addition of new Personal Queries for IBM ClearQuest system

**Applicable When**

* IBM ClearQuest is configured as an endpoint and the <code class="expression">space.vars.OIM</code> is upgraded to version 7.214 or later.

**Actions**

* User-related data is now fetched using Personal Queries instead of SimpleQuery calls.
* After upgrading to 7.214, the sync user must create the following Personal Queries in ClearQuest:
  1. `OpsHub_GetUsersByEmail`
  2. `OpsHub_GetUsersByName`
* Refer to the section: [ClearQuest\_Queries\_Configuration](/connectors/ibm-rational-clearquest#queries-configuration) for detailed steps to create these queries.

**Reason**

* This change replaces the default SimpleQuery, which returned all users without filtering. Personal Queries enable fetching users based on specific criteria, improving filtering and performance.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.217 or above

**Applicable When**

* If one of the integration endpoints is Jira Xray (Cloud), Jama, or Codebeamer, and the integration is using a customized workflow to synchronize step field \[Test Assets] attachments and inline images/files.

**Actions**

* The existing workflow must be updated to remove all handling related to step attachments and inline images/files synchronization. Otherwise, sync discrepancies may be observed at the step-level attachment/image sync. Kindly reach out to OpsHub Support for assistance.

**Reason**

* From version 7.217 onwards, step attachments and inline images/files are handled automatically between these systems, hence no workflow customization is required.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.218 or above

### Change in Personal Query for IBM ClearQuest system

**Applicable When**

* IBM ClearQuest is configured as an endpoint and the <code class="expression">space.vars.OIM</code> is upgraded to version 7.218 or later.

**Actions**

* After upgrading to 7.218, the sync user must edit the following Personal Query in ClearQuest:
  1. `OpsHub_emptyQuery`
* Refer to the section: [ClearQuest\_Queries\_Configuration](/connectors/ibm-rational-clearquest#queries-configuration) for detailed steps to change these query.

**Reason**

* If the ClearQuest database uses a case-sensitive collation, the casing of table and column names in the query must exactly match the database schema.
* If you notice the query failing due to case differences, update the table and column names in the SQL statement to match the exact casing defined in your ClearQuest database.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.221 or above

### Update Password Strength Policy

**Applicable When**

* Users are authenticating via <code class="expression">space.vars.OIM</code>'s Default Login Server.
* [OIM Admin/Rest APIs](/manage/api/getting-started-with-api) are utilized for various purpose.

**Actions**

* For <code class="expression">space.vars.OIM</code> Users:
  * Upon the first login post-upgrade, users with non-compliant passwords will see a security warning as shown below:

<div align="center"><img src="/files/dtdpOqEASeNPpKbtwi78" alt="" width="350"></div>

* These users must update their passwords via the [User Management](/manage/administrator/user-management) screen to meet the new complexity requirements.
* For Admin API Usage:
  * Ensure all passwords passed through API calls are updated to meet the new criteria, as the API will strictly reject non-compliant strings. API calls will fail if the password does not meet the new requirements.
* **New Password Complexity Requirements:**
  * **Minimum Length:** 10 characters.
  * **Complexity:** Must include at least **three** of the following:
    * Uppercase letters (A–Z)
    * Lowercase letters (a–z)
    * Numbers (0–9)
    * Special characters (!@#$%^&\*)
* Any existing custom password policy set in <code class="expression">space.vars.OIM</code> will be replaced with new standard rules to ensure compliance. If you had custom settings earlier, a backup has been created for your reference at: `<<OpsHub_Installation_Directory>>\AppData\logs\PasswordPolicy_Regex_And_RegexMessage_2026-03-19_13-32-44.txt`

**Reason**

* To strengthen product security and align with modern enterprise standards, <code class="expression">space.vars.OIM</code> has transitioned to a mandatory minimum password policy. This prevents the use of weak or default credentials that are vulnerable to automated attacks.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.225 or above

### Update the JSON input for Jira Xray On-Premise Entity Display Name

**Applicable When**

* The deployment type is On-Premise and Xray is selected as the test management plugin, and user has renamed any entity's display name.

**Actions**

* Update the value of field **Xray Entity Names** in Jira system configuration according to the current entity display name.
* For example, if `Test` entity is renamed to `Xray Test`, the input value must be modified as:

```json
[
    {
        "defaultEntityName": "Test",
        "currentEntityDisplayName": "Xray Test"
    },
    {
        "defaultEntityName": "Pre-Condition",
        "currentEntityDisplayName": "Pre-Condition"
    },
    {
        "defaultEntityName": "Test Set",
        "currentEntityDisplayName": "Test Set"
    },
    {
        "defaultEntityName": "Test Plan",
        "currentEntityDisplayName": "Test Plan"
    },
    {
        "defaultEntityName": "Test Execution",
        "currentEntityDisplayName": "Test Execution"
    },
    {
        "defaultEntityName": "Sub Test Execution",
        "currentEntityDisplayName": "Sub Test Execution"
    }
]
```

* Refer to [Jira Xray entity names](/connectors/jira#xray-entity-names) section for more details.

**Reason**

* The prerequisite to rename Jira Xray entities has been removed.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.227 or above

### Generate and replace ptc.jar

**Applicable When**

* Windchill RV\&S is configured as one of the endpoints in the integration.

**Actions**

* Create a new ptc.jar file by following the steps described in the [Windchill RV\&S connector guide](/connectors/windchillrv-and-s#create-ptc-jar-using-web-service-wsdl).
* Replace the existing ptc.jar file in your setup with the newly generated one. Follow the steps given [here](/connectors/windchillrv-and-s#library-configuration) for configuration.

**Reason**

* Earlier versions of ptc.jar were generated using Apache Axis, which is now outdated and has known security vulnerabilities. To address this and align with modern standards:
  * Now it has moved to Apache CXF, a more actively maintained and secure framework for generating web service clients from WSDL
  * CXF enforces stronger security practices, offers better protocol support, and ensures improved compatibility with modern systems

## Migrating <code class="expression">space.vars.OIM</code> version to 7.229 or above

**Applicable When**

* CodeBeamer is configured as one of the endpoints in the integration, and mapped reference field has custom advance mapping configured.

**Actions**

* If you are using custom or advanced XSLT logic with reference fields, please contact the support to ensure the advanced logic remains compatible with the updated reference field structure and to identify and make any required changes.\
  **Note**: If any required changes are not made, synchronization may fail.

**Reason**

* Full support for reference fields has been introduced in Codebeamer.

## Migrating <code class="expression">space.vars.OIM</code> version to 7.231 or above

### Configure the Authentication User field in Tricentis Tosca system form

**Applicable When**

* Tricentis Tosca is configured as one of the endpoints in <code class="expression">space.vars.OIM</code> using **Personal Access Token(PAT)** or **Client Credentials** authentication.

**Actions**

* Enter the dedicated OpsHub synchronization username associated with the configured PAT or Client Credentials in the **Authentication User** field of the Tricentis Tosca system configuration. For more details please refer to [Tosca system configuration](/connectors/tricentis-tosca#system-configuration).

**Reason**

* <code class="expression">space.vars.OIM</code> introduces enhanced authentication handling for Tricentis Tosca integrations. As part of this change, the **Authentication User** must be specified in <code class="expression">space.vars.OIM</code> ensure reliable interaction with the Tosca system.


# Taking Application Backup

## How to Take Backup

Steps to take backup of the application:

1. Inactivate all the integrations if any active.
2. Stop the OpsHub server, if it is running.
3. Take database backup (refer to the [Database Backup](#database-backup) section).
4. Take application backup (refer to the [Application Backup](#application-backup) section).

## Application Backup

Steps for taking the application backup:

* Navigate to the parent directory of OpsHub installation directory (given at the time of installation).
* Copy the application installation directory.
* Paste above copied directory to the place where you want to keep backup.\
  For Example: OpsHub is installed at path `C:\Program Files\OpsHub` then copy OpsHub directory from `C:\Program Files`.

## Database Backup

### HSQL Database Backup

* In case of HSQL, only application backup is enough to take back up of the database as well.

### MS SQL Database Backup

* Open your Microsoft SQL Server Management Studio, whichever you prefer, Standard or Express edition.
* Using your Database Username and Password, simply login to your MS SQL server database.
* **Select the database >> Right-click >> Tasks >> Back Up**:

<div align="center"><img src="/files/ZenEal4loQ5TaWrDEWLP" alt="" width="800"></div>

* Once you click on the **Backup** the following Backup Database window will appear:

<div align="center"><img src="/files/XFwZe14FB1IYrhSoPGPT" alt="" width="800"></div>

: Select the following options:

1. Backup type: Full
2. Under Destination, Backup to: Disk
3. Click the OK button.

* Select the destination folder for the backup file, and enter the "File name" with `.bak` extension. Your Backup is ready now.

### MySQL Database Backup

\[Note: Take backup of the both databases `opshub` and `reportsdb` which were provided while creating the database. If the database was manually created, the name would differ in that case.]

* Open Command Prompt and navigate to the `bin` directory of the MySQL server.
* Run the `mysqldump.exe` program with the following arguments:

```
mysqldump.exe -u [username] -p -h [hostname] [database_name] > C:\[filename].sql
```

(Note: Replace `[]` and anything inside `[]` using user's actual credentials.)

* On clicking the enter button, it will ask for a password. Please provide the password.

### Oracle Database Backup

* Open Command Prompt with Administrator privileges.
* Navigate to the directory where Oracle is installed. For example:

```
C:\Program Files\Oracle
```

* Enter Command :

```
sqlplus
```

* It will ask for username and password. Please provide it.
* Run the following command:

```
$exp [Username]/[Password] OWNER=([opshub_schema],[reports_schema]) FILE="[Path where you want to dump]"
```

(For example: `$exp USERID=system/root OWNER=(opshub,reportsdb) File="C:\dumpFinal.dmp"`)

> **Note**: For detailed information, you can refer to official Oracle documentation. Refer: [11g](https://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmbckba.htm#BRADV8003) or [12c](https://docs.oracle.com/database/121/BRADV/rcmbckba.htm#BRADV8003) according to installed Oracle version.

### PostgreSQL Database Backup

* Navigate to the directory where PostgreSQL is installed.\
  Example:

```
cd C:\Program Files\PostgreSQL\16\bin
```

* Run the following command using cmd with admin mode and enter the password of PostgreSQL when prompted:

```
pg_dump -U your_username -h your_host -d your_database > `<Path where you want to dump>`
```

Example:

```
pg_dump -U postgres -h localhost -d opshub > C:\opshub_backup.sql
```

## How to Restore

Steps to restore the application:

* Restore Database (refer to the Database Restore section).
* Restore Application (refer to the Application Restore section).

## Application Restore

Steps to restore the application:

* Copy the directory you have kept as a backup.
* Navigate to the directory in which you want to restore the application.
* If directory with the same name which you are going to restore, exists in current directory then delete it first.
* Paste copied directory in step 1 to current directory.

## Database Restore

### HSQL Database Restore

* In case of HSQL, only application restore is enough to take restoration of the database as well.

### MS SQL Database Restore

* Open your Microsoft SQL Server Management Studio Express and connect to your database. Using your Database Username and Password, simply login to your MSSQL server database.
* **Select the database >> Right-click >> Tasks >> Restore >> Database.**

<div align="center"><img src="/files/sdnJkaever8VS6RPTOPq" alt="" width="800"></div>

* The following "**Restore Database**" window will appear. Select "From device" mentioned under the "Source for restore" and click the button in front of that to specify the file location.

<div align="center"><img src="/files/AaWeqc0Fu1POjezuv8Th" alt="" width="800"></div>

* Select the option "Backup media as File" and click the **Add** button to add the backup file location.

<div align="center"><img src="/files/AfgGyCemUZcnGnjWb65S" alt="" width="800"></div>

* Select the backup file you wish to restore and click the OK button.

### MySQL Database Restore

\[Note: Restore both databases `opshub` and `reportsdb` which were provided while creating the database. If the database was manually created, the name would differ in that case.]

* Drop and create the database with same privileges. For this, refer to [manually creation of MySQL database](/getting-started/installation#queries-for-mysql-database).\
  \[Note: Use database and schema name as same as you used previously.]
* Open Command Prompt and navigate to the `bin` directory of the MySQL server.
* Run the `mysql.exe` program with the following arguments:

```
mysql.exe -u [username] -p -h [hostname] [database_name] < C:\[filename].sql
```

(Note: Replace `[]` and anything inside `[]` using user's actual credentials.)

* On clicking the enter button, it will ask for a password. Please provide the password.

### Oracle Database Restore

* Drop and create schema with same privileges which you gave previously at the installation time. For this, refer to [manually creation of Oracle database](/getting-started/installation#queries-for-oracle-database).
* Open Command Prompt with Administrator privileges. Right click on cmd.exe and select "Run as Administrator".
* Navigate to the directory where Oracle is installed. For example:

```
C:\Program Files\Oracle
```

* Enter Command :

```
sqlplus
```

* It will ask for username and password. Please provide it.
* Run the following command:

```
$imp USERID=[username]/[password] FULL=Y File="[File Path along with filename]"
```

(For example: `$imp USERID=system/root Full=Y File="C:\dumpFinal.dmp"`)

**Note** For detailed information, you can refer to official Oracle documentation. Refer: [11g](https://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmintro.htm#BRADV89341) or [12c](https://docs.oracle.com/database/121/BRADV/rcmintro.htm#BRADV89341) according to installed Oracle version.

### PostgreSQL Database

* Navigate to the directory where PostgreSQL is installed.\
  Example:

```
cd C:\Program Files\PostgreSQL\16\bin
```

* Run the following commands using cmd with admin mode and enter the password of PostgreSQL when prompted:
* Drop the existing database:

```
psql -U postgres -h localhost -c "DROP DATABASE your_database;"
```

* Create a new database with the same name:

```
createdb -U postgres -h localhost -e your_database
```

* For restoring database:

```
psql -U your_username -h your_host -d your_database < `<Path from where you want to restore the dump>`
```

Example:

```
psql -U postgres -h localhost -d opshub < C:/opshub_backup.sql
```


# Product Security

OpsHub is committed to ensuring that <code class="expression">space.vars.OIM</code> is designed, developed, and delivered following industry-standard security practices. Our approach includes secure development practices, application security testing, third-party component monitoring, vulnerability management, and continuous patching of security issues.

Our security practices are aligned with widely accepted standards and frameworks such as OWASP and CWE, and security validation is incorporated throughout the product development lifecycle.

***

## Application Security

OpsHub applies a multi-layered approach to ensure the security of OpsHub Integration Manager.

* Application vulnerability testing is conducted for every release using an industry-leading web application security testing provider.
* Security testing ensures that OpsHub Integration Manager and its deployment environment are protected against external attacks.
* Secure coding practices and validation are implemented in accordance with OWASP guidelines.

Security scans are performed regularly and it is ensured that no high or critical vulnerability exists in the product at the time of release.

***

## Code Security Audits

OpsHub conducts a security audit of the entire code base as part of every release.

The audit includes:

* Analysis for high and critical vulnerabilities
* Coverage of OWASP Top 10 vulnerabilities
* Validation against CWE security guidelines

Any high or critical vulnerabilities identified during the audit are resolved prior to release.

***

## Third-Party Library Security

OpsHub products include certain third-party libraries bundled with the product. These components do not require additional licenses or installation and are monitored as part of our product security program.

***

### Vulnerability Scanning

OpsHub uses **Grype**, a software composition analysis (SCA) tool, to scan builds and container images for vulnerabilities in third-party libraries.

Grype identifies dependencies within software artifacts and compares them against authoritative vulnerability databases to detect known security issues.

***

### Remediation Timeframes

Vulnerabilities identified through scanning are remediated according to the following timelines, measured from the date a fix becomes available in the affected third-party library.

| Severity | Remediation Timeframe |
| -------- | --------------------- |
| Critical | 10 business days      |
| High     | 20 business days      |

***

## Security Reports and Artifacts

For each release, OpsHub publishes security documentation and artifacts to a shared document repository.

These include:

* Software Bill of Materials (SBOM)
* Security scan reports
* False positive reports with documented explanations

All release-related security artifacts are available here:

[Security Reports Repository](https://opshubtrial-my.sharepoint.com/:f:/g/personal/support_opshub_com/IgD2uaOzmshMT7EV7ULZBVSKAeJvTIW5Qs-hY3pzQlP605U?e=CsAdEx)

Each release has a dedicated folder containing the corresponding reports.

***

## Security Issue Patching Policy

OpsHub continuously monitors publicly disclosed vulnerabilities related to core platform components used by the product.

* Security advisories related to Apache Tomcat and Java are actively monitored and patches are applied when required.
* If a severe security issue is reported by a customer or discovered internally by OpsHub, it is patched as soon as reasonably feasible.


# Supported Connectors

Given below are the systems supported currently by <code class="expression">space.vars.OIM</code>:

<table><thead><tr><th width="50" data-type="number">No.</th><th width="180">System</th><th width="250">Versions Supported</th><th>Entities Supported</th><th width="160">Formerly Known as</th></tr></thead><tbody><tr><td>1</td><td>Aha!</td><td>All</td><td>Epic, Goal, Feature, Idea, Initiative, Release, Requirement, To-do, Note</td><td></td></tr><tr><td>2</td><td>Aras Innovator</td><td>All</td><td>All System Item Types (excluding Item Types of Relationship and Core Type) and All Custom Item Types (excluding Item Types of Relationship Type)</td><td></td></tr><tr><td>3</td><td>Azure DevOps Server</td><td>2010, 2012, 2013, 2015 (up to Update 3), 2017, 2017 Update 2, 2018, 2019, 2020, 2022, 2025</td><td>Work items such as Bug, Requirement, Task, Test Case, User Story, Shared Steps and All Custom Entity Types<br>Test Entities such as Test Plan, Test Result, Test Run, Test Suite<br>Iteration, Area Path, User Group, Team and User: 2010 and above<br>Git Commit Information (only read): 2016 and above<br>Dashboard, Query, Widget: 2017 and above<br>Pull Request (only read), Build Pipeline**, Release Pipeline**, Service Connection, Task Group, Variable Group : 2018 and above<br>Build* (only read): 2019 and above<br>Agent Pool : 2020 and above</td><td>Team Foundation Server (TFS)</td></tr><tr><td>4</td><td>Azure DevOps Server Version Control</td><td>2010, 2012, 2013, 2015 (up to Update 3), 2017, 2017 Update 2, 2018, 2019, 2020, 2022, 2025</td><td>Commit Information</td><td>Team Foundation Server Version Control</td></tr><tr><td>5</td><td>Azure DevOps Services</td><td>All</td><td>Work items such as Bug, Requirement, Task, Test Case, User Story, Shared Steps and All custom workitem types<br>Test entities such as Test Plan, Test Result, Test Run, Test Suite<br>Iteration, Area Path, Group, Team, User, Dashboard, Query, Widget, Pipeline**, Release Pipeline**, Agent Pool, Service Connection, Task Group, Variable Group<br>Git Commit Information(only read), Pull Request(only read), Build* (only read)</td><td>Visual Studio Team Services (VSTS)</td></tr><tr><td>6</td><td>Blueprint*</td><td>From 5.4 to 13.0</td><td>All System/Custom Entities</td><td></td></tr><tr><td>7</td><td>BMC Remedy*</td><td>6.3, 8.0, 8.1</td><td>Request</td><td>Remedy</td></tr><tr><td>8</td><td>Broadcom Clarity</td><td>SaaS : 16.2.2 and above</td><td>Project, Task, To Do, Custom Investment Object (Parent only)</td><td>CA PPM</td></tr><tr><td>9</td><td>Broadcom Rally Software</td><td>All</td><td>Portfolio Items, Defect, Task, Test Case, Test Case Result, Test Set, Test Folder, User Story, Change Set [Write support only, Release, Iteration, Milestone], Risk</td><td>CA Agile</td></tr><tr><td>10</td><td>Broadcom Service Desk Manager*</td><td>alb-165</td><td>Change Request, Incident, Problem, Issue</td><td>CA Service Desk Manager</td></tr><tr><td>11</td><td>Bugzilla</td><td>4.4, 4.4.1, 4.4.2, 5.0 and above<br>Read only: 4.4.3 to 4.4.13</td><td>Bug</td><td></td></tr><tr><td>12</td><td>Cherwell*</td><td>10.1.0</td><td>Incident</td><td></td></tr><tr><td>13</td><td>Codebeamer</td><td>21.09-SP3, 21.09-SP9, 22.10 LTS, 2.x, 3.x</td><td>All System and Custom Tracker items<br><br>Not Supported: SCM type entities (Working Sets, Baselines, SCM commits, repositories), timekeeping trackers (Worklogs), Non-ALM entities (Wiki pages, documents)</td><td></td></tr><tr><td>14</td><td>Codebeamer X</td><td>4.2.1</td><td>All System and Custom Tracker items<br><br>Not Supported: SCM type entities (Working Sets, Baselines, SCM commits, repositories), timekeeping trackers (Worklogs), Non-ALM entities (Wiki pages, documents)</td><td></td></tr><tr><td>15</td><td>Database</td><td>All versions supported for MySQL, MS SQL Server/Azure SQL, Oracle, PostgreSQL, MariaDB</td><td>All tables or views in the database</td><td></td></tr><tr><td>16</td><td>Digital.ai Agility</td><td>Cloud (All)</td><td>Backlog Item, Defect, Epic, Goal, Issue, Request, Task, Test, TestSet, Theme, Project/Release, Iteration, Build Run, Changesets, Actuals</td><td>VersionOne</td></tr><tr><td>17</td><td>Digital.ai TeamForge</td><td>17.11 to 21.x</td><td>All System/Custom Tracker Types, Planning Folders, Teams</td><td></td></tr><tr><td>18</td><td>Enterprise Architect**</td><td>10, 11, 13.0, 13.5, 14, 15, 16 (Build 1622 onwards), 17</td><td>Element, Diagram, Package, Operation (read only), Attribute (read only)</td><td></td></tr><tr><td>19</td><td>FogBugz*</td><td>8.8.*, 8.9.*, 8.9.110.0H, 8.9.122.0H</td><td>Case</td><td></td></tr><tr><td>20</td><td>Gerrit</td><td>3.6.8</td><td>Change (read only)</td><td></td></tr><tr><td>21</td><td>Git</td><td>1.7.6, 1.8.3</td><td>Commit Information (read only)</td><td></td></tr><tr><td>22</td><td>GitHub</td><td>GitHub Enterprise - From 2.7 to 2.20<br>SaaS - 2.1</td><td>Issue, Commit Information (read only), Pull Request (read only)</td><td></td></tr><tr><td>23</td><td>GitLab</td><td>SaaS<br>On Premise: 15.x, 16.x, 17.x, 18.x</td><td>Commit (read only), Epic, Issues</td><td></td></tr><tr><td>24</td><td>Helix ALM</td><td>2021, 2024</td><td>Requirement, Issue, Test Case</td><td>Testtrack</td></tr><tr><td>25</td><td>Helix Core*</td><td>2009.2, 2013.1, 2015</td><td>Commit Information (read only)</td><td></td></tr><tr><td>26</td><td>HubSpot</td><td>SaaS</td><td>Deal, Ticket, Contact, Company, Orders, Notes, Emails, Tasks, Calls, Meetings</td><td></td></tr><tr><td>27</td><td>IBM DevOps Code ClearCase*</td><td>8.x</td><td>Delivery Information</td><td>Rational ClearCase</td></tr><tr><td>28</td><td>IBM Engineering Requirements Management DOORS Next</td><td>6.0.x*, 7.0.1, 7.0.2 to 7.0.2 IFix25, 7.0.3</td><td>All Artifacts (Text + Collection)</td><td>IBM DOORS NG</td></tr><tr><td>29</td><td>IBM Engineering Test Management</td><td>6.0.x*, 7.0.1 - 7.1.x</td><td>Test Plan, Test Suite, Test Case, Test Script, Test Case Execution Record, Test Case Result, Keyword</td><td></td></tr><tr><td>30</td><td>IBM Engineering Workflow Management</td><td>5.0.2, 6.0.1, 6.0.2, 6.0.3, 7.0.1, 7.0.2</td><td>Process Template/All Custom Entities</td><td>Rational Team Concert</td></tr><tr><td>31</td><td>IBM Rational ClearQuest</td><td>8.x*, 9.x, 10.x</td><td>Defect / Any Stateful Record Type</td><td></td></tr><tr><td>32</td><td>IBM Rational DOORS</td><td>9.1–9.7.2</td><td>Requirement, Baseline (read only)</td><td></td></tr><tr><td>33</td><td>IBM Rational RequisitePro*</td><td>7.0.1+</td><td>Requirement [All Custom-created Requirement Types supported]</td><td></td></tr><tr><td>34</td><td>Jama Connect</td><td>Cloud/Self-Hosted: From 8.22+</td><td>All System/Custom Item Types (Defect, Epic, Persona, Test Plan, Test Cycle, Test Run, Commit, Component, Set, Folder, Releases, etc.)<br>Not Supported: Attachment, Core</td><td></td></tr><tr><td>35</td><td>Jenkins</td><td>1.617, 2.7.1</td><td>Build (Read &#x26; Trigger)</td><td></td></tr><tr><td>36</td><td>Jira Agile</td><td>Cloud<br>Data Center: 6.7.7 – 9.12.x</td><td>Sprint, Epic, Link</td><td></td></tr><tr><td>37</td><td>Jira AIO (All-In-One) Tests*</td><td>Data Center: 4.4.0<br>Cloud: 4.4.0</td><td>AIO Test Case (read), AIO Test Cycle (read), AIO Test Run (read)</td><td></td></tr><tr><td>38</td><td>Jira Align</td><td>SaaS</td><td>Capability, Customer, Defect, Epic, Initiative, Portfolio, Program, PI, Release, Sprint, Story, Task, Theme, Value Stream, Objectives</td><td></td></tr><tr><td>39</td><td>Jira Cloud</td><td>All</td><td>All System &#x26; Custom Issue Types, Sub-Task Types, Version, Work-log</td><td></td></tr><tr><td>40</td><td>Jira Data Center</td><td>5.x–11.x</td><td>All System &#x26; Custom Issue Types, Sub-Task Types, Version, Work-log</td><td></td></tr><tr><td>41</td><td>Jira Elements Connect</td><td>On-Premise: 6.13.x</td><td>Live text/user/date/datetime custom fields</td><td></td></tr><tr><td>42</td><td>Jira Project &#x26; Portfolio Management</td><td>From Jira 8.15+ (part of Jira software)<br>2.24.0–3.29.x</td><td>Portfolio Items</td><td></td></tr><tr><td>43</td><td>Jira QMetry*</td><td>On Premise: QMetry 3.X, Build 4.6.1</td><td>Test Case, Test Scenario, Test Run, QMetry Test Execution</td><td></td></tr><tr><td>44</td><td>Jira R4J</td><td>Cloud,<br>On Premise*: 4.4.x–4.18.4</td><td>Folders, R4J Relationships (Folders ↔ Jira Issues)</td><td></td></tr><tr><td>45</td><td>Jira Service Management</td><td>Cloud<br>On Premise: 3.1.10–5.12.1</td><td>All System &#x26; Custom Issue Types</td><td>Jira Service Desk</td></tr><tr><td>46</td><td>Jira SLA Powerbox</td><td>3.x–4.2.x (excl. 3.5.x)</td><td>SLA Metric field (read only)</td><td></td></tr><tr><td>47</td><td>Jira Stagil Assets Management*</td><td>On Premise: Stagil Assets – Advanced Link 5.0.86</td><td>All Entities Supported By <code class="expression">space.vars.OIM</code> In JIRA</td><td></td></tr><tr><td>48</td><td>Jira Xray**</td><td>On Premise: 3.6.x–6.1.3<br>Cloud: V1.1.90-AC-4.004.000</td><td>On Premise: Test, Test Plan, Test Execution, Test Set, Sub Test Execution, Pre-Condition<br>Cloud: Xray Test, Test Plan, Test Execution, Test Set, Test Run, Precondition</td><td></td></tr><tr><td>49</td><td>Jira Zephyr Essential**</td><td>Data Center: 9.x, 10.x<br>Cloud: 8.x (1.3.33-AC)</td><td>Test, Test Cycle, Test Execution, Folder</td><td>Zephyr Squad</td></tr><tr><td>50</td><td>Mercurial*</td><td>2.0–2.0.1, 2.6.1, 2.6.2</td><td>Commit Information</td><td></td></tr><tr><td>51</td><td>Midas</td><td>25.10.e.003</td><td>Safety Mechanism</td><td></td></tr><tr><td>52</td><td>Microsoft Dynamics 365</td><td>9.2</td><td>All Entities</td><td></td></tr><tr><td>53</td><td>Modern Requirements</td><td>2010–2019</td><td>Test Result, Test Run, Test Suite, Work items (Bug, Requirement, Task, Test Case, User Story, etc.), Iteration, Git Commit, Custom Entities</td><td></td></tr><tr><td>54</td><td>Monday.com</td><td>SaaS</td><td>Board items, Board sub items</td><td></td></tr><tr><td>55</td><td>OpenText ALM Octane</td><td>On Premise: 16.1.x to 25.x<br>SaaS</td><td>Defect, User Story, Epic, Feature, Task, Requirement, Test, Run, etc.</td><td>Micro Focus ALM Octane</td></tr><tr><td>56</td><td>OpenText ALM Quality Center</td><td>SaaS: 15.x*<br>On-Prem: 10.x*, 11.x*, 12.x to 24.x</td><td>Defect, Requirement, Test, Test Set, Release, Cycle, Test Run, Folders, Configurations, Execution Request</td><td>Micro Focus ALM/QC, HPALM</td></tr><tr><td>57</td><td>OpenText IT Operations Cloud*</td><td>2009 R3,R4, 10.1.2.1,11.0</td><td>All Custom Primary Item Entities</td><td>Serena Business Manager</td></tr><tr><td>58</td><td>OpenText Project &#x26; Portfolio Mgmt (PPM)*</td><td>11.3, 11.5</td><td>Requirement</td><td>Caliber RM</td></tr><tr><td>59</td><td>PagerDuty</td><td>Cloud</td><td>Incident</td><td></td></tr><tr><td>60</td><td>Polarion</td><td>On Premise: ALM 2506<br>SaaS*</td><td>User Story, Requirement, Epic, Task, Test Case, Issue, Change Request, Release, all system-defined work items, and custom work items</td><td></td></tr><tr><td>61</td><td>ReadyOne</td><td>14.0.x (Release 26)</td><td>All System Item Types (Core + Custom)</td><td></td></tr><tr><td>62</td><td>Redmine</td><td>3.1.2+</td><td>Redmine Issue + Custom Issue Types</td><td></td></tr><tr><td>63</td><td>Salesforce</td><td>All</td><td>Case, Opportunity, Feeds, Custom Objects</td><td></td></tr><tr><td>64</td><td>SAP**</td><td>ECC, S/4HANA</td><td>Program, Transport Request, Transaction Code, Enhancement, Usage Details, Table, Function, Package, Auth Object, Class, Data Element, TADIR</td><td></td></tr><tr><td>65</td><td>Selenium*</td><td>All</td><td>TestScripts</td><td></td></tr><tr><td>66</td><td>ServiceNow</td><td>San Diego - Australia</td><td>All System + Custom Tables</td><td></td></tr><tr><td>67</td><td>Slack*</td><td>Cloud</td><td>Comments, Attachments, Post (write only)</td><td></td></tr><tr><td>68</td><td>Snowflake**</td><td>Cloud</td><td>Tables and Views</td><td></td></tr><tr><td>69</td><td>SolarWinds Service Desk</td><td>SaaS</td><td>Catalog Items, Change Catalog, Changes, Incidents, Problems, Releases, Solutions, Tasks</td><td></td></tr><tr><td>70</td><td>Subversion*</td><td>1.5, 1.6.3, 1.6.17, 1.7.9</td><td>Commit Information</td><td></td></tr><tr><td>71</td><td>TestRail**</td><td>7.2.1, 7.8.0, 8.0.1</td><td>Tests, Test Cases, Test Plans, Test Results, Test Runs, Test Suites, Sections, Milestones</td><td></td></tr><tr><td>72</td><td>Trac*</td><td>0.12.0, 0.11.5, 1.0</td><td>Trac Ticket</td><td></td></tr><tr><td>73</td><td>Tricentis qTest</td><td>Cloud,<br>On Premise: 8.4.2–2023.x.x</td><td>Defect, Requirement, Testcase, Testlog, Release, Test Suite, Test Run, Module, Test Cycle, Build (read only)</td><td>QA Symphony</td></tr><tr><td>74</td><td>Tricentis Tosca*</td><td>2023.2, 2024.2 (x64) - 2025.1 (x64)</td><td>TestCase, ExecutionTestCaseLog (read), ExecutionEntry, TCFolder, Requirement, RequirementSet, Issue, Module</td><td></td></tr><tr><td>75</td><td>Verisium Manager**</td><td>20.x–25.x (up to 25.01)</td><td>Section, Metrics Port, Reference [from 21.01+]<br>Supported for vPlan in DB only</td><td>vManager</td></tr><tr><td>76</td><td>Windchill</td><td>2009–13.3</td><td>Change Order, Change Request, Defect, Document, Model, Portfolio, Product, Project, Requirement, Test, Specification, Work Item, Custom Entities</td><td>PTC, Windchill RV&#x26;S</td></tr><tr><td>77</td><td>Windchill PLM*</td><td>13.x</td><td>Issue, Part, Change Request, and Engineering Material (each with associated Soft Types and Subtypes).</td><td>PDM Link</td></tr><tr><td>78</td><td>Zendesk</td><td>Cloud</td><td>Zendesk Ticket</td><td></td></tr><tr><td>79</td><td>Zephyr Enterprise</td><td>8.6.0</td><td>Cycle,Folder, Phase, Phase Folder, Test Case, Test Execution</td><td></td></tr></tbody></table>

(\*) Professional services required for version specific certification.\
(\*\*) Professional services recommended due to modelling complexity.

\`


# Connector Documentation

<table data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>Aha!</strong></td><td><a href="/files/XKd6Wz7JWyv5y9yqaTM3">/files/XKd6Wz7JWyv5y9yqaTM3</a></td><td><a href="/pages/DMaey90867jDLuTLTVBV">/pages/DMaey90867jDLuTLTVBV</a></td></tr><tr><td align="center"><strong>Aras Innovator</strong></td><td><a href="/files/aMSNznMgD37aNbXDyrDr">/files/aMSNznMgD37aNbXDyrDr</a></td><td><a href="/pages/UyIjJAnGC2N60rbUAAy2">/pages/UyIjJAnGC2N60rbUAAy2</a></td></tr><tr><td align="center"><strong>Azure DevOps</strong></td><td><a href="/files/Rf6igimbXdmWP4zE9tOM">/files/Rf6igimbXdmWP4zE9tOM</a></td><td><a href="/pages/l6c6DSgbAKt5Oz6Rqa9l">/pages/l6c6DSgbAKt5Oz6Rqa9l</a></td></tr><tr><td align="center"><strong>Blueprint</strong></td><td><a href="/files/Lf3zkqzXvBqR3lk35KzP">/files/Lf3zkqzXvBqR3lk35KzP</a></td><td><a href="/pages/KJ9ocgdqyGyUTbTqPUJx">/pages/KJ9ocgdqyGyUTbTqPUJx</a></td></tr><tr><td align="center"><strong>BMC Remedy</strong></td><td><a href="/files/ssYf3TRJor9ytqOvZe36">/files/ssYf3TRJor9ytqOvZe36</a></td><td><a href="/pages/aSqKfFy1mcjiN8jeaopp">/pages/aSqKfFy1mcjiN8jeaopp</a></td></tr><tr><td align="center"><strong>Broadcom</strong><br><strong>Clarity</strong></td><td><a href="/files/qUc8m4ENQ2uKhzGgt9Eu">/files/qUc8m4ENQ2uKhzGgt9Eu</a></td><td><a href="/pages/I2cY2yjo8uNyhf1zbsGx">/pages/I2cY2yjo8uNyhf1zbsGx</a></td></tr><tr><td align="center"><strong>Broadcom</strong><br><strong>Rally Software</strong></td><td><a href="/files/rXFT6jVNJqf6an2HN5ti">/files/rXFT6jVNJqf6an2HN5ti</a></td><td><a href="/pages/INhEK2iKfuN4TafRZYyA">/pages/INhEK2iKfuN4TafRZYyA</a></td></tr><tr><td align="center"><strong>Broadcom</strong><br><strong>Service Desk Manager</strong></td><td><a href="/files/ZiCPX5uwjIzziqACGqW2">/files/ZiCPX5uwjIzziqACGqW2</a></td><td><a href="/pages/ujvSse2wUM2g3kykCbVl">/pages/ujvSse2wUM2g3kykCbVl</a></td></tr><tr><td align="center"><strong>Bugzilla</strong></td><td><a href="/files/P4TcCl5GuZ2zj359Zdpg">/files/P4TcCl5GuZ2zj359Zdpg</a></td><td><a href="/pages/gmR6sNc9PdFMu1aygGha">/pages/gmR6sNc9PdFMu1aygGha</a></td></tr><tr><td align="center"><strong>Cherwell</strong></td><td><a href="/files/EpGdyxyM6WyTl0UUHbih">/files/EpGdyxyM6WyTl0UUHbih</a></td><td><a href="/pages/JOjhM0K2gGgnewTmu3ym">/pages/JOjhM0K2gGgnewTmu3ym</a></td></tr><tr><td align="center"><strong>Codebeamer</strong></td><td><a href="/files/v3d9LvLrost0U2pbpb1h">/files/v3d9LvLrost0U2pbpb1h</a></td><td><a href="/pages/grhyspvcl0q3acHScS7t">/pages/grhyspvcl0q3acHScS7t</a></td></tr><tr><td align="center"><strong>CodebeamerX</strong></td><td><a href="/files/KvxFwpNtf59BzXk7Mi0Q">/files/KvxFwpNtf59BzXk7Mi0Q</a></td><td><a href="/pages/grhyspvcl0q3acHScS7t">/pages/grhyspvcl0q3acHScS7t</a></td></tr><tr><td align="center"><strong>Database</strong></td><td><a href="/files/4qtFoUKwTBQw5lvN2KxF">/files/4qtFoUKwTBQw5lvN2KxF</a></td><td><a href="/pages/xFTBxi7XeTE7TJG0uf0Y">/pages/xFTBxi7XeTE7TJG0uf0Y</a></td></tr><tr><td align="center"><strong>Digital.ai</strong><br><strong>Agility</strong></td><td><a href="/files/C59q07V7Tkab22anRk7i">/files/C59q07V7Tkab22anRk7i</a></td><td><a href="/pages/LMr1VMq12ecbYaGvsLix">/pages/LMr1VMq12ecbYaGvsLix</a></td></tr><tr><td align="center"><strong>Digital.ai</strong><br><strong>TeamForge</strong></td><td><a href="/files/4QIdoPF2DmWNVl2Yl4dt">/files/4QIdoPF2DmWNVl2Yl4dt</a></td><td><a href="/pages/ezrrXwbsIVvtfHSc9cF7">/pages/ezrrXwbsIVvtfHSc9cF7</a></td></tr><tr><td align="center"><strong>Enterprise Architect</strong></td><td><a href="/files/zZWt6tgmRrJHi678KGvF">/files/zZWt6tgmRrJHi678KGvF</a></td><td><a href="/pages/v4Ub4LfvmCQWfWFfQKVh">/pages/v4Ub4LfvmCQWfWFfQKVh</a></td></tr><tr><td align="center"><strong>FogBugz</strong></td><td><a href="/files/UXJKd1DAeYhBStPKtgQ3">/files/UXJKd1DAeYhBStPKtgQ3</a></td><td><a href="/pages/0bMWMGV42VrNUQkaRNgF">/pages/0bMWMGV42VrNUQkaRNgF</a></td></tr><tr><td align="center"><strong>Gerrit</strong></td><td><a href="/files/lWaVtqdVmqgPXSPYN38s">/files/lWaVtqdVmqgPXSPYN38s</a></td><td><a href="/pages/KkT4BNOzmabRC9PBNfUz">/pages/KkT4BNOzmabRC9PBNfUz</a></td></tr><tr><td align="center"><strong>Git</strong></td><td><a href="/files/2BT9sS1SSoZOfqwaZonA">/files/2BT9sS1SSoZOfqwaZonA</a></td><td><a href="/pages/8koQHqZqfvIxlU49rf5A">/pages/8koQHqZqfvIxlU49rf5A</a></td></tr><tr><td align="center"><strong>GitHub</strong></td><td><a href="/files/z3NLxKIcq5RHBfkasJXb">/files/z3NLxKIcq5RHBfkasJXb</a></td><td><a href="/pages/nVs2dpiRjQ4okFvgjlvN">/pages/nVs2dpiRjQ4okFvgjlvN</a></td></tr><tr><td align="center"><strong>GitLab</strong></td><td><a href="/files/KNtgjQOFXeUPKwajBV47">/files/KNtgjQOFXeUPKwajBV47</a></td><td><a href="/pages/SHsVIIPJDLUDJC9rxWcA">/pages/SHsVIIPJDLUDJC9rxWcA</a></td></tr><tr><td align="center"><strong>Helix ALM</strong></td><td><a href="/files/xmrDKygXI9oj9hkyEhkT">/files/xmrDKygXI9oj9hkyEhkT</a></td><td><a href="/pages/0eESNIorfJPJYno9wBsi">/pages/0eESNIorfJPJYno9wBsi</a></td></tr><tr><td align="center"><strong>HubSpot</strong></td><td><a href="/files/6jTwTvXVwwzuUBbAPsrH">/files/6jTwTvXVwwzuUBbAPsrH</a></td><td><a href="/pages/BD6zTwrasjDPhNQHZnkS">/pages/BD6zTwrasjDPhNQHZnkS</a></td></tr><tr><td align="center"><strong>IBM Engineering</strong><br><strong>Requirements Management (DOORS NextGen)</strong></td><td><a href="/files/IXFQZUqqeTz23yX1jwYE">/files/IXFQZUqqeTz23yX1jwYE</a></td><td><a href="/pages/GDuRYCnbE50jBkOlDLDS">/pages/GDuRYCnbE50jBkOlDLDS</a></td></tr><tr><td align="center"><strong>IBM Engineering</strong><br><strong>Test Management</strong></td><td><a href="/files/u3tq5cnUv8ISoq97Pvxz">/files/u3tq5cnUv8ISoq97Pvxz</a></td><td><a href="/pages/rNhIoxkEN1ZZvdrGUwcz">/pages/rNhIoxkEN1ZZvdrGUwcz</a></td></tr><tr><td align="center"><strong>IBM Engineering</strong><br><strong>Workflow Management</strong></td><td><a href="/files/KIsm3w4pBB3sBJ94JUej">/files/KIsm3w4pBB3sBJ94JUej</a></td><td><a href="/pages/mzeUVQoGlz0v3GVdnQ8e">/pages/mzeUVQoGlz0v3GVdnQ8e</a></td></tr><tr><td align="center"><strong>IBM Rational</strong><br><strong>ClearQuest</strong></td><td><a href="/files/Hax7dWkf5gjElEXRR6vu">/files/Hax7dWkf5gjElEXRR6vu</a></td><td><a href="/pages/ZudJH8kJq4bhrabAWa8F">/pages/ZudJH8kJq4bhrabAWa8F</a></td></tr><tr><td align="center"><strong>IBM Rational</strong><br><strong>DOORS</strong></td><td><a href="/files/aMmWe90qGK8yu8gewptU">/files/aMmWe90qGK8yu8gewptU</a></td><td><a href="/pages/SolRj7omKLaj50XazJBD">/pages/SolRj7omKLaj50XazJBD</a></td></tr><tr><td align="center"><strong>Jama Connect</strong></td><td><a href="/files/V8yTABEfEEe6drPZtFJa">/files/V8yTABEfEEe6drPZtFJa</a></td><td><a href="/pages/eG4eo3m3iUP7o5pKEend">/pages/eG4eo3m3iUP7o5pKEend</a></td></tr><tr><td align="center"><strong>Jenkins</strong></td><td><a href="/files/01JyW5POOj1rym2GFe4f">/files/01JyW5POOj1rym2GFe4f</a></td><td><a href="/pages/fKKG0mNWC10Ck8rBV3rA">/pages/fKKG0mNWC10Ck8rBV3rA</a></td></tr><tr><td align="center"><strong>Jira Align</strong></td><td><a href="/files/rbwD0tDv3doRS8ZJaonr">/files/rbwD0tDv3doRS8ZJaonr</a></td><td><a href="/pages/ViruVvy3fOZvaE2q2wBo">/pages/ViruVvy3fOZvaE2q2wBo</a></td></tr><tr><td align="center"><strong>Jira Cloud / Data Center</strong></td><td><a href="/files/P2CKihMBo2I2rhrZGUPG">/files/P2CKihMBo2I2rhrZGUPG</a></td><td><a href="/pages/vBEOuiE1ic0O5aAQbrMe">/pages/vBEOuiE1ic0O5aAQbrMe</a></td></tr><tr><td align="center"><strong>Jira Zephyr</strong></td><td><a href="/files/bRLOO8OJFnu4wvn8fboW">/files/bRLOO8OJFnu4wvn8fboW</a></td><td><a href="/pages/KkOgCpSaVr9w13AZHF9W">/pages/KkOgCpSaVr9w13AZHF9W</a></td></tr><tr><td align="center"><strong>Midas</strong></td><td><a href="/files/ScxNkuM6SVKBtTloSR0v">/files/ScxNkuM6SVKBtTloSR0v</a></td><td><a href="/pages/OEH8fdyI62U8N0F5rllM">/pages/OEH8fdyI62U8N0F5rllM</a></td></tr><tr><td align="center"><strong>Microsoft Dynamics 365</strong></td><td><a href="/files/cgfWmxhhZElrQkAFNY8f">/files/cgfWmxhhZElrQkAFNY8f</a></td><td><a href="/pages/Dhl6SnVU5ceJv0V8AmnZ">/pages/Dhl6SnVU5ceJv0V8AmnZ</a></td></tr><tr><td align="center"><strong>Monday.com</strong></td><td><a href="/files/SIL5Qtx9LYPmGamXFbsP">/files/SIL5Qtx9LYPmGamXFbsP</a></td><td><a href="/pages/zRJIPHTI1LAD8MbPDZsS">/pages/zRJIPHTI1LAD8MbPDZsS</a></td></tr><tr><td align="center"><strong>OpenText</strong><br><strong>ALM Octane</strong></td><td><a href="/files/zysN3QtA5vMy5sQQibAW">/files/zysN3QtA5vMy5sQQibAW</a></td><td><a href="/pages/CfSAkSXG51rpm1nJgDv3">/pages/CfSAkSXG51rpm1nJgDv3</a></td></tr><tr><td align="center"><strong>OpenText</strong><br><strong>ALM Quality Center</strong></td><td><a href="/files/sVA1G5X6ybGWrSH7StPe">/files/sVA1G5X6ybGWrSH7StPe</a></td><td><a href="/pages/b2GMdZGE1WzRC0P1xWmp">/pages/b2GMdZGE1WzRC0P1xWmp</a></td></tr><tr><td align="center"><strong>OpenText</strong><br><strong>Project &#x26; Portfolio Management</strong></td><td><a href="/files/sib6mODgRLCgpFqla1xj">/files/sib6mODgRLCgpFqla1xj</a></td><td><a href="/pages/88JadqbiPKNeCgy2L8Ka">/pages/88JadqbiPKNeCgy2L8Ka</a></td></tr><tr><td align="center"><strong>PagerDuty</strong></td><td><a href="/files/BU8Oo8eDrvSnUvgFKQTB">/files/BU8Oo8eDrvSnUvgFKQTB</a></td><td><a href="/pages/zCswuj6YOiP72AsYqy2B">/pages/zCswuj6YOiP72AsYqy2B</a></td></tr><tr><td align="center"><strong>Planview AdaptiveWork</strong></td><td><a href="/files/6jpbJ1rFuJUqD8mxtxjZ">/files/6jpbJ1rFuJUqD8mxtxjZ</a></td><td><a href="/pages/iL1V76im7E2XJuQFwnK3">/pages/iL1V76im7E2XJuQFwnK3</a></td></tr><tr><td align="center"><strong>Polarion</strong></td><td><a href="/files/GNcXUgWPIwq6yhFBetnw">/files/GNcXUgWPIwq6yhFBetnw</a></td><td><a href="/pages/wYTPdPAhD5iyltXiMAsg">/pages/wYTPdPAhD5iyltXiMAsg</a></td></tr><tr><td align="center"><strong>ReadyOne</strong></td><td><a href="/files/AxjvaVRjIIzKX1UK4n3x">/files/AxjvaVRjIIzKX1UK4n3x</a></td><td><a href="/pages/AieXmyv3Fba8t59EQjkc">/pages/AieXmyv3Fba8t59EQjkc</a></td></tr><tr><td align="center"><strong>Redmine</strong></td><td><a href="/files/aemZvv3mK5F0jTjdvnSa">/files/aemZvv3mK5F0jTjdvnSa</a></td><td><a href="/pages/nLdYFPep5x60vWV4NNU8">/pages/nLdYFPep5x60vWV4NNU8</a></td></tr><tr><td align="center"><strong>Salesforce</strong></td><td><a href="/files/Gr4Giabeya1IxdRUKt1U">/files/Gr4Giabeya1IxdRUKt1U</a></td><td><a href="/pages/U5K2TvETHyCrD8hctQtS">/pages/U5K2TvETHyCrD8hctQtS</a></td></tr><tr><td align="center"><strong>SAP</strong></td><td><a href="/files/apQByNCekIlDbxGCiw6T">/files/apQByNCekIlDbxGCiw6T</a></td><td><a href="/pages/HmOeLdAl9SfHVwjaOjhs">/pages/HmOeLdAl9SfHVwjaOjhs</a></td></tr><tr><td align="center"><strong>Selenium</strong></td><td><a href="/files/8IBnXl3n6VMWsPLMas98">/files/8IBnXl3n6VMWsPLMas98</a></td><td><a href="/pages/1ppjmLHEgZNTL7OHRVKN">/pages/1ppjmLHEgZNTL7OHRVKN</a></td></tr><tr><td align="center"><strong>ServiceNow</strong></td><td><a href="/files/9KlA3Qo98kDrMfSIeJvP">/files/9KlA3Qo98kDrMfSIeJvP</a></td><td><a href="/pages/YC15W0FSUB7qUAdIMIHV">/pages/YC15W0FSUB7qUAdIMIHV</a></td></tr><tr><td align="center"><strong>ServiceNow Quick Connect</strong></td><td><a href="/files/9KlA3Qo98kDrMfSIeJvP">/files/9KlA3Qo98kDrMfSIeJvP</a></td><td><a href="/pages/r78UbosHubXjGj5Mi7e4">/pages/r78UbosHubXjGj5Mi7e4</a></td></tr><tr><td align="center"><strong>Slack</strong></td><td><a href="/files/jY7eKldC2WHRgckJf7JX">/files/jY7eKldC2WHRgckJf7JX</a></td><td><a href="/pages/U06aYPTOeD6URVh23E9N">/pages/U06aYPTOeD6URVh23E9N</a></td></tr><tr><td align="center"><strong>Snowflake</strong></td><td><a href="/files/mNurDl7o0dc7QxQfGREc">/files/mNurDl7o0dc7QxQfGREc</a></td><td><a href="/pages/Etsp8W0kU3hXyJAH86yK">/pages/Etsp8W0kU3hXyJAH86yK</a></td></tr><tr><td align="center"><strong>SolarWinds Service Desk</strong></td><td><a href="/files/fI0JlAzX4O1GzeDK8Wrj">/files/fI0JlAzX4O1GzeDK8Wrj</a></td><td><a href="/pages/DrCVDur8UF7GqqC00GyZ">/pages/DrCVDur8UF7GqqC00GyZ</a></td></tr><tr><td align="center"><strong>Subversion</strong></td><td><a href="/files/Ye8cSlWc3ODdH0k3h9zA">/files/Ye8cSlWc3ODdH0k3h9zA</a></td><td><a href="/pages/8XKIh46ihaB0TQDmI2gA">/pages/8XKIh46ihaB0TQDmI2gA</a></td></tr><tr><td align="center"><strong>TestRail</strong></td><td><a href="/files/mOHwqqYelVjqP2b6cx6m">/files/mOHwqqYelVjqP2b6cx6m</a></td><td><a href="/pages/9bjB5LCMluQsUFqNYng7">/pages/9bjB5LCMluQsUFqNYng7</a></td></tr><tr><td align="center"><strong>Trac</strong></td><td><a href="/files/8fLc4zofnNKK4i44ebPE">/files/8fLc4zofnNKK4i44ebPE</a></td><td><a href="/pages/jqUwrX4fB8yfRYHVLyJk">/pages/jqUwrX4fB8yfRYHVLyJk</a></td></tr><tr><td align="center"><strong>Tricentis</strong><br><strong>qTest</strong></td><td><a href="/files/4l25lFbO9IVxn3vwiPiu">/files/4l25lFbO9IVxn3vwiPiu</a></td><td><a href="/pages/bAke2eyZPsc5DTqhh4nx">/pages/bAke2eyZPsc5DTqhh4nx</a></td></tr><tr><td align="center"><strong>Tricentis</strong><br><strong>Tosca</strong></td><td><a href="/files/GWmxNRPh8XSCCnlRwezH">/files/GWmxNRPh8XSCCnlRwezH</a></td><td><a href="/pages/9I3rJMuGhho7F2Pp9gIE">/pages/9I3rJMuGhho7F2Pp9gIE</a></td></tr><tr><td align="center"><strong>Verisium Manager</strong></td><td><a href="/files/l8UHRrDmFNoNIAHV2nv1">/files/l8UHRrDmFNoNIAHV2nv1</a></td><td><a href="/pages/dRCMGgJivmT3w4iDVz09">/pages/dRCMGgJivmT3w4iDVz09</a></td></tr><tr><td align="center"><strong>Windchill</strong></td><td><a href="/files/qBgGs0TGFjlGezm41BCb">/files/qBgGs0TGFjlGezm41BCb</a></td><td><a href="/pages/2eIJQnB8p2LeLNb98zXy">/pages/2eIJQnB8p2LeLNb98zXy</a></td></tr><tr><td align="center"><strong>Windchill PLM</strong></td><td><a href="/files/kQxbcRjPtKu2l4TzUEwX">/files/kQxbcRjPtKu2l4TzUEwX</a></td><td><a href="/pages/sSXlK1HCqzQAfTUTl8Ud">/pages/sSXlK1HCqzQAfTUTl8Ud</a></td></tr><tr><td align="center"><strong>Zendesk</strong></td><td><a href="/files/cGHGUJlsGvjaebf6unDr">/files/cGHGUJlsGvjaebf6unDr</a></td><td><a href="/pages/IgS0iJp3oeX4MYaDdsHm">/pages/IgS0iJp3oeX4MYaDdsHm</a></td></tr><tr><td align="center"><strong>Zephyr Enterprise</strong></td><td><a href="/files/r8jaMA7VlR8OF1vjEfQ8">/files/r8jaMA7VlR8OF1vjEfQ8</a></td><td><a href="/pages/oqlXbmU4DF1yfewXKFiz">/pages/oqlXbmU4DF1yfewXKFiz</a></td></tr></tbody></table>


# Aha

## Prerequisites

### User privileges

* Create one user in Aha! that is dedicated for <code class="expression">space.vars.OIM</code>. This user shouldn't perform any other action from Aha!'s user interface. This user is referred as 'Integration User' in the document.
  * Please refer to [Add User](#add-user) section to create a user in Aha!.
* To synchronize entities to and from any systems to Aha!, Integration User must have **Contributor** permission at project level and **Customizations** role \[which needs be selected from project's Administrator roles]. Refer to [Grant permissions to Aha! user](#grant-permissions-to-aha-user) section for step-wise details on how to grant permissions to a Aha! user.

### API Rate Limiting

* Due to Aha! rate limit issues, for more details, refer to the [API Rate Limitation in Aha!](#api-rate-limitation-in-aha) section, it is recommended to use the Fetch Mapped Data Only feature (available as an <code class="expression">space.vars.OIM</code> add-on) to optimize the API calls. Contact your sales or support representative to enable it.

## System Configuration

* As you kickstart with the integration, you must first configure Aha! system in <code class="expression">space.vars.OIM</code>.
* Click [System Configuration](/integrate/configure-integrations/system-configuration) to learn the step-by-step process to configure a system.

Refer to the following screenshot for reference:

<div align="center"><img src="/files/amc1bmG4ZOkzaxCzFAAD" alt="" width="1000"></div>

**Aha! System form details**

| **Field Name**               | **Description**                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **System Name**              | Provide the system's name                                                                                                                                                                                                                                                                                                                                                                                                                 |
| **Instance URL**             | Provide Instance URL of the Aha! instance. This URL will be used for communicating to Aha! API. The format of the URL is: https\:// .aha.io Example: <https://opshub-inc.aha.io>                                                                                                                                                                                                                                                          |
| **User Email**               | Provide the email Id of a dedicated user who will be used for communicating with Aha! API. This user should have the required privileges to use the Aha! API. For more details on the required privileges, please refer to [User privileges](#user-privileges) section.                                                                                                                                                                   |
| **API Token**                | Provide the bearer API Token generated in Aha! for the user given in "User Email" field. Please refer to [Steps for generating the API token](#steps-for-generating-the-api-token) section for generating the API token.                                                                                                                                                                                                                  |
| **Metadata Details**         | The user can edit entity types based on his/her Aha! instance details for system metadata. For the format and guidance related to filling these details in JSON form, please refer to [Understanding JSON Input](#understanding-json-input) section.                                                                                                                                                                                      |
| **Base URL for Remote Link** | Provide different Instance URL of the Aha! instance. This URL is used for generating the Remote Link. E.g., if the Instance URL is <https://opshubTest33.aha.io/> or any API node URL, but Remote Link needs to be generated with a different Instance URL such as <https://opshubTest.aha.io/>. **Note** : If "Base URL for Remote Link" is empty, it will use Instance/Server URL to generate Remote Link if configured on Integration. |

**Understanding JSON Input**

* The entity metadata details can be provided at the time of system configuration in the field 'Metadata details' \[in the form of JSON] in the below mentioned use case:
  * Use case: In Aha!, the entity display name can be changed. Hence, if this is the case at your end, then changes are needed to be performed in the entity display name of JSON input. Below is the example of the JSON input:

```json
{
  "entities": [
    {
      "internalName": "capabilities",
      "displayName": "Capability"
    },
    {
      "internalName": "features",
      "displayName": "Feature"
    },
    {
      "internalName": "requirements",
      "displayName": "Requirement"
    },
    {
      "internalName": "pages",
      "displayName": "Note"
    },
    {
      "internalName": "releases",
      "displayName": "Release"
    },
    {
      "internalName": "tasks",
      "displayName": "To-do"
    },
    {
      "internalName": "initiatives",
      "displayName": "Initiative"
    }
  ]
}
```

## Mapping Configuration

Map the fields between Aha! and the other system to be integrated to ensure that the data between both the systems synchronize correctly.

<div align="center"><img src="/files/JvAJkIMWnZWLov22yq36" alt="" width="1000"></div>

Click [Mapping Configuration](/integrate/configure-integrations/mapping-configuration) to learn the step-by-step process to configure mapping between the systems.

In Aha!, entity type selection in mapping configuration depends on the project/product selection. For more details, please refer to [Project Selection](#project-selection) section.

> **Note**: In <code class="expression">space.vars.OIM</code>, for the sync of Parking lots, the Release entity needs to be seleted at mapping level {as Parking lots are considered as Release by <code class="expression">space.vars.OIM</code> }.

### Comments Configuration

* Aha! as source system:
  * If comments are mapped in Mapping Configuration, then all the comments will be synchronized to target system. Additionally, the attachments & inline images from the comment will sync to the target system based on its attachment behaviour. For example, if the target conatins the comment with attachment functionality, then attachment will sync to attachment section and the reference to that attachment will be added inside the comment.
* Aha! as target system:
  * If comments are mapped in Mapping Configuration, then comments will be synced to Aha! system. Here, the inline images and attachments will be synced to Aha! description field and reference to those attachements will be added in the comment.

### Attachments Configuration

* Each Rich Text type field supports attchements in Aha!.
* Aha! as source system:
  * Attachments from all rich text and attachment type fields will sync to the target system.
* Aha! as target system:
  * Attachment mapping can be configured to decide the field of Aha! to which the attachment needs to be synced.
    * If only attachment mapping toggle is enabled but the attachment type mapping is not configured, then attachment will sync to description field of Aha! as a part of default attachment behavior sync.

<div align="center"><img src="/files/lTKqNPeRNIjMfU4fV1QK" alt="" width="1000"></div>

### Relationship Configuration

In Aha!, Record links and Reference fields will be supported as relationships.

#### Mandatory Links

* For Feature and Epic type of entities, the Release is a mandatory relationship linkage as feature and epic can only be created inside the release/parking lot.
* For Requirement type of entities, Feature is a mandatory relationship linkage as requirements can only be created inside the feature.
* For To-do type of entities, the Parent is a mandatory relationship linkage as we support the creation of a to-do entity inside the other entity only. Here, the parent entity can be any other entity.

### Reference Fields

* Reference fields are the fields that refer to some other Aha! entity we support.
* Reference fields \[System/Custom fields] will be synchronized through relationships. For references, the names of the Reference fields will be shown in link type mapping of the Relationship Configuration, as shown in the screenshot below:

<div align="center"><img src="/files/XRuLhxvxIgB972hohGkl" alt="" width="1000"></div>

## Integration Configuration

Set a time to synchronize data between Aha! and the other system to be integrated. Also, define parameters and conditions (if any) for integration. Refer to [Integration Configuration](/integrate/configure-integrations/integration-configuration) to learn the step-by-step process to configure the integration between two systems. Refer to the screenshot given below:

<div align="center"><img src="/files/F8CcFWN8bMX1R48BxUcB" alt="" width="1000"></div>

In Aha!, the entity type selection in integration configuration depends on the project selection. For more details, please refer to [Project Selection](#project-selection) section.

### Criteria Configuration

If the user wants to specify conditions for synchronizing an entity from Aha! as source system to the other system, the criteria must be configured. Navigate to Criteria Configuration section on [Integration Configuration](/integrate/configure-integrations/integration-configuration) page to learn in detail about Criteria Configuration. Set the **Query** as per Aha! encoded query format. Criteria is only applicable to given four fields. Given below are the sample snippets of how the Aha! queries can be used as criteria query in <code class="expression">space.vars.OIM</code>:

**Criteria samples:**

| **Field Type**           | **Criteria Description**                                              | **Criteria snippet**                                                                                                                                                                                              |
| ------------------------ | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `q`                      | Synchronize all entities named as 'test feature'                      | q=test%20feature                                                                                                                                                                                                  |
| `updated_since`          | Synchronize all entities updated after 10 March 2021                  | <p>updated\_since=2021-03-10T00%3A00%3A00.000Z<br>Format: yyyy-MM-dd'T'HH<span data-gb-custom-inline data-tag="emoji" data-code="1f1f2-1f1f2">🇲🇲</span>ss.SSS'Z'</p>                                            |
| `tag`                    | Synchronize all entities associated with the tag 'need review'        | tag=need%20review                                                                                                                                                                                                 |
| `assigned_to_user`       | Synchronize all entities assigned to user 'ABC'                       | <p>Filter can be applied on User ID or User email.<br>For an example, assigned\_to\_user=7163902316942030700 /assigned\_to\_user=email%40opshub.com<br>Here, 7163902316942030700 is the id of the user 'ABC'.</p> |
| `updated_since` + `name` | Synchronize entities named 'test r \&d' and updated after 10 Mar 2021 | updated \_since=2021-03-10T00%3A00%3A00.000Z \&q=test%20r%26d                                                                                                                                                     |

### Target LookUp Configuration

* Provide Query in Target Search Query field such that it is possible to search the entity in the Aha! as the target system. In the target search query field, the user can provide a placeholder for the source system's field value in the '@'
* Go to **Search in Target Before Sync** section on [Integration Configuration](/integrate/configure-integrations/integration-configuration) page to learn in detail about how to configure Target LookUp.
* Overall, Target LookUp Query is similar to [Criteria Configuration](#criteria-configuration), except that the value part contains a field name with '@' instead of static value.

**Target LookUp query samples:**

| **Field Type** | **Target lookup usecase**                                       | **Snippet**                |
| -------------- | --------------------------------------------------------------- | -------------------------- |
| `q`            | Target lookup on entity having source entity's id in name field | q='@source \_system \_id@' |

## Known Behaviour

* From Aha! UI, issue type can be changed for entity. Currently, such conversions will create a new entity in the target and the previous one will be orphaned.
* From Aha! UI, the entity can be deleted. However, for Aha! as the source system, the deleted entity will not sync by <code class="expression">space.vars.OIM</code>. The corresponding target entity will remain orphan in target system on Aha! entity deletion. Also, Aha! entity deletion is not supported by <code class="expression">space.vars.OIM</code>, when Aha! is the target system.
* To update the "Progress" field through synchronization, the progress source must be set to "manual" (from Aha! UI or field mapping of <code class="expression">space.vars.OIM</code>) due to Aha! API behavior.
* Goals and Initiative System fields will be available as lookup fields in the field mapping, even though they are not available in Aha! Develop UI.
  * **The above fields are available in Aha! Develop UI when the Aha! Develop instance is combined with Aha! Roadmap.**
  * **Note** The above fields will be deprecated in future releases and replaced with link-based support.
* Hierarchy sync is not supported. Hence, the synchronization of ranking the requirements and to-dos will not be supported.
* Attachment and inline image synchronization is not supported for fields of type Table and other complex type of fields.
* User mention for portal users will be synchronized as text(user value coming from source).
* Entity mention is not supported for the following entities in the given scenarios:
  * **When Aha! is configured as the target system,** Entity mention is not supported for Goals, Notes, and To-Do entities.
  * **When Aha! is configured as the source system,** Entity mention through source URL configuration is not supported for the Goals entity.
* **Scorecard parameter values require additional configuration in OIM to sync.**
  * Refer to [Configuring Scorecard Parameter For Synchronization](#configuring-scorecard-parameter-for-synchronization)
  * Reason: Aha APIs do not provide scorecard parameter details.
* **Advanced XSLT configuration is required** to synchronize complex fields (such as table and worksheet types).
  * Refer to [Configure Advance XSLT For Complex Fields](#configure-advance-xslt-for-complex-fields) section.
* **Only read-only synchronization is supported** for the following fields
  * Scorecard fields
  * Table fields
  * Worksheet field
  * Votes and Submission portal field for **Idea** entity

#### User type field sync

* **History synchronization is not supported** for **System user** and **Custom user** fields due to Aha! API limitations. These fields support **Current state** synchronization only.
  * To synchronize the history of a user-type field, map the corresponding **Read-only text field** available in the mapping for every user-type field having the following naming convention:

    ```
    <FieldName>.Name
    ```

    The `.Name` field stores the history of the corresponding user field as the user's **display name**.

    Examples:

    | **User-type field** | **Read-only text field** |
    | ------------------- | ------------------------ |
    | Owner               | Owner.Name               |
    | Custom User         | Cusotm User.Name         |
    | Created By          | Created By.Name          |

    If history synchronization is required for a User-type field, map the corresponding `.Name` field along with User-type field.

    | **Requirement**               | **Field to map**                   |
    | ----------------------------- | ---------------------------------- |
    | Current state synchronization | `Assigned to`                      |
    | History state synchronization | `Assigned to` & `Assigned to.Name` |

    For History state synchronization, map both the User-type field and its corresponding `.Name` field. The User-type field is used to synchronize the current user value, while the corresponding `.Name` field provides the user's display name for history sync.

![Read only text type field for each system and custom user type field](/files/AO5Yn196oi1MBtThurog)

### Project Selection

* For Aha! system, users can organize their data at different types of workspaces, i.e., Project, Products or Teams. Different entities can reside in different workspaces, for e.g., the Feature can belong to the Product while Activity can belong to the Project.

### API Rate Limitation in Aha!

* Aha! has limitation on API access per minute for a single user. Due to this, <code class="expression">space.vars.OIM</code> can access Aha! API within a limit. When the limit exceeds, the Aha! API stops responding for certain amount of time, and no API calls can be done by <code class="expression">space.vars.OIM</code> during that time until Aha! resets the limit for that user.
  * **Up to 300 requests per minute and 20 requests per second are allowed in Aha!.**
* To address this issue, wait time (given by Aha! API) will be considered for entity synchronization. Thus, there might be some delay in synchronization in case of API rate limit issue.
* **Note:** To avoid hitting rate limits, do not set the integration schedule to run every minute. Instead, adjust the cache timeout in <code class="expression">space.vars.OIM</code>(for example, 24 hours) and the integration schedule interval (for example, 15 minutes in production) to ensure smooth operation without exceeding rate limit
* **Recommendation:** To reduce the number of API calls, consider using the Fetch Mapped Data Only feature, which is available as an additional license add-on. To enable this feature, please contact your sales or support representative.

## Known Limitations

* Limitations due to the lack of Aha! API:
  * Audit/History Sync
    * **History is synced for the last 12 months only from current date.**
      * Reason: Aha APIs provide history data limited to the past 12 months.
      * Reference: [Aha Audits API](https://www.aha.io/api/resources/audits)
    * **Some fields support only current value sync (history is not available).**
      * Due to Aha's historical behavior(UI and API limitations): Scorecard parameters, Watchers, Custom brief type field, Actual vote count, Admin message, Proxy voters and Submission portal details
      * Due to Aha's API limitations: Custom tables, Idea categories, Votes, Key results, Tags, Rich text fields, goals/initiatives and Estimate-related fields.
    * During history synchronization, changes in user fields may be synced as the wrong user in target, if multiple users share the same display name in Aha!.
      * Example:
        * User 1 in Aha!: Display Name = X, Email = <a@gmail.com>.
        * User 2 in Aha!: Display Name = X, Email = <b@gmail.com>.
        * If an update is made to “X” like X -> X in Aha!, the system may sync it to the wrong user in the target system.
        * Reason: The Aha! end system does not distinguish between users with identical display names through the UI/API.
    * **A 5-minute delay is applied to history based sync**
      * Reason: Aha consolidates audit records within a 5-minute interval. To avoid discrepancies or inconsistencies in history sync, this delay is introduced.
      * **Additional delay depends on polling/scheduling interval:**
        * Total delay = 5 minutes (processing) + configured polling interval.
        * Example: If polling is set to 5 minutes, creations/updates may reflect after approximately 10 minutes.
      * **Current-State-Based Synchronization with Revision History**
        * If the integration is running on current state-based synchronization and you are syncing history of source to target system's field or comment, then the field updates may be delayed if changes are made within last 5 minutes.
          * Reason: This happens because Aha merges audit records within 5-minute intervals done on the same field.
        * Example Timeline:
          * Time T1: field1 value changed from **A** to **B**
          * Time T2: field2 value changed from **1** to **2**
          * Time T3: field1 value changed from **B** to **C**
          * Time T4: field1 value changed from **C** to **D**
        * Aha end system audits will be as follows:
          * Time T1: field1 value changed from **A** to **D**
          * Time T2: field2 value changed from **1** to **2**
        * OIM current sync execution starts at time T5.
        * The updates made on the field2 will be synchronized in next synchronization cycle because of Aha's audits behavior.
  * Metadata is not available for the system fields. So, we are providing static metadata in the system itself. Here, the user can change the display name of the entity. User can provide the entity name using the JSON input, and if any user doesn't provide any JSON input, an inbuild entity display name will be considered.
  * In Aha! Develop instance, for **Epic & Feature** type of entities, **Workspace** field is not available for synchronization.
  * In Aha! Develop instance, for **Requirement** type of entity, **Initial estimate, Detailed estimate & Actual effort** fields will not be synced.
  * State transition is not supported as API doesn't give the information about state transitions.
  * For synchronizing updates of **Proxy votes** and **Submission portal details** fields for Idea entities, an additional field update is required. This is because changes to these fields do not update the entity's last modified time.
  * **Custom Key Result** field is treated as a **text** field due to API unavailability.
  * Attachment field: If Aha! is the target system and the attachment mapping is configured to use field-type attachments, at least one attachment should be present in the corresponding field.
  * Soft delete is not supported for the To-Do entity, as the Aha does not provide a way to recover/restore entity.
* For Aha! as the target system, the fields below will not unset via <code class="expression">space.vars.OIM</code> due to Aha!'s API limitation: **Effort, Value, Duration Source, Progress Source, Status, Type, Complete by date (internal), Round date to, Complete by date (external), Presented, and Description.**
* **To-dos** present at user level will not synced by <code class="expression">space.vars.OIM</code>. **To-dos** present in other entities can only be synchronized.

### Troubleshooting Guide

If you are getting an **Internal Server Error** with **Status Code: 500**, then you should retry the failures. There is a limitation of the Aha! API that if we perform updates on entities from same project at the same time, deadlocks occur in their database. It can cause the above-mentioned error.

## Appendix

### Add User

1. Login to Aha! using the user with privileges to create a new user.
2. Navigate to Settings given at the top right corner and go to Account section.

<div align="center"><img src="/files/bCTXUWcv5urD2G4boaDf" alt=""></div>

3 . Navigate to Users

<div align="center"><img src="/files/r425dM935Ag8UKw619cW" alt=""></div>

4 . Click on the Add User button given at the top right corner of the users' list.

<div align="center"><img src="/files/grfzK4yQ0SrmAvHeYaB5" alt=""></div>

5 . Fill the details regarding the user. For the Administration Role and Permissions for different workspaces, select the roles having permissions mentioned in \[User privileges] (#user-privileges) section.

<div align="center"><img src="/files/WrJpabInlbu7ykWXFQR5" alt=""></div>

6 . Save changes

### Grant permissions to Aha! user

1. Login to Aha! using the user with privileges to grant permissions to any user.
2. Navigate to Settings and go to **Account->Users** section.
3. Navigate to **Users** and select the user for which you want to change the permissions.

<div align="center"><img src="/files/gHrCzSpGe4NrubxwiJ85" alt=""></div>

4 . Select Administrator roles and Permissions for different workspaces you want to give to integration user.

<div align="center"><img src="/files/kZlaKHtgfmB7NxLyp9J1" alt=""></div>

5 . Save changes

### Add Custom Fields

1. Navigate to Settings given at the top right corner and go to Personal section.

<div align="center"><img src="/files/78L8NwkAaMlUfQQM1ROz" alt=""></div>

2 . Navigate to Custom fields section.

<div align="center"><img src="/files/j0klLOp3Str3CEKOjyFI" alt=""></div>

3 . Select the entity for which you want to create the custom field, and click Add custom field.

<div align="center"><img src="/files/ryUCqvoemjhcagEzSoEr" alt=""></div>

4 . Choose custom field type from the list and click Next.

<div align="center"><img src="/files/gN4o9YhYGyGzRzolJf4h" alt=""></div>

5 . Fill the details for creating the selected custom field.

<div align="center"><img src="/files/05HqvHwSStkeXWygSLHq" alt=""></div>

### Add Custom Layout

1. Navigate to Settings given at the top right corner and go to Personal section.

<div align="center"><img src="/files/78L8NwkAaMlUfQQM1ROz" alt=""></div>

2 . Navigate to Custom layouts section.

<div align="center"><img src="/files/50oWHDvf77oWWacGum46" alt=""></div>

3 . Select the entity for which you want to create the custom layout, and click Add custom layout.

<div align="center"><img src="/files/wlWhs7BlGTIJDrxA56PA" alt=""></div>

4 . You can choose to create a new custom field or select from the existing custom field from the list.

<div align="center"><img src="/files/QujrI3ZewKIrpU2nI6JG" alt=""></div>

5 . If you choose to use an existing custom field, you can drag and drop it to the fields list given on the right side.

<div align="center"><img src="/files/fl0ScOamWB1ecU2UdETT" alt=""></div>

6 . If you choose to create a custom field, you can drag and drop it to the fields list given on the right side. Fill the details for creating the custom fields.

<div align="center"><img src="/files/CfqhDFgJmBKEHIu90ims" alt=""></div>

7 . Give the name to the layout and save it.

### Steps for generating the API token

1. Navigate to Settings given at the top right corner and go to Personal section.

<div align="center"><img src="/files/78L8NwkAaMlUfQQM1ROz" alt=""></div>

2 . Navigate to the Developer section.

<div align="center"><img src="/files/dVfwNWB5NzhMOqxBtexp" alt=""></div>

3 . In the API keys section, click Generate API key.

<div align="center"><img src="/files/Q05Du05xLEMNGdc4Vh1K" alt=""></div>

4 . Give name to the key and click on Generate API key.

<div align="center"><img src="/files/6aXXn1EbjLliDxqMgl6T" alt=""></div>

5 . Copy the generated API key and save it for future reference.

### Configuring Scorecard Parameter For Synchronization

To synchronize **scorecard parameter values from Aha**, additional configuration is required in OIM because Aha APIs do not return these values by default.

#### 1. System Scorecard Fields

* Use the following format for `internalName`: Product value.\<Parameter name>. Example json:

  ```json
  {
    "internalName": "Product Value.Need",
    "displayName": "Need",
    "dataType": "numeric",
    "mandatory": false,
    "historyEnabled": false
  }
  ```

#### 2. Custom Scorecard parameter fields:

* Use the following format for `internalName`: custom\_\<CustomFieldKey>.\<Parameter Name>. Example json:

  ```json
   {
      "internalName": "custom_customscorecard.Sales increase",
      "displayName": "Sales increase",
      "dataType": "numeric",
      "mandatory": false,
      "historyEnabled": false
   }
  ```

3. The display name for the scorecard parameter field is configurable. The value specified as the display name will be reflected in the <code class="expression">space.vars.OIM</code> mapping configuration screen.
4. The last three parameters in the JSON configuration remain consistent across all scorecard parameters.
5. The \<Parameter name> specified in the internalName field corresponds to the name displayed in the UI for the respective scorecard. Refer to screenshot below for illustration.

   <div align="center"><img src="/files/zVjUhaYcs08CLBjIG7bj" alt=""></div>
6. The \<Custom Scorecard fieldKey> represents the unique key of the custom field. For details on identifying the custom field key, refer to [Get Custom Field Unique Key](#get-custom-field-unique-key).

### Configure Advance XSLT For Complex Fields

#### 1. Table Field → Rich Text (e.g., Jira Description)

To synchronize a table type field(for example `oh_table_field`) that contains three columns: **Name**, **Primary customer contact**, **Email address** to rich text type field like Description in Jira in table format, refer to the following sample advance XSLT:

```xml
       <description xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:text>||*Name*||*Primary customer contact*||*Email address*||</xsl:text>
        <xsl:variable name="nodes" select="/SourceXML/updatedFields/Property/custom__oh__table__field/list"/>
        <xsl:for-each select="$nodes[position() mod 3 = 1]">
            <xsl:variable name="start" select="((position() - 1) * 3) + 1"/>
            <xsl:text>&amp;#10;|</xsl:text>
            <xsl:choose>
                <xsl:when test="normalize-space($nodes[$start]/Property/value) != ''">
                    <xsl:value-of select="$nodes[$start]/Property/value"/>
                </xsl:when>
            </xsl:choose>
            <xsl:text>|</xsl:text>
            <xsl:choose>
                <xsl:when test="normalize-space($nodes[$start + 1]/Property/value) != ''">
                    <xsl:value-of select="$nodes[$start + 1]/Property/value"/>
                </xsl:when>
            </xsl:choose>
            <xsl:text>|</xsl:text>
            <xsl:choose>
                <xsl:when test="normalize-space($nodes[$start + 2]/Property/value) != ''">
                    <xsl:value-of select="$nodes[$start + 2]/Property/value"/>
                </xsl:when>
            </xsl:choose>
            <xsl:text>|</xsl:text>
        </xsl:for-each>
    </description>
```

1. The table field in aha is illustrated in the image below:

   <div align="center"><img src="/files/EdkNA2pq9ojO28b3vZ4c" alt=""></div>
2. The data after transformation and synchronization to Jira is shown in the following image:

   <div align="center"><img src="/files/e6Oye090zIlxnBfaqBXf" alt=""></div>

#### 2. Worksheet Field → Rich Text

To synchronize complex type worksheet field(for example, `custom_worksheet`) that contains two columns: **Column Name** and **Value** to a rich text field like Custom Description in Jira, refer to below sample advance XSLT:

```xml
       <customDescription xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:text>||*Column Name*||*Value*||</xsl:text>
        <xsl:for-each select="/SourceXML/updatedFields/Property/custom__customworksheet/Property/values/Property">
            <xsl:text>&amp;#10;|</xsl:text>
            <xsl:value-of select=".//Property[name][1]/name"/>
            <xsl:text>|</xsl:text>
            <xsl:choose>
                <xsl:when test="normalize-space(.//Property/value) != ''">
                    <xsl:value-of select=".//Property[value][1]/value"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text/>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:text>|</xsl:text>
        </xsl:for-each>
    </customDescription>
```

1. The worksheet field in aha is illustrated in the image below:

   <div align="center"><img src="/files/gM0lk30573CuVnF5FtRK" alt=""></div>
2. The data, after transformation and synchronization to Jira, is illustrated in the following image:

   <div align="center"><img src="/files/Qcc3mtfdw4J6PguhGYXI" alt=""></div>

### Get Custom Field Unique Key

#### Getting Custom Field Unique Key Using API.

* To retrieve custom fields via the API, use the following endpoint: \<aha-instance>/api/v1/custom\_field\_definitions. This can be accessed through browser or tools such as Postman.
* Sample JSON response is shown below:

  ```json
      {
        "custom_field_definitions": [
            {
                "name": "Custom Attachment",
                "id": "7174752533322023770",
                "key": "custom_attachment_feature",
                "type": "CustomFieldDefinitions::AttachmentField",
                "custom_fieldable_type": "Feature",
                "internal_name": null
            },
            {
                "name": "Custom Attachment",
                "id": "7624035087472118759",
                "key": "custom_attachment_initiative",
                "type": "CustomFieldDefinitions::AttachmentField",
                "custom_fieldable_type": "Initiative",
                "internal_name": null
            }
        ]
      }
  ```
* The value in the **key** field represents the unique identifier for a specific custom field.
* **Note** Multiple custom fields across different entity types may share the same name. Ensure that the key is interpreted in the context of its corresponding entity type (`custom_fieldable_type`).

#### Getting Custom Field Unique From UI.

add after login go to user profile and find the value

1. Navigate to the User Personal section under Settings by clicking on the user profile icon located in the top-right corner after logging in

<div align="center"><img src="/files/ZvlwoiazM5tnZD6hOel6" alt=""></div>

2 . Navigate to Custom fields section.

<div align="center"><img src="/files/j0klLOp3Str3CEKOjyFI" alt=""></div>

3 . Select the entity for which you want to identify the custom field key, and locate the relevant custom field.

<div align="center"><img src="/files/B8D9WWwfzDsPduDa4MrA" alt=""></div>

4. Open the Advanced Configuration settings for the selected custom field.

<div align="center"><img src="/files/BVCj4G5jtzpTFNMfiBhk" alt=""></div>

5. Retrieve the value displayed in the Key field.

<div align="center"><img src="/files/hYiZP6ad40SZ3YS82k0h" alt=""></div>




---

[Next Page](/llms-full.txt/1)

