diff --git a/docs.json b/docs.json index 500fcf3..c511e72 100644 --- a/docs.json +++ b/docs.json @@ -88,7 +88,8 @@ "group": "Integrations", "pages": [ "integrations/cloudability", - "integrations/cloudhealth" + "integrations/cloudhealth", + "integrations/flexera" ] }, { diff --git a/images/flexera-actions.png b/images/flexera-actions.png new file mode 100644 index 0000000..d20cba2 Binary files /dev/null and b/images/flexera-actions.png differ diff --git a/images/flexera-connection.png b/images/flexera-connection.png new file mode 100644 index 0000000..dad0f6d Binary files /dev/null and b/images/flexera-connection.png differ diff --git a/integrations/cloudability.mdx b/integrations/cloudability.mdx index a52b35c..647b208 100644 --- a/integrations/cloudability.mdx +++ b/integrations/cloudability.mdx @@ -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. @@ -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. + diff --git a/integrations/flexera.mdx b/integrations/flexera.mdx new file mode 100644 index 0000000..28205b8 --- /dev/null +++ b/integrations/flexera.mdx @@ -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: + + + +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. + + + +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: + + +```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" + } + } +] + ``` + + +### 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 + + diff --git a/snippets/integrations/designing-a-workflow.mdx b/snippets/integrations/designing-a-workflow.mdx new file mode 100644 index 0000000..bdb03be --- /dev/null +++ b/snippets/integrations/designing-a-workflow.mdx @@ -0,0 +1,29 @@ +## Designing a workflow + +A typical {productName} workflow starts by collecting active recommendations using the *{recommendationsActionName}* 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 {productName} workflows. + +### Owner mapping + +{productName} 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 {tagArrayName} array returned by the *{recommendationsActionName}* action. Subsequent workflow steps may add owners or departments to the preconfigured [*Tag-owner mapping* table](/reporting-analytics/tables#tag-owner-mapping). + +If your {productName} 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 {productName} 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 {productName} recommendations to the preconfigured [*Opportunities* table](/reporting-analytics/tables#opportunities) for centralized tracking and status management. + +Workflows using the *{recommendationsActionName}* 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 *{recommendationsActionName}*, 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 decision, the workflow can mark the recommendation as rejected, delay the recommendation using the *{snoozeActionName}* action, or proceed with remediation using OpenOps actions for the [cloud provider](/cloud-access/supported-cloud-providers) involved. Decisions can be 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. diff --git a/workflow-management/actions.mdx b/workflow-management/actions.mdx index 3a15b14..e252769 100644 --- a/workflow-management/actions.mdx +++ b/workflow-management/actions.mdx @@ -38,12 +38,12 @@ These actions help you retrieve data from cloud resources, third-party services, * **[Archera](https://archera.ai/)**: retrieve available and recommended commitment plans for cloud providers. * **AWS Compute Optimizer**: retrieve a summary of recommendations, as well as EBS- or EC2-specific recommendations. * **Azure**: get Azure Advisor cost recommendations. + * **[Cloudability](https://www.apptio.com/products/cloudability/)**: retrieve, snooze and unsnooze recommendations. For details about this integration, see [Cloudability](/integrations/cloudability/). * **[CloudFix](https://cloudfix.com/)**: get recommendations and reports, or create change requests. - * **[CloudHealth](https://www.vmware.com/products/app-platform/tanzu-cloudhealth)**: get recommendations, search assets and retrieve asset perspectives, or manage asset tags. + * **[CloudHealth](https://www.vmware.com/products/app-platform/tanzu-cloudhealth)**: get recommendations, search assets and retrieve asset perspectives, or manage asset tags. For a tutorial on creating a workflow to address CloudHealth recommendations, see [CloudHealth](/integrations/cloudhealth/). * **[CloudZero](https://www.cloudzero.com/)**: make API calls to fetch telemetry, billing data, budgets, insights, and more. - * **[Cloudability](https://www.apptio.com/products/cloudability/)**: retrieve, snooze and unsnooze recommendations. * **[Finout](https://www.finout.io/)**: get view data and recommendations, manage virtual tags. - * **[Flexera](https://www.flexera.com/)**: retrieve active recommendations and incidents. + * **[Flexera](https://www.flexera.com/)**: retrieve active recommendations and incidents. For details about this integration, see [Flexera](/integrations/flexera/). * **[Flexera Spot](https://spot.io/solutions/finops/)**: fetch clusters and make custom API calls. * **Google Cloud**: get recommendations from selected Google Cloud recommenders. * **[Hyperglance](https://www.hyperglance.com/)**: get recommendations, view tracked cloud resources, check the status and statistics of cloud credentials.