Skip to Content
Technical Articles
Author's profile photo Florian Kube

Identify SAP Cloud Integration Tenant Stage at runtime

Sometimes you need a different behavior in your iFlow depending on the stage the Integration Process is running (e.g., development/testing/productive).

One typical approach is to use an external parameter with the help of a content modifier and a router. Then you can customize the environment on each stage. This approach can lead to mistakes when someone set’s the wrong environment. So, I searched for a way you don’t need to make manual customizing on each stage.

Using the Cloud Foundry environment variables we can identify the name and derive the stage.

So let’s start.

Prerequisite

First we need to create a simple iFlow which executes one Groovy script.

Create%20iFlow%20with%20Groovy%20script%20step

Create iFlow with Groovy script step

Content of the script

import com.sap.gateway.ip.core.customdev.util.Message;
import groovy.json.JsonOutput;
import groovy.json.JsonSlurper;

def Message processData(Message message) {
    
    //get Cloud Foundry environment variables
    def envApplication = new JsonSlurper().parseText(System.getenv("VCAP_APPLICATION"))

    //Create a new map with the attributes from envApplication
    def envApplicationAttributes = [:]

    //interate all attributes
    envApplication.each { key, value ->
        envApplicationAttributes[key] = value
    }

    //Make it readable
    def readableJson = JsonOutput.prettyPrint(JsonOutput.toJson(envApplicationAttributes))
    
    //Create an attachment with Cloud Foundry environment variables
    messageLogFactory.getMessageLog(message)?.addAttachmentAsString('VCAP_APPLICATION.json', readableJson, 'application/json')

    //Set Cloud Foundry environment variables also as body
    message.setBody(readableJson)

    return message
}

Run the iFlow and take a look to the monitoring and select the attachment. Here we can now see the Cloud Foundry environment variables.

 

Attachment%20contains%20Environment%20variables%20in%20message%20monitoring

Attachment contains Environment variables in message monitoring

 

We will use attribute “application_name” to identify the environment. Now you need to transport this iFlow to all of your stages and run it once. Note down the “application_name”.

Now we have all information to write our final script.

 

Create getTenantStage script

It is best practice to add scripts like this to a global script collection. So, create one if you don’t have an existing one or edit a suitable.

import com.sap.gateway.ip.core.customdev.util.Message;
import groovy.json.JsonSlurper;

def Message getTenantStage(Message message) {

    JsonSlurper slurper = new JsonSlurper();
    //get Cloud Foundry environment variables
    Map envApplication = slurper.parseText(System.getenv("VCAP_APPLICATION"));

    //get Application name
    def applicationName = envApplication.application_name;

    //map of all stages including stage
    def tenantStageMap = [
        "itw-mytenentid-abc-0-90": "DEV",
        "itw-mytenentid-def-0-32": "QAS",
        "itw-mytenentid-ghi-0-74": "PRD"
    ]

    //set Tenant stage. If entry is missing in map set UNKNOWN 
    message.setProperty("TenantStage", tenantStageMap[applicationName] ?: "UNKNOWN")

    return message;
}

 

Test the script

You can now use this script in your iFlows by adding the script as reference.

Add%20script%20collection%20to%20your%20iFlow

Add script collection to your iFlow

 

If you did everything correct, the script collection should be listed.

Script%20collection%20added%20to%20iFlow

Script collection added to iFlow

In your iFlow click on the Groovy Script step and select “Global Resources”. Choose the Script you have just created. E.g., “getTenantStage”.

Select%20getTenantScript%20from%20Script%20Collection

Select getTenantScript from Script Collection

Also add Script function name: “getTenantStage”.

Add%20Script%20Function%20name%20getTenantStage

Add Script Function name getTenantStage

After the groovy script you can add a router and possible following steps which are depending on the current stage.

Add%20router%20after%20the%20Groovy%20Script

Add router after the Groovy Script

The script has added a property “TenantStage”. We can use camel expression to add the conditions:

${property.TenantStage} = 'DEV'

Router%20condition

Router condition

With help of a content modifier and the trace mode you can test your script/setup.

In%20trace%20mode%20you%20can%20validate%20your%20script/setup

In trace mode you can validate your script/setup

 

Please let me know if you have any improvements 😊

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.