Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@
"group": "Integrations",
"pages": [
"integrations/cloudability",
"integrations/cloudhealth"
"integrations/cloudhealth",
"integrations/flexera"
]
},
{
Expand Down
Binary file added images/flexera-actions.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/flexera-connection.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 7 additions & 29 deletions integrations/cloudability.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ icon: 'sprout'
---

import { NarrowImage } from '/snippets/narrow-image.jsx'
import WorkflowDesign from '/snippets/integrations/designing-a-workflow.mdx'

OpenOps integrates with [Cloudability](https://www.apptio.com/products/cloudability/) to automate the retrieval and management of cloud resource usage recommendations.

Expand Down Expand Up @@ -221,32 +222,9 @@ Allows making arbitrary calls to any [Cloudability API](https://www.ibm.com/docs
- **Query Parameters**: Optional
- **Body**: Optional JSON payload

## Designing a workflow

A typical Cloudability workflow starts by collecting active recommendations using the *Get Recommendations* action, then iterating through them, determining the owner of the affected resource, and deciding whether to request an action from the owner. If the owner approves the action, the workflow can remediate the resource using the actions available for the [cloud platforms OpenOps supports](/cloud-access/supported-cloud-providers).

Below is a description of common patterns that can be implemented in your Cloudability workflows.

### Owner mapping

Cloudability recommendations often need to be routed to the appropriate resource owners for review and action. OpenOps workflows can help you map cloud resources to their owners using tag values in the `tagMappings` array returned by the *Get Recommendations* action. Subsequent workflow steps may add owners or departments to the preconfigured [*Tag-owner mapping* table](/reporting-analytics/tables#tag-owner-mapping).

If your Cloudability instance returns specific owners, your workflow can add their contact details to the *Tag-owner mapping* table automatically. If it does not, you can populate the table manually once for each business unit to ensure that subsequent workflow runs know which team member should receive notifications or approval requests.

For an example of implementing owner mapping as a separate workflow, see [Creating a workflow to fill the project-owner mapping table](/integrations/cloudhealth#creating-a-workflow-to-fill-the-project-owner-mapping-table) in the CloudHealth integration guide. While the guide covers a different FinOps product, the principles of owner mapping apply to Cloudability workflows as well.

### Recommendation tracking using OpenOps tables and states

Rather than acting on each recommendation once and then losing track of its status, your OpenOps workflow can log Cloudability recommendations to the preconfigured [*Opportunities* table](/reporting-analytics/tables#opportunities) for centralized tracking and status management.

Workflows using the *Get Recommendations* action can create or update table records with details such as estimated savings, resource IDs, recommendation types, and current status (*Created*, *Under Review*, *Dismissed*, *Snoozed*). This approach prevents duplicate notifications, provides audit trails, and enables reporting on realized vs. unrealized savings across your organization.

Learn how to implement opportunity tracking by following the [CloudHealth recommendation logging workflow](/integrations/cloudhealth#look-up-the-opportunity-in-the-openops-table).

### Handling recommendations via Slack

For recommendations that require human judgment, OpenOps can send interactive Slack messages that allow resource owners to approve, dismiss, or snooze optimization opportunities directly from Slack.

After retrieving recommendations with *Get Recommendations*, workflows can use owner mapping to identify the appropriate Slack user, then send a Slack message with buttons for different responses using *Request Action* in the Slack action block. Based on the user's selection, the workflow can call *Snooze Recommendations* to temporarily dismiss false positives or proceed with automated remediation actions. Decisions are tracked in the *Opportunities* table.

See [Send a Slack notification with action buttons](/integrations/cloudhealth#send-a-slack-notification-with-action-buttons) in the CloudHealth guide for implementation details.
<WorkflowDesign
productName="Cloudability"
tagArrayName="tagMappings"
recommendationsActionName="Get Recommendations"
snoozeActionName="Snooze Recommendations"
/>
335 changes: 335 additions & 0 deletions integrations/flexera.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,335 @@
---
title: 'Flexera'
description: "An overview of how Flexera One can be integrated with OpenOps"
icon: 'pencil-ruler'
---

import { NarrowImage } from '/snippets/narrow-image.jsx'
import WorkflowDesign from '/snippets/integrations/designing-a-workflow.mdx'

OpenOps integrates with [Flexera One](https://www.flexera.com/products/flexera-one) to automate the retrieval and management of cloud resource usage recommendations.

## Actions

OpenOps provides three [actions](/workflow-management/actions) for interacting with Flexera One:

<NarrowImage src="/images/flexera-actions.png" alt="Flexera actions" />

All Flexera actions are based on the [Flexera One API](https://developer.flexera.com/) and require configuring a Flexera One [connection](/cloud-access/access-levels-permissions), where you need to specify your app region, refresh token, organization ID, and project ID.

<NarrowImage src="/images/flexera-connection.png" alt="Configuring a Flexera connection" />

The following sections describe the three actions available in the Flexera block.

### Get Active Recommendations
Retrieves active cost optimization recommendations from Flexera:
- **Policy Set**: Dynamic dropdown of available policy sets from your Flexera account
- **Filter by Provider**: Optional filter by cloud provider (AWS, Azure, Google, or Alibaba)

Below is a sample output returned by this step when it is configured to request active Azure recommendations for the "Unused Volumes" policy set:

<Expandable title="Flexera One recommendations">
```json
[
{
"id": "65ef1f6a2f831bae8d05dfcd-0",
"kind": "optima#recommendation",
"tags": [
"environment=dev",
"app=inventoryManagement"
],
"type": "Usage Reduction",
"region": "westus2",
"status": "active",
"vendor": "Azure",
"details": {
"ID": "/subscriptions/f048a88c-9bc9-43cf-a30d-f48c94708866/resourceGroups/wideblueberry/providers/Microsoft.Compute/disks/zealouskiwi",
"Tags": "environment=dev, app=inventoryManagement",
"State": "Unattached",
"Region": "westus2",
"Service": "Microsoft.Compute",
"Age (Days)": 323,
"Created At": "2025-10-10T09:05:17+00:00",
"Resource ID": "/subscriptions/f048a88c-9bc9-43cf-a30d-f48c94708866/resourceGroups/wideblueberry/providers/Microsoft.Compute/disks/zealouskiwi",
"Resource Name": "zealouskiwi",
"Resource Type": "Microsoft.Compute/disks",
"Attached VM ID": "/subscriptions/f048a88c-9bc9-43cf-a30d-f48c94708866/resourceGroups/wideblueberry/providers/Microsoft.Compute/virtualMachines/flatpenguin",
"Disk Size (GB)": 169,
"Recommendation": "Delete unused volume zealouskiwi in Azure Subscription transparentjaguar (f048a88c-9bc9-43cf-a30d-f48c94708866)",
"Resource Group": "wideblueberry",
"Lookback Period": 30,
"Subscription ID": "f048a88c-9bc9-43cf-a30d-f48c94708866",
"Savings Currency": "US$",
"Subscription Name": "transparentjaguar",
"Estimated Monthly Savings": 296.48
},
"savings": 296.48,
"service": "Microsoft.Compute",
"accountID": "f048a88c-9bc9-43cf-a30d-f48c94708866",
"createdAt": "2025-07-14T15:39:03Z",
"policySet": "Unused Volumes",
"updatedAt": "2025-07-17T14:47:19.633Z",
"incidentID": "65ef1f6a2f831bae8d05dfcd",
"resourceID": "/subscriptions/f048a88c-9bc9-43cf-a30d-f48c94708866/resourceGroups/wideblueberry/providers/Microsoft.Compute/disks/zealouskiwi",
"accountName": "transparentjaguar",
"resourceType": "Microsoft.Compute/disks",
"statusReason": "",
"resourceGroup": "wideblueberry",
"databaseEngine": "",
"recommendation": "Azure Unused Volumes [Demo]",
"billingCenterID": "unallocated",
"billingCenterName": "Unallocated",
"quantityToPurchase": 0,
"customTagDimensions": {
"tag_name": "",
"tag_hashtag": "",
"tag_k8s_app": "",
"tag_project": "",
"tag_purpose": "",
"tag_cost_centers": "",
"tag_product_line": "",
"tag_business_unit": "",
"tag_oracle_environment": "",
"tag_itam_corporate_unit": "",
"tag_kubernetes_container": "",
"tag_kubernetes_controller": "",
"tag_kubernetes_cluster_name": "",
"tag_kubernetes_resource_name": "",
"tag_kubernetes_resource_type": "",
"tag_kubernetes_resource_namespace": ""
},
"ruleBasedDimensions": {
"rbd_tagmaps": "None",
"rbd_tshirts": "None",
"rbd_ai_tools": "None",
"rbd_bill_split": "None",
"rbd_cost_owner": "None",
"rbd_department": "None",
"rbd_production": "None",
"rbd_application": "None",
"rbd_cost_center": "None",
"rbd_environment": "None",
"rbd_s3usagetypes": "None",
"rbd_business_unit": "None",
"rbd_product_owner": "None",
"rbd_s3_usage_type": "None",
"rbd_chargebackcode": "None",
"rbd_it_dept_markup": "None",
"rbd_environmenttest": "None",
"rbd_sample_rbd_list": "None",
"rbd_tagged_untagged": "None",
"rbd_hardware_dept_markup": "None",
"rbd_commitment_source_eco": "Non-Eco",
"rbd_cost_center_normalized": "None",
"rbd_committment_allocations": "None"
}
},
{
"id": "65ef1f6a2f831bae8d05dfcd-1",
"kind": "optima#recommendation",
"tags": [
"environment=prod",
"app=userManagement"
],
"type": "Usage Reduction",
"region": "australiaeast",
"status": "active",
"vendor": "Azure",
"details": {
"ID": "/subscriptions/1aec08f2-c15d-4c32-919c-4bab940f69f3/resourceGroups/glossytitan/providers/Microsoft.Compute/disks/opaquepluto",
"Tags": "environment=prod, app=userManagement",
"State": "Unattached",
"Region": "australiaeast",
"Service": "Microsoft.Compute",
"Age (Days)": 226,
"Created At": "2025-06-05T06:54:21+00:00",
"Resource ID": "/subscriptions/1aec08f2-c15d-4c32-919c-4bab940f69f3/resourceGroups/glossytitan/providers/Microsoft.Compute/disks/opaquepluto",
"Resource Name": "opaquepluto",
"Resource Type": "Microsoft.Compute/disks",
"Attached VM ID": "/subscriptions/1aec08f2-c15d-4c32-919c-4bab940f69f3/resourceGroups/glossytitan/providers/Microsoft.Compute/virtualMachines/quickeunomia",
"Disk Size (GB)": 486,
"Recommendation": "Delete unused volume opaquepluto in Azure Subscription circulareris (1aec08f2-c15d-4c32-919c-4bab940f69f3)",
"Resource Group": "glossytitan",
"Lookback Period": 30,
"Subscription ID": "1aec08f2-c15d-4c32-919c-4bab940f69f3",
"Savings Currency": "US$",
"Subscription Name": "circulareris",
"Estimated Monthly Savings": 141.74
},
"savings": 141.74,
"service": "Microsoft.Compute",
"accountID": "1aec08f2-c15d-4c32-919c-4bab940f69f3",
"createdAt": "2025-07-14T15:39:03Z",
"policySet": "Unused Volumes",
"updatedAt": "2025-07-17T14:47:19.633Z",
"incidentID": "65ef1f6a2f831bae8d05dfcd",
"resourceID": "/subscriptions/1aec08f2-c15d-4c32-919c-4bab940f69f3/resourceGroups/glossytitan/providers/Microsoft.Compute/disks/opaquepluto",
"accountName": "circulareris",
"resourceType": "Microsoft.Compute/disks",
"statusReason": "",
"resourceGroup": "glossytitan",
"databaseEngine": "",
"recommendation": "Azure Unused Volumes [Demo]",
"billingCenterID": "unallocated",
"billingCenterName": "Unallocated",
"quantityToPurchase": 0,
"customTagDimensions": {
"tag_name": "",
"tag_hashtag": "",
"tag_k8s_app": "",
"tag_project": "",
"tag_purpose": "",
"tag_cost_centers": "",
"tag_product_line": "",
"tag_business_unit": "",
"tag_oracle_environment": "",
"tag_itam_corporate_unit": "",
"tag_kubernetes_container": "",
"tag_kubernetes_controller": "",
"tag_kubernetes_cluster_name": "",
"tag_kubernetes_resource_name": "",
"tag_kubernetes_resource_type": "",
"tag_kubernetes_resource_namespace": ""
},
"ruleBasedDimensions": {
"rbd_tagmaps": "None",
"rbd_tshirts": "None",
"rbd_ai_tools": "None",
"rbd_bill_split": "None",
"rbd_cost_owner": "None",
"rbd_department": "None",
"rbd_production": "None",
"rbd_application": "None",
"rbd_cost_center": "None",
"rbd_environment": "None",
"rbd_s3usagetypes": "None",
"rbd_business_unit": "None",
"rbd_product_owner": "None",
"rbd_s3_usage_type": "None",
"rbd_chargebackcode": "None",
"rbd_it_dept_markup": "None",
"rbd_environmenttest": "None",
"rbd_sample_rbd_list": "None",
"rbd_tagged_untagged": "None",
"rbd_hardware_dept_markup": "None",
"rbd_commitment_source_eco": "Non-Eco",
"rbd_cost_center_normalized": "None",
"rbd_committment_allocations": "None"
}
},
{
"id": "65ef1f6a2f831bae8d05dfcd-2",
"kind": "optima#recommendation",
"tags": [
"environment=dev",
"app=customerSupport",
"tier=application"
],
"type": "Usage Reduction",
"region": "uksouth",
"status": "active",
"vendor": "Azure",
"details": {
"ID": "/subscriptions/8752afcb-f9b4-453b-b34c-cb9f3a9a0247/resourceGroups/tinycarrot/providers/Microsoft.Compute/disks/whiteoctopus",
"Tags": "environment=dev, app=customerSupport, tier=application",
"State": "Unattached",
"Region": "uksouth",
"Service": "Microsoft.Compute",
"Age (Days)": 38,
"Created At": "2025-02-28T11:17:17+00:00",
"Resource ID": "/subscriptions/8752afcb-f9b4-453b-b34c-cb9f3a9a0247/resourceGroups/tinycarrot/providers/Microsoft.Compute/disks/whiteoctopus",
"Resource Name": "whiteoctopus",
"Resource Type": "Microsoft.Compute/disks",
"Attached VM ID": "/subscriptions/8752afcb-f9b4-453b-b34c-cb9f3a9a0247/resourceGroups/tinycarrot/providers/Microsoft.Compute/virtualMachines/quirkyquaoar",
"Disk Size (GB)": 423,
"Recommendation": "Delete unused volume whiteoctopus in Azure Subscription wittysedna (8752afcb-f9b4-453b-b34c-cb9f3a9a0247)",
"Resource Group": "tinycarrot",
"Lookback Period": 30,
"Subscription ID": "8752afcb-f9b4-453b-b34c-cb9f3a9a0247",
"Savings Currency": "US$",
"Subscription Name": "wittysedna",
"Estimated Monthly Savings": 168.82
},
"savings": 168.82,
"service": "Microsoft.Compute",
"accountID": "8752afcb-f9b4-453b-b34c-cb9f3a9a0247",
"createdAt": "2025-07-14T15:39:03Z",
"policySet": "Unused Volumes",
"updatedAt": "2025-07-17T14:47:19.633Z",
"incidentID": "65ef1f6a2f831bae8d05dfcd",
"resourceID": "/subscriptions/8752afcb-f9b4-453b-b34c-cb9f3a9a0247/resourceGroups/tinycarrot/providers/Microsoft.Compute/disks/whiteoctopus",
"accountName": "wittysedna",
"resourceType": "Microsoft.Compute/disks",
"statusReason": "",
"resourceGroup": "tinycarrot",
"databaseEngine": "",
"recommendation": "Azure Unused Volumes [Demo]",
"billingCenterID": "unallocated",
"billingCenterName": "Unallocated",
"quantityToPurchase": 0,
"customTagDimensions": {
"tag_name": "",
"tag_hashtag": "",
"tag_k8s_app": "",
"tag_project": "",
"tag_purpose": "",
"tag_cost_centers": "",
"tag_product_line": "",
"tag_business_unit": "",
"tag_oracle_environment": "",
"tag_itam_corporate_unit": "",
"tag_kubernetes_container": "",
"tag_kubernetes_controller": "",
"tag_kubernetes_cluster_name": "",
"tag_kubernetes_resource_name": "",
"tag_kubernetes_resource_type": "",
"tag_kubernetes_resource_namespace": ""
},
"ruleBasedDimensions": {
"rbd_tagmaps": "None",
"rbd_tshirts": "None",
"rbd_ai_tools": "None",
"rbd_bill_split": "None",
"rbd_cost_owner": "None",
"rbd_department": "None",
"rbd_production": "None",
"rbd_application": "None",
"rbd_cost_center": "None",
"rbd_environment": "None",
"rbd_s3usagetypes": "None",
"rbd_business_unit": "None",
"rbd_product_owner": "None",
"rbd_s3_usage_type": "None",
"rbd_chargebackcode": "None",
"rbd_it_dept_markup": "None",
"rbd_environmenttest": "None",
"rbd_sample_rbd_list": "None",
"rbd_tagged_untagged": "None",
"rbd_hardware_dept_markup": "None",
"rbd_commitment_source_eco": "Non-Eco",
"rbd_cost_center_normalized": "None",
"rbd_committment_allocations": "None"
}
}
]
```
</Expandable>

### Get Incident
Retrieves details of a specific incident from Flexera:
- **Incident ID**: The unique identifier of the incident to retrieve

### Custom API Call
Allows making arbitrary calls to any [Flexera One API](https://developer.flexera.com/) endpoint:
- **URL**: Dynamic endpoint selection
- **Method**: `GET`, `POST`, `PATCH`, `PUT`, `DELETE`, or `HEAD`
- **Headers**: Optional (authorization auto-injected)
- **Query Parameters**: Optional
- **Body**: Optional JSON payload

<WorkflowDesign
productName="Flexera"
tagArrayName="tags"
recommendationsActionName="Get Active Recommendations"
snoozeActionName="Custom API Call"
/>
Loading