Hi there “Process Automation” fans,
Welcome to a new installment of “Process Automation” tips.
I see it sooooo often with customers. All the manual steps to put an OPA organization up and running. Boy-o-Boy…Why all the pain? Why all that time-wasting? Why doing all the error-prone steps manually?…With a platform full of services, you’ll expect to do one thing properly; That’s “AUTOMATION”! There is a reason our beloved platform calls it “Process Automation”!?!? So, why are we not doing it? Do we not know how? Do we not want to invest time understanding the concepts? Do we stick our heads in the sand and wait until somebody tells them to wake up? Well, here is your wake-up call…
For this post we’ll automate the creation of these steps:
- Create a brand-new organization (I leave OTDS for user/group consolidation out-of-scope, but it has an API (
http://192.168.56.107:8181/otdsws/api/index.html) to automate here as well) - Create service groups
- Create service containers
- Stop/Start/Restart service containers (which I leave for next week to keep you awake!)
- Create a Data Source Object (DSO) for connecting to an external database and extracting linked Entities; Read here and here
- Delete an organization (with the organization deletion Tool) because we also want to clean up our mess properly
This is a list of use-cases why you want to have these specific automation-steps in place:
- When a developer gets stuck in his organization with corrupted data and require a re-“initialization”.
- Cleaning an organization from garbage (In Dev/Test/Acp); Can happen after an upgrade, and you want to prepare yourself for the next upgrade.
- A fresh installation and creating a similar structure repeatedly.
- A “Build” organization for package generation/deployment. From a developer perspective, you can’t have enough organizations available. Each developer needs its own, you want a “build” organization, and you want a “deploy” organization for your first tests.
When you want to go next level with CI/CD, read these articles
Let’s get right into it…
A note upfront: You see me using CLI calls with the CWS tool, and this is one way to automate things! The other way of automating things is simply watching the developer tools of Chrome browser, run the actions once by hand, and recording all the calls. Once all information is available, you can execute these services from an external tool like SoapUI or Postman. The only thing you require is a session, but that’s all explained here.
Comment me if you want a post about how to do this post with direct service calls from SoapUI…It’ll be great as well!
Organization creation
Let’s get our hands dirty…Is your VM up and running? Yes? Jump into the ‘/system’ shared organization where we can create new organizations (with your sysadmin account!). With the developer tools open in your browser, you can create an organization from the ‘Organization Manager’ artifact. After you’re done, you found yourself a SOAP call looking like this:
1 | <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> |
The response for this call has an element <ID>3</ID>. This is the unique ID (or ‘destinationindicator’) for our organization (see here). It’s an important ID as all tables in the database start with this ‘OrgID’ (o3 in my case)
We can also delete an organization here (if you didn’t use it yet!). However, you will not find a
DeleteOrganizationservice call! This will be aDeleteRecursivecall in the categoryMethod Set LDAP 1.0. It’s not for now as we’ll learn about the ‘organizationremovaltool’ (you can find more details here already if your curious!)
Service group/container creation
This step we’ll do differently. We could still watch the developer tools, open the ‘System Resource Manager’ in our brand-new organization, and create a new service container. Only, this makes an advanced Update call to CARS (our OpenLDAP instance) with subtasks/tuples/entries for creating a ‘serviceGroup’, a ‘serviceContainer’, and a ‘connectionPoint’. Exactly what you would fill in for all the steps of the normal service container creation wizard…Can we do better? Yes, please…
For this, we do a quick recap on one of our CI/CD posts about ANT-tasks where an interesting JAR-file (anttasks.jar) passes by. A little decompiling teaches us not only about the already familiar deployapplicationpackage and undeployapplicationpackage operations, but more is exposed on operations like createconnectionpoint, createdatabaseconfiguration, createservicegroup, and createservicecontainer. These also have a “Delete”-variant!

You can also double-check the administration guide of the platform in section “Application Package Deployment utility”, but this post exposes new examples and undocumented thinking.
Time to get our hands dirty…again, but this time on the server (mine is RHEL). We first need to install “Apache Ant” with this command: sudo yum install -y ant. Once done, you can validate with ant -version.
Next is setting some environment variables:
1 | export CORDYS_HOME=/opt/opentext/ProcessAutomationCE/defaultInst |
I already have a
sysadminaccount on my RHEL VM during installation…A thing I always recommend doing. Installing the platform with a different account always requires additional security steps to make later in the process. The platform simply likessysadminfor some reason!
Now we can create a build.xml file with vi ~/build.xml pasting in content like this:
1 | <project basedir="." default="testAll" name="Test-Antscripts"> |
There is a reference to a test.properties file. Create it (vi ~/test.properties) with this content (smartly with your environment specifics!):
1 | #General properties |
For your reference; My hostname (FQDN) is:
opa.25.1.com
You also see a reference to a sc_appserver_config.xml file. Create it (vi ~/sc_appserver_config.xml) with this content:
1 | <configuration> |
You also see a reference to a
sc_wsappserver_config.xmlfile which will have this content:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 <configuration>
<!--The regular documentation does not tell you about this classpath element!-->
<classpath>
<location>components/wsappserver/wsappserver.jar</location>
<location>components/ruleengine/ruleengine.jar</location>
</classpath>
<startupDependency>
<namespace>http://schemas.cordys.com/1.0/xmlstore</namespace>
</startupDependency>
<ruleEnabled>false</ruleEnabled>
<auditEnabled>off</auditEnabled>
<initializeDB>false</initializeDB>
<multiTenant>false</multiTenant>
<initializeEIS>false</initializeEIS>
<customInitializer/>
<applicationInitializer/>
<autoCleanup>false</autoCleanup>
</configuration>
Where do we gain all this knowledge on those <configuration> XML parts? Well, first creating things by hand in the UI and watching closely what will eventually land in the ‘LDAP Explorer’ artifact:

…
Now you can move to the location of those two new files (cd ~) and run this first command: ant info. It will output the details of the info target of our XML configuration:
1 | Buildfile: /home/sysadmin/build.xml |
Yes…It’s magic; Notify yourself also of the possible variables you can pass in via the properties file!
Our next step is calling: ant testCreateServiceGroup
Aiiii, an expected error (because we created this one manually already for R&D):The DN cn=sg_appserver,cn=soap nodes,o=opa_build,cn=cordys,cn=defaultInst,o=25.1.com already exists on the LDAP server.
Remove it from the UI, makes the second call is a success! 🥳
For automation, you want to check this DN value (from my error) with a SOAP call like
GetLDAPObject(inMethod Set LDAP 1.0) OR you add an extra flag in the build XMLoverride="true"
What we can create, we can also remove: ant testDeleteServiceGroup
Be aware this will also remove the service containers within! I also recommend to first remove the service containers, then remove the service group…It just feels better!
Make sure these all work before running the ultimate test (incl. the clean/deletions where applicable for you):
1 | ant info |
Your final test call will be ant testAll! The result is…NOTHING, as we clean everything! This is my output:
1 | Buildfile: /home/sysadmin/build.xml |
DSO creation
What we can do for service groups and service containers, we can also do for a Data Source Object. It’s nothing more than a database connection setup for reusability in any of your service containers (like a WS-AppServer container which can extract ‘Linked’ entities from a DB; Read about it here)
For a new DSO, we can simply extend our build.xml with these snippets:
1 | <project basedir="." default="testAll" name="Test-Antscripts"> |
You can evaluate them with these calls:
1 | ant testCreateDSO |
Does it work? Well, watch this valid connectivity test:

Delete organization
Finally, the last part of the post…Deleting an organization! Not via the ‘Organizational Manager’ artifact, but solidly following our own post.
These are the quick steps:
- Deploy the tool
Cordys Organization Removal Toolin the ‘/system’ space with the ‘Application Deployer’ artifact (mine is already deployed in OPA version25.3). - Run this command:
sh /opt/opentext/ProcessAutomationCE/defaultInst/components/organizationremovaltool/organizationremovaltool.sh opa_build
The outcome is a party again! 🤠
1 | Preparing to execute organization data cleanup for all components. |
Nicely “DONE” with a first impression of what we can all automate with the CLI tool of our beloved platform. For the people thinking it’s impossible…Automation is always possible, but you just need someone to tell you with a little guidance to improve your way of thinking. No problem…It’s hereby done, and it’s an action for you to start automating all the rest of your time-wasting steps. Have a great weekend and till next week for another great topic about “Process Automation Tips”! 🍹
Don’t forget to subscribe to get updates on the activities happening on this site. Have you noticed the quiz where you find out if you are also “The Process Automation guy”?