In this blog post we are going to look at how to handle multiple vRealize Orchestrator servers as integration in Cloud Assembly, Code Stream and Service Broker.
- Introduction
- Running a WF as part of Extensibility in Assembly
- Running a Pipeline with WF’s coming from CodeStream vRO Endpoints
- Running WF coming from Assembly vRO Integration in Service Broker
- Running WF coming from Code Stream vRO Endpoint in Service Broker
- Final Step
Update Log:
Introduction
Before we continue special thanks to my college and frien Ivo Gaydajiev for the help to figure all this out
Cloud Assembly supports the integration of multiple vRealize Orchestrator servers that can be used not only in workflow subscriptions, but an enable workflows (WF) to be exposed in Service Broker. We are going to see how we can manage where a WF will be executed when we have more than one vRO integration.
Consider an example use case for this as follows:
– You have 2 vCenter cloud accounts in Assembly: vCenter A, vCenter B
– You have 2 vRO integrations in Assembly: vRO A, vRO B
– Each vCenter is paired with vRO in a different GEO.
– You build a blueprint that can deploy on both cloud accounts.
– You have WF A in vRO A and WF B in vRO B. This is exactly the same WF. It is exported/imported between vRO’s
– You want to trigger a WF in a different vRO depending on where you are provisioning as part of your extensibility.
We are going to discuss few places where vRO WF’s are being used and how to affect where the vRO will be provisioned:
– Assembly: Running a WF as part of Extensibility
– Code Stream: Pipelines with WF’s coming from CodeStream vRO Endpoints.
– Service Broker: WF’s coming from Assembly vRO integrations
– Service Broker: WF’s coming from CodeStream pipelines / CodeStream vRO Endpoints.
Running a WF as part of Extensibility in Assembly
First lets look at the setup I have.
I have 2 vRO integrations added in Assembly: vRO A and vRO B
As you can notice I have placed and ID capability tag to identify each of them: cas.integrations.id:vro_a and cas.integrations.id:vro_b
In both vRO instances I have the same WF: WF A
I have two vCenter cloud accounts: vCenter A (vCenter on-prem) and vCenter B (VMC Cloud)
I’ve created an Extensibility subscription and selected the WF for it.
As you can notice when I have selected the WF it noted that there are 2 integrations where this WF is available.
On a Project level I haven’t selected any extensibility constraints.
Now lets see what happens if we deploy a BP and expose few use cases.
CA-UC1
Setup:
– Project: No constraints
– Integration: No constraints
– vCenter: No constraints
– WF: present on all vRO’s
Outcome:
– Extensibility will trigger WF A in either vRO A or vRO B (based on round robin), regardless if we deploy on vCenter A or vCenter B
CA-UC2
Setup:
– Project: No constraints
– Integration: No constraints
– vCenter: No constraints
– WF: present on one of the vRO’s
Outcome:
– Extensibility will trigger WF A in either vRO A or vRO B (based on round robin), regardless if we deploy on vCenter A or vCenter B
– If Extensibility chooses vRO A it will succeed.
– If Extensibility chooses vRO B it will fail.
CA-UC3
Setup:
– Project: Constraint Tag – cas.integartions.id:vro_a
– Integration: Constraint Tag – cas.integartions.id:vro_a
– vCenter: No constraints
– WF: present on all vRO’s
Outcome:
– Extensibility will trigger WF A in on vRO A, regardless if we deploy on vCenter A or vCenter B. This is due to the constraint tag we’ve put on a project level.
CA-UC4
Setup:
– Project: No constraints
– Integration: Constraint Tag – cas.integartions.id:vro_a for vRO A and cas.integartions.id:vro_b for vRO B
– vCenter: Constraint Tag – cas.integartions.id:vro_a for vCenter A and cas.integartions.id:vro_b for vCenter B
– WF: present on all vRO’s
Outcome:
– If we deploy on vCenter A , extensibility will try to trigger the WF on vRO A. If not possible it will fall back to vRO B.
– If we deploy on vCenter B , extensibility will try to trigger the WF on vRO B. If not possible it will fall back to vRO A.
In this case the engine turning the constraints in a cloud account to a soft constraints and is trying to match these with a corresponding vRO integration. Because these are soft constraints if the preferred vRO Integration is not available it will fall back to the other vRO integrations
CA-UC5
Setup:
– Project: Constraint Tag – cas.integartions.id:vro_a
– Integration: Constraint Tag – cas.integartions.id:vro_a for vRO A and cas.integartions.id:vro_b for vRO B
– vCenter: Constraint Tag – cas.integartions.id:vro_a for vCenter A and cas.integartions.id:vro_b for vCenter B
– WF: present on all vRO’s
Outcome:
– If we deploy on vCenter A , extensibility will try to trigger the WF on vRO A. it will not fall back to vRO B.
– If we deploy on vCenter B , extensibility will try to trigger the WF on vRO A. If will not fall back to vRO B.
In this case the engine is again turning the constraints in a cloud account to a soft constraints and is trying to match these with a corresponding vRO integration. Because these are soft constraints if the preferred vRO Integration is not available it will fall back to the other vRO integrations. In this case should as we have specified a constraint vRO A on a project level, and constraints on a project level are hard constraints, engine will always trigger the WF on vRO A , regardless in which vCenter we deploy.
Running a Pipeline with WF’s coming from CodeStream vRO Endpoints
First lets look at the setup I have.
I have both vRO A and vRO B added in CodeStream.
Now this example is easy. When I create a Pipeline and add the vRO task I have to select on which vRO endpoint to run the WF. Regardless that both of these are connected to the same project, non of the previously explained options will interfere with the CodeStream pipeline deployment.
Running WF coming from Assembly vRO Integration in Service Broker
When you configure a vRO Content Source in assembly you have to add the WF’s that will be imported into the Service Broker catalog. Although you will see the WF A coming from both vRO A and vRO B , you can import it only once.
It makes no difference if you import the one from vRO A or vRO B. it will still work as explain below.
Now let’s see what happens if we deploy the workflow catalog item from Service Broker .
SB-CA-UC1
Setup:
– Project: No constraints
– WF: present on all vRO’s
Outcome:
– Service Broker will trigger WF A in either vRO A or vRO B (based on round robin), regardless which WF is imported in the catalog
SB-CA-UC2
Setup:
– Project: No constraint.
– Integration: No constraint.
– WF: present only on one vRO’s
Outcome:
– Service Broker will trigger WF A in either vRO, regardless which WF is imported in the catalog
– Service Broker will trigger WF A in either vRO A or vRO B (based on round robin), regardless which WF is imported in the catalog
– If Service Broker chooses vRO A it will succeed.
– If Service Broker chooses vRO B it will fail.
SB-CA-UC3
Setup:
– Project: Constraint Tag – cas.integartions.id:vro_a
– Integration: Constraint Tag – cas.integartions.id:vro_a for vRO A and cas.integartions.id:vro_b for vRO B
– WF: present on all vRO’s
Outcome:
– Service Broker will trigger WF A in either vRO, regardless which WF is imported in the catalog
Running WF coming from Code Stream vRO Endpoint in Service Broker
Let’s first go back to Code Stream.
I have a pipeline there that has a vRO Task and that task points to vRO A to trigger WF A
The same wey we have configured the vRO Content Source in the previous chapter, we need to configure a Code Stream Content Source.
Now if I deploy this from Service Broker it will always go to vRO A, regardless of any project extensibility or vRO integration endpoint constraints. It will go in vRO A because in my pipeline it is pointing to vRO A.
Final Step
If all went well, go grab a beer.
DISCLAIMER; This is a personal blog. Any views or opinions represented in this blog are personal and belong solely to the blog owner and do not represent those of people, institutions or organizations that the owner may or may not be associated with in professional or personal capacity, unless explicitly stated. Any views or opinions are not intended to malign any religion, ethnic group, club, organization, company, or individual.
All content provided on this blog is for informational purposes only. The owner of this blog makes no representations as to the accuracy or completeness of any information on this site or found by following any link on this site. The owner will not be liable for any errors or omissions in this information nor for the availability of this information. The owner will not be liable for any losses, injuries, or damages from the display or use of this information.
Photos
Unless stated, all photos are the work of the blog owner and are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License. If used with watermark, no need to credit to the blog owner. For any edit to photos, including cropping, please contact me first.
Recipes
Unless stated, all recipes are the work of the blog owner and are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License. Please credit all recipes to the blog owner and link back to the original blog post.
Downloadable Files
Any downloadable file, including but not limited to pdfs, docs, jpegs, pngs, is provided at the user’s own risk. The owner will not be liable for any losses, injuries, or damages resulting from a corrupted or damaged file.
Comments
Comments are welcome. However, the blog owner reserves the right to edit or delete any comments submitted to this blog without notice due to
– Comments deemed to be spam or questionable spam
– Comments including profanity
– Comments containing language or concepts that could be deemed offensive
– Comments containing hate speech, credible threats, or direct attacks on an individual or group
The blog owner is not responsible for the content in comments.
This policy is subject to change at anytime.